diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-10 14:13:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-10 14:13:06 -0400 |
commit | 64e3bbc7ef7029669c7fb23408864c60f147f7b9 (patch) | |
tree | ba958cab515ec5a8cf029e9955de27f99b1e069a /arch/arm | |
parent | 913847586290d5de22659e2a6195d91ff24d5aa6 (diff) | |
parent | ee34fb97a96ceac3334705ebab8b541ca291699f (diff) |
Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC fixes from Olof Johansson:
- a short branch of OMAP fixes that we didn't merge before the window
opened.
- a small cleanup that sorts the rk3288 dts entries properly
- a build fix due to a reference to a removed DT node on exynos
* tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc:
ARM: dts: exynos5420: remove disp_pd
ARM: EXYNOS: Fix suspend/resume sequences
ARM: dts: Fix the sort ordering of EHCI and HSIC in rk3288.dtsi
ARM: OMAP3: Fix coding style problems in arch/arm/mach-omap2/control.c
ARM: OMAP3: Fix choice of omap3_restore_es function in OMAP34XX rev3.1.2 case.
ARM: OMAP2+: clock: allow omap2_dpll_round_rate() to round to next-lowest rate
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/boot/dts/exynos5420.dtsi | 1 | ||||
-rw-r--r-- | arch/arm/boot/dts/rk3288.dtsi | 40 | ||||
-rw-r--r-- | arch/arm/mach-exynos/pm.c | 163 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clkt_dpll.c | 28 | ||||
-rw-r--r-- | arch/arm/mach-omap2/control.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-omap2/dpll3xxx.c | 13 |
6 files changed, 131 insertions, 120 deletions
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi index 95ec37dff3e8..bfe056d9148c 100644 --- a/arch/arm/boot/dts/exynos5420.dtsi +++ b/arch/arm/boot/dts/exynos5420.dtsi | |||
@@ -525,7 +525,6 @@ | |||
525 | compatible = "samsung,exynos5410-mipi-dsi"; | 525 | compatible = "samsung,exynos5410-mipi-dsi"; |
526 | reg = <0x14500000 0x10000>; | 526 | reg = <0x14500000 0x10000>; |
527 | interrupts = <0 82 0>; | 527 | interrupts = <0 82 0>; |
528 | samsung,power-domain = <&disp_pd>; | ||
529 | phys = <&mipi_phy 1>; | 528 | phys = <&mipi_phy 1>; |
530 | phy-names = "dsim"; | 529 | phy-names = "dsim"; |
531 | clocks = <&clock CLK_DSIM1>, <&clock CLK_SCLK_MIPI1>; | 530 | clocks = <&clock CLK_DSIM1>, <&clock CLK_SCLK_MIPI1>; |
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi index e7cb00873dd4..5950b0a53224 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi | |||
@@ -195,6 +195,26 @@ | |||
195 | status = "disabled"; | 195 | status = "disabled"; |
196 | }; | 196 | }; |
197 | 197 | ||
198 | usb_host0_ehci: usb@ff500000 { | ||
199 | compatible = "generic-ehci"; | ||
200 | reg = <0xff500000 0x100>; | ||
201 | interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>; | ||
202 | clocks = <&cru HCLK_USBHOST0>; | ||
203 | clock-names = "usbhost"; | ||
204 | status = "disabled"; | ||
205 | }; | ||
206 | |||
207 | /* NOTE: ohci@ff520000 doesn't actually work on hardware */ | ||
208 | |||
209 | usb_hsic: usb@ff5c0000 { | ||
210 | compatible = "generic-ehci"; | ||
211 | reg = <0xff5c0000 0x100>; | ||
212 | interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; | ||
213 | clocks = <&cru HCLK_HSIC>; | ||
214 | clock-names = "usbhost"; | ||
215 | status = "disabled"; | ||
216 | }; | ||
217 | |||
198 | i2c0: i2c@ff650000 { | 218 | i2c0: i2c@ff650000 { |
199 | compatible = "rockchip,rk3288-i2c"; | 219 | compatible = "rockchip,rk3288-i2c"; |
200 | reg = <0xff650000 0x1000>; | 220 | reg = <0xff650000 0x1000>; |
@@ -251,26 +271,6 @@ | |||
251 | status = "disabled"; | 271 | status = "disabled"; |
252 | }; | 272 | }; |
253 | 273 | ||
254 | usb_host0_ehci: usb@ff500000 { | ||
255 | compatible = "generic-ehci"; | ||
256 | reg = <0xff500000 0x100>; | ||
257 | interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>; | ||
258 | clocks = <&cru HCLK_USBHOST0>; | ||
259 | clock-names = "usbhost"; | ||
260 | status = "disabled"; | ||
261 | }; | ||
262 | |||
263 | /* NOTE: ohci@ff520000 doesn't actually work on hardware */ | ||
264 | |||
265 | usb_hsic: usb@ff5c0000 { | ||
266 | compatible = "generic-ehci"; | ||
267 | reg = <0xff5c0000 0x100>; | ||
268 | interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; | ||
269 | clocks = <&cru HCLK_HSIC>; | ||
270 | clock-names = "usbhost"; | ||
271 | status = "disabled"; | ||
272 | }; | ||
273 | |||
274 | gic: interrupt-controller@ffc01000 { | 274 | gic: interrupt-controller@ffc01000 { |
275 | compatible = "arm,gic-400"; | 275 | compatible = "arm,gic-400"; |
276 | interrupt-controller; | 276 | interrupt-controller; |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index 18646b7e226b..abefacb45976 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
@@ -114,26 +114,6 @@ static int exynos_irq_set_wake(struct irq_data *data, unsigned int state) | |||
114 | #define S5P_CHECK_AFTR 0xFCBA0D10 | 114 | #define S5P_CHECK_AFTR 0xFCBA0D10 |
115 | #define S5P_CHECK_SLEEP 0x00000BAD | 115 | #define S5P_CHECK_SLEEP 0x00000BAD |
116 | 116 | ||
117 | /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */ | ||
118 | static void exynos_set_wakeupmask(long mask) | ||
119 | { | ||
120 | pmu_raw_writel(mask, S5P_WAKEUP_MASK); | ||
121 | } | ||
122 | |||
123 | static void exynos_cpu_set_boot_vector(long flags) | ||
124 | { | ||
125 | __raw_writel(virt_to_phys(exynos_cpu_resume), EXYNOS_BOOT_VECTOR_ADDR); | ||
126 | __raw_writel(flags, EXYNOS_BOOT_VECTOR_FLAG); | ||
127 | } | ||
128 | |||
129 | void exynos_enter_aftr(void) | ||
130 | { | ||
131 | exynos_set_wakeupmask(0x0000ff3e); | ||
132 | exynos_cpu_set_boot_vector(S5P_CHECK_AFTR); | ||
133 | /* Set value of power down register for aftr mode */ | ||
134 | exynos_sys_powerdown_conf(SYS_AFTR); | ||
135 | } | ||
136 | |||
137 | /* For Cortex-A9 Diagnostic and Power control register */ | 117 | /* For Cortex-A9 Diagnostic and Power control register */ |
138 | static unsigned int save_arm_register[2]; | 118 | static unsigned int save_arm_register[2]; |
139 | 119 | ||
@@ -173,6 +153,82 @@ static void exynos_cpu_restore_register(void) | |||
173 | : "cc"); | 153 | : "cc"); |
174 | } | 154 | } |
175 | 155 | ||
156 | static void exynos_pm_central_suspend(void) | ||
157 | { | ||
158 | unsigned long tmp; | ||
159 | |||
160 | /* Setting Central Sequence Register for power down mode */ | ||
161 | tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); | ||
162 | tmp &= ~S5P_CENTRAL_LOWPWR_CFG; | ||
163 | pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); | ||
164 | } | ||
165 | |||
166 | static int exynos_pm_central_resume(void) | ||
167 | { | ||
168 | unsigned long tmp; | ||
169 | |||
170 | /* | ||
171 | * If PMU failed while entering sleep mode, WFI will be | ||
172 | * ignored by PMU and then exiting cpu_do_idle(). | ||
173 | * S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically | ||
174 | * in this situation. | ||
175 | */ | ||
176 | tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); | ||
177 | if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) { | ||
178 | tmp |= S5P_CENTRAL_LOWPWR_CFG; | ||
179 | pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); | ||
180 | /* clear the wakeup state register */ | ||
181 | pmu_raw_writel(0x0, S5P_WAKEUP_STAT); | ||
182 | /* No need to perform below restore code */ | ||
183 | return -1; | ||
184 | } | ||
185 | |||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */ | ||
190 | static void exynos_set_wakeupmask(long mask) | ||
191 | { | ||
192 | pmu_raw_writel(mask, S5P_WAKEUP_MASK); | ||
193 | } | ||
194 | |||
195 | static void exynos_cpu_set_boot_vector(long flags) | ||
196 | { | ||
197 | __raw_writel(virt_to_phys(exynos_cpu_resume), EXYNOS_BOOT_VECTOR_ADDR); | ||
198 | __raw_writel(flags, EXYNOS_BOOT_VECTOR_FLAG); | ||
199 | } | ||
200 | |||
201 | static int exynos_aftr_finisher(unsigned long flags) | ||
202 | { | ||
203 | exynos_set_wakeupmask(0x0000ff3e); | ||
204 | exynos_cpu_set_boot_vector(S5P_CHECK_AFTR); | ||
205 | /* Set value of power down register for aftr mode */ | ||
206 | exynos_sys_powerdown_conf(SYS_AFTR); | ||
207 | cpu_do_idle(); | ||
208 | |||
209 | return 1; | ||
210 | } | ||
211 | |||
212 | void exynos_enter_aftr(void) | ||
213 | { | ||
214 | cpu_pm_enter(); | ||
215 | |||
216 | exynos_pm_central_suspend(); | ||
217 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) | ||
218 | exynos_cpu_save_register(); | ||
219 | |||
220 | cpu_suspend(0, exynos_aftr_finisher); | ||
221 | |||
222 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { | ||
223 | scu_enable(S5P_VA_SCU); | ||
224 | exynos_cpu_restore_register(); | ||
225 | } | ||
226 | |||
227 | exynos_pm_central_resume(); | ||
228 | |||
229 | cpu_pm_exit(); | ||
230 | } | ||
231 | |||
176 | static int exynos_cpu_suspend(unsigned long arg) | 232 | static int exynos_cpu_suspend(unsigned long arg) |
177 | { | 233 | { |
178 | #ifdef CONFIG_CACHE_L2X0 | 234 | #ifdef CONFIG_CACHE_L2X0 |
@@ -217,16 +273,6 @@ static void exynos_pm_prepare(void) | |||
217 | pmu_raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0); | 273 | pmu_raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0); |
218 | } | 274 | } |
219 | 275 | ||
220 | static void exynos_pm_central_suspend(void) | ||
221 | { | ||
222 | unsigned long tmp; | ||
223 | |||
224 | /* Setting Central Sequence Register for power down mode */ | ||
225 | tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); | ||
226 | tmp &= ~S5P_CENTRAL_LOWPWR_CFG; | ||
227 | pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); | ||
228 | } | ||
229 | |||
230 | static int exynos_pm_suspend(void) | 276 | static int exynos_pm_suspend(void) |
231 | { | 277 | { |
232 | unsigned long tmp; | 278 | unsigned long tmp; |
@@ -244,29 +290,6 @@ static int exynos_pm_suspend(void) | |||
244 | return 0; | 290 | return 0; |
245 | } | 291 | } |
246 | 292 | ||
247 | static int exynos_pm_central_resume(void) | ||
248 | { | ||
249 | unsigned long tmp; | ||
250 | |||
251 | /* | ||
252 | * If PMU failed while entering sleep mode, WFI will be | ||
253 | * ignored by PMU and then exiting cpu_do_idle(). | ||
254 | * S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically | ||
255 | * in this situation. | ||
256 | */ | ||
257 | tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); | ||
258 | if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) { | ||
259 | tmp |= S5P_CENTRAL_LOWPWR_CFG; | ||
260 | pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); | ||
261 | /* clear the wakeup state register */ | ||
262 | pmu_raw_writel(0x0, S5P_WAKEUP_STAT); | ||
263 | /* No need to perform below restore code */ | ||
264 | return -1; | ||
265 | } | ||
266 | |||
267 | return 0; | ||
268 | } | ||
269 | |||
270 | static void exynos_pm_resume(void) | 293 | static void exynos_pm_resume(void) |
271 | { | 294 | { |
272 | if (exynos_pm_central_resume()) | 295 | if (exynos_pm_central_resume()) |
@@ -369,44 +392,10 @@ static const struct platform_suspend_ops exynos_suspend_ops = { | |||
369 | .valid = suspend_valid_only_mem, | 392 | .valid = suspend_valid_only_mem, |
370 | }; | 393 | }; |
371 | 394 | ||
372 | static int exynos_cpu_pm_notifier(struct notifier_block *self, | ||
373 | unsigned long cmd, void *v) | ||
374 | { | ||
375 | int cpu = smp_processor_id(); | ||
376 | |||
377 | switch (cmd) { | ||
378 | case CPU_PM_ENTER: | ||
379 | if (cpu == 0) { | ||
380 | exynos_pm_central_suspend(); | ||
381 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) | ||
382 | exynos_cpu_save_register(); | ||
383 | } | ||
384 | break; | ||
385 | |||
386 | case CPU_PM_EXIT: | ||
387 | if (cpu == 0) { | ||
388 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { | ||
389 | scu_enable(S5P_VA_SCU); | ||
390 | exynos_cpu_restore_register(); | ||
391 | } | ||
392 | exynos_pm_central_resume(); | ||
393 | } | ||
394 | break; | ||
395 | } | ||
396 | |||
397 | return NOTIFY_OK; | ||
398 | } | ||
399 | |||
400 | static struct notifier_block exynos_cpu_pm_notifier_block = { | ||
401 | .notifier_call = exynos_cpu_pm_notifier, | ||
402 | }; | ||
403 | |||
404 | void __init exynos_pm_init(void) | 395 | void __init exynos_pm_init(void) |
405 | { | 396 | { |
406 | u32 tmp; | 397 | u32 tmp; |
407 | 398 | ||
408 | cpu_pm_register_notifier(&exynos_cpu_pm_notifier_block); | ||
409 | |||
410 | /* Platform-specific GIC callback */ | 399 | /* Platform-specific GIC callback */ |
411 | gic_arch_extn.irq_set_wake = exynos_irq_set_wake; | 400 | gic_arch_extn.irq_set_wake = exynos_irq_set_wake; |
412 | 401 | ||
diff --git a/arch/arm/mach-omap2/clkt_dpll.c b/arch/arm/mach-omap2/clkt_dpll.c index b2ff6cd7ca9f..f251a14cbf16 100644 --- a/arch/arm/mach-omap2/clkt_dpll.c +++ b/arch/arm/mach-omap2/clkt_dpll.c | |||
@@ -285,10 +285,13 @@ long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate, | |||
285 | { | 285 | { |
286 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); | 286 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); |
287 | int m, n, r, scaled_max_m; | 287 | int m, n, r, scaled_max_m; |
288 | int min_delta_m = INT_MAX, min_delta_n = INT_MAX; | ||
288 | unsigned long scaled_rt_rp; | 289 | unsigned long scaled_rt_rp; |
289 | unsigned long new_rate = 0; | 290 | unsigned long new_rate = 0; |
290 | struct dpll_data *dd; | 291 | struct dpll_data *dd; |
291 | unsigned long ref_rate; | 292 | unsigned long ref_rate; |
293 | long delta; | ||
294 | long prev_min_delta = LONG_MAX; | ||
292 | const char *clk_name; | 295 | const char *clk_name; |
293 | 296 | ||
294 | if (!clk || !clk->dpll_data) | 297 | if (!clk || !clk->dpll_data) |
@@ -334,23 +337,34 @@ long omap2_dpll_round_rate(struct clk_hw *hw, unsigned long target_rate, | |||
334 | if (r == DPLL_MULT_UNDERFLOW) | 337 | if (r == DPLL_MULT_UNDERFLOW) |
335 | continue; | 338 | continue; |
336 | 339 | ||
340 | /* skip rates above our target rate */ | ||
341 | delta = target_rate - new_rate; | ||
342 | if (delta < 0) | ||
343 | continue; | ||
344 | |||
345 | if (delta < prev_min_delta) { | ||
346 | prev_min_delta = delta; | ||
347 | min_delta_m = m; | ||
348 | min_delta_n = n; | ||
349 | } | ||
350 | |||
337 | pr_debug("clock: %s: m = %d: n = %d: new_rate = %lu\n", | 351 | pr_debug("clock: %s: m = %d: n = %d: new_rate = %lu\n", |
338 | clk_name, m, n, new_rate); | 352 | clk_name, m, n, new_rate); |
339 | 353 | ||
340 | if (target_rate == new_rate) { | 354 | if (delta == 0) |
341 | dd->last_rounded_m = m; | ||
342 | dd->last_rounded_n = n; | ||
343 | dd->last_rounded_rate = target_rate; | ||
344 | break; | 355 | break; |
345 | } | ||
346 | } | 356 | } |
347 | 357 | ||
348 | if (target_rate != new_rate) { | 358 | if (prev_min_delta == LONG_MAX) { |
349 | pr_debug("clock: %s: cannot round to rate %lu\n", | 359 | pr_debug("clock: %s: cannot round to rate %lu\n", |
350 | clk_name, target_rate); | 360 | clk_name, target_rate); |
351 | return ~0; | 361 | return ~0; |
352 | } | 362 | } |
353 | 363 | ||
354 | return target_rate; | 364 | dd->last_rounded_m = min_delta_m; |
365 | dd->last_rounded_n = min_delta_n; | ||
366 | dd->last_rounded_rate = target_rate - prev_min_delta; | ||
367 | |||
368 | return dd->last_rounded_rate; | ||
355 | } | 369 | } |
356 | 370 | ||
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c index f4796c002070..da041b4ab29c 100644 --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c | |||
@@ -280,6 +280,7 @@ void omap3_clear_scratchpad_contents(void) | |||
280 | u32 max_offset = OMAP343X_SCRATCHPAD_ROM_OFFSET; | 280 | u32 max_offset = OMAP343X_SCRATCHPAD_ROM_OFFSET; |
281 | void __iomem *v_addr; | 281 | void __iomem *v_addr; |
282 | u32 offset = 0; | 282 | u32 offset = 0; |
283 | |||
283 | v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM); | 284 | v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM); |
284 | if (omap3xxx_prm_clear_global_cold_reset()) { | 285 | if (omap3xxx_prm_clear_global_cold_reset()) { |
285 | for ( ; offset <= max_offset; offset += 0x4) | 286 | for ( ; offset <= max_offset; offset += 0x4) |
@@ -309,7 +310,8 @@ void omap3_save_scratchpad_contents(void) | |||
309 | scratchpad_contents.public_restore_ptr = | 310 | scratchpad_contents.public_restore_ptr = |
310 | virt_to_phys(omap3_restore_3630); | 311 | virt_to_phys(omap3_restore_3630); |
311 | else if (omap_rev() != OMAP3430_REV_ES3_0 && | 312 | else if (omap_rev() != OMAP3430_REV_ES3_0 && |
312 | omap_rev() != OMAP3430_REV_ES3_1) | 313 | omap_rev() != OMAP3430_REV_ES3_1 && |
314 | omap_rev() != OMAP3430_REV_ES3_1_2) | ||
313 | scratchpad_contents.public_restore_ptr = | 315 | scratchpad_contents.public_restore_ptr = |
314 | virt_to_phys(omap3_restore); | 316 | virt_to_phys(omap3_restore); |
315 | else | 317 | else |
@@ -463,7 +465,6 @@ void omap3_control_save_context(void) | |||
463 | control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI); | 465 | control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI); |
464 | control_context.padconf_sys_nirq = | 466 | control_context.padconf_sys_nirq = |
465 | omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_SYSNIRQ); | 467 | omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_SYSNIRQ); |
466 | return; | ||
467 | } | 468 | } |
468 | 469 | ||
469 | void omap3_control_restore_context(void) | 470 | void omap3_control_restore_context(void) |
@@ -521,7 +522,6 @@ void omap3_control_restore_context(void) | |||
521 | omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI); | 522 | omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI); |
522 | omap_ctrl_writel(control_context.padconf_sys_nirq, | 523 | omap_ctrl_writel(control_context.padconf_sys_nirq, |
523 | OMAP343X_CONTROL_PADCONF_SYSNIRQ); | 524 | OMAP343X_CONTROL_PADCONF_SYSNIRQ); |
524 | return; | ||
525 | } | 525 | } |
526 | 526 | ||
527 | void omap3630_ctrl_disable_rta(void) | 527 | void omap3630_ctrl_disable_rta(void) |
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index cd5f3a0b97bd..ac3d789ac3cd 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c | |||
@@ -475,6 +475,7 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
475 | { | 475 | { |
476 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); | 476 | struct clk_hw_omap *clk = to_clk_hw_omap(hw); |
477 | struct clk *new_parent = NULL; | 477 | struct clk *new_parent = NULL; |
478 | unsigned long rrate; | ||
478 | u16 freqsel = 0; | 479 | u16 freqsel = 0; |
479 | struct dpll_data *dd; | 480 | struct dpll_data *dd; |
480 | int ret; | 481 | int ret; |
@@ -502,8 +503,16 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
502 | __clk_prepare(dd->clk_ref); | 503 | __clk_prepare(dd->clk_ref); |
503 | clk_enable(dd->clk_ref); | 504 | clk_enable(dd->clk_ref); |
504 | 505 | ||
505 | if (dd->last_rounded_rate != rate) | 506 | /* XXX this check is probably pointless in the CCF context */ |
506 | rate = __clk_round_rate(hw->clk, rate); | 507 | if (dd->last_rounded_rate != rate) { |
508 | rrate = __clk_round_rate(hw->clk, rate); | ||
509 | if (rrate != rate) { | ||
510 | pr_warn("%s: %s: final rate %lu does not match desired rate %lu\n", | ||
511 | __func__, __clk_get_name(hw->clk), | ||
512 | rrate, rate); | ||
513 | rate = rrate; | ||
514 | } | ||
515 | } | ||
507 | 516 | ||
508 | if (dd->last_rounded_rate == 0) | 517 | if (dd->last_rounded_rate == 0) |
509 | return -EINVAL; | 518 | return -EINVAL; |