diff options
author | 邱建斌 <qjb@rock-chips.com> | 2011-06-30 11:17:37 +0800 |
---|---|---|
committer | 邱建斌 <qjb@rock-chips.com> | 2011-06-30 11:17:37 +0800 |
commit | 3e3f4f2f7e27d93a6119c2ab7957a4b3c0a56637 (patch) | |
tree | 9913b07f034060ab663f6606da28d891d58fc00c /drivers/headset_observe | |
parent | 676e6f9da7162dc49ce688b78ae8957563a4906c (diff) |
rk29phone: fix wm8994 suspend and resume noise
Diffstat (limited to 'drivers/headset_observe')
-rwxr-xr-x | drivers/headset_observe/Kconfig | 2 | ||||
-rwxr-xr-x | drivers/headset_observe/rk_headset.c | 35 |
2 files changed, 26 insertions, 11 deletions
diff --git a/drivers/headset_observe/Kconfig b/drivers/headset_observe/Kconfig index 19415bea9c3c..08381d6db6d0 100755 --- a/drivers/headset_observe/Kconfig +++ b/drivers/headset_observe/Kconfig @@ -12,7 +12,7 @@ config HEADSET_DET config RK_HEADSET_DET depends on !ARCH_RK2818 - default y + default n tristate "RK headset detech support" ---help--- Universal headphone driver(write begin rk29) diff --git a/drivers/headset_observe/rk_headset.c b/drivers/headset_observe/rk_headset.c index 22c32f17a7fd..3cad1a203dbe 100755 --- a/drivers/headset_observe/rk_headset.c +++ b/drivers/headset_observe/rk_headset.c @@ -128,7 +128,7 @@ static void headsetobserve_work(struct work_struct *work) int i,level = 0; struct rk_headset_pdata *pdata = headset_info->pdata; static unsigned int old_status = 0; - DBG("---headsetobserve_work---\n"); +// DBG("---headsetobserve_work---\n"); mutex_lock(&headset_info->mutex_lock[HEADSET]); for(i=0; i<3; i++) @@ -179,7 +179,7 @@ static void headsetobserve_work(struct work_struct *work) case HEADSET_IN_HIGH: if(level > 0) {//in--High level - DBG("--- HEADSET_IN_HIGH headset in HIGH---\n"); + // DBG("--- HEADSET_IN_HIGH headset in HIGH---\n"); // enable_irq(headset_info->irq[HOOK]); headset_info->cur_headset_status = BIT_HEADSET; headset_change_irqtype(HEADSET,IRQF_TRIGGER_FALLING);// @@ -189,10 +189,10 @@ static void headsetobserve_work(struct work_struct *work) } else if(level == 0) {//out--Low level - DBG("---HEADSET_IN_HIGH headset out HIGH---\n"); + // DBG("---HEADSET_IN_HIGH headset out HIGH---\n"); if(headset_info->isHook_irq == enable) { - DBG("disable_irq\n"); + // DBG("disable_irq\n"); headset_info->isHook_irq = disable; disable_irq(headset_info->irq[HOOK]); } @@ -203,14 +203,23 @@ static void headsetobserve_work(struct work_struct *work) case HEADSET_IN_LOW: if(level == 0) {//in--High level - DBG("---HEADSET_IN_LOW headset in LOW ---\n"); + // DBG("---HEADSET_IN_LOW headset in LOW ---\n"); headset_info->cur_headset_status = BIT_HEADSET; headset_change_irqtype(HEADSET,IRQF_TRIGGER_RISING);// enable_irq(headset_info->irq[HOOK]); + del_timer(&headset_info->headset_timer);//Start the timer, wait for switch to the headphone channel + headset_info->headset_timer.expires = jiffies + 500; + add_timer(&headset_info->headset_timer); } else if(level > 0) {//out--High level - DBG("---HEADSET_IN_LOW headset out LOW ---\n"); + // DBG("---HEADSET_IN_LOW headset out LOW ---\n"); + if(headset_info->isHook_irq == enable) + { + // DBG("disable_irq\n"); + headset_info->isHook_irq = disable; + disable_irq(headset_info->irq[HOOK]); + } headset_info->cur_headset_status = ~(BIT_HEADSET|BIT_HEADSET_NO_MIC); headset_change_irqtype(HEADSET,IRQF_TRIGGER_FALLING);// disable_irq(headset_info->irq[HOOK]); @@ -233,14 +242,20 @@ static void Hook_work(struct work_struct *work) struct rk_headset_pdata *pdata = headset_info->pdata; static unsigned int old_status = 0; - DBG("---Hook_work---\n"); +// DBG("---Hook_work---\n"); mutex_lock(&headset_info->mutex_lock[HOOK]); if(headset_info->headset_status == HEADSET_OUT) { DBG("Headset is out\n"); goto RE_ERROR; } - + #ifdef CONFIG_SND_SOC_WM8994 + if(wm8994_set_status() < 0) + { + DBG("wm8994 is not set on heatset channel\n"); + goto RE_ERROR; + } + #endif for(i=0; i<3; i++) { level = gpio_get_value(pdata->Hook_gpio); @@ -294,7 +309,7 @@ static void headset_timer_callback(unsigned long arg) struct rk_headset_pdata *pdata = headset->pdata; int i,level = 0; - DBG("headset_timer_callback\n"); +// DBG("headset_timer_callback\n"); if(headset->headset_status == HEADSET_OUT) { @@ -333,7 +348,7 @@ static void headset_timer_callback(unsigned long arg) else if(level > 0) { headset->isMic = 1;//have mic - DBG("enable_irq\n"); + // DBG("enable_irq\n"); enable_irq(headset_info->irq[HOOK]); headset->isHook_irq = enable; } |