diff options
author | Michael Turquette <mturquette@linaro.org> | 2014-11-29 00:00:16 -0500 |
---|---|---|
committer | Michael Turquette <mturquette@linaro.org> | 2014-11-29 00:00:16 -0500 |
commit | b572b5f821abb350439609f367bd35961f53a28e (patch) | |
tree | 380542ae6d32a0f32763062af3194d9628560123 | |
parent | 250d07d1e782e68e9b2e7b637703b3739f0ec1b1 (diff) | |
parent | 89bf26cbc1a09476c4c4740d16a0ffdfa2192b9c (diff) |
Merge tag 'v3.19-rockchip-clk2' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into clk-next
- clock phase setting capability for the rk3288 mmc clocks
- pll init to allow syncing to actual rate table values
- some more exported clocks
- fixes for some clocks (typos etc) all of them not yet used
in actual drivers
-rw-r--r-- | drivers/clk/rockchip/Makefile | 1 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk-mmc-phase.c | 154 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk-pll.c | 81 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk-rk3188.c | 37 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk-rk3288.c | 32 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk.c | 11 | ||||
-rw-r--r-- | drivers/clk/rockchip/clk.h | 36 | ||||
-rw-r--r-- | include/dt-bindings/clock/rk3288-cru.h | 13 |
8 files changed, 315 insertions, 50 deletions
diff --git a/drivers/clk/rockchip/Makefile b/drivers/clk/rockchip/Makefile index bd8514d63634..2714097f90db 100644 --- a/drivers/clk/rockchip/Makefile +++ b/drivers/clk/rockchip/Makefile | |||
@@ -6,6 +6,7 @@ obj-y += clk-rockchip.o | |||
6 | obj-y += clk.o | 6 | obj-y += clk.o |
7 | obj-y += clk-pll.o | 7 | obj-y += clk-pll.o |
8 | obj-y += clk-cpu.o | 8 | obj-y += clk-cpu.o |
9 | obj-y += clk-mmc-phase.o | ||
9 | obj-$(CONFIG_RESET_CONTROLLER) += softrst.o | 10 | obj-$(CONFIG_RESET_CONTROLLER) += softrst.o |
10 | 11 | ||
11 | obj-y += clk-rk3188.o | 12 | obj-y += clk-rk3188.o |
diff --git a/drivers/clk/rockchip/clk-mmc-phase.c b/drivers/clk/rockchip/clk-mmc-phase.c new file mode 100644 index 000000000000..c842e3b60f21 --- /dev/null +++ b/drivers/clk/rockchip/clk-mmc-phase.c | |||
@@ -0,0 +1,154 @@ | |||
1 | /* | ||
2 | * Copyright 2014 Google, Inc | ||
3 | * Author: Alexandru M Stan <amstan@chromium.org> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #include <linux/slab.h> | ||
17 | #include <linux/clk-provider.h> | ||
18 | #include "clk.h" | ||
19 | |||
20 | struct rockchip_mmc_clock { | ||
21 | struct clk_hw hw; | ||
22 | void __iomem *reg; | ||
23 | int id; | ||
24 | int shift; | ||
25 | }; | ||
26 | |||
27 | #define to_mmc_clock(_hw) container_of(_hw, struct rockchip_mmc_clock, hw) | ||
28 | |||
29 | #define RK3288_MMC_CLKGEN_DIV 2 | ||
30 | |||
31 | static unsigned long rockchip_mmc_recalc(struct clk_hw *hw, | ||
32 | unsigned long parent_rate) | ||
33 | { | ||
34 | return parent_rate / RK3288_MMC_CLKGEN_DIV; | ||
35 | } | ||
36 | |||
37 | #define ROCKCHIP_MMC_DELAY_SEL BIT(10) | ||
38 | #define ROCKCHIP_MMC_DEGREE_MASK 0x3 | ||
39 | #define ROCKCHIP_MMC_DELAYNUM_OFFSET 2 | ||
40 | #define ROCKCHIP_MMC_DELAYNUM_MASK (0xff << ROCKCHIP_MMC_DELAYNUM_OFFSET) | ||
41 | |||
42 | #define PSECS_PER_SEC 1000000000000LL | ||
43 | |||
44 | /* | ||
45 | * Each fine delay is between 40ps-80ps. Assume each fine delay is 60ps to | ||
46 | * simplify calculations. So 45degs could be anywhere between 33deg and 66deg. | ||
47 | */ | ||
48 | #define ROCKCHIP_MMC_DELAY_ELEMENT_PSEC 60 | ||
49 | |||
50 | static int rockchip_mmc_get_phase(struct clk_hw *hw) | ||
51 | { | ||
52 | struct rockchip_mmc_clock *mmc_clock = to_mmc_clock(hw); | ||
53 | unsigned long rate = clk_get_rate(hw->clk); | ||
54 | u32 raw_value; | ||
55 | u16 degrees; | ||
56 | u32 delay_num = 0; | ||
57 | |||
58 | raw_value = readl(mmc_clock->reg) >> (mmc_clock->shift); | ||
59 | |||
60 | degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90; | ||
61 | |||
62 | if (raw_value & ROCKCHIP_MMC_DELAY_SEL) { | ||
63 | /* degrees/delaynum * 10000 */ | ||
64 | unsigned long factor = (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10) * | ||
65 | 36 * (rate / 1000000); | ||
66 | |||
67 | delay_num = (raw_value & ROCKCHIP_MMC_DELAYNUM_MASK); | ||
68 | delay_num >>= ROCKCHIP_MMC_DELAYNUM_OFFSET; | ||
69 | degrees += delay_num * factor / 10000; | ||
70 | } | ||
71 | |||
72 | return degrees % 360; | ||
73 | } | ||
74 | |||
75 | static int rockchip_mmc_set_phase(struct clk_hw *hw, int degrees) | ||
76 | { | ||
77 | struct rockchip_mmc_clock *mmc_clock = to_mmc_clock(hw); | ||
78 | unsigned long rate = clk_get_rate(hw->clk); | ||
79 | u8 nineties, remainder; | ||
80 | u8 delay_num; | ||
81 | u32 raw_value; | ||
82 | u64 delay; | ||
83 | |||
84 | /* allow 22 to be 22.5 */ | ||
85 | degrees++; | ||
86 | /* floor to 22.5 increment */ | ||
87 | degrees -= ((degrees) * 10 % 225) / 10; | ||
88 | |||
89 | nineties = degrees / 90; | ||
90 | /* 22.5 multiples */ | ||
91 | remainder = (degrees % 90) / 22; | ||
92 | |||
93 | delay = PSECS_PER_SEC; | ||
94 | do_div(delay, rate); | ||
95 | /* / 360 / 22.5 */ | ||
96 | do_div(delay, 16); | ||
97 | do_div(delay, ROCKCHIP_MMC_DELAY_ELEMENT_PSEC); | ||
98 | |||
99 | delay *= remainder; | ||
100 | delay_num = (u8) min(delay, 255ULL); | ||
101 | |||
102 | raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0; | ||
103 | raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_OFFSET; | ||
104 | raw_value |= nineties; | ||
105 | writel(HIWORD_UPDATE(raw_value, 0x07ff, mmc_clock->shift), mmc_clock->reg); | ||
106 | |||
107 | pr_debug("%s->set_phase(%d) delay_nums=%u reg[0x%p]=0x%03x actual_degrees=%d\n", | ||
108 | __clk_get_name(hw->clk), degrees, delay_num, | ||
109 | mmc_clock->reg, raw_value>>(mmc_clock->shift), | ||
110 | rockchip_mmc_get_phase(hw) | ||
111 | ); | ||
112 | |||
113 | return 0; | ||
114 | } | ||
115 | |||
116 | static const struct clk_ops rockchip_mmc_clk_ops = { | ||
117 | .recalc_rate = rockchip_mmc_recalc, | ||
118 | .get_phase = rockchip_mmc_get_phase, | ||
119 | .set_phase = rockchip_mmc_set_phase, | ||
120 | }; | ||
121 | |||
122 | struct clk *rockchip_clk_register_mmc(const char *name, | ||
123 | const char **parent_names, u8 num_parents, | ||
124 | void __iomem *reg, int shift) | ||
125 | { | ||
126 | struct clk_init_data init; | ||
127 | struct rockchip_mmc_clock *mmc_clock; | ||
128 | struct clk *clk; | ||
129 | |||
130 | mmc_clock = kmalloc(sizeof(*mmc_clock), GFP_KERNEL); | ||
131 | if (!mmc_clock) | ||
132 | return NULL; | ||
133 | |||
134 | init.num_parents = num_parents; | ||
135 | init.parent_names = parent_names; | ||
136 | init.ops = &rockchip_mmc_clk_ops; | ||
137 | |||
138 | mmc_clock->hw.init = &init; | ||
139 | mmc_clock->reg = reg; | ||
140 | mmc_clock->shift = shift; | ||
141 | |||
142 | if (name) | ||
143 | init.name = name; | ||
144 | |||
145 | clk = clk_register(NULL, &mmc_clock->hw); | ||
146 | if (IS_ERR(clk)) | ||
147 | goto err_free; | ||
148 | |||
149 | return clk; | ||
150 | |||
151 | err_free: | ||
152 | kfree(mmc_clock); | ||
153 | return NULL; | ||
154 | } | ||
diff --git a/drivers/clk/rockchip/clk-pll.c b/drivers/clk/rockchip/clk-pll.c index a3e886a38480..f8d3baf275b2 100644 --- a/drivers/clk/rockchip/clk-pll.c +++ b/drivers/clk/rockchip/clk-pll.c | |||
@@ -39,6 +39,7 @@ struct rockchip_clk_pll { | |||
39 | int lock_offset; | 39 | int lock_offset; |
40 | unsigned int lock_shift; | 40 | unsigned int lock_shift; |
41 | enum rockchip_pll_type type; | 41 | enum rockchip_pll_type type; |
42 | u8 flags; | ||
42 | const struct rockchip_pll_rate_table *rate_table; | 43 | const struct rockchip_pll_rate_table *rate_table; |
43 | unsigned int rate_count; | 44 | unsigned int rate_count; |
44 | spinlock_t *lock; | 45 | spinlock_t *lock; |
@@ -257,6 +258,55 @@ static int rockchip_rk3066_pll_is_enabled(struct clk_hw *hw) | |||
257 | return !(pllcon & RK3066_PLLCON3_PWRDOWN); | 258 | return !(pllcon & RK3066_PLLCON3_PWRDOWN); |
258 | } | 259 | } |
259 | 260 | ||
261 | static void rockchip_rk3066_pll_init(struct clk_hw *hw) | ||
262 | { | ||
263 | struct rockchip_clk_pll *pll = to_rockchip_clk_pll(hw); | ||
264 | const struct rockchip_pll_rate_table *rate; | ||
265 | unsigned int nf, nr, no, bwadj; | ||
266 | unsigned long drate; | ||
267 | u32 pllcon; | ||
268 | |||
269 | if (!(pll->flags & ROCKCHIP_PLL_SYNC_RATE)) | ||
270 | return; | ||
271 | |||
272 | drate = __clk_get_rate(hw->clk); | ||
273 | rate = rockchip_get_pll_settings(pll, drate); | ||
274 | |||
275 | /* when no rate setting for the current rate, rely on clk_set_rate */ | ||
276 | if (!rate) | ||
277 | return; | ||
278 | |||
279 | pllcon = readl_relaxed(pll->reg_base + RK3066_PLLCON(0)); | ||
280 | nr = ((pllcon >> RK3066_PLLCON0_NR_SHIFT) & RK3066_PLLCON0_NR_MASK) + 1; | ||
281 | no = ((pllcon >> RK3066_PLLCON0_OD_SHIFT) & RK3066_PLLCON0_OD_MASK) + 1; | ||
282 | |||
283 | pllcon = readl_relaxed(pll->reg_base + RK3066_PLLCON(1)); | ||
284 | nf = ((pllcon >> RK3066_PLLCON1_NF_SHIFT) & RK3066_PLLCON1_NF_MASK) + 1; | ||
285 | |||
286 | pllcon = readl_relaxed(pll->reg_base + RK3066_PLLCON(2)); | ||
287 | bwadj = (pllcon >> RK3066_PLLCON2_BWADJ_SHIFT) & RK3066_PLLCON2_BWADJ_MASK; | ||
288 | |||
289 | pr_debug("%s: pll %s@%lu: nr (%d:%d); no (%d:%d); nf(%d:%d), bwadj(%d:%d)\n", | ||
290 | __func__, __clk_get_name(hw->clk), drate, rate->nr, nr, | ||
291 | rate->no, no, rate->nf, nf, rate->bwadj, bwadj); | ||
292 | if (rate->nr != nr || rate->no != no || rate->nf != nf | ||
293 | || rate->bwadj != bwadj) { | ||
294 | struct clk *parent = __clk_get_parent(hw->clk); | ||
295 | unsigned long prate; | ||
296 | |||
297 | if (!parent) { | ||
298 | pr_warn("%s: parent of %s not available\n", | ||
299 | __func__, __clk_get_name(hw->clk)); | ||
300 | return; | ||
301 | } | ||
302 | |||
303 | pr_debug("%s: pll %s: rate params do not match rate table, adjusting\n", | ||
304 | __func__, __clk_get_name(hw->clk)); | ||
305 | prate = __clk_get_rate(parent); | ||
306 | rockchip_rk3066_pll_set_rate(hw, drate, prate); | ||
307 | } | ||
308 | } | ||
309 | |||
260 | static const struct clk_ops rockchip_rk3066_pll_clk_norate_ops = { | 310 | static const struct clk_ops rockchip_rk3066_pll_clk_norate_ops = { |
261 | .recalc_rate = rockchip_rk3066_pll_recalc_rate, | 311 | .recalc_rate = rockchip_rk3066_pll_recalc_rate, |
262 | .enable = rockchip_rk3066_pll_enable, | 312 | .enable = rockchip_rk3066_pll_enable, |
@@ -271,6 +321,7 @@ static const struct clk_ops rockchip_rk3066_pll_clk_ops = { | |||
271 | .enable = rockchip_rk3066_pll_enable, | 321 | .enable = rockchip_rk3066_pll_enable, |
272 | .disable = rockchip_rk3066_pll_disable, | 322 | .disable = rockchip_rk3066_pll_disable, |
273 | .is_enabled = rockchip_rk3066_pll_is_enabled, | 323 | .is_enabled = rockchip_rk3066_pll_is_enabled, |
324 | .init = rockchip_rk3066_pll_init, | ||
274 | }; | 325 | }; |
275 | 326 | ||
276 | /* | 327 | /* |
@@ -282,7 +333,7 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
282 | void __iomem *base, int con_offset, int grf_lock_offset, | 333 | void __iomem *base, int con_offset, int grf_lock_offset, |
283 | int lock_shift, int mode_offset, int mode_shift, | 334 | int lock_shift, int mode_offset, int mode_shift, |
284 | struct rockchip_pll_rate_table *rate_table, | 335 | struct rockchip_pll_rate_table *rate_table, |
285 | spinlock_t *lock) | 336 | u8 clk_pll_flags, spinlock_t *lock) |
286 | { | 337 | { |
287 | const char *pll_parents[3]; | 338 | const char *pll_parents[3]; |
288 | struct clk_init_data init; | 339 | struct clk_init_data init; |
@@ -345,8 +396,22 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
345 | pll->reg_base = base + con_offset; | 396 | pll->reg_base = base + con_offset; |
346 | pll->lock_offset = grf_lock_offset; | 397 | pll->lock_offset = grf_lock_offset; |
347 | pll->lock_shift = lock_shift; | 398 | pll->lock_shift = lock_shift; |
399 | pll->flags = clk_pll_flags; | ||
348 | pll->lock = lock; | 400 | pll->lock = lock; |
349 | 401 | ||
402 | /* create the mux on top of the real pll */ | ||
403 | pll->pll_mux_ops = &clk_mux_ops; | ||
404 | pll_mux = &pll->pll_mux; | ||
405 | pll_mux->reg = base + mode_offset; | ||
406 | pll_mux->shift = mode_shift; | ||
407 | pll_mux->mask = PLL_MODE_MASK; | ||
408 | pll_mux->flags = 0; | ||
409 | pll_mux->lock = lock; | ||
410 | pll_mux->hw.init = &init; | ||
411 | |||
412 | if (pll_type == pll_rk3066) | ||
413 | pll_mux->flags |= CLK_MUX_HIWORD_MASK; | ||
414 | |||
350 | pll_clk = clk_register(NULL, &pll->hw); | 415 | pll_clk = clk_register(NULL, &pll->hw); |
351 | if (IS_ERR(pll_clk)) { | 416 | if (IS_ERR(pll_clk)) { |
352 | pr_err("%s: failed to register pll clock %s : %ld\n", | 417 | pr_err("%s: failed to register pll clock %s : %ld\n", |
@@ -355,10 +420,6 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
355 | goto err_pll; | 420 | goto err_pll; |
356 | } | 421 | } |
357 | 422 | ||
358 | /* create the mux on top of the real pll */ | ||
359 | pll->pll_mux_ops = &clk_mux_ops; | ||
360 | pll_mux = &pll->pll_mux; | ||
361 | |||
362 | /* the actual muxing is xin24m, pll-output, xin32k */ | 423 | /* the actual muxing is xin24m, pll-output, xin32k */ |
363 | pll_parents[0] = parent_names[0]; | 424 | pll_parents[0] = parent_names[0]; |
364 | pll_parents[1] = pll_name; | 425 | pll_parents[1] = pll_name; |
@@ -370,16 +431,6 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
370 | init.parent_names = pll_parents; | 431 | init.parent_names = pll_parents; |
371 | init.num_parents = ARRAY_SIZE(pll_parents); | 432 | init.num_parents = ARRAY_SIZE(pll_parents); |
372 | 433 | ||
373 | pll_mux->reg = base + mode_offset; | ||
374 | pll_mux->shift = mode_shift; | ||
375 | pll_mux->mask = PLL_MODE_MASK; | ||
376 | pll_mux->flags = 0; | ||
377 | pll_mux->lock = lock; | ||
378 | pll_mux->hw.init = &init; | ||
379 | |||
380 | if (pll_type == pll_rk3066) | ||
381 | pll_mux->flags |= CLK_MUX_HIWORD_MASK; | ||
382 | |||
383 | mux_clk = clk_register(NULL, &pll_mux->hw); | 434 | mux_clk = clk_register(NULL, &pll_mux->hw); |
384 | if (IS_ERR(mux_clk)) | 435 | if (IS_ERR(mux_clk)) |
385 | goto err_mux; | 436 | goto err_mux; |
diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c index f88eb7dacd97..c54078960847 100644 --- a/drivers/clk/rockchip/clk-rk3188.c +++ b/drivers/clk/rockchip/clk-rk3188.c | |||
@@ -212,13 +212,13 @@ PNAME(mux_sclk_macref_p) = { "mac_src", "ext_rmii" }; | |||
212 | 212 | ||
213 | static struct rockchip_pll_clock rk3188_pll_clks[] __initdata = { | 213 | static struct rockchip_pll_clock rk3188_pll_clks[] __initdata = { |
214 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), | 214 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK2928_PLL_CON(0), |
215 | RK2928_MODE_CON, 0, 6, rk3188_pll_rates), | 215 | RK2928_MODE_CON, 0, 6, 0, rk3188_pll_rates), |
216 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK2928_PLL_CON(4), | 216 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK2928_PLL_CON(4), |
217 | RK2928_MODE_CON, 4, 5, NULL), | 217 | RK2928_MODE_CON, 4, 5, 0, NULL), |
218 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK2928_PLL_CON(8), | 218 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK2928_PLL_CON(8), |
219 | RK2928_MODE_CON, 8, 7, rk3188_pll_rates), | 219 | RK2928_MODE_CON, 8, 7, ROCKCHIP_PLL_SYNC_RATE, rk3188_pll_rates), |
220 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK2928_PLL_CON(12), | 220 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK2928_PLL_CON(12), |
221 | RK2928_MODE_CON, 12, 8, rk3188_pll_rates), | 221 | RK2928_MODE_CON, 12, 8, ROCKCHIP_PLL_SYNC_RATE, rk3188_pll_rates), |
222 | }; | 222 | }; |
223 | 223 | ||
224 | #define MFLAGS CLK_MUX_HIWORD_MASK | 224 | #define MFLAGS CLK_MUX_HIWORD_MASK |
@@ -330,6 +330,15 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
330 | RK2928_CLKSEL_CON(24), 8, 8, DFLAGS, | 330 | RK2928_CLKSEL_CON(24), 8, 8, DFLAGS, |
331 | RK2928_CLKGATE_CON(2), 8, GFLAGS), | 331 | RK2928_CLKGATE_CON(2), 8, GFLAGS), |
332 | 332 | ||
333 | COMPOSITE_NOMUX(0, "spdif_pre", "i2s_src", 0, | ||
334 | RK2928_CLKSEL_CON(5), 0, 7, DFLAGS, | ||
335 | RK2928_CLKGATE_CON(0), 13, GFLAGS), | ||
336 | COMPOSITE_FRAC(0, "spdif_frac", "spdif_pll", 0, | ||
337 | RK2928_CLKSEL_CON(9), 0, | ||
338 | RK2928_CLKGATE_CON(0), 14, GFLAGS), | ||
339 | MUX(SCLK_SPDIF, "sclk_spdif", mux_sclk_spdif_p, 0, | ||
340 | RK2928_CLKSEL_CON(5), 8, 2, MFLAGS), | ||
341 | |||
333 | /* | 342 | /* |
334 | * Clock-Architecture Diagram 4 | 343 | * Clock-Architecture Diagram 4 |
335 | */ | 344 | */ |
@@ -410,7 +419,7 @@ static struct rockchip_clk_branch common_clk_branches[] __initdata = { | |||
410 | /* hclk_ahb2apb is part of a clk branch */ | 419 | /* hclk_ahb2apb is part of a clk branch */ |
411 | GATE(0, "hclk_vio_bus", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 12, GFLAGS), | 420 | GATE(0, "hclk_vio_bus", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 12, GFLAGS), |
412 | GATE(HCLK_LCDC0, "hclk_lcdc0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 1, GFLAGS), | 421 | GATE(HCLK_LCDC0, "hclk_lcdc0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 1, GFLAGS), |
413 | GATE(HCLK_LCDC1, "hclk_lcdc1", "aclk_cpu", 0, RK2928_CLKGATE_CON(6), 2, GFLAGS), | 422 | GATE(HCLK_LCDC1, "hclk_lcdc1", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 2, GFLAGS), |
414 | GATE(HCLK_CIF0, "hclk_cif0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 4, GFLAGS), | 423 | GATE(HCLK_CIF0, "hclk_cif0", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 4, GFLAGS), |
415 | GATE(HCLK_IPP, "hclk_ipp", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 9, GFLAGS), | 424 | GATE(HCLK_IPP, "hclk_ipp", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 9, GFLAGS), |
416 | GATE(HCLK_RGA, "hclk_rga", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 10, GFLAGS), | 425 | GATE(HCLK_RGA, "hclk_rga", "hclk_cpu", 0, RK2928_CLKGATE_CON(6), 10, GFLAGS), |
@@ -577,14 +586,6 @@ static struct rockchip_clk_branch rk3066a_clk_branches[] __initdata = { | |||
577 | RK2928_CLKGATE_CON(0), 12, GFLAGS), | 586 | RK2928_CLKGATE_CON(0), 12, GFLAGS), |
578 | MUX(SCLK_I2S2, "sclk_i2s2", mux_sclk_i2s2_p, 0, | 587 | MUX(SCLK_I2S2, "sclk_i2s2", mux_sclk_i2s2_p, 0, |
579 | RK2928_CLKSEL_CON(4), 8, 2, MFLAGS), | 588 | RK2928_CLKSEL_CON(4), 8, 2, MFLAGS), |
580 | COMPOSITE_NOMUX(0, "spdif_pre", "i2s_src", 0, | ||
581 | RK2928_CLKSEL_CON(5), 0, 7, DFLAGS, | ||
582 | RK2928_CLKGATE_CON(0), 13, GFLAGS), | ||
583 | COMPOSITE_FRAC(0, "spdif_frac", "spdif_pll", 0, | ||
584 | RK2928_CLKSEL_CON(9), 0, | ||
585 | RK2928_CLKGATE_CON(0), 14, GFLAGS), | ||
586 | MUX(SCLK_SPDIF, "sclk_spdif", mux_sclk_spdif_p, 0, | ||
587 | RK2928_CLKSEL_CON(5), 8, 2, MFLAGS), | ||
588 | 589 | ||
589 | GATE(HCLK_I2S1, "hclk_i2s1", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS), | 590 | GATE(HCLK_I2S1, "hclk_i2s1", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 3, GFLAGS), |
590 | GATE(HCLK_I2S2, "hclk_i2s2", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS), | 591 | GATE(HCLK_I2S2, "hclk_i2s2", "hclk_cpu", 0, RK2928_CLKGATE_CON(7), 4, GFLAGS), |
@@ -663,7 +664,7 @@ static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | |||
663 | RK2928_CLKSEL_CON(30), 0, 2, DFLAGS, | 664 | RK2928_CLKSEL_CON(30), 0, 2, DFLAGS, |
664 | RK2928_CLKGATE_CON(3), 6, GFLAGS), | 665 | RK2928_CLKGATE_CON(3), 6, GFLAGS), |
665 | DIV(0, "sclk_hsicphy_12m", "sclk_hsicphy_480m", 0, | 666 | DIV(0, "sclk_hsicphy_12m", "sclk_hsicphy_480m", 0, |
666 | RK2928_CLKGATE_CON(11), 8, 6, DFLAGS), | 667 | RK2928_CLKSEL_CON(11), 8, 6, DFLAGS), |
667 | 668 | ||
668 | MUX(0, "i2s_src", mux_pll_src_gpll_cpll_p, 0, | 669 | MUX(0, "i2s_src", mux_pll_src_gpll_cpll_p, 0, |
669 | RK2928_CLKSEL_CON(2), 15, 1, MFLAGS), | 670 | RK2928_CLKSEL_CON(2), 15, 1, MFLAGS), |
@@ -675,14 +676,6 @@ static struct rockchip_clk_branch rk3188_clk_branches[] __initdata = { | |||
675 | RK2928_CLKGATE_CON(0), 10, GFLAGS), | 676 | RK2928_CLKGATE_CON(0), 10, GFLAGS), |
676 | MUX(SCLK_I2S0, "sclk_i2s0", mux_sclk_i2s0_p, 0, | 677 | MUX(SCLK_I2S0, "sclk_i2s0", mux_sclk_i2s0_p, 0, |
677 | RK2928_CLKSEL_CON(3), 8, 2, MFLAGS), | 678 | RK2928_CLKSEL_CON(3), 8, 2, MFLAGS), |
678 | COMPOSITE_NOMUX(0, "spdif_pre", "i2s_src", 0, | ||
679 | RK2928_CLKSEL_CON(5), 0, 7, DFLAGS, | ||
680 | RK2928_CLKGATE_CON(13), 13, GFLAGS), | ||
681 | COMPOSITE_FRAC(0, "spdif_frac", "spdif_pll", 0, | ||
682 | RK2928_CLKSEL_CON(9), 0, | ||
683 | RK2928_CLKGATE_CON(0), 14, GFLAGS), | ||
684 | MUX(SCLK_SPDIF, "sclk_spdif", mux_sclk_spdif_p, 0, | ||
685 | RK2928_CLKSEL_CON(5), 8, 2, MFLAGS), | ||
686 | 679 | ||
687 | GATE(0, "hclk_imem0", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), | 680 | GATE(0, "hclk_imem0", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 14, GFLAGS), |
688 | GATE(0, "hclk_imem1", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 15, GFLAGS), | 681 | GATE(0, "hclk_imem1", "hclk_cpu", 0, RK2928_CLKGATE_CON(4), 15, GFLAGS), |
diff --git a/drivers/clk/rockchip/clk-rk3288.c b/drivers/clk/rockchip/clk-rk3288.c index 174589c95e33..ac6be7c0132d 100644 --- a/drivers/clk/rockchip/clk-rk3288.c +++ b/drivers/clk/rockchip/clk-rk3288.c | |||
@@ -202,15 +202,15 @@ PNAME(mux_hsicphy12m_p) = { "hsicphy12m_xin12m", "hsicphy12m_usbphy" }; | |||
202 | 202 | ||
203 | static struct rockchip_pll_clock rk3288_pll_clks[] __initdata = { | 203 | static struct rockchip_pll_clock rk3288_pll_clks[] __initdata = { |
204 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK3288_PLL_CON(0), | 204 | [apll] = PLL(pll_rk3066, PLL_APLL, "apll", mux_pll_p, 0, RK3288_PLL_CON(0), |
205 | RK3288_MODE_CON, 0, 6, rk3288_pll_rates), | 205 | RK3288_MODE_CON, 0, 6, 0, rk3288_pll_rates), |
206 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK3288_PLL_CON(4), | 206 | [dpll] = PLL(pll_rk3066, PLL_DPLL, "dpll", mux_pll_p, 0, RK3288_PLL_CON(4), |
207 | RK3288_MODE_CON, 4, 5, NULL), | 207 | RK3288_MODE_CON, 4, 5, 0, NULL), |
208 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK3288_PLL_CON(8), | 208 | [cpll] = PLL(pll_rk3066, PLL_CPLL, "cpll", mux_pll_p, 0, RK3288_PLL_CON(8), |
209 | RK3288_MODE_CON, 8, 7, rk3288_pll_rates), | 209 | RK3288_MODE_CON, 8, 7, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), |
210 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK3288_PLL_CON(12), | 210 | [gpll] = PLL(pll_rk3066, PLL_GPLL, "gpll", mux_pll_p, 0, RK3288_PLL_CON(12), |
211 | RK3288_MODE_CON, 12, 8, rk3288_pll_rates), | 211 | RK3288_MODE_CON, 12, 8, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), |
212 | [npll] = PLL(pll_rk3066, PLL_NPLL, "npll", mux_pll_p, 0, RK3288_PLL_CON(16), | 212 | [npll] = PLL(pll_rk3066, PLL_NPLL, "npll", mux_pll_p, 0, RK3288_PLL_CON(16), |
213 | RK3288_MODE_CON, 14, 9, rk3288_pll_rates), | 213 | RK3288_MODE_CON, 14, 9, ROCKCHIP_PLL_SYNC_RATE, rk3288_pll_rates), |
214 | }; | 214 | }; |
215 | 215 | ||
216 | static struct clk_div_table div_hclk_cpu_t[] = { | 216 | static struct clk_div_table div_hclk_cpu_t[] = { |
@@ -308,7 +308,7 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
308 | RK3288_CLKGATE_CON(4), 2, GFLAGS), | 308 | RK3288_CLKGATE_CON(4), 2, GFLAGS), |
309 | MUX(0, "i2s_pre", mux_i2s_pre_p, CLK_SET_RATE_PARENT, | 309 | MUX(0, "i2s_pre", mux_i2s_pre_p, CLK_SET_RATE_PARENT, |
310 | RK3288_CLKSEL_CON(4), 8, 2, MFLAGS), | 310 | RK3288_CLKSEL_CON(4), 8, 2, MFLAGS), |
311 | COMPOSITE_NODIV(0, "i2s0_clkout", mux_i2s_clkout_p, 0, | 311 | COMPOSITE_NODIV(SCLK_I2S0_OUT, "i2s0_clkout", mux_i2s_clkout_p, 0, |
312 | RK3288_CLKSEL_CON(4), 12, 1, MFLAGS, | 312 | RK3288_CLKSEL_CON(4), 12, 1, MFLAGS, |
313 | RK3288_CLKGATE_CON(4), 0, GFLAGS), | 313 | RK3288_CLKGATE_CON(4), 0, GFLAGS), |
314 | GATE(SCLK_I2S0, "sclk_i2s0", "i2s_pre", CLK_SET_RATE_PARENT, | 314 | GATE(SCLK_I2S0, "sclk_i2s0", "i2s_pre", CLK_SET_RATE_PARENT, |
@@ -486,6 +486,18 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
486 | RK3288_CLKSEL_CON(12), 14, 2, MFLAGS, 8, 6, DFLAGS, | 486 | RK3288_CLKSEL_CON(12), 14, 2, MFLAGS, 8, 6, DFLAGS, |
487 | RK3288_CLKGATE_CON(13), 3, GFLAGS), | 487 | RK3288_CLKGATE_CON(13), 3, GFLAGS), |
488 | 488 | ||
489 | MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "sclk_sdmmc", RK3288_SDMMC_CON0, 1), | ||
490 | MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "sclk_sdmmc", RK3288_SDMMC_CON1, 0), | ||
491 | |||
492 | MMC(SCLK_SDIO0_DRV, "sdio0_drv", "sclk_sdio0", RK3288_SDIO0_CON0, 1), | ||
493 | MMC(SCLK_SDIO0_SAMPLE, "sdio0_sample", "sclk_sdio0", RK3288_SDIO0_CON1, 0), | ||
494 | |||
495 | MMC(SCLK_SDIO1_DRV, "sdio1_drv", "sclk_sdio1", RK3288_SDIO1_CON0, 1), | ||
496 | MMC(SCLK_SDIO1_SAMPLE, "sdio1_sample", "sclk_sdio1", RK3288_SDIO1_CON1, 0), | ||
497 | |||
498 | MMC(SCLK_EMMC_DRV, "emmc_drv", "sclk_emmc", RK3288_EMMC_CON0, 1), | ||
499 | MMC(SCLK_EMMC_SAMPLE, "emmc_sample", "sclk_emmc", RK3288_EMMC_CON1, 0), | ||
500 | |||
489 | COMPOSITE(0, "sclk_tspout", mux_tspout_p, 0, | 501 | COMPOSITE(0, "sclk_tspout", mux_tspout_p, 0, |
490 | RK3288_CLKSEL_CON(35), 14, 2, MFLAGS, 8, 5, DFLAGS, | 502 | RK3288_CLKSEL_CON(35), 14, 2, MFLAGS, 8, 5, DFLAGS, |
491 | RK3288_CLKGATE_CON(4), 11, GFLAGS), | 503 | RK3288_CLKGATE_CON(4), 11, GFLAGS), |
@@ -625,10 +637,10 @@ static struct rockchip_clk_branch rk3288_clk_branches[] __initdata = { | |||
625 | GATE(PCLK_TIMER, "pclk_timer", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 1, GFLAGS), | 637 | GATE(PCLK_TIMER, "pclk_timer", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 1, GFLAGS), |
626 | GATE(PCLK_I2C0, "pclk_i2c0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 2, GFLAGS), | 638 | GATE(PCLK_I2C0, "pclk_i2c0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 2, GFLAGS), |
627 | GATE(PCLK_I2C2, "pclk_i2c2", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 3, GFLAGS), | 639 | GATE(PCLK_I2C2, "pclk_i2c2", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 3, GFLAGS), |
628 | GATE(0, "pclk_ddrupctl0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 14, GFLAGS), | 640 | GATE(PCLK_DDRUPCTL0, "pclk_ddrupctl0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 14, GFLAGS), |
629 | GATE(0, "pclk_publ0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 15, GFLAGS), | 641 | GATE(PCLK_PUBL0, "pclk_publ0", "pclk_cpu", 0, RK3288_CLKGATE_CON(10), 15, GFLAGS), |
630 | GATE(0, "pclk_ddrupctl1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 0, GFLAGS), | 642 | GATE(PCLK_DDRUPCTL1, "pclk_ddrupctl1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 0, GFLAGS), |
631 | GATE(0, "pclk_publ1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 1, GFLAGS), | 643 | GATE(PCLK_PUBL1, "pclk_publ1", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 1, GFLAGS), |
632 | GATE(0, "pclk_efuse_1024", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 2, GFLAGS), | 644 | GATE(0, "pclk_efuse_1024", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 2, GFLAGS), |
633 | GATE(PCLK_TZPC, "pclk_tzpc", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 3, GFLAGS), | 645 | GATE(PCLK_TZPC, "pclk_tzpc", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 3, GFLAGS), |
634 | GATE(PCLK_UART2, "pclk_uart2", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 9, GFLAGS), | 646 | GATE(PCLK_UART2, "pclk_uart2", "pclk_cpu", 0, RK3288_CLKGATE_CON(11), 9, GFLAGS), |
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c index 70559fab36b6..20e05bbb3a67 100644 --- a/drivers/clk/rockchip/clk.c +++ b/drivers/clk/rockchip/clk.c | |||
@@ -197,7 +197,8 @@ void __init rockchip_clk_register_plls(struct rockchip_pll_clock *list, | |||
197 | list->parent_names, list->num_parents, | 197 | list->parent_names, list->num_parents, |
198 | reg_base, list->con_offset, grf_lock_offset, | 198 | reg_base, list->con_offset, grf_lock_offset, |
199 | list->lock_shift, list->mode_offset, | 199 | list->lock_shift, list->mode_offset, |
200 | list->mode_shift, list->rate_table, &clk_lock); | 200 | list->mode_shift, list->rate_table, |
201 | list->pll_flags, &clk_lock); | ||
201 | if (IS_ERR(clk)) { | 202 | if (IS_ERR(clk)) { |
202 | pr_err("%s: failed to register clock %s\n", __func__, | 203 | pr_err("%s: failed to register clock %s\n", __func__, |
203 | list->name); | 204 | list->name); |
@@ -268,6 +269,14 @@ void __init rockchip_clk_register_branches( | |||
268 | list->gate_offset, list->gate_shift, | 269 | list->gate_offset, list->gate_shift, |
269 | list->gate_flags, flags, &clk_lock); | 270 | list->gate_flags, flags, &clk_lock); |
270 | break; | 271 | break; |
272 | case branch_mmc: | ||
273 | clk = rockchip_clk_register_mmc( | ||
274 | list->name, | ||
275 | list->parent_names, list->num_parents, | ||
276 | reg_base + list->muxdiv_offset, | ||
277 | list->div_shift | ||
278 | ); | ||
279 | break; | ||
271 | } | 280 | } |
272 | 281 | ||
273 | /* none of the cases above matched */ | 282 | /* none of the cases above matched */ |
diff --git a/drivers/clk/rockchip/clk.h b/drivers/clk/rockchip/clk.h index 6baf6655b5c3..58d2e3bdf22f 100644 --- a/drivers/clk/rockchip/clk.h +++ b/drivers/clk/rockchip/clk.h | |||
@@ -48,6 +48,14 @@ | |||
48 | #define RK3288_GLB_SRST_SND 0x1b4 | 48 | #define RK3288_GLB_SRST_SND 0x1b4 |
49 | #define RK3288_SOFTRST_CON(x) (x * 0x4 + 0x1b8) | 49 | #define RK3288_SOFTRST_CON(x) (x * 0x4 + 0x1b8) |
50 | #define RK3288_MISC_CON 0x1e8 | 50 | #define RK3288_MISC_CON 0x1e8 |
51 | #define RK3288_SDMMC_CON0 0x200 | ||
52 | #define RK3288_SDMMC_CON1 0x204 | ||
53 | #define RK3288_SDIO0_CON0 0x208 | ||
54 | #define RK3288_SDIO0_CON1 0x20c | ||
55 | #define RK3288_SDIO1_CON0 0x210 | ||
56 | #define RK3288_SDIO1_CON1 0x214 | ||
57 | #define RK3288_EMMC_CON0 0x218 | ||
58 | #define RK3288_EMMC_CON1 0x21c | ||
51 | 59 | ||
52 | enum rockchip_pll_type { | 60 | enum rockchip_pll_type { |
53 | pll_rk3066, | 61 | pll_rk3066, |
@@ -90,7 +98,12 @@ struct rockchip_pll_rate_table { | |||
90 | * @mode_shift: offset inside the mode-register for the mode of this pll. | 98 | * @mode_shift: offset inside the mode-register for the mode of this pll. |
91 | * @lock_shift: offset inside the lock register for the lock status. | 99 | * @lock_shift: offset inside the lock register for the lock status. |
92 | * @type: Type of PLL to be registered. | 100 | * @type: Type of PLL to be registered. |
101 | * @pll_flags: hardware-specific flags | ||
93 | * @rate_table: Table of usable pll rates | 102 | * @rate_table: Table of usable pll rates |
103 | * | ||
104 | * Flags: | ||
105 | * ROCKCHIP_PLL_SYNC_RATE - check rate parameters to match against the | ||
106 | * rate_table parameters and ajust them if necessary. | ||
94 | */ | 107 | */ |
95 | struct rockchip_pll_clock { | 108 | struct rockchip_pll_clock { |
96 | unsigned int id; | 109 | unsigned int id; |
@@ -103,11 +116,14 @@ struct rockchip_pll_clock { | |||
103 | int mode_shift; | 116 | int mode_shift; |
104 | int lock_shift; | 117 | int lock_shift; |
105 | enum rockchip_pll_type type; | 118 | enum rockchip_pll_type type; |
119 | u8 pll_flags; | ||
106 | struct rockchip_pll_rate_table *rate_table; | 120 | struct rockchip_pll_rate_table *rate_table; |
107 | }; | 121 | }; |
108 | 122 | ||
123 | #define ROCKCHIP_PLL_SYNC_RATE BIT(0) | ||
124 | |||
109 | #define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift, \ | 125 | #define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift, \ |
110 | _lshift, _rtable) \ | 126 | _lshift, _pflags, _rtable) \ |
111 | { \ | 127 | { \ |
112 | .id = _id, \ | 128 | .id = _id, \ |
113 | .type = _type, \ | 129 | .type = _type, \ |
@@ -119,6 +135,7 @@ struct rockchip_pll_clock { | |||
119 | .mode_offset = _mode, \ | 135 | .mode_offset = _mode, \ |
120 | .mode_shift = _mshift, \ | 136 | .mode_shift = _mshift, \ |
121 | .lock_shift = _lshift, \ | 137 | .lock_shift = _lshift, \ |
138 | .pll_flags = _pflags, \ | ||
122 | .rate_table = _rtable, \ | 139 | .rate_table = _rtable, \ |
123 | } | 140 | } |
124 | 141 | ||
@@ -127,7 +144,7 @@ struct clk *rockchip_clk_register_pll(enum rockchip_pll_type pll_type, | |||
127 | void __iomem *base, int con_offset, int grf_lock_offset, | 144 | void __iomem *base, int con_offset, int grf_lock_offset, |
128 | int lock_shift, int reg_mode, int mode_shift, | 145 | int lock_shift, int reg_mode, int mode_shift, |
129 | struct rockchip_pll_rate_table *rate_table, | 146 | struct rockchip_pll_rate_table *rate_table, |
130 | spinlock_t *lock); | 147 | u8 clk_pll_flags, spinlock_t *lock); |
131 | 148 | ||
132 | struct rockchip_cpuclk_clksel { | 149 | struct rockchip_cpuclk_clksel { |
133 | int reg; | 150 | int reg; |
@@ -161,6 +178,10 @@ struct clk *rockchip_clk_register_cpuclk(const char *name, | |||
161 | const struct rockchip_cpuclk_rate_table *rates, | 178 | const struct rockchip_cpuclk_rate_table *rates, |
162 | int nrates, void __iomem *reg_base, spinlock_t *lock); | 179 | int nrates, void __iomem *reg_base, spinlock_t *lock); |
163 | 180 | ||
181 | struct clk *rockchip_clk_register_mmc(const char *name, | ||
182 | const char **parent_names, u8 num_parents, | ||
183 | void __iomem *reg, int shift); | ||
184 | |||
164 | #define PNAME(x) static const char *x[] __initconst | 185 | #define PNAME(x) static const char *x[] __initconst |
165 | 186 | ||
166 | enum rockchip_clk_branch_type { | 187 | enum rockchip_clk_branch_type { |
@@ -169,6 +190,7 @@ enum rockchip_clk_branch_type { | |||
169 | branch_divider, | 190 | branch_divider, |
170 | branch_fraction_divider, | 191 | branch_fraction_divider, |
171 | branch_gate, | 192 | branch_gate, |
193 | branch_mmc, | ||
172 | }; | 194 | }; |
173 | 195 | ||
174 | struct rockchip_clk_branch { | 196 | struct rockchip_clk_branch { |
@@ -361,6 +383,16 @@ struct rockchip_clk_branch { | |||
361 | .gate_flags = gf, \ | 383 | .gate_flags = gf, \ |
362 | } | 384 | } |
363 | 385 | ||
386 | #define MMC(_id, cname, pname, offset, shift) \ | ||
387 | { \ | ||
388 | .id = _id, \ | ||
389 | .branch_type = branch_mmc, \ | ||
390 | .name = cname, \ | ||
391 | .parent_names = (const char *[]){ pname }, \ | ||
392 | .num_parents = 1, \ | ||
393 | .muxdiv_offset = offset, \ | ||
394 | .div_shift = shift, \ | ||
395 | } | ||
364 | 396 | ||
365 | void rockchip_clk_init(struct device_node *np, void __iomem *base, | 397 | void rockchip_clk_init(struct device_node *np, void __iomem *base, |
366 | unsigned long nr_clks); | 398 | unsigned long nr_clks); |
diff --git a/include/dt-bindings/clock/rk3288-cru.h b/include/dt-bindings/clock/rk3288-cru.h index 100a08c47692..f60ce72a2b2c 100644 --- a/include/dt-bindings/clock/rk3288-cru.h +++ b/include/dt-bindings/clock/rk3288-cru.h | |||
@@ -71,6 +71,15 @@ | |||
71 | #define SCLK_HDMI_CEC 110 | 71 | #define SCLK_HDMI_CEC 110 |
72 | #define SCLK_HEVC_CABAC 111 | 72 | #define SCLK_HEVC_CABAC 111 |
73 | #define SCLK_HEVC_CORE 112 | 73 | #define SCLK_HEVC_CORE 112 |
74 | #define SCLK_I2S0_OUT 113 | ||
75 | #define SCLK_SDMMC_DRV 114 | ||
76 | #define SCLK_SDIO0_DRV 115 | ||
77 | #define SCLK_SDIO1_DRV 116 | ||
78 | #define SCLK_EMMC_DRV 117 | ||
79 | #define SCLK_SDMMC_SAMPLE 118 | ||
80 | #define SCLK_SDIO0_SAMPLE 119 | ||
81 | #define SCLK_SDIO1_SAMPLE 120 | ||
82 | #define SCLK_EMMC_SAMPLE 121 | ||
74 | 83 | ||
75 | #define DCLK_VOP0 190 | 84 | #define DCLK_VOP0 190 |
76 | #define DCLK_VOP1 191 | 85 | #define DCLK_VOP1 191 |
@@ -141,6 +150,10 @@ | |||
141 | #define PCLK_VIO2_H2P 361 | 150 | #define PCLK_VIO2_H2P 361 |
142 | #define PCLK_CPU 362 | 151 | #define PCLK_CPU 362 |
143 | #define PCLK_PERI 363 | 152 | #define PCLK_PERI 363 |
153 | #define PCLK_DDRUPCTL0 364 | ||
154 | #define PCLK_PUBL0 365 | ||
155 | #define PCLK_DDRUPCTL1 366 | ||
156 | #define PCLK_PUBL1 367 | ||
144 | 157 | ||
145 | /* hclk gates */ | 158 | /* hclk gates */ |
146 | #define HCLK_GPS 448 | 159 | #define HCLK_GPS 448 |