diff options
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r-- | arch/arm/mach-omap2/cclock33xx_data.c | 26 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock36xx.c | 18 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 113 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.h | 7 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_33xx_data.c | 15 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_44xx_data.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-omap2/serial.c | 31 |
10 files changed, 93 insertions, 136 deletions
diff --git a/arch/arm/mach-omap2/cclock33xx_data.c b/arch/arm/mach-omap2/cclock33xx_data.c index 6ebc7803bc3e..af3544ce4f02 100644 --- a/arch/arm/mach-omap2/cclock33xx_data.c +++ b/arch/arm/mach-omap2/cclock33xx_data.c | |||
@@ -454,9 +454,29 @@ DEFINE_CLK_GATE(cefuse_fck, "sys_clkin_ck", &sys_clkin_ck, 0x0, | |||
454 | */ | 454 | */ |
455 | DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732); | 455 | DEFINE_CLK_FIXED_FACTOR(clkdiv32k_ck, "clk_24mhz", &clk_24mhz, 0x0, 1, 732); |
456 | 456 | ||
457 | DEFINE_CLK_GATE(clkdiv32k_ick, "clkdiv32k_ck", &clkdiv32k_ck, 0x0, | 457 | static struct clk clkdiv32k_ick; |
458 | AM33XX_CM_PER_CLKDIV32K_CLKCTRL, AM33XX_MODULEMODE_SWCTRL_SHIFT, | 458 | |
459 | 0x0, NULL); | 459 | static const char *clkdiv32k_ick_parent_names[] = { |
460 | "clkdiv32k_ck", | ||
461 | }; | ||
462 | |||
463 | static const struct clk_ops clkdiv32k_ick_ops = { | ||
464 | .enable = &omap2_dflt_clk_enable, | ||
465 | .disable = &omap2_dflt_clk_disable, | ||
466 | .is_enabled = &omap2_dflt_clk_is_enabled, | ||
467 | .init = &omap2_init_clk_clkdm, | ||
468 | }; | ||
469 | |||
470 | static struct clk_hw_omap clkdiv32k_ick_hw = { | ||
471 | .hw = { | ||
472 | .clk = &clkdiv32k_ick, | ||
473 | }, | ||
474 | .enable_reg = AM33XX_CM_PER_CLKDIV32K_CLKCTRL, | ||
475 | .enable_bit = AM33XX_MODULEMODE_SWCTRL_SHIFT, | ||
476 | .clkdm_name = "clk_24mhz_clkdm", | ||
477 | }; | ||
478 | |||
479 | DEFINE_STRUCT_CLK(clkdiv32k_ick, clkdiv32k_ick_parent_names, clkdiv32k_ick_ops); | ||
460 | 480 | ||
461 | /* "usbotg_fck" is an additional clock and not really a modulemode */ | 481 | /* "usbotg_fck" is an additional clock and not really a modulemode */ |
462 | DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0, | 482 | DEFINE_CLK_GATE(usbotg_fck, "dpll_per_ck", &dpll_per_ck, 0x0, |
diff --git a/arch/arm/mach-omap2/clock36xx.c b/arch/arm/mach-omap2/clock36xx.c index 8f3bf4e50908..bbd6a3f717e6 100644 --- a/arch/arm/mach-omap2/clock36xx.c +++ b/arch/arm/mach-omap2/clock36xx.c | |||
@@ -20,11 +20,12 @@ | |||
20 | 20 | ||
21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/clk-provider.h> | ||
23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
24 | 25 | ||
25 | #include "clock.h" | 26 | #include "clock.h" |
26 | #include "clock36xx.h" | 27 | #include "clock36xx.h" |
27 | 28 | #define to_clk_divider(_hw) container_of(_hw, struct clk_divider, hw) | |
28 | 29 | ||
29 | /** | 30 | /** |
30 | * omap36xx_pwrdn_clk_enable_with_hsdiv_restore - enable clocks suffering | 31 | * omap36xx_pwrdn_clk_enable_with_hsdiv_restore - enable clocks suffering |
@@ -39,29 +40,28 @@ | |||
39 | */ | 40 | */ |
40 | int omap36xx_pwrdn_clk_enable_with_hsdiv_restore(struct clk_hw *clk) | 41 | int omap36xx_pwrdn_clk_enable_with_hsdiv_restore(struct clk_hw *clk) |
41 | { | 42 | { |
42 | struct clk_hw_omap *parent; | 43 | struct clk_divider *parent; |
43 | struct clk_hw *parent_hw; | 44 | struct clk_hw *parent_hw; |
44 | u32 dummy_v, orig_v, clksel_shift; | 45 | u32 dummy_v, orig_v; |
45 | int ret; | 46 | int ret; |
46 | 47 | ||
47 | /* Clear PWRDN bit of HSDIVIDER */ | 48 | /* Clear PWRDN bit of HSDIVIDER */ |
48 | ret = omap2_dflt_clk_enable(clk); | 49 | ret = omap2_dflt_clk_enable(clk); |
49 | 50 | ||
50 | parent_hw = __clk_get_hw(__clk_get_parent(clk->clk)); | 51 | parent_hw = __clk_get_hw(__clk_get_parent(clk->clk)); |
51 | parent = to_clk_hw_omap(parent_hw); | 52 | parent = to_clk_divider(parent_hw); |
52 | 53 | ||
53 | /* Restore the dividers */ | 54 | /* Restore the dividers */ |
54 | if (!ret) { | 55 | if (!ret) { |
55 | clksel_shift = __ffs(parent->clksel_mask); | 56 | orig_v = __raw_readl(parent->reg); |
56 | orig_v = __raw_readl(parent->clksel_reg); | ||
57 | dummy_v = orig_v; | 57 | dummy_v = orig_v; |
58 | 58 | ||
59 | /* Write any other value different from the Read value */ | 59 | /* Write any other value different from the Read value */ |
60 | dummy_v ^= (1 << clksel_shift); | 60 | dummy_v ^= (1 << parent->shift); |
61 | __raw_writel(dummy_v, parent->clksel_reg); | 61 | __raw_writel(dummy_v, parent->reg); |
62 | 62 | ||
63 | /* Write the original divider */ | 63 | /* Write the original divider */ |
64 | __raw_writel(orig_v, parent->clksel_reg); | 64 | __raw_writel(orig_v, parent->reg); |
65 | } | 65 | } |
66 | 66 | ||
67 | return ret; | 67 | return ret; |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index d25a95fe9921..7341eff63f56 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -1356,13 +1356,27 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
1356 | 1356 | ||
1357 | clkdm = _get_clkdm(oh); | 1357 | clkdm = _get_clkdm(oh); |
1358 | if (sf & SYSC_HAS_SIDLEMODE) { | 1358 | if (sf & SYSC_HAS_SIDLEMODE) { |
1359 | if (oh->flags & HWMOD_SWSUP_SIDLE || | ||
1360 | oh->flags & HWMOD_SWSUP_SIDLE_ACT) { | ||
1361 | idlemode = HWMOD_IDLEMODE_NO; | ||
1362 | } else { | ||
1363 | if (sf & SYSC_HAS_ENAWAKEUP) | ||
1364 | _enable_wakeup(oh, &v); | ||
1365 | if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) | ||
1366 | idlemode = HWMOD_IDLEMODE_SMART_WKUP; | ||
1367 | else | ||
1368 | idlemode = HWMOD_IDLEMODE_SMART; | ||
1369 | } | ||
1370 | |||
1371 | /* | ||
1372 | * This is special handling for some IPs like | ||
1373 | * 32k sync timer. Force them to idle! | ||
1374 | */ | ||
1359 | clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU); | 1375 | clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU); |
1360 | if (clkdm_act && !(oh->class->sysc->idlemodes & | 1376 | if (clkdm_act && !(oh->class->sysc->idlemodes & |
1361 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | 1377 | (SIDLE_SMART | SIDLE_SMART_WKUP))) |
1362 | idlemode = HWMOD_IDLEMODE_FORCE; | 1378 | idlemode = HWMOD_IDLEMODE_FORCE; |
1363 | else | 1379 | |
1364 | idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? | ||
1365 | HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; | ||
1366 | _set_slave_idlemode(oh, idlemode, &v); | 1380 | _set_slave_idlemode(oh, idlemode, &v); |
1367 | } | 1381 | } |
1368 | 1382 | ||
@@ -1391,10 +1405,6 @@ static void _enable_sysc(struct omap_hwmod *oh) | |||
1391 | (sf & SYSC_HAS_CLOCKACTIVITY)) | 1405 | (sf & SYSC_HAS_CLOCKACTIVITY)) |
1392 | _set_clockactivity(oh, oh->class->sysc->clockact, &v); | 1406 | _set_clockactivity(oh, oh->class->sysc->clockact, &v); |
1393 | 1407 | ||
1394 | /* If slave is in SMARTIDLE, also enable wakeup */ | ||
1395 | if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) | ||
1396 | _enable_wakeup(oh, &v); | ||
1397 | |||
1398 | _write_sysconfig(v, oh); | 1408 | _write_sysconfig(v, oh); |
1399 | 1409 | ||
1400 | /* | 1410 | /* |
@@ -1430,13 +1440,16 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
1430 | sf = oh->class->sysc->sysc_flags; | 1440 | sf = oh->class->sysc->sysc_flags; |
1431 | 1441 | ||
1432 | if (sf & SYSC_HAS_SIDLEMODE) { | 1442 | if (sf & SYSC_HAS_SIDLEMODE) { |
1433 | /* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */ | 1443 | if (oh->flags & HWMOD_SWSUP_SIDLE) { |
1434 | if (oh->flags & HWMOD_SWSUP_SIDLE || | ||
1435 | !(oh->class->sysc->idlemodes & | ||
1436 | (SIDLE_SMART | SIDLE_SMART_WKUP))) | ||
1437 | idlemode = HWMOD_IDLEMODE_FORCE; | 1444 | idlemode = HWMOD_IDLEMODE_FORCE; |
1438 | else | 1445 | } else { |
1439 | idlemode = HWMOD_IDLEMODE_SMART; | 1446 | if (sf & SYSC_HAS_ENAWAKEUP) |
1447 | _enable_wakeup(oh, &v); | ||
1448 | if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) | ||
1449 | idlemode = HWMOD_IDLEMODE_SMART_WKUP; | ||
1450 | else | ||
1451 | idlemode = HWMOD_IDLEMODE_SMART; | ||
1452 | } | ||
1440 | _set_slave_idlemode(oh, idlemode, &v); | 1453 | _set_slave_idlemode(oh, idlemode, &v); |
1441 | } | 1454 | } |
1442 | 1455 | ||
@@ -1455,10 +1468,6 @@ static void _idle_sysc(struct omap_hwmod *oh) | |||
1455 | _set_master_standbymode(oh, idlemode, &v); | 1468 | _set_master_standbymode(oh, idlemode, &v); |
1456 | } | 1469 | } |
1457 | 1470 | ||
1458 | /* If slave is in SMARTIDLE, also enable wakeup */ | ||
1459 | if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE)) | ||
1460 | _enable_wakeup(oh, &v); | ||
1461 | |||
1462 | _write_sysconfig(v, oh); | 1471 | _write_sysconfig(v, oh); |
1463 | } | 1472 | } |
1464 | 1473 | ||
@@ -2065,7 +2074,7 @@ static int _omap4_get_context_lost(struct omap_hwmod *oh) | |||
2065 | * do so is present in the hwmod data, then call it and pass along the | 2074 | * do so is present in the hwmod data, then call it and pass along the |
2066 | * return value; otherwise, return 0. | 2075 | * return value; otherwise, return 0. |
2067 | */ | 2076 | */ |
2068 | static int __init _enable_preprogram(struct omap_hwmod *oh) | 2077 | static int _enable_preprogram(struct omap_hwmod *oh) |
2069 | { | 2078 | { |
2070 | if (!oh->class->enable_preprogram) | 2079 | if (!oh->class->enable_preprogram) |
2071 | return 0; | 2080 | return 0; |
@@ -2246,42 +2255,6 @@ static int _idle(struct omap_hwmod *oh) | |||
2246 | } | 2255 | } |
2247 | 2256 | ||
2248 | /** | 2257 | /** |
2249 | * omap_hwmod_set_ocp_autoidle - set the hwmod's OCP autoidle bit | ||
2250 | * @oh: struct omap_hwmod * | ||
2251 | * @autoidle: desired AUTOIDLE bitfield value (0 or 1) | ||
2252 | * | ||
2253 | * Sets the IP block's OCP autoidle bit in hardware, and updates our | ||
2254 | * local copy. Intended to be used by drivers that require | ||
2255 | * direct manipulation of the AUTOIDLE bits. | ||
2256 | * Returns -EINVAL if @oh is null or is not in the ENABLED state, or passes | ||
2257 | * along the return value from _set_module_autoidle(). | ||
2258 | * | ||
2259 | * Any users of this function should be scrutinized carefully. | ||
2260 | */ | ||
2261 | int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle) | ||
2262 | { | ||
2263 | u32 v; | ||
2264 | int retval = 0; | ||
2265 | unsigned long flags; | ||
2266 | |||
2267 | if (!oh || oh->_state != _HWMOD_STATE_ENABLED) | ||
2268 | return -EINVAL; | ||
2269 | |||
2270 | spin_lock_irqsave(&oh->_lock, flags); | ||
2271 | |||
2272 | v = oh->_sysc_cache; | ||
2273 | |||
2274 | retval = _set_module_autoidle(oh, autoidle, &v); | ||
2275 | |||
2276 | if (!retval) | ||
2277 | _write_sysconfig(v, oh); | ||
2278 | |||
2279 | spin_unlock_irqrestore(&oh->_lock, flags); | ||
2280 | |||
2281 | return retval; | ||
2282 | } | ||
2283 | |||
2284 | /** | ||
2285 | * _shutdown - shutdown an omap_hwmod | 2258 | * _shutdown - shutdown an omap_hwmod |
2286 | * @oh: struct omap_hwmod * | 2259 | * @oh: struct omap_hwmod * |
2287 | * | 2260 | * |
@@ -3180,38 +3153,6 @@ error: | |||
3180 | } | 3153 | } |
3181 | 3154 | ||
3182 | /** | 3155 | /** |
3183 | * omap_hwmod_set_slave_idlemode - set the hwmod's OCP slave idlemode | ||
3184 | * @oh: struct omap_hwmod * | ||
3185 | * @idlemode: SIDLEMODE field bits (shifted to bit 0) | ||
3186 | * | ||
3187 | * Sets the IP block's OCP slave idlemode in hardware, and updates our | ||
3188 | * local copy. Intended to be used by drivers that have some erratum | ||
3189 | * that requires direct manipulation of the SIDLEMODE bits. Returns | ||
3190 | * -EINVAL if @oh is null, or passes along the return value from | ||
3191 | * _set_slave_idlemode(). | ||
3192 | * | ||
3193 | * XXX Does this function have any current users? If not, we should | ||
3194 | * remove it; it is better to let the rest of the hwmod code handle this. | ||
3195 | * Any users of this function should be scrutinized carefully. | ||
3196 | */ | ||
3197 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode) | ||
3198 | { | ||
3199 | u32 v; | ||
3200 | int retval = 0; | ||
3201 | |||
3202 | if (!oh) | ||
3203 | return -EINVAL; | ||
3204 | |||
3205 | v = oh->_sysc_cache; | ||
3206 | |||
3207 | retval = _set_slave_idlemode(oh, idlemode, &v); | ||
3208 | if (!retval) | ||
3209 | _write_sysconfig(v, oh); | ||
3210 | |||
3211 | return retval; | ||
3212 | } | ||
3213 | |||
3214 | /** | ||
3215 | * omap_hwmod_lookup - look up a registered omap_hwmod by name | 3156 | * omap_hwmod_lookup - look up a registered omap_hwmod by name |
3216 | * @name: name of the omap_hwmod to look up | 3157 | * @name: name of the omap_hwmod to look up |
3217 | * | 3158 | * |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index fe5962921f07..0c898f58ac9b 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -463,6 +463,9 @@ struct omap_hwmod_omap4_prcm { | |||
463 | * is kept in force-standby mode. Failing to do so causes PM problems | 463 | * is kept in force-standby mode. Failing to do so causes PM problems |
464 | * with musb on OMAP3630 at least. Note that musb has a dedicated register | 464 | * with musb on OMAP3630 at least. Note that musb has a dedicated register |
465 | * to control MSTANDBY signal when MIDLEMODE is set to force-standby. | 465 | * to control MSTANDBY signal when MIDLEMODE is set to force-standby. |
466 | * HWMOD_SWSUP_SIDLE_ACT: omap_hwmod code should manually bring the module | ||
467 | * out of idle, but rely on smart-idle to the put it back in idle, | ||
468 | * so the wakeups are still functional (Only known case for now is UART) | ||
466 | */ | 469 | */ |
467 | #define HWMOD_SWSUP_SIDLE (1 << 0) | 470 | #define HWMOD_SWSUP_SIDLE (1 << 0) |
468 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) | 471 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) |
@@ -476,6 +479,7 @@ struct omap_hwmod_omap4_prcm { | |||
476 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) | 479 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) |
477 | #define HWMOD_BLOCK_WFI (1 << 10) | 480 | #define HWMOD_BLOCK_WFI (1 << 10) |
478 | #define HWMOD_FORCE_MSTANDBY (1 << 11) | 481 | #define HWMOD_FORCE_MSTANDBY (1 << 11) |
482 | #define HWMOD_SWSUP_SIDLE_ACT (1 << 12) | ||
479 | 483 | ||
480 | /* | 484 | /* |
481 | * omap_hwmod._int_flags definitions | 485 | * omap_hwmod._int_flags definitions |
@@ -641,9 +645,6 @@ int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name); | |||
641 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); | 645 | int omap_hwmod_enable_clocks(struct omap_hwmod *oh); |
642 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); | 646 | int omap_hwmod_disable_clocks(struct omap_hwmod *oh); |
643 | 647 | ||
644 | int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode); | ||
645 | int omap_hwmod_set_ocp_autoidle(struct omap_hwmod *oh, u8 autoidle); | ||
646 | |||
647 | int omap_hwmod_reset(struct omap_hwmod *oh); | 648 | int omap_hwmod_reset(struct omap_hwmod *oh); |
648 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); | 649 | void omap_hwmod_ocp_barrier(struct omap_hwmod *oh); |
649 | 650 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c index c8c64b3e1acc..d05fc7b54567 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | |||
@@ -512,6 +512,7 @@ struct omap_hwmod omap2xxx_uart1_hwmod = { | |||
512 | .mpu_irqs = omap2_uart1_mpu_irqs, | 512 | .mpu_irqs = omap2_uart1_mpu_irqs, |
513 | .sdma_reqs = omap2_uart1_sdma_reqs, | 513 | .sdma_reqs = omap2_uart1_sdma_reqs, |
514 | .main_clk = "uart1_fck", | 514 | .main_clk = "uart1_fck", |
515 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
515 | .prcm = { | 516 | .prcm = { |
516 | .omap2 = { | 517 | .omap2 = { |
517 | .module_offs = CORE_MOD, | 518 | .module_offs = CORE_MOD, |
@@ -531,6 +532,7 @@ struct omap_hwmod omap2xxx_uart2_hwmod = { | |||
531 | .mpu_irqs = omap2_uart2_mpu_irqs, | 532 | .mpu_irqs = omap2_uart2_mpu_irqs, |
532 | .sdma_reqs = omap2_uart2_sdma_reqs, | 533 | .sdma_reqs = omap2_uart2_sdma_reqs, |
533 | .main_clk = "uart2_fck", | 534 | .main_clk = "uart2_fck", |
535 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
534 | .prcm = { | 536 | .prcm = { |
535 | .omap2 = { | 537 | .omap2 = { |
536 | .module_offs = CORE_MOD, | 538 | .module_offs = CORE_MOD, |
@@ -550,6 +552,7 @@ struct omap_hwmod omap2xxx_uart3_hwmod = { | |||
550 | .mpu_irqs = omap2_uart3_mpu_irqs, | 552 | .mpu_irqs = omap2_uart3_mpu_irqs, |
551 | .sdma_reqs = omap2_uart3_sdma_reqs, | 553 | .sdma_reqs = omap2_uart3_sdma_reqs, |
552 | .main_clk = "uart3_fck", | 554 | .main_clk = "uart3_fck", |
555 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
553 | .prcm = { | 556 | .prcm = { |
554 | .omap2 = { | 557 | .omap2 = { |
555 | .module_offs = CORE_MOD, | 558 | .module_offs = CORE_MOD, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 01d8f324450a..69337af748cc 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
@@ -1995,6 +1995,7 @@ static struct omap_hwmod am33xx_uart1_hwmod = { | |||
1995 | .name = "uart1", | 1995 | .name = "uart1", |
1996 | .class = &uart_class, | 1996 | .class = &uart_class, |
1997 | .clkdm_name = "l4_wkup_clkdm", | 1997 | .clkdm_name = "l4_wkup_clkdm", |
1998 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
1998 | .mpu_irqs = am33xx_uart1_irqs, | 1999 | .mpu_irqs = am33xx_uart1_irqs, |
1999 | .sdma_reqs = uart1_edma_reqs, | 2000 | .sdma_reqs = uart1_edma_reqs, |
2000 | .main_clk = "dpll_per_m2_div4_wkupdm_ck", | 2001 | .main_clk = "dpll_per_m2_div4_wkupdm_ck", |
@@ -2006,6 +2007,13 @@ static struct omap_hwmod am33xx_uart1_hwmod = { | |||
2006 | }, | 2007 | }, |
2007 | }; | 2008 | }; |
2008 | 2009 | ||
2010 | /* uart2 */ | ||
2011 | static struct omap_hwmod_dma_info uart2_edma_reqs[] = { | ||
2012 | { .name = "tx", .dma_req = 28, }, | ||
2013 | { .name = "rx", .dma_req = 29, }, | ||
2014 | { .dma_req = -1 } | ||
2015 | }; | ||
2016 | |||
2009 | static struct omap_hwmod_irq_info am33xx_uart2_irqs[] = { | 2017 | static struct omap_hwmod_irq_info am33xx_uart2_irqs[] = { |
2010 | { .irq = 73 + OMAP_INTC_START, }, | 2018 | { .irq = 73 + OMAP_INTC_START, }, |
2011 | { .irq = -1 }, | 2019 | { .irq = -1 }, |
@@ -2015,8 +2023,9 @@ static struct omap_hwmod am33xx_uart2_hwmod = { | |||
2015 | .name = "uart2", | 2023 | .name = "uart2", |
2016 | .class = &uart_class, | 2024 | .class = &uart_class, |
2017 | .clkdm_name = "l4ls_clkdm", | 2025 | .clkdm_name = "l4ls_clkdm", |
2026 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2018 | .mpu_irqs = am33xx_uart2_irqs, | 2027 | .mpu_irqs = am33xx_uart2_irqs, |
2019 | .sdma_reqs = uart1_edma_reqs, | 2028 | .sdma_reqs = uart2_edma_reqs, |
2020 | .main_clk = "dpll_per_m2_div4_ck", | 2029 | .main_clk = "dpll_per_m2_div4_ck", |
2021 | .prcm = { | 2030 | .prcm = { |
2022 | .omap4 = { | 2031 | .omap4 = { |
@@ -2042,6 +2051,7 @@ static struct omap_hwmod am33xx_uart3_hwmod = { | |||
2042 | .name = "uart3", | 2051 | .name = "uart3", |
2043 | .class = &uart_class, | 2052 | .class = &uart_class, |
2044 | .clkdm_name = "l4ls_clkdm", | 2053 | .clkdm_name = "l4ls_clkdm", |
2054 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2045 | .mpu_irqs = am33xx_uart3_irqs, | 2055 | .mpu_irqs = am33xx_uart3_irqs, |
2046 | .sdma_reqs = uart3_edma_reqs, | 2056 | .sdma_reqs = uart3_edma_reqs, |
2047 | .main_clk = "dpll_per_m2_div4_ck", | 2057 | .main_clk = "dpll_per_m2_div4_ck", |
@@ -2062,6 +2072,7 @@ static struct omap_hwmod am33xx_uart4_hwmod = { | |||
2062 | .name = "uart4", | 2072 | .name = "uart4", |
2063 | .class = &uart_class, | 2073 | .class = &uart_class, |
2064 | .clkdm_name = "l4ls_clkdm", | 2074 | .clkdm_name = "l4ls_clkdm", |
2075 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2065 | .mpu_irqs = am33xx_uart4_irqs, | 2076 | .mpu_irqs = am33xx_uart4_irqs, |
2066 | .sdma_reqs = uart1_edma_reqs, | 2077 | .sdma_reqs = uart1_edma_reqs, |
2067 | .main_clk = "dpll_per_m2_div4_ck", | 2078 | .main_clk = "dpll_per_m2_div4_ck", |
@@ -2082,6 +2093,7 @@ static struct omap_hwmod am33xx_uart5_hwmod = { | |||
2082 | .name = "uart5", | 2093 | .name = "uart5", |
2083 | .class = &uart_class, | 2094 | .class = &uart_class, |
2084 | .clkdm_name = "l4ls_clkdm", | 2095 | .clkdm_name = "l4ls_clkdm", |
2096 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2085 | .mpu_irqs = am33xx_uart5_irqs, | 2097 | .mpu_irqs = am33xx_uart5_irqs, |
2086 | .sdma_reqs = uart1_edma_reqs, | 2098 | .sdma_reqs = uart1_edma_reqs, |
2087 | .main_clk = "dpll_per_m2_div4_ck", | 2099 | .main_clk = "dpll_per_m2_div4_ck", |
@@ -2102,6 +2114,7 @@ static struct omap_hwmod am33xx_uart6_hwmod = { | |||
2102 | .name = "uart6", | 2114 | .name = "uart6", |
2103 | .class = &uart_class, | 2115 | .class = &uart_class, |
2104 | .clkdm_name = "l4ls_clkdm", | 2116 | .clkdm_name = "l4ls_clkdm", |
2117 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
2105 | .mpu_irqs = am33xx_uart6_irqs, | 2118 | .mpu_irqs = am33xx_uart6_irqs, |
2106 | .sdma_reqs = uart1_edma_reqs, | 2119 | .sdma_reqs = uart1_edma_reqs, |
2107 | .main_clk = "dpll_per_m2_div4_ck", | 2120 | .main_clk = "dpll_per_m2_div4_ck", |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 4083606ea1da..31c7126eb3bb 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -490,6 +490,7 @@ static struct omap_hwmod omap3xxx_uart1_hwmod = { | |||
490 | .mpu_irqs = omap2_uart1_mpu_irqs, | 490 | .mpu_irqs = omap2_uart1_mpu_irqs, |
491 | .sdma_reqs = omap2_uart1_sdma_reqs, | 491 | .sdma_reqs = omap2_uart1_sdma_reqs, |
492 | .main_clk = "uart1_fck", | 492 | .main_clk = "uart1_fck", |
493 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
493 | .prcm = { | 494 | .prcm = { |
494 | .omap2 = { | 495 | .omap2 = { |
495 | .module_offs = CORE_MOD, | 496 | .module_offs = CORE_MOD, |
@@ -508,6 +509,7 @@ static struct omap_hwmod omap3xxx_uart2_hwmod = { | |||
508 | .mpu_irqs = omap2_uart2_mpu_irqs, | 509 | .mpu_irqs = omap2_uart2_mpu_irqs, |
509 | .sdma_reqs = omap2_uart2_sdma_reqs, | 510 | .sdma_reqs = omap2_uart2_sdma_reqs, |
510 | .main_clk = "uart2_fck", | 511 | .main_clk = "uart2_fck", |
512 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
511 | .prcm = { | 513 | .prcm = { |
512 | .omap2 = { | 514 | .omap2 = { |
513 | .module_offs = CORE_MOD, | 515 | .module_offs = CORE_MOD, |
@@ -526,6 +528,7 @@ static struct omap_hwmod omap3xxx_uart3_hwmod = { | |||
526 | .mpu_irqs = omap2_uart3_mpu_irqs, | 528 | .mpu_irqs = omap2_uart3_mpu_irqs, |
527 | .sdma_reqs = omap2_uart3_sdma_reqs, | 529 | .sdma_reqs = omap2_uart3_sdma_reqs, |
528 | .main_clk = "uart3_fck", | 530 | .main_clk = "uart3_fck", |
531 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
529 | .prcm = { | 532 | .prcm = { |
530 | .omap2 = { | 533 | .omap2 = { |
531 | .module_offs = OMAP3430_PER_MOD, | 534 | .module_offs = OMAP3430_PER_MOD, |
@@ -555,6 +558,7 @@ static struct omap_hwmod omap36xx_uart4_hwmod = { | |||
555 | .mpu_irqs = uart4_mpu_irqs, | 558 | .mpu_irqs = uart4_mpu_irqs, |
556 | .sdma_reqs = uart4_sdma_reqs, | 559 | .sdma_reqs = uart4_sdma_reqs, |
557 | .main_clk = "uart4_fck", | 560 | .main_clk = "uart4_fck", |
561 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
558 | .prcm = { | 562 | .prcm = { |
559 | .omap2 = { | 563 | .omap2 = { |
560 | .module_offs = OMAP3430_PER_MOD, | 564 | .module_offs = OMAP3430_PER_MOD, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index eaba9dc91a0d..848b6dc67590 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -3434,6 +3434,7 @@ static struct omap_hwmod omap44xx_uart1_hwmod = { | |||
3434 | .name = "uart1", | 3434 | .name = "uart1", |
3435 | .class = &omap44xx_uart_hwmod_class, | 3435 | .class = &omap44xx_uart_hwmod_class, |
3436 | .clkdm_name = "l4_per_clkdm", | 3436 | .clkdm_name = "l4_per_clkdm", |
3437 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
3437 | .mpu_irqs = omap44xx_uart1_irqs, | 3438 | .mpu_irqs = omap44xx_uart1_irqs, |
3438 | .sdma_reqs = omap44xx_uart1_sdma_reqs, | 3439 | .sdma_reqs = omap44xx_uart1_sdma_reqs, |
3439 | .main_clk = "func_48m_fclk", | 3440 | .main_clk = "func_48m_fclk", |
@@ -3462,6 +3463,7 @@ static struct omap_hwmod omap44xx_uart2_hwmod = { | |||
3462 | .name = "uart2", | 3463 | .name = "uart2", |
3463 | .class = &omap44xx_uart_hwmod_class, | 3464 | .class = &omap44xx_uart_hwmod_class, |
3464 | .clkdm_name = "l4_per_clkdm", | 3465 | .clkdm_name = "l4_per_clkdm", |
3466 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
3465 | .mpu_irqs = omap44xx_uart2_irqs, | 3467 | .mpu_irqs = omap44xx_uart2_irqs, |
3466 | .sdma_reqs = omap44xx_uart2_sdma_reqs, | 3468 | .sdma_reqs = omap44xx_uart2_sdma_reqs, |
3467 | .main_clk = "func_48m_fclk", | 3469 | .main_clk = "func_48m_fclk", |
@@ -3490,7 +3492,8 @@ static struct omap_hwmod omap44xx_uart3_hwmod = { | |||
3490 | .name = "uart3", | 3492 | .name = "uart3", |
3491 | .class = &omap44xx_uart_hwmod_class, | 3493 | .class = &omap44xx_uart_hwmod_class, |
3492 | .clkdm_name = "l4_per_clkdm", | 3494 | .clkdm_name = "l4_per_clkdm", |
3493 | .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET, | 3495 | .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET | |
3496 | HWMOD_SWSUP_SIDLE_ACT, | ||
3494 | .mpu_irqs = omap44xx_uart3_irqs, | 3497 | .mpu_irqs = omap44xx_uart3_irqs, |
3495 | .sdma_reqs = omap44xx_uart3_sdma_reqs, | 3498 | .sdma_reqs = omap44xx_uart3_sdma_reqs, |
3496 | .main_clk = "func_48m_fclk", | 3499 | .main_clk = "func_48m_fclk", |
@@ -3519,6 +3522,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = { | |||
3519 | .name = "uart4", | 3522 | .name = "uart4", |
3520 | .class = &omap44xx_uart_hwmod_class, | 3523 | .class = &omap44xx_uart_hwmod_class, |
3521 | .clkdm_name = "l4_per_clkdm", | 3524 | .clkdm_name = "l4_per_clkdm", |
3525 | .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
3522 | .mpu_irqs = omap44xx_uart4_irqs, | 3526 | .mpu_irqs = omap44xx_uart4_irqs, |
3523 | .sdma_reqs = omap44xx_uart4_sdma_reqs, | 3527 | .sdma_reqs = omap44xx_uart4_sdma_reqs, |
3524 | .main_clk = "func_48m_fclk", | 3528 | .main_clk = "func_48m_fclk", |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index c01859398b54..5a2d8034c8de 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -546,8 +546,10 @@ static void __init prcm_setup_regs(void) | |||
546 | /* Clear any pending PRCM interrupts */ | 546 | /* Clear any pending PRCM interrupts */ |
547 | omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 547 | omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
548 | 548 | ||
549 | if (omap3_has_iva()) | 549 | /* |
550 | omap3_iva_idle(); | 550 | * We need to idle iva2_pwrdm even on am3703 with no iva2. |
551 | */ | ||
552 | omap3_iva_idle(); | ||
551 | 553 | ||
552 | omap3_d2d_idle(); | 554 | omap3_d2d_idle(); |
553 | } | 555 | } |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 8396b5b7e912..f6601563aa69 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -95,38 +95,9 @@ static void omap_uart_enable_wakeup(struct device *dev, bool enable) | |||
95 | omap_hwmod_disable_wakeup(od->hwmods[0]); | 95 | omap_hwmod_disable_wakeup(od->hwmods[0]); |
96 | } | 96 | } |
97 | 97 | ||
98 | /* | ||
99 | * Errata i291: [UART]:Cannot Acknowledge Idle Requests | ||
100 | * in Smartidle Mode When Configured for DMA Operations. | ||
101 | * WA: configure uart in force idle mode. | ||
102 | */ | ||
103 | static void omap_uart_set_noidle(struct device *dev) | ||
104 | { | ||
105 | struct platform_device *pdev = to_platform_device(dev); | ||
106 | struct omap_device *od = to_omap_device(pdev); | ||
107 | |||
108 | omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO); | ||
109 | } | ||
110 | |||
111 | static void omap_uart_set_smartidle(struct device *dev) | ||
112 | { | ||
113 | struct platform_device *pdev = to_platform_device(dev); | ||
114 | struct omap_device *od = to_omap_device(pdev); | ||
115 | u8 idlemode; | ||
116 | |||
117 | if (od->hwmods[0]->class->sysc->idlemodes & SIDLE_SMART_WKUP) | ||
118 | idlemode = HWMOD_IDLEMODE_SMART_WKUP; | ||
119 | else | ||
120 | idlemode = HWMOD_IDLEMODE_SMART; | ||
121 | |||
122 | omap_hwmod_set_slave_idlemode(od->hwmods[0], idlemode); | ||
123 | } | ||
124 | |||
125 | #else | 98 | #else |
126 | static void omap_uart_enable_wakeup(struct device *dev, bool enable) | 99 | static void omap_uart_enable_wakeup(struct device *dev, bool enable) |
127 | {} | 100 | {} |
128 | static void omap_uart_set_noidle(struct device *dev) {} | ||
129 | static void omap_uart_set_smartidle(struct device *dev) {} | ||
130 | #endif /* CONFIG_PM */ | 101 | #endif /* CONFIG_PM */ |
131 | 102 | ||
132 | #ifdef CONFIG_OMAP_MUX | 103 | #ifdef CONFIG_OMAP_MUX |
@@ -299,8 +270,6 @@ void __init omap_serial_init_port(struct omap_board_data *bdata, | |||
299 | omap_up.uartclk = OMAP24XX_BASE_BAUD * 16; | 270 | omap_up.uartclk = OMAP24XX_BASE_BAUD * 16; |
300 | omap_up.flags = UPF_BOOT_AUTOCONF; | 271 | omap_up.flags = UPF_BOOT_AUTOCONF; |
301 | omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count; | 272 | omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count; |
302 | omap_up.set_forceidle = omap_uart_set_smartidle; | ||
303 | omap_up.set_noidle = omap_uart_set_noidle; | ||
304 | omap_up.enable_wakeup = omap_uart_enable_wakeup; | 273 | omap_up.enable_wakeup = omap_uart_enable_wakeup; |
305 | omap_up.dma_rx_buf_size = info->dma_rx_buf_size; | 274 | omap_up.dma_rx_buf_size = info->dma_rx_buf_size; |
306 | omap_up.dma_rx_timeout = info->dma_rx_timeout; | 275 | omap_up.dma_rx_timeout = info->dma_rx_timeout; |