Blame view

arch/arm/mach-shmobile/clock-sh73a0.c 15.6 KB
6d9598e24   Magnus Damm   ARM: mach-shmobil...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /*
   * sh73a0 clock framework support
   *
   * Copyright (C) 2010 Magnus Damm
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/io.h>
  #include <linux/sh_clk.h>
6ef9f6fd8   Paul Mundt   ARM: mach-shmobil...
23
  #include <linux/clkdev.h>
6d9598e24   Magnus Damm   ARM: mach-shmobil...
24
  #include <mach/common.h>
6d9598e24   Magnus Damm   ARM: mach-shmobil...
25

f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  #define FRQCRA		0xe6150000
  #define FRQCRB		0xe6150004
  #define FRQCRD		0xe61500e4
  #define VCLKCR1		0xe6150008
  #define VCLKCR2		0xe615000C
  #define VCLKCR3		0xe615001C
  #define ZBCKCR		0xe6150010
  #define FLCKCR		0xe6150014
  #define SD0CKCR		0xe6150074
  #define SD1CKCR		0xe6150078
  #define SD2CKCR		0xe615007C
  #define FSIACKCR	0xe6150018
  #define FSIBCKCR	0xe6150090
  #define SUBCKCR		0xe6150080
  #define SPUACKCR	0xe6150084
  #define SPUVCKCR	0xe6150094
  #define MSUCKCR		0xe6150088
  #define HSICKCR		0xe615008C
  #define MFCK1CR		0xe6150098
  #define MFCK2CR		0xe615009C
  #define DSITCKCR	0xe6150060
  #define DSI0PCKCR	0xe6150064
  #define DSI1PCKCR	0xe6150068
  #define DSI0PHYCR	0xe615006C
  #define DSI1PHYCR	0xe6150070
  #define PLLECR		0xe61500d0
  #define PLL0CR		0xe61500d8
  #define PLL1CR		0xe6150028
  #define PLL2CR		0xe615002c
  #define PLL3CR		0xe61500dc
6d9598e24   Magnus Damm   ARM: mach-shmobil...
56
57
58
59
60
61
  #define SMSTPCR0	0xe6150130
  #define SMSTPCR1	0xe6150134
  #define SMSTPCR2	0xe6150138
  #define SMSTPCR3	0xe615013c
  #define SMSTPCR4	0xe6150140
  #define SMSTPCR5	0xe6150144
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
62
  #define CKSCR		0xe61500c0
6d9598e24   Magnus Damm   ARM: mach-shmobil...
63
64
65
66
67
  
  /* Fixed 32 KHz root clock from EXTALR pin */
  static struct clk r_clk = {
  	.rate           = 32768,
  };
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  /*
   * 26MHz default rate for the EXTAL1 root input clock.
   * If needed, reset this with clk_set_rate() from the platform code.
   */
  struct clk sh73a0_extal1_clk = {
  	.rate		= 26000000,
  };
  
  /*
   * 48MHz default rate for the EXTAL2 root input clock.
   * If needed, reset this with clk_set_rate() from the platform code.
   */
  struct clk sh73a0_extal2_clk = {
  	.rate		= 48000000,
  };
  
  /* A fixed divide-by-2 block */
  static unsigned long div2_recalc(struct clk *clk)
  {
  	return clk->parent->rate / 2;
  }
  
  static struct clk_ops div2_clk_ops = {
  	.recalc		= div2_recalc,
  };
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  static unsigned long div7_recalc(struct clk *clk)
  {
  	return clk->parent->rate / 7;
  }
  
  static struct clk_ops div7_clk_ops = {
  	.recalc		= div7_recalc,
  };
  
  static unsigned long div13_recalc(struct clk *clk)
  {
  	return clk->parent->rate / 13;
  }
  
  static struct clk_ops div13_clk_ops = {
  	.recalc		= div13_recalc,
  };
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  /* Divide extal1 by two */
  static struct clk extal1_div2_clk = {
  	.ops		= &div2_clk_ops,
  	.parent		= &sh73a0_extal1_clk,
  };
  
  /* Divide extal2 by two */
  static struct clk extal2_div2_clk = {
  	.ops		= &div2_clk_ops,
  	.parent		= &sh73a0_extal2_clk,
  };
  
  static struct clk_ops main_clk_ops = {
  	.recalc		= followparent_recalc,
  };
  
  /* Main clock */
  static struct clk main_clk = {
  	.ops		= &main_clk_ops,
  };
