summaryrefslogtreecommitdiff
path: root/drivers/headset_observe
diff options
context:
space:
mode:
author邱建斌 <qjb@rock-chips.com>2011-06-30 11:17:37 +0800
committer邱建斌 <qjb@rock-chips.com>2011-06-30 11:17:37 +0800
commit3e3f4f2f7e27d93a6119c2ab7957a4b3c0a56637 (patch)
tree9913b07f034060ab663f6606da28d891d58fc00c /drivers/headset_observe
parent676e6f9da7162dc49ce688b78ae8957563a4906c (diff)
rk29phone: fix wm8994 suspend and resume noise
Diffstat (limited to 'drivers/headset_observe')
-rwxr-xr-xdrivers/headset_observe/Kconfig2
-rwxr-xr-xdrivers/headset_observe/rk_headset.c35
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;
}