From a64c302217531484e700f03fb6726b8a9fea34c3 Mon Sep 17 00:00:00 2001 From: Mian Yousaf Kaukab Date: Fri, 2 Mar 2012 15:27:51 +0100 Subject: arm: ux500: qos: remove locking down of ape opp during voice-call ST-Ericsson Linux next: - ST-Ericsson ID: 419724 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I0abb64e24fd4eadd01335e1fddd56a1b05c94ce9 Signed-off-by: Mian Yousaf Kaukab Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/51373 Reviewed-by: Mattias NILSSON Reviewed-by: Jonas ABERG --- arch/arm/mach-ux500/pm/prcmu-qos-power.c | 39 ++++++++++++-------------------- arch/arm/mach-ux500/prcmu-debug.c | 3 +++ drivers/mfd/db8500-prcmu.c | 10 +++++--- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/arch/arm/mach-ux500/pm/prcmu-qos-power.c b/arch/arm/mach-ux500/pm/prcmu-qos-power.c index a600a57dc13..3bd99b766af 100644 --- a/arch/arm/mach-ux500/pm/prcmu-qos-power.c +++ b/arch/arm/mach-ux500/pm/prcmu-qos-power.c @@ -117,7 +117,7 @@ static struct prcmu_qos_object *prcmu_qos_array[] = { static DEFINE_MUTEX(prcmu_qos_mutex); static DEFINE_SPINLOCK(prcmu_qos_lock); -static bool ape_opp_forced_to_50_partly_25; +static bool ape_opp_50_partly_25_enabled; static unsigned long cpufreq_opp_delay = HZ / 5; @@ -272,7 +272,10 @@ static void update_target(int target) case PRCMU_QOS_APE_OPP: switch (extreme_value) { case 50: - op = APE_50_OPP; + if (ape_opp_50_partly_25_enabled) + op = APE_50_PARTLY_25_OPP; + else + op = APE_50_OPP; pr_debug("prcmu qos: set ape opp to 50%%\n"); break; case 100: @@ -284,9 +287,7 @@ static void update_target(int target) extreme_value); goto unlock_and_return; } - - if (!ape_opp_forced_to_50_partly_25) - (void)prcmu_set_ape_opp(op); + (void)prcmu_set_ape_opp(op); prcmu_debug_ape_opp_log(op); break; case PRCMU_QOS_ARM_OPP: @@ -319,33 +320,21 @@ void prcmu_qos_force_opp(int prcmu_qos_class, s32 i) void prcmu_qos_voice_call_override(bool enable) { - u8 op; + int ape_opp; mutex_lock(&prcmu_qos_mutex); - ape_opp_forced_to_50_partly_25 = enable; + ape_opp_50_partly_25_enabled = enable; - if (enable) { - (void)prcmu_set_ape_opp(APE_50_PARTLY_25_OPP); - goto unlock_and_return; - } + ape_opp = prcmu_get_ape_opp(); - /* Disable: set the OPP according to the current target value. */ - switch (atomic_read( - &prcmu_qos_array[PRCMU_QOS_APE_OPP]->target_value)) { - case 50: - op = APE_50_OPP; - break; - case 100: - op = APE_100_OPP; - break; - default: - goto unlock_and_return; + if (ape_opp == APE_50_OPP) { + if (enable) + prcmu_set_ape_opp(APE_50_PARTLY_25_OPP); + else + prcmu_set_ape_opp(APE_50_OPP); } - (void)prcmu_set_ape_opp(op); - -unlock_and_return: mutex_unlock(&prcmu_qos_mutex); } diff --git a/arch/arm/mach-ux500/prcmu-debug.c b/arch/arm/mach-ux500/prcmu-debug.c index 749bcef85b7..6842e4b68fe 100644 --- a/arch/arm/mach-ux500/prcmu-debug.c +++ b/arch/arm/mach-ux500/prcmu-debug.c @@ -203,6 +203,9 @@ static void log_set(struct state_history *sh, u8 opp) void prcmu_debug_ape_opp_log(u8 opp) { + if (opp == APE_50_PARTLY_25_OPP) + opp = APE_50_OPP; + log_set(&ape_sh, opp); } diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index a62bff1adc6..7c26c41a7ef 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c @@ -1145,12 +1145,14 @@ unlock_and_return: int db8500_prcmu_set_ape_opp(u8 opp) { int r = 0; + u8 prcmu_opp_req; if (opp == mb1_transfer.ape_opp) return 0; mutex_lock(&mb1_transfer.lock); + /* Exit APE_50_PARTLY_25_OPP */ if (mb1_transfer.ape_opp == APE_50_PARTLY_25_OPP) request_even_slower_clocks(false); @@ -1160,20 +1162,22 @@ int db8500_prcmu_set_ape_opp(u8 opp) while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(1)) cpu_relax(); + prcmu_opp_req = (opp == APE_50_PARTLY_25_OPP) ? APE_50_OPP : opp; + writeb(MB1H_ARM_APE_OPP, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB1)); writeb(ARM_NO_CHANGE, (tcdm_base + PRCM_REQ_MB1_ARM_OPP)); - writeb(((opp == APE_50_PARTLY_25_OPP) ? APE_50_OPP : opp), - (tcdm_base + PRCM_REQ_MB1_APE_OPP)); + writeb(prcmu_opp_req, (tcdm_base + PRCM_REQ_MB1_APE_OPP)); writel(MBOX_BIT(1), PRCM_MBOX_CPU_SET); wait_for_completion(&mb1_transfer.work); if ((mb1_transfer.ack.header != MB1H_ARM_APE_OPP) || - (mb1_transfer.ack.ape_opp != opp)) + (mb1_transfer.ack.ape_opp != prcmu_opp_req)) r = -EIO; skip_message: if ((!r && (opp == APE_50_PARTLY_25_OPP)) || + /* Set APE_50_PARTLY_25_OPP back in case new opp failed */ (r && (mb1_transfer.ape_opp == APE_50_PARTLY_25_OPP))) request_even_slower_clocks(true); if (!r) -- cgit v1.2.3