33661c9e2   Magnus Damm   ARM: mach-shmobil...
130
  /* Divide Main clock by two */
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
131
132
133
134
  static struct clk main_div2_clk = {
  	.ops		= &div2_clk_ops,
  	.parent		= &main_clk,
  };
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
135
136
137
138
  /* PLL0, PLL1, PLL2, PLL3 */
  static unsigned long pll_recalc(struct clk *clk)
  {
  	unsigned long mult = 1;
71fc5099e   Magnus Damm   ARM: mach-shmobil...
139
  	if (__raw_readl(PLLECR) & (1 << clk->enable_bit)) {
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
140
  		mult = (((__raw_readl(clk->enable_reg) >> 24) & 0x3f) + 1);
71fc5099e   Magnus Damm   ARM: mach-shmobil...
141
142
143
144
145
146
147
148
  		/* handle CFG bit for PLL1 and PLL2 */
  		switch (clk->enable_bit) {
  		case 1:
  		case 2:
  			if (__raw_readl(clk->enable_reg) & (1 << 20))
  				mult *= 2;
  		}
  	}
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  
  	return clk->parent->rate * mult;
  }
  
  static struct clk_ops pll_clk_ops = {
  	.recalc		= pll_recalc,
  };
  
  static struct clk pll0_clk = {
  	.ops		= &pll_clk_ops,
  	.flags		= CLK_ENABLE_ON_INIT,
  	.parent		= &main_clk,
  	.enable_reg	= (void __iomem *)PLL0CR,
  	.enable_bit	= 0,
6d9598e24   Magnus Damm   ARM: mach-shmobil...
163
  };
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  static struct clk pll1_clk = {
  	.ops		= &pll_clk_ops,
  	.flags		= CLK_ENABLE_ON_INIT,
  	.parent		= &main_clk,
  	.enable_reg	= (void __iomem *)PLL1CR,
  	.enable_bit	= 1,
  };
  
  static struct clk pll2_clk = {
  	.ops		= &pll_clk_ops,
  	.flags		= CLK_ENABLE_ON_INIT,
  	.parent		= &main_clk,
  	.enable_reg	= (void __iomem *)PLL2CR,
  	.enable_bit	= 2,
  };
  
  static struct clk pll3_clk = {
  	.ops		= &pll_clk_ops,
  	.flags		= CLK_ENABLE_ON_INIT,
  	.parent		= &main_clk,
  	.enable_reg	= (void __iomem *)PLL3CR,
  	.enable_bit	= 3,
  };
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
187
  /* Divide PLL */
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
188
189
190
  static struct clk pll1_div2_clk = {
  	.ops		= &div2_clk_ops,
  	.parent		= &pll1_clk,
b028f94b7   Takashi YOSHII   ARM: mach-shmobil...
191
  };
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
  static struct clk pll1_div7_clk = {
  	.ops		= &div7_clk_ops,
  	.parent		= &pll1_clk,
  };
  
  static struct clk pll1_div13_clk = {
  	.ops		= &div13_clk_ops,
  	.parent		= &pll1_clk,
  };
  
  /* External input clock */
  struct clk sh73a0_extcki_clk = {
  };
  
  struct clk sh73a0_extalr_clk = {
  };
6d9598e24   Magnus Damm   ARM: mach-shmobil...
208
209
  static struct clk *main_clks[] = {
  	&r_clk,
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
210
211
212
213
214
  	&sh73a0_extal1_clk,
  	&sh73a0_extal2_clk,
  	&extal1_div2_clk,
  	&extal2_div2_clk,
  	&main_clk,
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
215
  	&main_div2_clk,
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
216
217
218
219
220
  	&pll0_clk,
  	&pll1_clk,
  	&pll2_clk,
  	&pll3_clk,
  	&pll1_div2_clk,
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
221
222
223
224
  	&pll1_div7_clk,
  	&pll1_div13_clk,
  	&sh73a0_extcki_clk,
  	&sh73a0_extalr_clk,
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
225
226
227
228
229
230
231
232
233
234
235
236
237
  };
  
  static void div4_kick(struct clk *clk)
  {
  	unsigned long value;
  
  	/* set KICK bit in FRQCRB to update hardware setting */
  	value = __raw_readl(FRQCRB);
  	value |= (1 << 31);
  	__raw_writel(value, FRQCRB);
  }
  
  static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18,
