clock_prep.c revision 1.2.2.4 1 1.2.2.4 yamt /* $Id: clock_prep.c,v 1.2.2.4 2014/05/22 11:39:43 yamt Exp $ */
2 1.2.2.2 yamt
3 1.2.2.2 yamt /*
4 1.2.2.2 yamt * Copyright (c) 2012 The NetBSD Foundation, Inc.
5 1.2.2.2 yamt * All rights reserved.
6 1.2.2.2 yamt *
7 1.2.2.2 yamt * This code is derived from software contributed to The NetBSD Foundation
8 1.2.2.2 yamt * by Petri Laakso.
9 1.2.2.2 yamt *
10 1.2.2.2 yamt * Redistribution and use in source and binary forms, with or without
11 1.2.2.2 yamt * modification, are permitted provided that the following conditions
12 1.2.2.2 yamt * are met:
13 1.2.2.2 yamt * 1. Redistributions of source code must retain the above copyright
14 1.2.2.2 yamt * notice, this list of conditions and the following disclaimer.
15 1.2.2.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
16 1.2.2.2 yamt * notice, this list of conditions and the following disclaimer in the
17 1.2.2.2 yamt * documentation and/or other materials provided with the distribution.
18 1.2.2.2 yamt *
19 1.2.2.2 yamt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.2.2.2 yamt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.2.2.2 yamt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.2.2.2 yamt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.2.2.2 yamt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.2.2.2 yamt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.2.2.2 yamt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.2.2.2 yamt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.2.2.2 yamt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.2.2.2 yamt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.2.2.2 yamt * POSSIBILITY OF SUCH DAMAGE.
30 1.2.2.2 yamt */
31 1.2.2.2 yamt
32 1.2.2.2 yamt #include <sys/cdefs.h>
33 1.2.2.4 yamt #include <sys/param.h>
34 1.2.2.2 yamt #include <sys/types.h>
35 1.2.2.2 yamt
36 1.2.2.2 yamt #include <arm/imx/imx23_clkctrlreg.h>
37 1.2.2.2 yamt
38 1.2.2.2 yamt #include <lib/libsa/stand.h>
39 1.2.2.2 yamt
40 1.2.2.2 yamt #include "common.h"
41 1.2.2.2 yamt
42 1.2.2.4 yamt #define CLKCTRL_HBUS (HW_CLKCTRL_BASE + HW_CLKCTRL_HBUS)
43 1.2.2.4 yamt #define CLKCTRL_PLL0 (HW_CLKCTRL_BASE + HW_CLKCTRL_PLLCTRL0)
44 1.2.2.4 yamt #define CLKCTRL_PLL0_S (HW_CLKCTRL_BASE + HW_CLKCTRL_PLLCTRL0_SET)
45 1.2.2.4 yamt #define CLKCTRL_PLL0_C (HW_CLKCTRL_BASE + HW_CLKCTRL_PLLCTRL0_CLR)
46 1.2.2.4 yamt #define CLKCTRL_PLL1 (HW_CLKCTRL_BASE + HW_CLKCTRL_PLLCTRL1)
47 1.2.2.4 yamt #define CLKCTRL_FRAC (HW_CLKCTRL_BASE + HW_CLKCTRL_FRAC)
48 1.2.2.4 yamt #define CLKCTRL_FRAC_S (HW_CLKCTRL_BASE + HW_CLKCTRL_FRAC_SET)
49 1.2.2.4 yamt #define CLKCTRL_FRAC_C (HW_CLKCTRL_BASE + HW_CLKCTRL_FRAC_CLR)
50 1.2.2.4 yamt #define CLKCTRL_SEQ (HW_CLKCTRL_BASE + HW_CLKCTRL_CLKSEQ)
51 1.2.2.4 yamt #define CLKCTRL_SEQ_S (HW_CLKCTRL_BASE + HW_CLKCTRL_CLKSEQ_SET)
52 1.2.2.4 yamt #define CLKCTRL_SEQ_C (HW_CLKCTRL_BASE + HW_CLKCTRL_CLKSEQ_CLR)
53 1.2.2.4 yamt #define CLKCTRL_EMI (HW_CLKCTRL_BASE + HW_CLKCTRL_EMI)
54 1.2.2.4 yamt #define CLKCTRL_SSP (HW_CLKCTRL_BASE + HW_CLKCTRL_SSP)
55 1.2.2.2 yamt
56 1.2.2.4 yamt void en_pll(void);
57 1.2.2.4 yamt void set_hbus_div(unsigned int);
58 1.2.2.4 yamt void set_cpu_frac(unsigned int);
59 1.2.2.4 yamt void bypass_cpu(void);
60 1.2.2.4 yamt void set_emi_div(unsigned int);
61 1.2.2.4 yamt void set_emi_frac(unsigned int);
62 1.2.2.4 yamt void bypass_emi(void);
63 1.2.2.2 yamt
64 1.2.2.2 yamt /*
65 1.2.2.4 yamt * Power on 480 MHz PLL.
66 1.2.2.2 yamt */
67 1.2.2.4 yamt void
68 1.2.2.4 yamt en_pll(void)
69 1.2.2.2 yamt {
70 1.2.2.2 yamt
71 1.2.2.4 yamt REG_WR(CLKCTRL_PLL0_S, HW_CLKCTRL_PLLCTRL0_POWER);
72 1.2.2.4 yamt while(!(REG_RD(CLKCTRL_PLL1) & HW_CLKCTRL_PLLCTRL1))
73 1.2.2.4 yamt ;
74 1.2.2.2 yamt
75 1.2.2.4 yamt return;
76 1.2.2.2 yamt }
77 1.2.2.4 yamt void
78 1.2.2.4 yamt bypass_cpu(void)
79 1.2.2.2 yamt {
80 1.2.2.2 yamt
81 1.2.2.4 yamt REG_WR(CLKCTRL_SEQ_C, HW_CLKCTRL_CLKSEQ_BYPASS_CPU);
82 1.2.2.2 yamt
83 1.2.2.2 yamt return;
84 1.2.2.2 yamt }
85 1.2.2.4 yamt void
86 1.2.2.4 yamt bypass_emi(void)
87 1.2.2.2 yamt {
88 1.2.2.4 yamt REG_WR(CLKCTRL_SEQ_C, HW_CLKCTRL_CLKSEQ_BYPASS_EMI);
89 1.2.2.2 yamt
90 1.2.2.2 yamt return;
91 1.2.2.2 yamt }
92 1.2.2.4 yamt void
93 1.2.2.4 yamt bypass_ssp(void)
94 1.2.2.2 yamt {
95 1.2.2.4 yamt REG_WR(CLKCTRL_SEQ_C, HW_CLKCTRL_CLKSEQ_BYPASS_SSP);
96 1.2.2.2 yamt
97 1.2.2.2 yamt return;
98 1.2.2.2 yamt }
99 1.2.2.4 yamt void
100 1.2.2.4 yamt bypass_saif(void)
101 1.2.2.2 yamt {
102 1.2.2.4 yamt REG_WR(CLKCTRL_SEQ_C, HW_CLKCTRL_CLKSEQ_BYPASS_SAIF);
103 1.2.2.4 yamt
104 1.2.2.2 yamt return;
105 1.2.2.2 yamt }
106 1.2.2.2 yamt /*
107 1.2.2.4 yamt * Set HBUS divider value.
108 1.2.2.2 yamt */
109 1.2.2.4 yamt void
110 1.2.2.4 yamt set_hbus_div(unsigned int div)
111 1.2.2.2 yamt {
112 1.2.2.4 yamt uint32_t tmp_r;
113 1.2.2.2 yamt
114 1.2.2.4 yamt while (REG_RD(CLKCTRL_HBUS) & HW_CLKCTRL_HBUS_BUSY)
115 1.2.2.4 yamt ;
116 1.2.2.4 yamt
117 1.2.2.4 yamt tmp_r = REG_RD(CLKCTRL_HBUS);
118 1.2.2.4 yamt tmp_r &= ~HW_CLKCTRL_HBUS_DIV;
119 1.2.2.4 yamt tmp_r |= __SHIFTIN(div, HW_CLKCTRL_HBUS_DIV);
120 1.2.2.4 yamt REG_WR(CLKCTRL_HBUS, tmp_r);
121 1.2.2.4 yamt
122 1.2.2.4 yamt while (REG_RD(CLKCTRL_HBUS) & HW_CLKCTRL_HBUS_BUSY)
123 1.2.2.4 yamt ;
124 1.2.2.2 yamt
125 1.2.2.2 yamt return;
126 1.2.2.2 yamt }
127 1.2.2.2 yamt /*
128 1.2.2.4 yamt * Set CPU frac.
129 1.2.2.2 yamt */
130 1.2.2.4 yamt void
131 1.2.2.4 yamt set_cpu_frac(unsigned int frac)
132 1.2.2.2 yamt {
133 1.2.2.4 yamt uint8_t tmp_r;
134 1.2.2.2 yamt
135 1.2.2.4 yamt tmp_r = REG_RD_BYTE(CLKCTRL_FRAC);
136 1.2.2.4 yamt tmp_r &= ~(HW_CLKCTRL_FRAC_CLKGATECPU | HW_CLKCTRL_FRAC_CPUFRAC);
137 1.2.2.4 yamt tmp_r |= __SHIFTIN(frac, HW_CLKCTRL_FRAC_CPUFRAC);
138 1.2.2.4 yamt REG_WR_BYTE(CLKCTRL_FRAC, tmp_r);
139 1.2.2.2 yamt
140 1.2.2.2 yamt return;
141 1.2.2.2 yamt }
142 1.2.2.2 yamt /*
143 1.2.2.4 yamt * Set EMI frac.
144 1.2.2.2 yamt */
145 1.2.2.4 yamt void
146 1.2.2.4 yamt set_emi_frac(unsigned int frac)
147 1.2.2.2 yamt {
148 1.2.2.4 yamt uint8_t *emi_frac;
149 1.2.2.4 yamt uint16_t tmp_r;
150 1.2.2.2 yamt
151 1.2.2.4 yamt emi_frac = (uint8_t *)(CLKCTRL_FRAC);
152 1.2.2.4 yamt emi_frac++;
153 1.2.2.4 yamt
154 1.2.2.4 yamt tmp_r = *emi_frac<<8;
155 1.2.2.4 yamt tmp_r &= ~(HW_CLKCTRL_FRAC_CLKGATEEMI | HW_CLKCTRL_FRAC_EMIFRAC);
156 1.2.2.4 yamt tmp_r |= __SHIFTIN(frac, HW_CLKCTRL_FRAC_EMIFRAC);
157 1.2.2.4 yamt
158 1.2.2.4 yamt *emi_frac = tmp_r>>8;
159 1.2.2.2 yamt
160 1.2.2.2 yamt return;
161 1.2.2.2 yamt }
162 1.2.2.2 yamt /*
163 1.2.2.4 yamt * Set EMU divider value.
164 1.2.2.2 yamt */
165 1.2.2.4 yamt void
166 1.2.2.4 yamt set_emi_div(unsigned int div)
167 1.2.2.2 yamt {
168 1.2.2.4 yamt uint32_t tmp_r;
169 1.2.2.4 yamt
170 1.2.2.4 yamt while (REG_RD(CLKCTRL_EMI) &
171 1.2.2.4 yamt (HW_CLKCTRL_EMI_BUSY_REF_XTAL | HW_CLKCTRL_EMI_BUSY_REF_EMI))
172 1.2.2.4 yamt ;
173 1.2.2.4 yamt
174 1.2.2.4 yamt tmp_r = REG_RD(CLKCTRL_EMI);
175 1.2.2.4 yamt tmp_r &= ~(HW_CLKCTRL_EMI_CLKGATE | HW_CLKCTRL_EMI_DIV_EMI);
176 1.2.2.4 yamt tmp_r |= __SHIFTIN(div, HW_CLKCTRL_EMI_DIV_EMI);
177 1.2.2.4 yamt REG_WR(CLKCTRL_EMI, tmp_r);
178 1.2.2.4 yamt
179 1.2.2.2 yamt return;
180 1.2.2.2 yamt }
181 1.2.2.2 yamt /*
182 1.2.2.4 yamt * Set SSP divider value.
183 1.2.2.2 yamt */
184 1.2.2.4 yamt void
185 1.2.2.4 yamt set_ssp_div(unsigned int div)
186 1.2.2.2 yamt {
187 1.2.2.4 yamt uint32_t tmp_r;
188 1.2.2.2 yamt
189 1.2.2.4 yamt tmp_r = REG_RD(CLKCTRL_SSP);
190 1.2.2.4 yamt tmp_r &= ~HW_CLKCTRL_SSP_CLKGATE;
191 1.2.2.4 yamt REG_WR(CLKCTRL_SSP, tmp_r);
192 1.2.2.2 yamt
193 1.2.2.4 yamt while (REG_RD(CLKCTRL_SSP) & HW_CLKCTRL_SSP_BUSY)
194 1.2.2.4 yamt ;
195 1.2.2.4 yamt
196 1.2.2.4 yamt tmp_r = REG_RD(CLKCTRL_SSP);
197 1.2.2.4 yamt tmp_r &= ~HW_CLKCTRL_SSP_DIV;
198 1.2.2.4 yamt tmp_r |= __SHIFTIN(div, HW_CLKCTRL_SSP_DIV);
199 1.2.2.4 yamt REG_WR(CLKCTRL_SSP, tmp_r);
200 1.2.2.4 yamt
201 1.2.2.4 yamt while (REG_RD(CLKCTRL_SSP) & HW_CLKCTRL_SSP_BUSY)
202 1.2.2.4 yamt ;
203 1.2.2.2 yamt
204 1.2.2.2 yamt return;
205 1.2.2.2 yamt }
206 1.2.2.2 yamt /*
207 1.2.2.4 yamt * Set IO frac.
208 1.2.2.2 yamt */
209 1.2.2.4 yamt void
210 1.2.2.4 yamt set_io_frac(unsigned int frac)
211 1.2.2.2 yamt {
212 1.2.2.4 yamt uint8_t *io_frac;
213 1.2.2.4 yamt uint32_t tmp_r;
214 1.2.2.4 yamt
215 1.2.2.4 yamt io_frac = (uint8_t *)(CLKCTRL_FRAC);
216 1.2.2.4 yamt io_frac++; /* emi */
217 1.2.2.4 yamt io_frac++; /* pix */
218 1.2.2.4 yamt io_frac++; /* io */
219 1.2.2.4 yamt tmp_r = (*io_frac)<<24;
220 1.2.2.4 yamt tmp_r &= ~(HW_CLKCTRL_FRAC_CLKGATEIO | HW_CLKCTRL_FRAC_IOFRAC);
221 1.2.2.4 yamt tmp_r |= __SHIFTIN(frac, HW_CLKCTRL_FRAC_IOFRAC);
222 1.2.2.2 yamt
223 1.2.2.4 yamt *io_frac = (uint8_t)(tmp_r>>24);
224 1.2.2.2 yamt
225 1.2.2.2 yamt return;
226 1.2.2.2 yamt }
227