summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVirupax Sadashivpetimath <virupax.sadashivpetimath@stericsson.com>2012-02-29 18:00:21 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:03:40 +0200
commit1127d5036421b97ceb2a396978863f2fbb8ac7b8 (patch)
tree3d70aef808c808abfa06c2b3256c33decbeb6c7a
parent5409adc138caf18a6399a0c69d9a73fc858983c7 (diff)
input:misc:accdet: Add ab8505 accessory detect support
Add the new mic control gpio found in the 8520 board. Gpio is used to configure the mux, so that the 3.5mm jack gets connected to either the audio or video part of the board. ST-Ericsson ID: 366316 Signed-off-by: Virupax Sadashivpetimath <virupax.sadashivpetimath@stericsson.com>
-rw-r--r--arch/arm/mach-ux500/include/mach/abx500-accdet.h2
-rw-r--r--drivers/input/misc/ab8500-accdet.c25
-rw-r--r--drivers/input/misc/abx500-accdet.c30
3 files changed, 50 insertions, 7 deletions
diff --git a/arch/arm/mach-ux500/include/mach/abx500-accdet.h b/arch/arm/mach-ux500/include/mach/abx500-accdet.h
index cdd78cd7d0c..9871ae11530 100644
--- a/arch/arm/mach-ux500/include/mach/abx500-accdet.h
+++ b/arch/arm/mach-ux500/include/mach/abx500-accdet.h
@@ -101,6 +101,7 @@
* @accdet2122_th Voltage thresholds for accdet21 and accdet22 inputs.
* @is_detection_inverted Whether the accessory insert/removal, button
* press/release irq's are inverted.
+ * @mic_ctrl Gpio to select between CVBS and MIC.
*/
struct abx500_accdet_platform_data {
int btn_keycode;
@@ -108,6 +109,7 @@ struct abx500_accdet_platform_data {
u8 accdet2122_th;
unsigned int video_ctrl_gpio;
bool is_detection_inverted;
+ unsigned int mic_ctrl;
};
/* Enumerations */
diff --git a/drivers/input/misc/ab8500-accdet.c b/drivers/input/misc/ab8500-accdet.c
index 8faa7c425a5..59ad959e909 100644
--- a/drivers/input/misc/ab8500-accdet.c
+++ b/drivers/input/misc/ab8500-accdet.c
@@ -351,18 +351,33 @@ static void ab8500_set_av_switch(struct abx500_ad *dd,
ret = gpio_direction_input(dd->pdata->video_ctrl_gpio);
dd->gpio35_dir_set = 0;
ret = gpio_direction_output(dd->pdata->video_ctrl_gpio, 0);
+ if (dd->pdata->mic_ctrl)
+ gpio_direction_output(dd->pdata->mic_ctrl, 0);
} else if (!dd->gpio35_dir_set) {
ret = gpio_direction_output(dd->pdata->video_ctrl_gpio,
dir == AUDIO_IN ? 1 : 0);
if (ret < 0) {
dev_err(&dd->pdev->dev,
- "%s: Output video ctrl signal failed (%d).\n",
+ "%s: video_ctrl pin output config failed (%d).\n",
__func__, ret);
- } else {
- dd->gpio35_dir_set = 1;
- dev_dbg(&dd->pdev->dev, "AV-SWITCH: %s\n",
- dir == AUDIO_IN ? "AUDIO_IN" : "VIDEO_OUT");
+ return;
+ }
+
+ if (dd->pdata->mic_ctrl) {
+ ret = gpio_direction_output(dd->pdata->mic_ctrl,
+ dir == AUDIO_IN ? 1 : 0);
+ if (ret < 0) {
+ dev_err(&dd->pdev->dev,
+ "%s: mic_ctrl pin output"
+ "config failed (%d).\n",
+ __func__, ret);
+ return;
+ }
}
+
+ dd->gpio35_dir_set = 1;
+ dev_dbg(&dd->pdev->dev, "AV-SWITCH: %s\n",
+ dir == AUDIO_IN ? "AUDIO_IN" : "VIDEO_OUT");
} else {
gpio_set_value(dd->pdata->video_ctrl_gpio,
dir == AUDIO_IN ? 1 : 0);
diff --git a/drivers/input/misc/abx500-accdet.c b/drivers/input/misc/abx500-accdet.c
index c0d1cb04a0e..5c4e96c73d6 100644
--- a/drivers/input/misc/abx500-accdet.c
+++ b/drivers/input/misc/abx500-accdet.c
@@ -786,7 +786,25 @@ static int abx500_accessory_init(struct platform_device *pdev)
}
}
- (ret = create_btn_input_dev(dd));
+ if (dd->pdata->mic_ctrl) {
+ ret = gpio_is_valid(dd->pdata->mic_ctrl);
+ if (!ret) {
+ dev_err(&pdev->dev,
+ "%s: Mic ctrl GPIO invalid (%d).\n", __func__,
+ dd->pdata->mic_ctrl);
+
+ goto mic_ctrl_fail;
+ }
+ ret = gpio_request(dd->pdata->mic_ctrl,
+ "Mic Control");
+ if (ret) {
+ dev_err(&pdev->dev, "%s: Get mic ctrl GPIO"
+ "failed.\n", __func__);
+ goto mic_ctrl_fail;
+ }
+ }
+
+ ret = create_btn_input_dev(dd);
if (ret < 0) {
dev_err(&pdev->dev, "%s: create_button_input_dev failed.\n",
__func__);
@@ -827,6 +845,9 @@ fail_no_mem_for_wq:
fail_no_regulators:
input_unregister_device(dd->btn_input_dev);
fail_no_btn_input_dev:
+ if (dd->pdata->mic_ctrl)
+ gpio_free(dd->pdata->mic_ctrl);
+mic_ctrl_fail:
if (dd->pdata->video_ctrl_gpio)
gpio_free(dd->pdata->video_ctrl_gpio);
return ret;
@@ -842,7 +863,12 @@ static void abx500_accessory_cleanup(struct abx500_ad *dd)
dd->jack_type = JACK_TYPE_UNSPECIFIED;
config_accdetect(dd);
- gpio_free(dd->pdata->video_ctrl_gpio);
+ if (dd->pdata->mic_ctrl)
+ gpio_free(dd->pdata->mic_ctrl);
+
+ if (dd->pdata->video_ctrl_gpio)
+ gpio_free(dd->pdata->video_ctrl_gpio);
+
input_unregister_device(dd->btn_input_dev);
free_regulators(dd);