c070c203c   Takashi YOSHII   ARM: mach-shmobil...
238
  			  24, 0, 36, 48, 7 };
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
  
  static struct clk_div_mult_table div4_div_mult_table = {
  	.divisors = divisors,
  	.nr_divisors = ARRAY_SIZE(divisors),
  };
  
  static struct clk_div4_table div4_table = {
  	.div_mult_table = &div4_div_mult_table,
  	.kick = div4_kick,
  };
  
  enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,
  	DIV4_Z, DIV4_ZTR, DIV4_ZT, DIV4_ZX, DIV4_HP, DIV4_NR };
  
  #define DIV4(_reg, _bit, _mask, _flags) \
  	SH_CLK_DIV4(&pll1_clk, _reg, _bit, _mask, _flags)
  
  static struct clk div4_clks[DIV4_NR] = {
  	[DIV4_I] = DIV4(FRQCRA, 20, 0xfff, CLK_ENABLE_ON_INIT),
  	[DIV4_ZG] = DIV4(FRQCRA, 16, 0xbff, CLK_ENABLE_ON_INIT),
dcdb318f2   Magnus Damm   ARM: mach-shmobil...
259
  	[DIV4_M3] = DIV4(FRQCRA, 12, 0xfff, CLK_ENABLE_ON_INIT),
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
  	[DIV4_B] = DIV4(FRQCRA, 8, 0xfff, CLK_ENABLE_ON_INIT),
  	[DIV4_M1] = DIV4(FRQCRA, 4, 0xfff, 0),
  	[DIV4_M2] = DIV4(FRQCRA, 0, 0xfff, 0),
  	[DIV4_Z] = DIV4(FRQCRB, 24, 0xbff, 0),
  	[DIV4_ZTR] = DIV4(FRQCRB, 20, 0xfff, 0),
  	[DIV4_ZT] = DIV4(FRQCRB, 16, 0xfff, 0),
  	[DIV4_ZX] = DIV4(FRQCRB, 12, 0xfff, 0),
  	[DIV4_HP] = DIV4(FRQCRB, 4, 0xfff, 0),
  };
  
  enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1,
  	DIV6_FLCTL, DIV6_SDHI0, DIV6_SDHI1, DIV6_SDHI2,
  	DIV6_FSIA, DIV6_FSIB, DIV6_SUB,
  	DIV6_SPUA, DIV6_SPUV, DIV6_MSU,
  	DIV6_HSI,  DIV6_MFG1, DIV6_MFG2,
  	DIV6_DSIT, DIV6_DSI0P, DIV6_DSI1P,
  	DIV6_NR };
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
  static struct clk *vck_parent[8] = {
  	[0] = &pll1_div2_clk,
  	[1] = &pll2_clk,
  	[2] = &sh73a0_extcki_clk,
  	[3] = &sh73a0_extal2_clk,
  	[4] = &main_div2_clk,
  	[5] = &sh73a0_extalr_clk,
  	[6] = &main_clk,
  };
  
  static struct clk *pll_parent[4] = {
  	[0] = &pll1_div2_clk,
  	[1] = &pll2_clk,
  	[2] = &pll1_div13_clk,
  };
  
  static struct clk *hsi_parent[4] = {
  	[0] = &pll1_div2_clk,
  	[1] = &pll2_clk,
  	[2] = &pll1_div7_clk,
  };
  
  static struct clk *pll_extal2_parent[] = {
  	[0] = &pll1_div2_clk,
  	[1] = &pll2_clk,
  	[2] = &sh73a0_extal2_clk,
  	[3] = &sh73a0_extal2_clk,
  };
  
  static struct clk *dsi_parent[8] = {
  	[0] = &pll1_div2_clk,
  	[1] = &pll2_clk,
  	[2] = &main_clk,
  	[3] = &sh73a0_extal2_clk,
  	[4] = &sh73a0_extcki_clk,
  };
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
313
  static struct clk div6_clks[DIV6_NR] = {
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
314
315
316
317
318
319
  	[DIV6_VCK1] = SH_CLK_DIV6_EXT(VCLKCR1, 0,
  			vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
  	[DIV6_VCK2] = SH_CLK_DIV6_EXT(VCLKCR2, 0,
  			vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
  	[DIV6_VCK3] = SH_CLK_DIV6_EXT(VCLKCR3, 0,
  			vck_parent, ARRAY_SIZE(vck_parent), 12, 3),
ca371d285   Paul Mundt   Merge branch 'mas...
320
  	[DIV6_ZB1] = SH_CLK_DIV6_EXT(ZBCKCR, CLK_ENABLE_ON_INIT,
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
  			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
  	[DIV6_FLCTL] = SH_CLK_DIV6_EXT(FLCKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
  	[DIV6_SDHI0] = SH_CLK_DIV6_EXT(SD0CKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
  	[DIV6_SDHI1] = SH_CLK_DIV6_EXT(SD1CKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
  	[DIV6_SDHI2] = SH_CLK_DIV6_EXT(SD2CKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 6, 2),
  	[DIV6_FSIA] = SH_CLK_DIV6_EXT(FSIACKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 6, 1),
  	[DIV6_FSIB] = SH_CLK_DIV6_EXT(FSIBCKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 6, 1),
  	[DIV6_SUB] = SH_CLK_DIV6_EXT(SUBCKCR, 0,
  			pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
  	[DIV6_SPUA] = SH_CLK_DIV6_EXT(SPUACKCR, 0,
  			pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
  	[DIV6_SPUV] = SH_CLK_DIV6_EXT(SPUVCKCR, 0,
  			pll_extal2_parent, ARRAY_SIZE(pll_extal2_parent), 6, 2),
  	[DIV6_MSU] = SH_CLK_DIV6_EXT(MSUCKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
  	[DIV6_HSI] = SH_CLK_DIV6_EXT(HSICKCR, 0,
  			hsi_parent, ARRAY_SIZE(hsi_parent), 6, 2),
  	[DIV6_MFG1] = SH_CLK_DIV6_EXT(MFCK1CR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
  	[DIV6_MFG2] = SH_CLK_DIV6_EXT(MFCK2CR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
  	[DIV6_DSIT] = SH_CLK_DIV6_EXT(DSITCKCR, 0,
  			pll_parent, ARRAY_SIZE(pll_parent), 7, 1),
  	[DIV6_DSI0P] = SH_CLK_DIV6_EXT(DSI0PCKCR, 0,
  			dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3),
  	[DIV6_DSI1P] = SH_CLK_DIV6_EXT(DSI1PCKCR, 0,
  			dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3),
6d9598e24   Magnus Damm   ARM: mach-shmobil...
354
  };
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
355
  enum { MSTP001,
ad054cbd7   Magnus Damm   ARM: mach-shmobil...
356
  	MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100,
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
357
358
  	MSTP219,
  	MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
681e1b3ee   Magnus Damm   ARM: mach-shmobil...
359
360
  	MSTP331, MSTP329, MSTP325, MSTP323, MSTP318,
  	MSTP314, MSTP313, MSTP312, MSTP311,
33661c9e2   Magnus Damm   ARM: mach-shmobil...
361
  	MSTP303, MSTP302, MSTP301, MSTP300,
696d6e178   Kuninori Morimoto   ARM: mach-shmobil...
362
  	MSTP411, MSTP410, MSTP403,
6d9598e24   Magnus Damm   ARM: mach-shmobil...
363
364
365
366
367
368
  	MSTP_NR };
  
  #define MSTP(_parent, _reg, _bit, _flags) \
  	SH_CLK_MSTP32(_parent, _reg, _bit, _flags)
  
  static struct clk mstp_clks[MSTP_NR] = {
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
369
  	[MSTP001] = MSTP(&div4_clks[DIV4_HP], SMSTPCR0, 1, 0), /* IIC2 */
ad054cbd7   Magnus Damm   ARM: mach-shmobil...
370
371
372
373
  	[MSTP129] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 29, 0), /* CEU1 */
  	[MSTP128] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 28, 0), /* CSI2-RX1 */
  	[MSTP127] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 27, 0), /* CEU0 */
  	[MSTP126] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 26, 0), /* CSI2-RX0 */
5010f3db9   Magnus Damm   ARM: mach-shmobil...
374
  	[MSTP125] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */
170c7ab58   Magnus Damm   ARM: mach-shmobil...
375
  	[MSTP118] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 18, 0), /* DSITX0 */
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
376
  	[MSTP116] = MSTP(&div4_clks[DIV4_HP], SMSTPCR1, 16, 0), /* IIC0 */
170c7ab58   Magnus Damm   ARM: mach-shmobil...
377
  	[MSTP100] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
378
379
380
381
382
383
384
385
386
  	[MSTP219] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 19, 0), /* SCIFA7 */
  	[MSTP207] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 7, 0), /* SCIFA5 */
  	[MSTP206] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 6, 0), /* SCIFB */
  	[MSTP204] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 4, 0), /* SCIFA0 */
  	[MSTP203] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 3, 0), /* SCIFA1 */
  	[MSTP202] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 2, 0), /* SCIFA2 */
  	[MSTP201] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 1, 0), /* SCIFA3 */
  	[MSTP200] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 0, 0), /* SCIFA4 */
  	[MSTP331] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 31, 0), /* SCIFA6 */
