diff options
author | Srikanth Shivanand <srikanth.shivanand@stericsson.com> | 2011-03-26 17:11:41 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:03:30 +0200 |
commit | ea17b3ec968115040e365eed245606426d310df5 (patch) | |
tree | 21a9aa60d57f4e65a256f309fabe6e6d21f78fb7 | |
parent | a056a794381d3d774ebdcd247c85dd119cdbf9ef (diff) |
input: misc: ab8500-accdet: Power optimisation fix.
The detection of the accessory is made independent of GPIO35.
The GPIO is used only after detection. This saves power.
ST-Ericsson ID: ER 330343
Change-Id: Ifbf0028777d242a09067eb560f4476d5522e9074
Signed-off-by: Srikanth Shivanand <srikanth.shivanand@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/19312
Reviewed-by: Marcel TUNNISSEN <marcel.tuennissen@stericsson.com>
Tested-by: Marcel TUNNISSEN <marcel.tuennissen@stericsson.com>
Reviewed-by: Martin PERSSON <martin.persson@stericsson.com>
Tested-by: Martin PERSSON <martin.persson@stericsson.com>
-rw-r--r-- | drivers/input/misc/ab8500-accdet.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/input/misc/ab8500-accdet.c b/drivers/input/misc/ab8500-accdet.c index 9eeccd34d52..77634d51c7a 100644 --- a/drivers/input/misc/ab8500-accdet.c +++ b/drivers/input/misc/ab8500-accdet.c @@ -149,10 +149,12 @@ enum accessory_irq { * Enumerates the op. modes of the avcontrol switch * @AUDIO_IN Audio input is selected * @VIDEO_OUT Video output is selected + * @NOT_SET The av-switch control signal is disconnected. */ enum accessory_avcontrol_dir { AUDIO_IN, VIDEO_OUT, + NOT_SET, }; /** @@ -689,8 +691,6 @@ static void unplug_irq_handler_work(struct work_struct *work) dd->btn_state = BUTTON_UNK; config_accdetect(dd); - set_av_switch(dd, AUDIO_IN); - accessory_regulator_disable(REGULATOR_ALL); report_jack_status(dd); @@ -748,6 +748,8 @@ static void detect_work(struct work_struct *work) dev_dbg(&dd->pdev->dev, "%s: Enter\n", __func__); + set_av_switch(dd, AUDIO_IN); + new_type = detect(dd, &req_det_count); dd->total_jack_det_count++; @@ -956,8 +958,12 @@ static void set_av_switch(struct ab8500_ad *dd, { int ret; - dev_dbg(&dd->pdev->dev, "%s: Enter\n", __func__); - if (!dd->gpio35_dir_set) { + dev_dbg(&dd->pdev->dev, "%s: Enter (%d)\n", __func__, dir); + if (dir == NOT_SET) { + ret = gpio_direction_input(dd->pdata->video_ctrl_gpio); + dd->gpio35_dir_set = 0; + ret = gpio_direction_output(dd->pdata->video_ctrl_gpio, 0); + } else if (!dd->gpio35_dir_set) { ret = gpio_direction_output(dd->pdata->video_ctrl_gpio, dir == AUDIO_IN ? 1 : 0); if (ret < 0) { @@ -1089,9 +1095,11 @@ static void config_accdetect(struct ab8500_ad *dd) release_irq(dd, UNPLUG_IRQ); release_irq(dd, BUTTON_PRESS_IRQ); release_irq(dd, BUTTON_RELEASE_IRQ); + set_av_switch(dd, NOT_SET); break; case JACK_TYPE_DISCONNECTED: + set_av_switch(dd, NOT_SET); case JACK_TYPE_HEADPHONE: case JACK_TYPE_CVIDEO: config_accdetect1_hw(dd, 1); @@ -1132,7 +1140,6 @@ static void init_work(struct work_struct *work) dev_dbg(&dd->pdev->dev, "%s: Enter\n", __func__); - set_av_switch(dd, AUDIO_IN); dd->jack_type = dd->reported_jack_type = JACK_TYPE_UNSPECIFIED; config_accdetect(dd); queue_delayed_work(dd->irq_work_queue, |