]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arm/mach-shmobile/clock-r8a7790.c
ca980669806fca38fe8e7da207e05652d5319aa8
[karo-tx-linux.git] / arch / arm / mach-shmobile / clock-r8a7790.c
1 /*
2  * r8a7790 clock framework support
3  *
4  * Copyright (C) 2013  Renesas Solutions Corp.
5  * Copyright (C) 2013  Magnus Damm
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; version 2 of the License.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 #include <linux/init.h>
21 #include <linux/io.h>
22 #include <linux/kernel.h>
23 #include <linux/sh_clk.h>
24 #include <linux/clkdev.h>
25 #include <mach/r8a7790.h>
26 #include "clock.h"
27 #include "common.h"
28 #include "rcar-gen2.h"
29
30 /*
31  *   MD         EXTAL           PLL0    PLL1    PLL3
32  * 14 13 19     (MHz)           *1      *1
33  *---------------------------------------------------
34  * 0  0  0      15 x 1          x172/2  x208/2  x106
35  * 0  0  1      15 x 1          x172/2  x208/2  x88
36  * 0  1  0      20 x 1          x130/2  x156/2  x80
37  * 0  1  1      20 x 1          x130/2  x156/2  x66
38  * 1  0  0      26 / 2          x200/2  x240/2  x122
39  * 1  0  1      26 / 2          x200/2  x240/2  x102
40  * 1  1  0      30 / 2          x172/2  x208/2  x106
41  * 1  1  1      30 / 2          x172/2  x208/2  x88
42  *
43  * *1 : Table 7.6 indicates VCO ouput (PLLx = VCO/2)
44  *      see "p1 / 2" on R8A7790_CLOCK_ROOT() below
45  */
46
47 #define CPG_BASE        0xe6150000
48 #define CPG_LEN         0x1000
49
50 #define SMSTPCR1        0xe6150134
51 #define SMSTPCR2        0xe6150138
52 #define SMSTPCR3        0xe615013c
53 #define SMSTPCR5        0xe6150144
54 #define SMSTPCR7        0xe615014c
55 #define SMSTPCR8        0xe6150990
56 #define SMSTPCR9        0xe6150994
57 #define SMSTPCR10       0xe6150998
58
59 #define MSTPSR1         IOMEM(0xe6150038)
60 #define MSTPSR2         IOMEM(0xe6150040)
61 #define MSTPSR3         IOMEM(0xe6150048)
62 #define MSTPSR5         IOMEM(0xe615003c)
63 #define MSTPSR7         IOMEM(0xe61501c4)
64 #define MSTPSR8         IOMEM(0xe61509a0)
65 #define MSTPSR9         IOMEM(0xe61509a4)
66 #define MSTPSR10        IOMEM(0xe61509a8)
67
68 #define SDCKCR          0xE6150074
69 #define SD2CKCR         0xE6150078
70 #define SD3CKCR         0xE615007C
71 #define MMC0CKCR        0xE6150240
72 #define MMC1CKCR        0xE6150244
73 #define SSPCKCR         0xE6150248
74 #define SSPRSCKCR       0xE615024C
75
76 static struct clk_mapping cpg_mapping = {
77         .phys   = CPG_BASE,
78         .len    = CPG_LEN,
79 };
80
81 static struct clk extal_clk = {
82         /* .rate will be updated on r8a7790_clock_init() */
83         .mapping        = &cpg_mapping,
84 };
85
86 static struct sh_clk_ops followparent_clk_ops = {
87         .recalc = followparent_recalc,
88 };
89
90 static struct clk main_clk = {
91         /* .parent will be set r8a7790_clock_init */
92         .ops    = &followparent_clk_ops,
93 };
94
95 static struct clk audio_clk_a = {
96 };
97
98 static struct clk audio_clk_b = {
99 };
100
101 static struct clk audio_clk_c = {
102 };
103
104 /*
105  * clock ratio of these clock will be updated
106  * on r8a7790_clock_init()
107  */
108 SH_FIXED_RATIO_CLK_SET(pll1_clk,                main_clk,       1, 1);
109 SH_FIXED_RATIO_CLK_SET(pll3_clk,                main_clk,       1, 1);
110 SH_FIXED_RATIO_CLK_SET(lb_clk,                  pll1_clk,       1, 1);
111 SH_FIXED_RATIO_CLK_SET(qspi_clk,                pll1_clk,       1, 1);
112
113 /* fixed ratio clock */
114 SH_FIXED_RATIO_CLK_SET(extal_div2_clk,          extal_clk,      1, 2);
115 SH_FIXED_RATIO_CLK_SET(cp_clk,                  extal_clk,      1, 2);
116
117 SH_FIXED_RATIO_CLK_SET(pll1_div2_clk,           pll1_clk,       1, 2);
118 SH_FIXED_RATIO_CLK_SET(zg_clk,                  pll1_clk,       1, 3);
119 SH_FIXED_RATIO_CLK_SET(zx_clk,                  pll1_clk,       1, 3);
120 SH_FIXED_RATIO_CLK_SET(zs_clk,                  pll1_clk,       1, 6);
121 SH_FIXED_RATIO_CLK_SET(hp_clk,                  pll1_clk,       1, 12);
122 SH_FIXED_RATIO_CLK_SET(i_clk,                   pll1_clk,       1, 2);
123 SH_FIXED_RATIO_CLK_SET(b_clk,                   pll1_clk,       1, 12);
124 SH_FIXED_RATIO_CLK_SET(p_clk,                   pll1_clk,       1, 24);
125 SH_FIXED_RATIO_CLK_SET(cl_clk,                  pll1_clk,       1, 48);
126 SH_FIXED_RATIO_CLK_SET(m2_clk,                  pll1_clk,       1, 8);
127 SH_FIXED_RATIO_CLK_SET(imp_clk,                 pll1_clk,       1, 4);
128 SH_FIXED_RATIO_CLK_SET(rclk_clk,                pll1_clk,       1, (48 * 1024));
129 SH_FIXED_RATIO_CLK_SET(oscclk_clk,              pll1_clk,       1, (12 * 1024));
130
131 SH_FIXED_RATIO_CLK_SET(zb3_clk,                 pll3_clk,       1, 4);
132 SH_FIXED_RATIO_CLK_SET(zb3d2_clk,               pll3_clk,       1, 8);
133 SH_FIXED_RATIO_CLK_SET(ddr_clk,                 pll3_clk,       1, 8);
134 SH_FIXED_RATIO_CLK_SET(mp_clk,                  pll1_div2_clk,  1, 15);
135
136 static struct clk *main_clks[] = {
137         &audio_clk_a,
138         &audio_clk_b,
139         &audio_clk_c,
140         &extal_clk,
141         &extal_div2_clk,
142         &main_clk,
143         &pll1_clk,
144         &pll1_div2_clk,
145         &pll3_clk,
146         &lb_clk,
147         &qspi_clk,
148         &zg_clk,
149         &zx_clk,
150         &zs_clk,
151         &hp_clk,
152         &i_clk,
153         &b_clk,
154         &p_clk,
155         &cl_clk,
156         &m2_clk,
157         &imp_clk,
158         &rclk_clk,
159         &oscclk_clk,
160         &zb3_clk,
161         &zb3d2_clk,
162         &ddr_clk,
163         &mp_clk,
164         &cp_clk,
165 };
166
167 /* SDHI (DIV4) clock */
168 static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, 24, 0, 36, 48, 10 };
169
170 static struct clk_div_mult_table div4_div_mult_table = {
171         .divisors = divisors,
172         .nr_divisors = ARRAY_SIZE(divisors),
173 };
174
175 static struct clk_div4_table div4_table = {
176         .div_mult_table = &div4_div_mult_table,
177 };
178
179 enum {
180         DIV4_SDH, DIV4_SD0, DIV4_SD1, DIV4_NR
181 };
182
183 static struct clk div4_clks[DIV4_NR] = {
184         [DIV4_SDH] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 8, 0x0dff, CLK_ENABLE_ON_INIT),
185         [DIV4_SD0] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 4, 0x1de0, CLK_ENABLE_ON_INIT),
186         [DIV4_SD1] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 0, 0x1de0, CLK_ENABLE_ON_INIT),
187 };
188
189 /* DIV6 clocks */
190 enum {
191         DIV6_SD2, DIV6_SD3,
192         DIV6_MMC0, DIV6_MMC1,
193         DIV6_SSP, DIV6_SSPRS,
194         DIV6_NR
195 };
196
197 static struct clk div6_clks[DIV6_NR] = {
198         [DIV6_SD2]      = SH_CLK_DIV6(&pll1_div2_clk, SD2CKCR, 0),
199         [DIV6_SD3]      = SH_CLK_DIV6(&pll1_div2_clk, SD3CKCR, 0),
200         [DIV6_MMC0]     = SH_CLK_DIV6(&pll1_div2_clk, MMC0CKCR, 0),
201         [DIV6_MMC1]     = SH_CLK_DIV6(&pll1_div2_clk, MMC1CKCR, 0),
202         [DIV6_SSP]      = SH_CLK_DIV6(&pll1_div2_clk, SSPCKCR, 0),
203         [DIV6_SSPRS]    = SH_CLK_DIV6(&pll1_div2_clk, SSPRSCKCR, 0),
204 };
205
206 /* MSTP */
207 enum {
208         MSTP1017, /* parent of SCU */
209
210         MSTP1031, MSTP1030,
211         MSTP1029, MSTP1028, MSTP1027, MSTP1026, MSTP1025, MSTP1024, MSTP1023, MSTP1022,
212         MSTP1015, MSTP1014, MSTP1013, MSTP1012, MSTP1011, MSTP1010,
213         MSTP1009, MSTP1008, MSTP1007, MSTP1006, MSTP1005,
214         MSTP931, MSTP930, MSTP929, MSTP928,
215         MSTP917,
216         MSTP815, MSTP814,
217         MSTP813,
218         MSTP811, MSTP810, MSTP809, MSTP808,
219         MSTP726, MSTP725, MSTP724, MSTP723, MSTP722, MSTP721, MSTP720,
220         MSTP717, MSTP716,
221         MSTP704, MSTP703,
222         MSTP522,
223         MSTP502, MSTP501,
224         MSTP315, MSTP314, MSTP313, MSTP312, MSTP311, MSTP305, MSTP304,
225         MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202,
226         MSTP124,
227         MSTP_NR
228 };
229
230 static struct clk mstp_clks[MSTP_NR] = {
231         [MSTP1031] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 31, MSTPSR10, 0), /* SCU0 */
232         [MSTP1030] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 30, MSTPSR10, 0), /* SCU1 */
233         [MSTP1029] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 29, MSTPSR10, 0), /* SCU2 */
234         [MSTP1028] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 28, MSTPSR10, 0), /* SCU3 */
235         [MSTP1027] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 27, MSTPSR10, 0), /* SCU4 */
236         [MSTP1026] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 26, MSTPSR10, 0), /* SCU5 */
237         [MSTP1025] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 25, MSTPSR10, 0), /* SCU6 */
238         [MSTP1024] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 24, MSTPSR10, 0), /* SCU7 */
239         [MSTP1023] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 23, MSTPSR10, 0), /* SCU8 */
240         [MSTP1022] = SH_CLK_MSTP32_STS(&mstp_clks[MSTP1017], SMSTPCR10, 22, MSTPSR10, 0), /* SCU9 */
241         [MSTP1017] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 17, MSTPSR10, 0), /* SCU */
242         [MSTP1015] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 15, MSTPSR10, 0), /* SSI0 */
243         [MSTP1014] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 14, MSTPSR10, 0), /* SSI1 */
244         [MSTP1013] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 13, MSTPSR10, 0), /* SSI2 */
245         [MSTP1012] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 12, MSTPSR10, 0), /* SSI3 */
246         [MSTP1011] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 11, MSTPSR10, 0), /* SSI4 */
247         [MSTP1010] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 10, MSTPSR10, 0), /* SSI5 */
248         [MSTP1009] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 9, MSTPSR10, 0), /* SSI6 */
249         [MSTP1008] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 8, MSTPSR10, 0), /* SSI7 */
250         [MSTP1007] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 7, MSTPSR10, 0), /* SSI8 */
251         [MSTP1006] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 6, MSTPSR10, 0), /* SSI9 */
252         [MSTP1005] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR10, 5, MSTPSR10, 0), /* SSI ALL */
253         [MSTP931] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 31, MSTPSR9, 0), /* I2C0 */
254         [MSTP930] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 30, MSTPSR9, 0), /* I2C1 */
255         [MSTP929] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 29, MSTPSR9, 0), /* I2C2 */
256         [MSTP928] = SH_CLK_MSTP32_STS(&hp_clk, SMSTPCR9, 28, MSTPSR9, 0), /* I2C3 */
257         [MSTP917] = SH_CLK_MSTP32_STS(&qspi_clk, SMSTPCR9, 17, MSTPSR9, 0), /* QSPI */
258         [MSTP815] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR8, 15, MSTPSR8, 0), /* SATA0 */
259         [MSTP814] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR8, 14, MSTPSR8, 0), /* SATA1 */
260         [MSTP813] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR8, 13, MSTPSR8, 0), /* Ether */
261         [MSTP811] = SH_CLK_MSTP32_STS(&zg_clk, SMSTPCR8, 11, MSTPSR8, 0), /* VIN0 */
262         [MSTP810] = SH_CLK_MSTP32_STS(&zg_clk, SMSTPCR8, 10, MSTPSR8, 0), /* VIN1 */
263         [MSTP809] = SH_CLK_MSTP32_STS(&zg_clk, SMSTPCR8,  9, MSTPSR8, 0), /* VIN2 */
264         [MSTP808] = SH_CLK_MSTP32_STS(&zg_clk, SMSTPCR8,  8, MSTPSR8, 0), /* VIN3 */
265         [MSTP726] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 26, MSTPSR7, 0), /* LVDS0 */
266         [MSTP725] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 25, MSTPSR7, 0), /* LVDS1 */
267         [MSTP724] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 24, MSTPSR7, 0), /* DU0 */
268         [MSTP723] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 23, MSTPSR7, 0), /* DU1 */
269         [MSTP722] = SH_CLK_MSTP32_STS(&zx_clk, SMSTPCR7, 22, MSTPSR7, 0), /* DU2 */
270         [MSTP721] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 21, MSTPSR7, 0), /* SCIF0 */
271         [MSTP720] = SH_CLK_MSTP32_STS(&p_clk, SMSTPCR7, 20, MSTPSR7, 0), /* SCIF1 */
272         [MSTP717] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR7, 17, MSTPSR7, 0), /* HSCIF0 */
273         [MSTP716] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR7, 16, MSTPSR7, 0), /* HSCIF1 */
274         [MSTP704] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR7, 4, MSTPSR7, 0), /* HSUSB */
275         [MSTP703] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR7, 3, MSTPSR7, 0), /* EHCI */
276         [MSTP522] = SH_CLK_MSTP32_STS(&extal_clk, SMSTPCR5, 22, MSTPSR5, 0), /* Thermal */
277         [MSTP502] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR5, 2, MSTPSR5, 0), /* Audio-DMAC low */
278         [MSTP501] = SH_CLK_MSTP32_STS(&zs_clk, SMSTPCR5, 1, MSTPSR5, 0), /* Audio-DMAC hi */
279         [MSTP315] = SH_CLK_MSTP32_STS(&div6_clks[DIV6_MMC0], SMSTPCR3, 15, MSTPSR3, 0), /* MMC0 */
280         [MSTP314] = SH_CLK_MSTP32_STS(&div4_clks[DIV4_SD0], SMSTPCR3, 14, MSTPSR3, 0), /* SDHI0 */
281         [MSTP313] = SH_CLK_MSTP32_STS(&div4_clks[DIV4_SD1], SMSTPCR3, 13, MSTPSR3, 0), /* SDHI1 */
282         [MSTP312] = SH_CLK_MSTP32_STS(&div6_clks[DIV6_SD2], SMSTPCR3, 12, MSTPSR3, 0), /* SDHI2 */
283         [MSTP311] = SH_CLK_MSTP32_STS(&div6_clks[DIV6_SD3], SMSTPCR3, 11, MSTPSR3, 0), /* SDHI3 */
284         [MSTP305] = SH_CLK_MSTP32_STS(&div6_clks[DIV6_MMC1], SMSTPCR3, 5, MSTPSR3, 0), /* MMC1 */
285         [MSTP304] = SH_CLK_MSTP32_STS(&cp_clk, SMSTPCR3, 4, MSTPSR3, 0), /* TPU0 */
286         [MSTP216] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 16, MSTPSR2, 0), /* SCIFB2 */
287         [MSTP207] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 7, MSTPSR2, 0), /* SCIFB1 */
288         [MSTP206] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 6, MSTPSR2, 0), /* SCIFB0 */
289         [MSTP204] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 4, MSTPSR2, 0), /* SCIFA0 */
290         [MSTP203] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 3, MSTPSR2, 0), /* SCIFA1 */
291         [MSTP202] = SH_CLK_MSTP32_STS(&mp_clk, SMSTPCR2, 2, MSTPSR2, 0), /* SCIFA2 */
292         [MSTP124] = SH_CLK_MSTP32_STS(&rclk_clk, SMSTPCR1, 24, MSTPSR1, 0), /* CMT0 */
293 };
294
295 static struct clk_lookup lookups[] = {
296
297         /* main clocks */
298         CLKDEV_CON_ID("extal",          &extal_clk),
299         CLKDEV_CON_ID("extal_div2",     &extal_div2_clk),
300         CLKDEV_CON_ID("main",           &main_clk),
301         CLKDEV_CON_ID("pll1",           &pll1_clk),
302         CLKDEV_CON_ID("pll1_div2",      &pll1_div2_clk),
303         CLKDEV_CON_ID("pll3",           &pll3_clk),
304         CLKDEV_CON_ID("zg",             &zg_clk),
305         CLKDEV_CON_ID("zx",             &zx_clk),
306         CLKDEV_CON_ID("zs",             &zs_clk),
307         CLKDEV_CON_ID("hp",             &hp_clk),
308         CLKDEV_CON_ID("i",              &i_clk),
309         CLKDEV_CON_ID("b",              &b_clk),
310         CLKDEV_CON_ID("lb",             &lb_clk),
311         CLKDEV_CON_ID("p",              &p_clk),
312         CLKDEV_CON_ID("cl",             &cl_clk),
313         CLKDEV_CON_ID("m2",             &m2_clk),
314         CLKDEV_CON_ID("imp",            &imp_clk),
315         CLKDEV_CON_ID("rclk",           &rclk_clk),
316         CLKDEV_CON_ID("oscclk",         &oscclk_clk),
317         CLKDEV_CON_ID("zb3",            &zb3_clk),
318         CLKDEV_CON_ID("zb3d2",          &zb3d2_clk),
319         CLKDEV_CON_ID("ddr",            &ddr_clk),
320         CLKDEV_CON_ID("mp",             &mp_clk),
321         CLKDEV_CON_ID("qspi",           &qspi_clk),
322         CLKDEV_CON_ID("cp",             &cp_clk),
323
324         /* DIV4 */
325         CLKDEV_CON_ID("sdh",            &div4_clks[DIV4_SDH]),
326
327         /* DIV6 */
328         CLKDEV_CON_ID("ssp",            &div6_clks[DIV6_SSP]),
329         CLKDEV_CON_ID("ssprs",          &div6_clks[DIV6_SSPRS]),
330
331         /* MSTP */
332         CLKDEV_DEV_ID("rcar_sound", &mstp_clks[MSTP1005]),
333         CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]),
334         CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]),
335         CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP206]),
336         CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP207]),
337         CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]),
338         CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP202]),
339         CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP721]),
340         CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP720]),
341         CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP717]),
342         CLKDEV_DEV_ID("sh-sci.9", &mstp_clks[MSTP716]),
343         CLKDEV_DEV_ID("i2c-rcar_gen2.0", &mstp_clks[MSTP931]),
344         CLKDEV_DEV_ID("i2c-rcar_gen2.1", &mstp_clks[MSTP930]),
345         CLKDEV_DEV_ID("i2c-rcar_gen2.2", &mstp_clks[MSTP929]),
346         CLKDEV_DEV_ID("i2c-rcar_gen2.3", &mstp_clks[MSTP928]),
347         CLKDEV_DEV_ID("r8a7790-ether", &mstp_clks[MSTP813]),
348         CLKDEV_DEV_ID("r8a7790-vin.0", &mstp_clks[MSTP811]),
349         CLKDEV_DEV_ID("r8a7790-vin.1", &mstp_clks[MSTP810]),
350         CLKDEV_DEV_ID("r8a7790-vin.2", &mstp_clks[MSTP809]),
351         CLKDEV_DEV_ID("r8a7790-vin.3", &mstp_clks[MSTP808]),
352         CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
353         CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP502]),
354         CLKDEV_DEV_ID("sh-dma-engine.1", &mstp_clks[MSTP501]),
355         CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]),
356         CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]),
357         CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]),
358         CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP312]),
359         CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP311]),
360         CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]),
361         CLKDEV_DEV_ID("qspi.0", &mstp_clks[MSTP917]),
362         CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP704]),
363         CLKDEV_DEV_ID("pci-rcar-gen2.0", &mstp_clks[MSTP703]),
364         CLKDEV_DEV_ID("pci-rcar-gen2.1", &mstp_clks[MSTP703]),
365         CLKDEV_DEV_ID("pci-rcar-gen2.2", &mstp_clks[MSTP703]),
366         CLKDEV_DEV_ID("sata-r8a7790.0", &mstp_clks[MSTP815]),
367         CLKDEV_DEV_ID("sata-r8a7790.1", &mstp_clks[MSTP814]),
368
369         /* ICK */
370         CLKDEV_ICK_ID("fck", "sh-cmt-48-gen2.0", &mstp_clks[MSTP124]),
371         CLKDEV_ICK_ID("usbhs", "usb_phy_rcar_gen2", &mstp_clks[MSTP704]),
372         CLKDEV_ICK_ID("lvds.0", "rcar-du-r8a7790", &mstp_clks[MSTP726]),
373         CLKDEV_ICK_ID("lvds.1", "rcar-du-r8a7790", &mstp_clks[MSTP725]),
374         CLKDEV_ICK_ID("du.0", "rcar-du-r8a7790", &mstp_clks[MSTP724]),
375         CLKDEV_ICK_ID("du.1", "rcar-du-r8a7790", &mstp_clks[MSTP723]),
376         CLKDEV_ICK_ID("du.2", "rcar-du-r8a7790", &mstp_clks[MSTP722]),
377         CLKDEV_ICK_ID("clk_a", "rcar_sound", &audio_clk_a),
378         CLKDEV_ICK_ID("clk_b", "rcar_sound", &audio_clk_b),
379         CLKDEV_ICK_ID("clk_c", "rcar_sound", &audio_clk_c),
380         CLKDEV_ICK_ID("clk_i", "rcar_sound", &m2_clk),
381         CLKDEV_ICK_ID("src.0", "rcar_sound", &mstp_clks[MSTP1031]),
382         CLKDEV_ICK_ID("src.1", "rcar_sound", &mstp_clks[MSTP1030]),
383         CLKDEV_ICK_ID("src.2", "rcar_sound", &mstp_clks[MSTP1029]),
384         CLKDEV_ICK_ID("src.3", "rcar_sound", &mstp_clks[MSTP1028]),
385         CLKDEV_ICK_ID("src.4", "rcar_sound", &mstp_clks[MSTP1027]),
386         CLKDEV_ICK_ID("src.5", "rcar_sound", &mstp_clks[MSTP1026]),
387         CLKDEV_ICK_ID("src.6", "rcar_sound", &mstp_clks[MSTP1025]),
388         CLKDEV_ICK_ID("src.7", "rcar_sound", &mstp_clks[MSTP1024]),
389         CLKDEV_ICK_ID("src.8", "rcar_sound", &mstp_clks[MSTP1023]),
390         CLKDEV_ICK_ID("src.9", "rcar_sound", &mstp_clks[MSTP1022]),
391         CLKDEV_ICK_ID("ssi.0", "rcar_sound", &mstp_clks[MSTP1015]),
392         CLKDEV_ICK_ID("ssi.1", "rcar_sound", &mstp_clks[MSTP1014]),
393         CLKDEV_ICK_ID("ssi.2", "rcar_sound", &mstp_clks[MSTP1013]),
394         CLKDEV_ICK_ID("ssi.3", "rcar_sound", &mstp_clks[MSTP1012]),
395         CLKDEV_ICK_ID("ssi.4", "rcar_sound", &mstp_clks[MSTP1011]),
396         CLKDEV_ICK_ID("ssi.5", "rcar_sound", &mstp_clks[MSTP1010]),
397         CLKDEV_ICK_ID("ssi.6", "rcar_sound", &mstp_clks[MSTP1009]),
398         CLKDEV_ICK_ID("ssi.7", "rcar_sound", &mstp_clks[MSTP1008]),
399         CLKDEV_ICK_ID("ssi.8", "rcar_sound", &mstp_clks[MSTP1007]),
400         CLKDEV_ICK_ID("ssi.9", "rcar_sound", &mstp_clks[MSTP1006]),
401
402 };
403
404 #define R8A7790_CLOCK_ROOT(e, m, p0, p1, p30, p31)              \
405         extal_clk.rate  = e * 1000 * 1000;                      \
406         main_clk.parent = m;                                    \
407         SH_CLK_SET_RATIO(&pll1_clk_ratio, p1 / 2, 1);           \
408         if (mode & MD(19))                                      \
409                 SH_CLK_SET_RATIO(&pll3_clk_ratio, p31, 1);      \
410         else                                                    \
411                 SH_CLK_SET_RATIO(&pll3_clk_ratio, p30, 1)
412
413
414 void __init r8a7790_clock_init(void)
415 {
416         u32 mode = rcar_gen2_read_mode_pins();
417         int k, ret = 0;
418
419         switch (mode & (MD(14) | MD(13))) {
420         case 0:
421                 R8A7790_CLOCK_ROOT(15, &extal_clk, 172, 208, 106, 88);
422                 break;
423         case MD(13):
424                 R8A7790_CLOCK_ROOT(20, &extal_clk, 130, 156, 80, 66);
425                 break;
426         case MD(14):
427                 R8A7790_CLOCK_ROOT(26 / 2, &extal_div2_clk, 200, 240, 122, 102);
428                 break;
429         case MD(13) | MD(14):
430                 R8A7790_CLOCK_ROOT(30 / 2, &extal_div2_clk, 172, 208, 106, 88);
431                 break;
432         }
433
434         if (mode & (MD(18)))
435                 SH_CLK_SET_RATIO(&lb_clk_ratio, 1, 36);
436         else
437                 SH_CLK_SET_RATIO(&lb_clk_ratio, 1, 24);
438
439         if ((mode & (MD(3) | MD(2) | MD(1))) == MD(2))
440                 SH_CLK_SET_RATIO(&qspi_clk_ratio, 1, 16);
441         else
442                 SH_CLK_SET_RATIO(&qspi_clk_ratio, 1, 20);
443
444         for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
445                 ret = clk_register(main_clks[k]);
446
447         if (!ret)
448                 ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
449
450         if (!ret)
451                 ret = sh_clk_div6_register(div6_clks, DIV6_NR);
452
453         if (!ret)
454                 ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
455
456         clkdev_add_table(lookups, ARRAY_SIZE(lookups));
457
458         if (!ret)
459                 shmobile_clk_init();
460         else
461                 panic("failed to setup r8a7790 clocks\n");
462 }