6d9598e24   Magnus Damm   ARM: mach-shmobil...
387
  	[MSTP329] = MSTP(&r_clk, SMSTPCR3, 29, 0), /* CMT10 */
5a1b70a48   Magnus Damm   ARM: mach-shmobil...
388
  	[MSTP325] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR3, 25, 0), /* IrDA */
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
389
  	[MSTP323] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 23, 0), /* IIC1 */
681e1b3ee   Magnus Damm   ARM: mach-shmobil...
390
  	[MSTP318] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 18, 0), /* SY-DMAC */
fb66c5238   Magnus Damm   ARM: mach-shmobil...
391
392
  	[MSTP314] = MSTP(&div6_clks[DIV6_SDHI0], SMSTPCR3, 14, 0), /* SDHI0 */
  	[MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */
6bf45a101   Takashi YOSHII   ARM: mach-shmobil...
393
  	[MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */
fb66c5238   Magnus Damm   ARM: mach-shmobil...
394
  	[MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */
33661c9e2   Magnus Damm   ARM: mach-shmobil...
395
396
397
398
  	[MSTP303] = MSTP(&main_div2_clk, SMSTPCR3, 3, 0), /* TPU1 */
  	[MSTP302] = MSTP(&main_div2_clk, SMSTPCR3, 2, 0), /* TPU2 */
  	[MSTP301] = MSTP(&main_div2_clk, SMSTPCR3, 1, 0), /* TPU3 */
  	[MSTP300] = MSTP(&main_div2_clk, SMSTPCR3, 0, 0), /* TPU4 */
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
399
400
  	[MSTP411] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 11, 0), /* IIC3 */
  	[MSTP410] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 10, 0), /* IIC4 */
019c4ae31   Magnus Damm   ARM: mach-shmobil...
401
  	[MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */
6d9598e24   Magnus Damm   ARM: mach-shmobil...
402
  };
6d9598e24   Magnus Damm   ARM: mach-shmobil...
403
  static struct clk_lookup lookups[] = {
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
404
405
  	/* main clocks */
  	CLKDEV_CON_ID("r_clk", &r_clk),
170c7ab58   Magnus Damm   ARM: mach-shmobil...
406
  	/* DIV6 clocks */
ad054cbd7   Magnus Damm   ARM: mach-shmobil...
407
408
409
  	CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]),
  	CLKDEV_CON_ID("vck2_clk", &div6_clks[DIV6_VCK2]),
  	CLKDEV_CON_ID("vck3_clk", &div6_clks[DIV6_VCK3]),
