diff options
Diffstat (limited to 'arch/arm/mach-omap2')
| -rw-r--r-- | arch/arm/mach-omap2/cclock33xx_data.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/dpll3xxx.c | 19 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.c | 4 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod.h | 6 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/omap_hwmod_33xx_data.c | 15 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/powerdomain.c | 18 |
6 files changed, 42 insertions, 28 deletions
diff --git a/arch/arm/mach-omap2/cclock33xx_data.c b/arch/arm/mach-omap2/cclock33xx_data.c index 476b82066cb6..7f091c85384e 100644 --- a/arch/arm/mach-omap2/cclock33xx_data.c +++ b/arch/arm/mach-omap2/cclock33xx_data.c | |||
| @@ -958,6 +958,14 @@ int __init am33xx_clk_init(void) | |||
| 958 | 958 | ||
| 959 | clk_set_parent(&timer3_fck, &sys_clkin_ck); | 959 | clk_set_parent(&timer3_fck, &sys_clkin_ck); |
| 960 | clk_set_parent(&timer6_fck, &sys_clkin_ck); | 960 | clk_set_parent(&timer6_fck, &sys_clkin_ck); |
| 961 | /* | ||
| 962 | * The On-Chip 32K RC Osc clock is not an accurate clock-source as per | ||
| 963 | * the design/spec, so as a result, for example, timer which supposed | ||
| 964 | * to get expired @60Sec, but will expire somewhere ~@40Sec, which is | ||
| 965 | * not expected by any use-case, so change WDT1 clock source to PRCM | ||
| 966 | * 32KHz clock. | ||
| 967 | */ | ||
| 968 | clk_set_parent(&wdt1_fck, &clkdiv32k_ick); | ||
| 961 | 969 | ||
| 962 | return 0; | 970 | return 0; |
| 963 | } | 971 | } |
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index 3aed4b0b9563..6e9873ff1844 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c | |||
| @@ -480,20 +480,22 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
| 480 | if (!dd) | 480 | if (!dd) |
| 481 | return -EINVAL; | 481 | return -EINVAL; |
| 482 | 482 | ||
| 483 | __clk_prepare(dd->clk_bypass); | ||
| 484 | clk_enable(dd->clk_bypass); | ||
| 485 | __clk_prepare(dd->clk_ref); | ||
| 486 | clk_enable(dd->clk_ref); | ||
| 487 | |||
| 488 | if (__clk_get_rate(dd->clk_bypass) == rate && | 483 | if (__clk_get_rate(dd->clk_bypass) == rate && |
| 489 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { | 484 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { |
| 490 | pr_debug("%s: %s: set rate: entering bypass.\n", | 485 | pr_debug("%s: %s: set rate: entering bypass.\n", |
| 491 | __func__, __clk_get_name(hw->clk)); | 486 | __func__, __clk_get_name(hw->clk)); |
| 492 | 487 | ||
| 488 | __clk_prepare(dd->clk_bypass); | ||
| 489 | clk_enable(dd->clk_bypass); | ||
| 493 | ret = _omap3_noncore_dpll_bypass(clk); | 490 | ret = _omap3_noncore_dpll_bypass(clk); |
| 494 | if (!ret) | 491 | if (!ret) |
| 495 | new_parent = dd->clk_bypass; | 492 | new_parent = dd->clk_bypass; |
| 493 | clk_disable(dd->clk_bypass); | ||
| 494 | __clk_unprepare(dd->clk_bypass); | ||
| 496 | } else { | 495 | } else { |
| 496 | __clk_prepare(dd->clk_ref); | ||
| 497 | clk_enable(dd->clk_ref); | ||
| 498 | |||
| 497 | if (dd->last_rounded_rate != rate) | 499 | if (dd->last_rounded_rate != rate) |
| 498 | rate = __clk_round_rate(hw->clk, rate); | 500 | rate = __clk_round_rate(hw->clk, rate); |
| 499 | 501 | ||
| @@ -514,6 +516,8 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
| 514 | ret = omap3_noncore_dpll_program(clk, freqsel); | 516 | ret = omap3_noncore_dpll_program(clk, freqsel); |
| 515 | if (!ret) | 517 | if (!ret) |
| 516 | new_parent = dd->clk_ref; | 518 | new_parent = dd->clk_ref; |
| 519 | clk_disable(dd->clk_ref); | ||
| 520 | __clk_unprepare(dd->clk_ref); | ||
| 517 | } | 521 | } |
| 518 | /* | 522 | /* |
| 519 | * FIXME - this is all wrong. common code handles reparenting and | 523 | * FIXME - this is all wrong. common code handles reparenting and |
| @@ -525,11 +529,6 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
| 525 | if (!ret) | 529 | if (!ret) |
| 526 | __clk_reparent(hw->clk, new_parent); | 530 | __clk_reparent(hw->clk, new_parent); |
| 527 | 531 | ||
| 528 | clk_disable(dd->clk_ref); | ||
| 529 | __clk_unprepare(dd->clk_ref); | ||
| 530 | clk_disable(dd->clk_bypass); | ||
| 531 | __clk_unprepare(dd->clk_bypass); | ||
| 532 | |||
| 533 | return 0; | 532 | return 0; |
| 534 | } | 533 | } |
| 535 | 534 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index c2c798c08c2b..e5cafed8ef25 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -610,8 +610,6 @@ static int _enable_wakeup(struct omap_hwmod *oh, u32 *v) | |||
| 610 | 610 | ||
| 611 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ | 611 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ |
| 612 | 612 | ||
| 613 | oh->_int_flags |= _HWMOD_WAKEUP_ENABLED; | ||
| 614 | |||
| 615 | return 0; | 613 | return 0; |
| 616 | } | 614 | } |
| 617 | 615 | ||
| @@ -645,8 +643,6 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v) | |||
| 645 | 643 | ||
| 646 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ | 644 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ |
| 647 | 645 | ||
| 648 | oh->_int_flags &= ~_HWMOD_WAKEUP_ENABLED; | ||
| 649 | |||
| 650 | return 0; | 646 | return 0; |
| 651 | } | 647 | } |
| 652 | 648 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index d43d9b608eda..28f4dea0512e 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
| @@ -477,15 +477,13 @@ struct omap_hwmod_omap4_prcm { | |||
| 477 | * These are for internal use only and are managed by the omap_hwmod code. | 477 | * These are for internal use only and are managed by the omap_hwmod code. |
| 478 | * | 478 | * |
| 479 | * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module | 479 | * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module |
| 480 | * _HWMOD_WAKEUP_ENABLED: set when the omap_hwmod code has enabled ENAWAKEUP | ||
| 481 | * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached | 480 | * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached |
| 482 | * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) - | 481 | * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) - |
| 483 | * causes the first call to _enable() to only update the pinmux | 482 | * causes the first call to _enable() to only update the pinmux |
| 484 | */ | 483 | */ |
| 485 | #define _HWMOD_NO_MPU_PORT (1 << 0) | 484 | #define _HWMOD_NO_MPU_PORT (1 << 0) |
| 486 | #define _HWMOD_WAKEUP_ENABLED (1 << 1) | 485 | #define _HWMOD_SYSCONFIG_LOADED (1 << 1) |
| 487 | #define _HWMOD_SYSCONFIG_LOADED (1 << 2) | 486 | #define _HWMOD_SKIP_ENABLE (1 << 2) |
| 488 | #define _HWMOD_SKIP_ENABLE (1 << 3) | ||
| 489 | 487 | ||
| 490 | /* | 488 | /* |
| 491 | * omap_hwmod._state definitions | 489 | * omap_hwmod._state definitions |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 26eee4a556ad..31bea1ce3de1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include "prm-regbits-33xx.h" | 28 | #include "prm-regbits-33xx.h" |
| 29 | #include "i2c.h" | 29 | #include "i2c.h" |
| 30 | #include "mmc.h" | 30 | #include "mmc.h" |
| 31 | #include "wd_timer.h" | ||
| 31 | 32 | ||
| 32 | /* | 33 | /* |
| 33 | * IP blocks | 34 | * IP blocks |
| @@ -2087,8 +2088,21 @@ static struct omap_hwmod am33xx_uart6_hwmod = { | |||
| 2087 | }; | 2088 | }; |
| 2088 | 2089 | ||
| 2089 | /* 'wd_timer' class */ | 2090 | /* 'wd_timer' class */ |
| 2091 | static struct omap_hwmod_class_sysconfig wdt_sysc = { | ||
| 2092 | .rev_offs = 0x0, | ||
| 2093 | .sysc_offs = 0x10, | ||
| 2094 | .syss_offs = 0x14, | ||
| 2095 | .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SIDLEMODE | | ||
| 2096 | SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), | ||
| 2097 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | ||
| 2098 | SIDLE_SMART_WKUP), | ||
| 2099 | .sysc_fields = &omap_hwmod_sysc_type1, | ||
| 2100 | }; | ||
| 2101 | |||
| 2090 | static struct omap_hwmod_class am33xx_wd_timer_hwmod_class = { | 2102 | static struct omap_hwmod_class am33xx_wd_timer_hwmod_class = { |
| 2091 | .name = "wd_timer", | 2103 | .name = "wd_timer", |
| 2104 | .sysc = &wdt_sysc, | ||
| 2105 | .pre_shutdown = &omap2_wd_timer_disable, | ||
| 2092 | }; | 2106 | }; |
| 2093 | 2107 | ||
| 2094 | /* | 2108 | /* |
| @@ -2099,6 +2113,7 @@ static struct omap_hwmod am33xx_wd_timer1_hwmod = { | |||
| 2099 | .name = "wd_timer2", | 2113 | .name = "wd_timer2", |
| 2100 | .class = &am33xx_wd_timer_hwmod_class, | 2114 | .class = &am33xx_wd_timer_hwmod_class, |
| 2101 | .clkdm_name = "l4_wkup_clkdm", | 2115 | .clkdm_name = "l4_wkup_clkdm", |
| 2116 | .flags = HWMOD_SWSUP_SIDLE, | ||
| 2102 | .main_clk = "wdt1_fck", | 2117 | .main_clk = "wdt1_fck", |
| 2103 | .prcm = { | 2118 | .prcm = { |
| 2104 | .omap4 = { | 2119 | .omap4 = { |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 8e61d80bf6b3..89cad4a605dd 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
| @@ -52,7 +52,6 @@ enum { | |||
| 52 | #define ALREADYACTIVE_SWITCH 0 | 52 | #define ALREADYACTIVE_SWITCH 0 |
| 53 | #define FORCEWAKEUP_SWITCH 1 | 53 | #define FORCEWAKEUP_SWITCH 1 |
| 54 | #define LOWPOWERSTATE_SWITCH 2 | 54 | #define LOWPOWERSTATE_SWITCH 2 |
| 55 | #define ERROR_SWITCH 3 | ||
| 56 | 55 | ||
| 57 | /* pwrdm_list contains all registered struct powerdomains */ | 56 | /* pwrdm_list contains all registered struct powerdomains */ |
| 58 | static LIST_HEAD(pwrdm_list); | 57 | static LIST_HEAD(pwrdm_list); |
| @@ -233,10 +232,7 @@ static u8 _pwrdm_save_clkdm_state_and_activate(struct powerdomain *pwrdm, | |||
| 233 | { | 232 | { |
| 234 | u8 sleep_switch; | 233 | u8 sleep_switch; |
| 235 | 234 | ||
| 236 | if (curr_pwrst < 0) { | 235 | if (curr_pwrst < PWRDM_POWER_ON) { |
| 237 | WARN_ON(1); | ||
| 238 | sleep_switch = ERROR_SWITCH; | ||
| 239 | } else if (curr_pwrst < PWRDM_POWER_ON) { | ||
| 240 | if (curr_pwrst > pwrst && | 236 | if (curr_pwrst > pwrst && |
| 241 | pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE && | 237 | pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE && |
| 242 | arch_pwrdm->pwrdm_set_lowpwrstchange) { | 238 | arch_pwrdm->pwrdm_set_lowpwrstchange) { |
| @@ -1091,7 +1087,8 @@ int pwrdm_post_transition(struct powerdomain *pwrdm) | |||
| 1091 | */ | 1087 | */ |
| 1092 | int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 pwrst) | 1088 | int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 pwrst) |
| 1093 | { | 1089 | { |
| 1094 | u8 curr_pwrst, next_pwrst, sleep_switch; | 1090 | u8 next_pwrst, sleep_switch; |
| 1091 | int curr_pwrst; | ||
| 1095 | int ret = 0; | 1092 | int ret = 0; |
| 1096 | bool hwsup = false; | 1093 | bool hwsup = false; |
| 1097 | 1094 | ||
| @@ -1107,16 +1104,17 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 pwrst) | |||
| 1107 | pwrdm_lock(pwrdm); | 1104 | pwrdm_lock(pwrdm); |
| 1108 | 1105 | ||
| 1109 | curr_pwrst = pwrdm_read_pwrst(pwrdm); | 1106 | curr_pwrst = pwrdm_read_pwrst(pwrdm); |
| 1107 | if (curr_pwrst < 0) { | ||
| 1108 | ret = -EINVAL; | ||
| 1109 | goto osps_out; | ||
| 1110 | } | ||
| 1111 | |||
| 1110 | next_pwrst = pwrdm_read_next_pwrst(pwrdm); | 1112 | next_pwrst = pwrdm_read_next_pwrst(pwrdm); |
| 1111 | if (curr_pwrst == pwrst && next_pwrst == pwrst) | 1113 | if (curr_pwrst == pwrst && next_pwrst == pwrst) |
| 1112 | goto osps_out; | 1114 | goto osps_out; |
| 1113 | 1115 | ||
| 1114 | sleep_switch = _pwrdm_save_clkdm_state_and_activate(pwrdm, curr_pwrst, | 1116 | sleep_switch = _pwrdm_save_clkdm_state_and_activate(pwrdm, curr_pwrst, |
| 1115 | pwrst, &hwsup); | 1117 | pwrst, &hwsup); |
| 1116 | if (sleep_switch == ERROR_SWITCH) { | ||
| 1117 | ret = -EINVAL; | ||
| 1118 | goto osps_out; | ||
| 1119 | } | ||
| 1120 | 1118 | ||
| 1121 | ret = pwrdm_set_next_pwrst(pwrdm, pwrst); | 1119 | ret = pwrdm_set_next_pwrst(pwrdm, pwrst); |
| 1122 | if (ret) | 1120 | if (ret) |
