diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2012-03-19 20:15:53 -0500 |
---|---|---|
committer | Robert Lee <b18647@b18647-12.(none)> | 2012-03-19 20:42:47 -0500 |
commit | e2e23afdc93d569c9bb9947c6794098920dc02a0 (patch) | |
tree | 9c6bce15e4a3c35a8469c36d63d8e4626effcd2f | |
parent | 01d9ee53ab2c4f6088ac8a2661f5ce5977e57d10 (diff) |
mfd : ux500 - copy gic settings
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
-rw-r--r-- | drivers/mfd/db8500-prcmu.c | 19 | ||||
-rw-r--r-- | include/linux/mfd/db8500-prcmu.h | 2 | ||||
-rw-r--r-- | include/linux/mfd/dbx500-prcmu.h | 16 |
3 files changed, 37 insertions, 0 deletions
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index 4a89b223790..d2957ff146d 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c @@ -849,6 +849,25 @@ bool db8500_prcmu_gic_pending_irq(void) return false; } +/* + * This function copies the gic SPI settings to the prcmu in order to + * monitor them and abort/finish the retention/off sequence or state. + */ +int db8500_prcmu_copy_gic_settings(void) +{ + u32 er; /* Enable register */ + void __iomem *dist_base = __io_address(U8500_GIC_DIST_BASE); + int i; + + /* We skip the STI and PPI */ + for (i = 0; i < PRCMU_GIC_NUMBER_REGS - 1; i++) { + er = readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + (i + 1) * 4); + writel(er, PRCM_ARMITMSK31TO0 + i * 4); + } + + return 0; +} + /* This function should only be called while mb0_transfer.lock is held. */ static void config_wakeups(void) { diff --git a/include/linux/mfd/db8500-prcmu.h b/include/linux/mfd/db8500-prcmu.h index 8bf0dc3ba04..026d93e8cef 100644 --- a/include/linux/mfd/db8500-prcmu.h +++ b/include/linux/mfd/db8500-prcmu.h @@ -538,7 +538,9 @@ void db8500_prcmu_system_reset(u16 reset_code); int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll); int db8500_prcmu_gic_decouple(void); int db8500_prcmu_gic_recouple(void); +int db8500_prcmu_copy_gic_settings(void); bool db8500_prcmu_gic_pending_irq(void); +bool db8500_prcmu_pending_irq(void); void db8500_prcmu_enable_wakeups(u32 wakeups); int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state); int db8500_prcmu_request_clock(u8 clock, bool enable); diff --git a/include/linux/mfd/dbx500-prcmu.h b/include/linux/mfd/dbx500-prcmu.h index 82c6d516d0b..69848f8e652 100644 --- a/include/linux/mfd/dbx500-prcmu.h +++ b/include/linux/mfd/dbx500-prcmu.h @@ -261,6 +261,22 @@ static inline bool prcmu_gic_pending_irq(void) return db8500_prcmu_gic_pending_irq(); } +static inline bool prcmu_pending_irq(void) +{ + if (machine_is_u5500()) + return -EINVAL; + else + return db8500_prcmu_pending_irq(); +} + +static inline int prcmu_copy_gic_settings(void) +{ + if (machine_is_u5500()) + return -EINVAL; + else + return db8500_prcmu_copy_gic_settings(); +} + static inline int prcmu_set_epod(u16 epod_id, u8 epod_state) { if (machine_is_u5500()) |