fb66c5238   Magnus Damm   ARM: mach-shmobil...
410
411
412
  	CLKDEV_CON_ID("sdhi0_clk", &div6_clks[DIV6_SDHI0]),
  	CLKDEV_CON_ID("sdhi1_clk", &div6_clks[DIV6_SDHI1]),
  	CLKDEV_CON_ID("sdhi2_clk", &div6_clks[DIV6_SDHI2]),
170c7ab58   Magnus Damm   ARM: mach-shmobil...
413
414
  	CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSIT]),
  	CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]),
9250741e5   Kuninori Morimoto   fbdev: sh_mipi_ds...
415
416
  	CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]),
  	CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]),
170c7ab58   Magnus Damm   ARM: mach-shmobil...
417

6d9598e24   Magnus Damm   ARM: mach-shmobil...
418
  	/* MSTP32 clocks */
696d6e178   Kuninori Morimoto   ARM: mach-shmobil...
419
  	CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */
ad054cbd7   Magnus Damm   ARM: mach-shmobil...
420
421
422
423
  	CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP129]), /* CEU1 */
  	CLKDEV_DEV_ID("sh-mobile-csi2.1", &mstp_clks[MSTP128]), /* CSI2-RX1 */
  	CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU0 */
  	CLKDEV_DEV_ID("sh-mobile-csi2.0", &mstp_clks[MSTP126]), /* CSI2-RX0 */
