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; |
