diff options
author | Vijaya Kumar Kilari <vijay.kilari@stericsson.com> | 2011-06-08 17:50:57 +0530 |
---|---|---|
committer | said m bagheri <ebgheri@steludxu2848.(none)> | 2011-06-29 10:30:25 +0200 |
commit | 5d0ff0050959c570872fe0223498dee191eb3116 (patch) | |
tree | 14b66278d4bdbd97296f74bf003a3ea5c3db6235 /arch/arm/mach-ux500 | |
parent | 689c1ef5b07c094c42e8578c28bf8b801cfe056a (diff) |
U5500: Support for ESRAM12 EPOD in PRCMU driver
ST-Ericsson Linux next: -
ST-Ericsson ID: 334774
ST-Ericsson FOSS-OUT ID: Trivial
Depends-on: I139406645ec09151d6b9295af12680a28f0d437c
Change-Id: I763abdbf6117ceaff4597af128772d3ee85db42f
Signed-off-by: Vijaya Kumar Kilari <vijay.kilari@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/24657
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'arch/arm/mach-ux500')
-rw-r--r-- | arch/arm/mach-ux500/prcmu-db5500.c | 75 |
1 files changed, 48 insertions, 27 deletions
diff --git a/arch/arm/mach-ux500/prcmu-db5500.c b/arch/arm/mach-ux500/prcmu-db5500.c index c549de7a4b9..f7014e46e9b 100644 --- a/arch/arm/mach-ux500/prcmu-db5500.c +++ b/arch/arm/mach-ux500/prcmu-db5500.c @@ -121,6 +121,11 @@ enum epod_state { EPOD_OFF, EPOD_ON, }; +enum epod_onoffret_state { + EPOD_OOR_OFF, + EPOD_OOR_RET, + EPOD_OOR_ON, +}; enum db5500_prcmu_pll { DB5500_PLL_SOC0, DB5500_PLL_SOC1, @@ -192,8 +197,8 @@ static struct { struct mutex lock; struct completion work; struct { - u8 epod_states[DB5500_NUM_EPOD_ID]; - u8 pll_states[DB5500_NUM_PLL_ID]; + u8 epod_st[DB5500_NUM_EPOD_ID]; + u8 pll_st[DB5500_NUM_PLL_ID]; } req; struct { u8 header; @@ -377,11 +382,11 @@ static int request_pll(u8 pll, bool enable) while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(2)) cpu_relax(); - mb2_transfer.req.pll_states[pll] = enable; + mb2_transfer.req.pll_st[pll] = enable; /* fill in mailbox */ writeb(pll, PRCM_REQ_MB2_PLL_CLIENT); - writeb(mb2_transfer.req.pll_states[pll], PRCM_REQ_MB2_PLL_STATE); + writeb(mb2_transfer.req.pll_st[pll], PRCM_REQ_MB2_PLL_STATE); writeb(MB2H_PLL_REQUEST, PRCM_REQ_MB2_HEADER); @@ -606,28 +611,21 @@ static void ack_dbb_wakeup(void) spin_unlock_irqrestore(&mb0_transfer.lock, flags); } -int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state) +int db5500_prcmu_set_epod(u16 epod, u8 epod_state) { int r = 0; bool ram_retention = false; /* check argument */ - BUG_ON(epod_id < DB5500_EPOD_ID_BASE); + BUG_ON(epod < DB5500_EPOD_ID_BASE); BUG_ON(epod_state > EPOD_STATE_ON); + BUG_ON((epod - DB5500_EPOD_ID_BASE) >= DB5500_NUM_EPOD_ID); - epod_id &= 0xFF; - BUG_ON(epod_id > DB5500_NUM_EPOD_ID); - - /* TODO: FW does not take retention for ESRAM12? - set flag if retention is possible */ - switch (epod_id) { - case DB5500_EPOD_ID_ESRAM12: + if (epod == DB5500_EPOD_ID_ESRAM12) ram_retention = true; - break; - } /* check argument */ - /* BUG_ON(epod_state == EPOD_STATE_RAMRET && !ram_retention); */ + BUG_ON(epod_state == EPOD_STATE_RAMRET && !ram_retention); /* get lock */ mutex_lock(&mb2_transfer.lock); @@ -636,19 +634,42 @@ int db5500_prcmu_set_epod(u16 epod_id, u8 epod_state) while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(2)) cpu_relax(); - /* PRCMU FW can only handle on or off */ - if (epod_state == EPOD_STATE_ON) - mb2_transfer.req.epod_states[epod_id] = EPOD_ON; - else if (epod_state == EPOD_STATE_OFF) - mb2_transfer.req.epod_states[epod_id] = EPOD_OFF; - else { - r = -EINVAL; - goto unlock_and_return; + /* Retention is allowed only for ESRAM12 */ + if (epod == DB5500_EPOD_ID_ESRAM12) { + switch (epod_state) { + case EPOD_STATE_ON: + mb2_transfer.req.epod_st[epod - DB5500_EPOD_ID_BASE] = + EPOD_OOR_ON; + break; + case EPOD_STATE_OFF: + mb2_transfer.req.epod_st[epod - DB5500_EPOD_ID_BASE] = + EPOD_OOR_OFF; + break; + case EPOD_STATE_RAMRET: + mb2_transfer.req.epod_st[epod - DB5500_EPOD_ID_BASE] = + EPOD_OOR_RET; + break; + default: + r = -EINVAL; + goto unlock_and_return; + break; + } + } else { + if (epod_state == EPOD_STATE_ON) + mb2_transfer.req.epod_st[epod - DB5500_EPOD_ID_BASE] = + EPOD_ON; + else if (epod_state == EPOD_STATE_OFF) + mb2_transfer.req.epod_st[epod - DB5500_EPOD_ID_BASE] = + EPOD_OFF; + else { + r = -EINVAL; + goto unlock_and_return; + } } - /* fill in mailbox */ - writeb(epod_id, PRCM_REQ_MB2_EPOD_CLIENT); - writeb(mb2_transfer.req.epod_states[epod_id], PRCM_REQ_MB2_EPOD_STATE); + writeb((epod - DB5500_EPOD_ID_BASE), PRCM_REQ_MB2_EPOD_CLIENT); + writeb(mb2_transfer.req.epod_st[epod - DB5500_EPOD_ID_BASE], + PRCM_REQ_MB2_EPOD_STATE); writeb(MB2H_EPOD_REQUEST, PRCM_REQ_MB2_HEADER); |