5010f3db9   Magnus Damm   ARM: mach-shmobil...
424
425
  	CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP125]), /* TMU00 */
  	CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */
170c7ab58   Magnus Damm   ARM: mach-shmobil...
426
  	CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */
ad054cbd7   Magnus Damm   ARM: mach-shmobil...
427
428
  	CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */
  	CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */
6d9598e24   Magnus Damm   ARM: mach-shmobil...
429
430
431
432
433
434
435
436
437
438
  	CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */
  	CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP207]), /* SCIFA5 */
  	CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP206]), /* SCIFB */
  	CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]), /* SCIFA0 */
  	CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]), /* SCIFA1 */
  	CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP202]), /* SCIFA2 */
  	CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP201]), /* SCIFA3 */
  	CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */
  	CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP331]), /* SCIFA6 */
  	CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]), /* CMT10 */
a33bb8a2c   Kuninori Morimoto   ARM: mach-shmobil...
439
  	CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */
b028f94b7   Takashi YOSHII   ARM: mach-shmobil...
440
  	CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* I2C1 */
681e1b3ee   Magnus Damm   ARM: mach-shmobil...
441
  	CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP318]), /* SY-DMAC */
fb66c5238   Magnus Damm   ARM: mach-shmobil...
442
443
  	CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */
  	CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
6bf45a101   Takashi YOSHII   ARM: mach-shmobil...
444
  	CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */
fb66c5238   Magnus Damm   ARM: mach-shmobil...
445
  	CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */
33661c9e2   Magnus Damm   ARM: mach-shmobil...
446
447
448
449
  	CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */
  	CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */
  	CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */
  	CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */
b028f94b7   Takashi YOSHII   ARM: mach-shmobil...
450
451
  	CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */
  	CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */
019c4ae31   Magnus Damm   ARM: mach-shmobil...
452
  	CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */
6d9598e24   Magnus Damm   ARM: mach-shmobil...
453
454
455
456
457
  };
  
  void __init sh73a0_clock_init(void)
  {
  	int k, ret = 0;
fb66c5238   Magnus Damm   ARM: mach-shmobil...
458
459
460
461
  	/* Set SDHI clocks to a known state */
  	__raw_writel(0x108, SD0CKCR);
  	__raw_writel(0x108, SD1CKCR);
  	__raw_writel(0x108, SD2CKCR);
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
462
  	/* detect main clock parent */
86d84083c   Kuninori Morimoto   ARM: mach-shmobil...
463
  	switch ((__raw_readl(CKSCR) >> 28) & 0x03) {
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
464
465
466
467
468
469
470
471
472
473
474
475
476
  	case 0:
  		main_clk.parent = &sh73a0_extal1_clk;
  		break;
  	case 1:
  		main_clk.parent = &extal1_div2_clk;
  		break;
  	case 2:
  		main_clk.parent = &sh73a0_extal2_clk;
  		break;
  	case 3:
  		main_clk.parent = &extal2_div2_clk;
  		break;
  	}
6d9598e24   Magnus Damm   ARM: mach-shmobil...
477
478
479
480
  	for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
  		ret = clk_register(main_clks[k]);
  
  	if (!ret)
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
481
482
483
  		ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
  
  	if (!ret)
d4775356b   Kuninori Morimoto   sh: clkfwk: clock...
484
  		ret = sh_clk_div6_reparent_register(div6_clks, DIV6_NR);
f6d84f4a7   Magnus Damm   ARM: mach-shmobil...
485
486
  
  	if (!ret)
6d9598e24   Magnus Damm   ARM: mach-shmobil...
487
488
489
490
491
492
493
494
495
496
  		ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR);
  
  	clkdev_add_table(lookups, ARRAY_SIZE(lookups));
  
  	if (!ret)
  		clk_init();
  	else
  		panic("failed to setup sh73a0 clocks
  ");
  }