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 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); diff --git a/arch/arm/mach-msm/subsystem_restart.c b/arch/arm/mach-msm/subsystem_restart.c index 818b86d2f976e3..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); @@ -601,7 +604,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();