diff options
author | Johan Bohlin <johan.bohlin@stericsson.com> | 2011-08-24 11:12:03 +0200 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-09-19 16:07:28 +0200 |
commit | 66b4b1130dfe68f8240b142f6c932827b31071cd (patch) | |
tree | 6e3af0290df252a4ccca08cfa3b2352b877b6447 /drivers/input | |
parent | 3be085d9aab9689fb50de522257b83ea5a29c8da (diff) |
input: ab8500-accdet: Add android switch
Add android switch support to the accessory driver to make it work properly.
ST-Ericsson ID: 357950
ST-Ericsson Linux next: NA
Change-Id: Ibfabe84515fc0074c3944594f799f98a99563d17
Signed-off-by: Johan Bohlin <johan.bohlin@stericsson.com>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/misc/ab8500-accdet.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/input/misc/ab8500-accdet.c b/drivers/input/misc/ab8500-accdet.c index cff9b78847b..bc14143d1b6 100644 --- a/drivers/input/misc/ab8500-accdet.c +++ b/drivers/input/misc/ab8500-accdet.c @@ -28,6 +28,7 @@ #include <linux/mfd/ab8500/gpadc.h> #include <linux/mfd/ab8500/gpio.h> #include <linux/gpio.h> +#include <linux/switch.h> #include <mach/ab8500-accdet.h> #ifdef CONFIG_SND_SOC_UX500_AB8500 #include <sound/ux500_ab8500.h> @@ -256,6 +257,7 @@ struct accessory_detect_task { * @accdet2_th_set flag to indicate whether accdet2 thresholds are configured * @gpio35_dir_set flag to indicate whether GPIO35 (VIDEOCTRL) direction * has been configured. + * @ab_switch userspace android switch interface */ struct ab8500_ad { struct platform_device *pdev; @@ -282,6 +284,7 @@ struct ab8500_ad { int accdet1_th_set; int accdet2_th_set; int gpio35_dir_set; + struct switch_dev ab_switch; }; /* Forward declarations */ @@ -657,6 +660,11 @@ static void report_jack_status(struct ab8500_ad *dd) set_av_switch(dd, VIDEO_OUT); } + if (dd->jack_type == JACK_TYPE_DISCONNECTED) + switch_set_state(&dd->ab_switch, 0); + else + switch_set_state(&dd->ab_switch, 1); + ux500_ab8500_jack_report(value); out: return; @@ -1194,6 +1202,7 @@ static int ab8500_accessory_init(struct platform_device *pdev) { struct ab8500_ad *dd; struct ab8500_platform_data *plat; + int ret; dev_dbg(&pdev->dev, "Enter: %s\n", __func__); @@ -1259,8 +1268,15 @@ static int ab8500_accessory_init(struct platform_device *pdev) platform_set_drvdata(pdev, dd); - return 0; + /* Android switch interface */ + dd->ab_switch.name = "h2w"; + ret = switch_dev_register(&dd->ab_switch); + if (ret < 0) + goto fail_switch; + return 0; +fail_switch: + destroy_workqueue(dd->irq_work_queue); fail_no_mem_for_wq: free_regulators(); fail_no_regulators: @@ -1294,6 +1310,7 @@ static void ab8500_accessory_cleanup(struct ab8500_ad *dd) cancel_delayed_work(&dd->init_work); flush_workqueue(dd->irq_work_queue); destroy_workqueue(dd->irq_work_queue); + switch_dev_unregister(&dd->ab_switch); kfree(dd); } |