From 077c1ce9fec0eb246bcaf70173aca62c1d69bdf2 Mon Sep 17 00:00:00 2001 From: James Sullins Date: Fri, 16 Nov 2012 04:26:58 -0600 Subject: [PATCH 1/4] subsystem_restart: set default restart_level for Q6 restarts set default restart_mode to RESET_SUBSYS_SUBSYSTEM so Q6 can restart Change-Id: I7e74c94bce33789dfdd7bd375f2fd74f8291f6fd --- arch/arm/mach-msm/subsystem_restart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mach-msm/subsystem_restart.c b/arch/arm/mach-msm/subsystem_restart.c index 818b86d2f976e3..a4998d7e093af6 100644 --- a/arch/arm/mach-msm/subsystem_restart.c +++ b/arch/arm/mach-msm/subsystem_restart.c @@ -601,7 +601,7 @@ static int __init subsys_restart_init(void) restart_level = RESET_SUBSYS_COUPLED; else #endif - restart_level = RESET_SOC; + restart_level = RESET_SUBSYS_INDEPENDENT; ret = ssr_init_soc_restart_orders(); From ff7913acc80915b09b1a77680c8223b8decccb3e Mon Sep 17 00:00:00 2001 From: James Sullins Date: Fri, 16 Nov 2012 04:29:59 -0600 Subject: [PATCH 2/4] subsystem_restart: ignore restart if already in-process Q6 Watchdog Bite can happen sometimes while still in process of restarting, so just ignore a duplicate restart instead of panic Change-Id: I4df993368869a7d6e8247319cb85ea51c6a33405 --- arch/arm/mach-msm/subsystem_restart.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-msm/subsystem_restart.c b/arch/arm/mach-msm/subsystem_restart.c index a4998d7e093af6..ff21c81b0917d4 100644 --- a/arch/arm/mach-msm/subsystem_restart.c +++ b/arch/arm/mach-msm/subsystem_restart.c @@ -349,9 +349,12 @@ static int subsystem_restart_thread(void *data) * sequence for these subsystems. In the latter case, panic and bail * out, since a subsystem died in its powerup sequence. */ - if (!mutex_trylock(powerup_lock)) - panic("%s[%p]: Subsystem died during powerup!", - __func__, current); + if (!mutex_trylock(powerup_lock)) { + mutex_unlock(shutdown_lock); + printk(KERN_ERR "%s: Subsystem '%s' died during powerup!?!", __func__, subsys->name); + kfree(data); + do_exit(0); + } do_epoch_check(subsys); From 6f9d082c379ce165a04b4d213d9950cb103ce554 Mon Sep 17 00:00:00 2001 From: James Sullins Date: Fri, 16 Nov 2012 10:00:21 -0600 Subject: [PATCH 3/4] adjust reset_q6_untrusted timing (and some delays) Change-Id: Id656dd071192cdda729989b984e48f7e6144dfbf --- arch/arm/mach-msm/pil-q6v3.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/arm/mach-msm/pil-q6v3.c b/arch/arm/mach-msm/pil-q6v3.c index 8f72286b6d656d..1f8a47dc7c2268 100644 --- a/arch/arm/mach-msm/pil-q6v3.c +++ b/arch/arm/mach-msm/pil-q6v3.c @@ -114,6 +114,7 @@ static int pil_q6v3_reset(struct pil_desc *pil) q6v3_make_proxy_votes(pil->dev); + usleep(5); /* Put Q6 into reset */ reg = readl_relaxed(LCC_Q6_FUNC); reg |= Q6SS_SS_ARES | Q6SS_ISDB_ARES | Q6SS_ETM_ARES | STOP_CORE | @@ -129,6 +130,7 @@ static int pil_q6v3_reset(struct pil_desc *pil) CORE_TCM_MEM_PERPH_EN; writel_relaxed(reg, LCC_Q6_FUNC); + usleep(5); /* Turn on Q6 core clocks and take core out of reset */ reg &= ~(CLAMP_IO | Q6SS_SS_ARES | Q6SS_ISDB_ARES | Q6SS_ETM_ARES | CORE_ARES); @@ -136,18 +138,22 @@ static int pil_q6v3_reset(struct pil_desc *pil) /* Wait for clocks to be enabled */ mb(); + usleep(5); /* Program boot address */ writel_relaxed((drv->start_addr >> 12) & 0xFFFFF, drv->base + QDSP6SS_RST_EVB); + usleep(5); writel_relaxed(Q6_STRAP_TCM_CONFIG | Q6_STRAP_TCM_BASE, drv->base + QDSP6SS_STRAP_TCM); writel_relaxed(Q6_STRAP_AHB_UPPER | Q6_STRAP_AHB_LOWER, drv->base + QDSP6SS_STRAP_AHB); + usleep(5); /* Wait for addresses to be programmed before starting Q6 */ mb(); + usleep(5); /* Start Q6 instruction execution */ reg &= ~STOP_CORE; writel_relaxed(reg, LCC_Q6_FUNC); From c31ea94119b5353ed77969fb93725330f69e40a9 Mon Sep 17 00:00:00 2001 From: James Sullins Date: Fri, 16 Nov 2012 10:01:56 -0600 Subject: [PATCH 4/4] defconfig: set min cpu freq to 192Mhz Change-Id: Ia4da2ee0ae33f19eb468cb010c3348c65597f0dd --- arch/arm/configs/cyanogenmod_tenderloin_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/configs/cyanogenmod_tenderloin_defconfig b/arch/arm/configs/cyanogenmod_tenderloin_defconfig index caed53889283f1..dd45169aeb9417 100644 --- a/arch/arm/configs/cyanogenmod_tenderloin_defconfig +++ b/arch/arm/configs/cyanogenmod_tenderloin_defconfig @@ -418,7 +418,7 @@ CONFIG_MSM_MPDEC=y # CONFIG_MSM_MPDEC_INPUTBOOST_CPUMIN is not set CONFIG_MSM_CPU_FREQ_SET_MIN_MAX=y CONFIG_MSM_CPU_FREQ_MAX=1512000 -CONFIG_MSM_CPU_FREQ_MIN=384000 +CONFIG_MSM_CPU_FREQ_MIN=192000 CONFIG_MSM_FORCE_MAX_CPU_TABLE=y # CONFIG_MSM_AVS_HW is not set # CONFIG_MSM_HW3D is not set