aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-08-10 14:13:06 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-08-10 14:13:06 -0400
commit64e3bbc7ef7029669c7fb23408864c60f147f7b9 (patch)
treeba958cab515ec5a8cf029e9955de27f99b1e069a /arch/arm
parent913847586290d5de22659e2a6195d91ff24d5aa6 (diff)
parentee34fb97a96ceac3334705ebab8b541ca291699f (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.dtsi1
-rw-r--r--arch/arm/boot/dts/rk3288.dtsi40
-rw-r--r--arch/arm/mach-exynos/pm.c163
-rw-r--r--arch/arm/mach-omap2/clkt_dpll.c28
-rw-r--r--arch/arm/mach-omap2/control.c6
-rw-r--r--arch/arm/mach-omap2/dpll3xxx.c13
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 */
118static void exynos_set_wakeupmask(long mask)
119{
120 pmu_raw_writel(mask, S5P_WAKEUP_MASK);
121}
122
123static 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
129void 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 */
138static unsigned int save_arm_register[2]; 118static 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
156static 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
166static 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 */
190static void exynos_set_wakeupmask(long mask)
191{
192 pmu_raw_writel(mask, S5P_WAKEUP_MASK);
193}
194
195static 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
201static 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
212void 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
176static int exynos_cpu_suspend(unsigned long arg) 232static 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
220static 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
230static int exynos_pm_suspend(void) 276static 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
247static 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
270static void exynos_pm_resume(void) 293static 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
372static 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
400static struct notifier_block exynos_cpu_pm_notifier_block = {
401 .notifier_call = exynos_cpu_pm_notifier,
402};
403
404void __init exynos_pm_init(void) 395void __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
469void omap3_control_restore_context(void) 470void 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
527void omap3630_ctrl_disable_rta(void) 527void 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;