diff options
author | Tero Kristo <t-kristo@ti.com> | 2014-04-04 05:31:51 -0400 |
---|---|---|
committer | Tero Kristo <t-kristo@ti.com> | 2015-03-25 05:03:37 -0400 |
commit | 9cb6d36371b0a9935de92bf250c7152f5b50fdc1 (patch) | |
tree | 0554046de7ecbb7b75ccdca3f05551b79382be85 | |
parent | f0caa5270bcf97c6a51c89d44747da00c0d67bb8 (diff) |
ARM: OMAP2+: PRM: add generic API for clear_mod_irqs
OMAP2/3 now use generic API for the prm_clear_mod_irqs, the SoC specific
implementation details are provided through prm_ll_data.
Signed-off-by: Tero Kristo <t-kristo@ti.com>
-rw-r--r-- | arch/arm/mach-omap2/pm24xx.c | 24 | ||||
-rw-r--r-- | arch/arm/mach-omap2/pm34xx.c | 18 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm2xxx.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm2xxx.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm3xxx.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm3xxx.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/prm_common.c | 21 |
8 files changed, 47 insertions, 28 deletions
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index fe01c5a03aa2..b1aad7e1426c 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -75,9 +75,9 @@ static int omap2_enter_full_retention(void) | |||
75 | 75 | ||
76 | /* Clear old wake-up events */ | 76 | /* Clear old wake-up events */ |
77 | /* REVISIT: These write to reserved bits? */ | 77 | /* REVISIT: These write to reserved bits? */ |
78 | omap2xxx_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0); | 78 | omap_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0); |
79 | omap2xxx_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0); | 79 | omap_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0); |
80 | omap2xxx_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, ~0); | 80 | omap_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, ~0); |
81 | 81 | ||
82 | pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET); | 82 | pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET); |
83 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); | 83 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); |
@@ -104,18 +104,16 @@ no_sleep: | |||
104 | clk_enable(osc_ck); | 104 | clk_enable(osc_ck); |
105 | 105 | ||
106 | /* clear CORE wake-up events */ | 106 | /* clear CORE wake-up events */ |
107 | omap2xxx_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0); | 107 | omap_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0); |
108 | omap2xxx_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0); | 108 | omap_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0); |
109 | 109 | ||
110 | /* wakeup domain events - bit 1: GPT1, bit5 GPIO */ | 110 | /* wakeup domain events - bit 1: GPT1, bit5 GPIO */ |
111 | omap2xxx_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, 0x4 | 0x1); | 111 | omap_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, 0x4 | 0x1); |
112 | 112 | ||
113 | /* MPU domain wake events */ | 113 | /* MPU domain wake events */ |
114 | omap2xxx_prm_clear_mod_irqs(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET, | 114 | omap_prm_clear_mod_irqs(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET, 0x1); |
115 | 0x1); | ||
116 | 115 | ||
117 | omap2xxx_prm_clear_mod_irqs(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET, | 116 | omap_prm_clear_mod_irqs(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET, 0x20); |
118 | 0x20); | ||
119 | 117 | ||
120 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); | 118 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); |
121 | pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_ON); | 119 | pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_ON); |
@@ -143,9 +141,9 @@ static void omap2_enter_mpu_retention(void) | |||
143 | * it is in retention mode. */ | 141 | * it is in retention mode. */ |
144 | if (omap2_allow_mpu_retention()) { | 142 | if (omap2_allow_mpu_retention()) { |
145 | /* REVISIT: These write to reserved bits? */ | 143 | /* REVISIT: These write to reserved bits? */ |
146 | omap2xxx_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0); | 144 | omap_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0); |
147 | omap2xxx_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0); | 145 | omap_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0); |
148 | omap2xxx_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, ~0); | 146 | omap_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, ~0); |
149 | 147 | ||
150 | /* Try to enter MPU retention */ | 148 | /* Try to enter MPU retention */ |
151 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); | 149 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 25813293eaa6..87b98bf92366 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -137,8 +137,8 @@ static irqreturn_t _prcm_int_handle_io(int irq, void *unused) | |||
137 | { | 137 | { |
138 | int c; | 138 | int c; |
139 | 139 | ||
140 | c = omap3xxx_prm_clear_mod_irqs(WKUP_MOD, 1, OMAP3430_ST_IO_MASK | | 140 | c = omap_prm_clear_mod_irqs(WKUP_MOD, 1, OMAP3430_ST_IO_MASK | |
141 | OMAP3430_ST_IO_CHAIN_MASK); | 141 | OMAP3430_ST_IO_CHAIN_MASK); |
142 | 142 | ||
143 | return c ? IRQ_HANDLED : IRQ_NONE; | 143 | return c ? IRQ_HANDLED : IRQ_NONE; |
144 | } | 144 | } |
@@ -152,15 +152,13 @@ static irqreturn_t _prcm_int_handle_wakeup(int irq, void *unused) | |||
152 | * these are handled in a separate handler to avoid acking | 152 | * these are handled in a separate handler to avoid acking |
153 | * IO events before parsing in mux code | 153 | * IO events before parsing in mux code |
154 | */ | 154 | */ |
155 | c = omap3xxx_prm_clear_mod_irqs(WKUP_MOD, 1, | 155 | c = omap_prm_clear_mod_irqs(WKUP_MOD, 1, ~(OMAP3430_ST_IO_MASK | |
156 | ~(OMAP3430_ST_IO_MASK | | 156 | OMAP3430_ST_IO_CHAIN_MASK)); |
157 | OMAP3430_ST_IO_CHAIN_MASK)); | 157 | c += omap_prm_clear_mod_irqs(CORE_MOD, 1, ~0); |
158 | c += omap3xxx_prm_clear_mod_irqs(CORE_MOD, 1, ~0); | 158 | c += omap_prm_clear_mod_irqs(OMAP3430_PER_MOD, 1, ~0); |
159 | c += omap3xxx_prm_clear_mod_irqs(OMAP3430_PER_MOD, 1, ~0); | ||
160 | if (omap_rev() > OMAP3430_REV_ES1_0) { | 159 | if (omap_rev() > OMAP3430_REV_ES1_0) { |
161 | c += omap3xxx_prm_clear_mod_irqs(CORE_MOD, 3, ~0); | 160 | c += omap_prm_clear_mod_irqs(CORE_MOD, 3, ~0); |
162 | c += omap3xxx_prm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1, | 161 | c += omap_prm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1, ~0); |
163 | ~0); | ||
164 | } | 162 | } |
165 | 163 | ||
166 | return c ? IRQ_HANDLED : IRQ_NONE; | 164 | return c ? IRQ_HANDLED : IRQ_NONE; |
diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h index ba9b9336de7c..2a01a5885c61 100644 --- a/arch/arm/mach-omap2/prm.h +++ b/arch/arm/mach-omap2/prm.h | |||
@@ -146,6 +146,7 @@ struct prm_ll_data { | |||
146 | int (*is_hardreset_asserted)(u8 shift, u8 part, s16 prm_mod, | 146 | int (*is_hardreset_asserted)(u8 shift, u8 part, s16 prm_mod, |
147 | u16 offset); | 147 | u16 offset); |
148 | void (*reset_system)(void); | 148 | void (*reset_system)(void); |
149 | int (*clear_mod_irqs)(s16 module, u8 regs, u32 wkst_mask); | ||
149 | }; | 150 | }; |
150 | 151 | ||
151 | extern int prm_register(struct prm_ll_data *pld); | 152 | extern int prm_register(struct prm_ll_data *pld); |
@@ -161,6 +162,7 @@ extern void prm_clear_context_loss_flags_old(u8 part, s16 inst, u16 idx); | |||
161 | void omap_prm_reset_system(void); | 162 | void omap_prm_reset_system(void); |
162 | 163 | ||
163 | void omap_prm_reconfigure_io_chain(void); | 164 | void omap_prm_reconfigure_io_chain(void); |
165 | int omap_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask); | ||
164 | 166 | ||
165 | #endif | 167 | #endif |
166 | 168 | ||
diff --git a/arch/arm/mach-omap2/prm2xxx.c b/arch/arm/mach-omap2/prm2xxx.c index af0f15278fc2..bacb05e8cc39 100644 --- a/arch/arm/mach-omap2/prm2xxx.c +++ b/arch/arm/mach-omap2/prm2xxx.c | |||
@@ -123,13 +123,14 @@ static void omap2xxx_prm_dpll_reset(void) | |||
123 | * Clears wakeup status bits for a given module, so that the device can | 123 | * Clears wakeup status bits for a given module, so that the device can |
124 | * re-enter idle. | 124 | * re-enter idle. |
125 | */ | 125 | */ |
126 | void omap2xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask) | 126 | static int omap2xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask) |
127 | { | 127 | { |
128 | u32 wkst; | 128 | u32 wkst; |
129 | 129 | ||
130 | wkst = omap2_prm_read_mod_reg(module, regs); | 130 | wkst = omap2_prm_read_mod_reg(module, regs); |
131 | wkst &= wkst_mask; | 131 | wkst &= wkst_mask; |
132 | omap2_prm_write_mod_reg(wkst, module, regs); | 132 | omap2_prm_write_mod_reg(wkst, module, regs); |
133 | return 0; | ||
133 | } | 134 | } |
134 | 135 | ||
135 | int omap2xxx_clkdm_sleep(struct clockdomain *clkdm) | 136 | int omap2xxx_clkdm_sleep(struct clockdomain *clkdm) |
@@ -216,6 +217,7 @@ static struct prm_ll_data omap2xxx_prm_ll_data = { | |||
216 | .deassert_hardreset = &omap2_prm_deassert_hardreset, | 217 | .deassert_hardreset = &omap2_prm_deassert_hardreset, |
217 | .is_hardreset_asserted = &omap2_prm_is_hardreset_asserted, | 218 | .is_hardreset_asserted = &omap2_prm_is_hardreset_asserted, |
218 | .reset_system = &omap2xxx_prm_dpll_reset, | 219 | .reset_system = &omap2xxx_prm_dpll_reset, |
220 | .clear_mod_irqs = &omap2xxx_prm_clear_mod_irqs, | ||
219 | }; | 221 | }; |
220 | 222 | ||
221 | int __init omap2xxx_prm_init(void) | 223 | int __init omap2xxx_prm_init(void) |
diff --git a/arch/arm/mach-omap2/prm2xxx.h b/arch/arm/mach-omap2/prm2xxx.h index 1d51643062f7..9c91f4fac36d 100644 --- a/arch/arm/mach-omap2/prm2xxx.h +++ b/arch/arm/mach-omap2/prm2xxx.h | |||
@@ -124,8 +124,6 @@ | |||
124 | extern int omap2xxx_clkdm_sleep(struct clockdomain *clkdm); | 124 | extern int omap2xxx_clkdm_sleep(struct clockdomain *clkdm); |
125 | extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm); | 125 | extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm); |
126 | 126 | ||
127 | void omap2xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask); | ||
128 | |||
129 | extern int __init omap2xxx_prm_init(void); | 127 | extern int __init omap2xxx_prm_init(void); |
130 | 128 | ||
131 | #endif | 129 | #endif |
diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c index 4cc72e828421..a4443344affe 100644 --- a/arch/arm/mach-omap2/prm3xxx.c +++ b/arch/arm/mach-omap2/prm3xxx.c | |||
@@ -226,7 +226,7 @@ static void omap3xxx_prm_restore_irqen(u32 *saved_mask) | |||
226 | * that any peripheral wake-up events occurring while attempting to | 226 | * that any peripheral wake-up events occurring while attempting to |
227 | * clear the PM_WKST_x are detected and cleared. | 227 | * clear the PM_WKST_x are detected and cleared. |
228 | */ | 228 | */ |
229 | int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask) | 229 | static int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask) |
230 | { | 230 | { |
231 | u32 wkst, fclk, iclk, clken; | 231 | u32 wkst, fclk, iclk, clken; |
232 | u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1; | 232 | u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1; |
@@ -664,6 +664,7 @@ static struct prm_ll_data omap3xxx_prm_ll_data = { | |||
664 | .deassert_hardreset = &omap2_prm_deassert_hardreset, | 664 | .deassert_hardreset = &omap2_prm_deassert_hardreset, |
665 | .is_hardreset_asserted = &omap2_prm_is_hardreset_asserted, | 665 | .is_hardreset_asserted = &omap2_prm_is_hardreset_asserted, |
666 | .reset_system = &omap3xxx_prm_dpll3_reset, | 666 | .reset_system = &omap3xxx_prm_dpll3_reset, |
667 | .clear_mod_irqs = &omap3xxx_prm_clear_mod_irqs, | ||
667 | }; | 668 | }; |
668 | 669 | ||
669 | int __init omap3xxx_prm_init(void) | 670 | int __init omap3xxx_prm_init(void) |
diff --git a/arch/arm/mach-omap2/prm3xxx.h b/arch/arm/mach-omap2/prm3xxx.h index 856f3c5d7f79..5a09a74e7f8f 100644 --- a/arch/arm/mach-omap2/prm3xxx.h +++ b/arch/arm/mach-omap2/prm3xxx.h | |||
@@ -145,7 +145,6 @@ extern void omap3_prm_vcvp_write(u32 val, u8 offset); | |||
145 | extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); | 145 | extern u32 omap3_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset); |
146 | 146 | ||
147 | extern int __init omap3xxx_prm_init(void); | 147 | extern int __init omap3xxx_prm_init(void); |
148 | int omap3xxx_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask); | ||
149 | void omap3xxx_prm_iva_idle(void); | 148 | void omap3xxx_prm_iva_idle(void); |
150 | void omap3_prm_reset_modem(void); | 149 | void omap3_prm_reset_modem(void); |
151 | int omap3xxx_prm_clear_global_cold_reset(void); | 150 | int omap3xxx_prm_clear_global_cold_reset(void); |
diff --git a/arch/arm/mach-omap2/prm_common.c b/arch/arm/mach-omap2/prm_common.c index c5cfaa98be9e..2c2e7ed1bc6c 100644 --- a/arch/arm/mach-omap2/prm_common.c +++ b/arch/arm/mach-omap2/prm_common.c | |||
@@ -534,6 +534,27 @@ void omap_prm_reset_system(void) | |||
534 | } | 534 | } |
535 | 535 | ||
536 | /** | 536 | /** |
537 | * omap_prm_clear_mod_irqs - clear wake-up events from PRCM interrupt | ||
538 | * @module: PRM module to clear wakeups from | ||
539 | * @regs: register to clear | ||
540 | * @wkst_mask: wkst bits to clear | ||
541 | * | ||
542 | * Clears any wakeup events for the module and register set defined. | ||
543 | * Uses SoC specific implementation to do the actual wakeup status | ||
544 | * clearing. | ||
545 | */ | ||
546 | int omap_prm_clear_mod_irqs(s16 module, u8 regs, u32 wkst_mask) | ||
547 | { | ||
548 | if (!prm_ll_data->clear_mod_irqs) { | ||
549 | WARN_ONCE(1, "prm: %s: no mapping function defined\n", | ||
550 | __func__); | ||
551 | return -EINVAL; | ||
552 | } | ||
553 | |||
554 | return prm_ll_data->clear_mod_irqs(module, regs, wkst_mask); | ||
555 | } | ||
556 | |||
557 | /** | ||
537 | * prm_register - register per-SoC low-level data with the PRM | 558 | * prm_register - register per-SoC low-level data with the PRM |
538 | * @pld: low-level per-SoC OMAP PRM data & function pointers to register | 559 | * @pld: low-level per-SoC OMAP PRM data & function pointers to register |
539 | * | 560 | * |