* [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices
@ 2012-08-04 2:46 Anish Kumar
0 siblings, 0 replies; 6+ messages in thread
From: Anish Kumar @ 2012-08-04 2:46 UTC (permalink / raw)
To: cw00.choi, myungjoo.ham, jic23
Cc: linux-kernel, linux-iio, anish kumar, anish kumar
From: anish kumar <anish198519851985@gmail.com>
External connector devices that decides connection information based on
ADC values may use adc-jack device driver. The user simply needs to
provide a table of adc range and connection states. Then, extcon
framework will automatically notify others.
Signed-off-by: anish kumar <anish.singh@samsung.com>
---
drivers/extcon/Kconfig | 6 +-
drivers/extcon/Makefile | 1 +
drivers/extcon/adc_jack.c | 183 +++++++++++++++++++++++++++++++++++++++
include/linux/extcon/adc_jack.h | 109 +++++++++++++++++++++++
4 files changed, 298 insertions(+), 1 deletions(-)
create mode 100644 drivers/extcon/adc_jack.c
create mode 100644 include/linux/extcon/adc_jack.h
diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
index e175c8e..3a35117 100644
--- a/drivers/extcon/Kconfig
+++ b/drivers/extcon/Kconfig
@@ -16,11 +16,15 @@ comment "Extcon Device Drivers"
config EXTCON_GPIO
tristate "GPIO extcon support"
- depends on GENERIC_GPIO
help
Say Y here to enable GPIO based extcon support. Note that GPIO
extcon supports single state per extcon instance.
+config EXTCON_ADC_JACK
+ tristate "ADC Jack extcon support"
+ help
+ Say Y here to enable extcon device driver based on ADC values.
+
config EXTCON_MAX77693
tristate "MAX77693 EXTCON Support"
depends on MFD_MAX77693
diff --git a/drivers/extcon/Makefile b/drivers/extcon/Makefile
index 88961b3..d95c5ea 100644
--- a/drivers/extcon/Makefile
+++ b/drivers/extcon/Makefile
@@ -4,6 +4,7 @@
obj-$(CONFIG_EXTCON) += extcon_class.o
obj-$(CONFIG_EXTCON_GPIO) += extcon_gpio.o
+obj-$(CONFIG_EXTCON_ADC_JACK) += adc_jack.o
obj-$(CONFIG_EXTCON_MAX77693) += extcon-max77693.o
obj-$(CONFIG_EXTCON_MAX8997) += extcon-max8997.o
obj-$(CONFIG_EXTCON_ARIZONA) += extcon-arizona.o
diff --git a/drivers/extcon/adc_jack.c b/drivers/extcon/adc_jack.c
new file mode 100644
index 0000000..fef8334
--- /dev/null
+++ b/drivers/extcon/adc_jack.c
@@ -0,0 +1,183 @@
+/*
+ * drivers/extcon/adc_jack.c
+ *
+ * Analog Jack extcon driver with ADC-based detection capability.
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * MyungJoo Ham <myungjoo.ham@samsung.com>
+ *
+ * Modified for calling to IIO to get adc by <anish.singh@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/workqueue.h>
+#include <linux/iio/consumer.h>
+#include <linux/extcon/adc_jack.h>
+#include <linux/extcon.h>
+
+static void adc_jack_handler(struct work_struct *work)
+{
+ struct adc_jack_data *data = container_of(to_delayed_work(work),
+ struct adc_jack_data,
+ handler);
+ u32 state = 0;
+ int ret, adc_val;
+ int i;
+
+ if (!data->ready)
+ return;
+
+ ret = iio_read_channel_raw(data->chan, &adc_val);
+ if (ret < 0) {
+ dev_err(data->edev.dev, "read channel() error: %d\n", ret);
+ return;
+ }
+
+ /* Get state from adc value with adc_condition */
+ for (i = 0; i < data->num_conditions; i++) {
+ struct adc_jack_cond *def = &data->adc_condition[i];
+ if (!def->state)
+ break;
+ if (def->min_adc <= adc_val && def->max_adc >= adc_val) {
+ state = def->state;
+ break;
+ }
+ }
+ /* if no def has met, it means state = 0 (no cables attached) */
+
+ extcon_set_state(&data->edev, state);
+}
+
+static irqreturn_t adc_jack_irq_thread(int irq, void *_data)
+{
+ struct adc_jack_data *data = _data;
+
+ schedule_delayed_work(&data->handler, data->handling_delay);
+
+ return IRQ_HANDLED;
+}
+
+static int adc_jack_probe(struct platform_device *pdev)
+{
+ struct adc_jack_data *data;
+ struct adc_jack_pdata *pdata = pdev->dev.platform_data;
+ int i, err = 0;
+
+ data = kzalloc(sizeof(struct adc_jack_data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->edev.name = pdata->name;
+
+ if (pdata->cable_names)
+ data->edev.supported_cable = pdata->cable_names;
+ else
+ data->edev.supported_cable = extcon_cable_name;
+
+ /* Check the length of array and set num_cables */
+ for (i = 0; data->edev.supported_cable[i]; i++)
+ ;
+ if (i == 0 || i > SUPPORTED_CABLE_MAX) {
+ err = -EINVAL;
+ dev_err(&pdev->dev, "error: pdata->cable_names size = %d\n",
+ i - 1);
+ goto err_alloc;
+ }
+ data->num_cables = i;
+
+ if (!pdata->adc_condition ||
+ !pdata->adc_condition[0].state) {
+ err = -EINVAL;
+ dev_err(&pdev->dev, "error: adc_condition not defined.\n");
+ goto err_alloc;
+ }
+ data->adc_condition = pdata->adc_condition;
+
+ /* Check the length of array and set num_conditions */
+ for (i = 0; data->adc_condition[i].state; i++)
+ ;
+ data->num_conditions = i;
+
+ data->chan = iio_channel_get(dev_name(&pdev->dev),
+ pdata->consumer_channel);
+ data->handling_delay = msecs_to_jiffies(pdata->handling_delay_ms);
+
+ INIT_DELAYED_WORK_DEFERRABLE(&data->handler, adc_jack_handler);
+
+ platform_set_drvdata(pdev, data);
+
+ if (pdata->irq) {
+ data->irq = pdata->irq;
+
+ err = request_threaded_irq(data->irq, NULL,
+ adc_jack_irq_thread,
+ pdata->irq_flags, pdata->name,
+ data);
+
+ if (err) {
+ dev_err(&pdev->dev, "error: irq %d\n", data->irq);
+ err = -EINVAL;
+ goto err_initwork;
+ }
+ }
+ err = extcon_dev_register(&data->edev, &pdev->dev);
+ if (err)
+ goto err_irq;
+
+ data->ready = true;
+
+ goto out;
+
+err_irq:
+ if (data->irq)
+ free_irq(data->irq, data);
+err_initwork:
+ cancel_delayed_work_sync(&data->handler);
+err_alloc:
+ kfree(data);
+out:
+ return err;
+}
+
+static int __devexit adc_jack_remove(struct platform_device *pdev)
+{
+ struct adc_jack_data *data = platform_get_drvdata(pdev);
+
+ extcon_dev_unregister(&data->edev);
+ if (data->irq)
+ free_irq(data->irq, data);
+ platform_set_drvdata(pdev, NULL);
+ kfree(data);
+
+ return 0;
+}
+
+static struct platform_driver adc_jack_driver = {
+ .probe = adc_jack_probe,
+ .remove = __devexit_p(adc_jack_remove),
+ .driver = {
+ .name = "adc-jack",
+ .owner = THIS_MODULE,
+ },
+};
+
+static int __init adc_jack_init(void)
+{
+ return platform_driver_register(&adc_jack_driver);
+}
+
+static void __exit adc_jack_exit(void)
+{
+ platform_driver_unregister(&adc_jack_driver);
+}
+
+module_init(adc_jack_init);
+module_exit(adc_jack_exit);
diff --git a/include/linux/extcon/adc_jack.h b/include/linux/extcon/adc_jack.h
new file mode 100644
index 0000000..d9884b6
--- /dev/null
+++ b/include/linux/extcon/adc_jack.h
@@ -0,0 +1,109 @@
+/*
+ * include/linux/extcon/adc_jack.h
+ *
+ * Analog Jack extcon driver with ADC-based detection capability.
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * MyungJoo Ham <myungjoo.ham@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef _EXTCON_ADC_JACK_H_
+#define _EXTCON_ADC_JACK_H_ __FILE__
+
+#include <linux/module.h>
+#include <linux/extcon.h>
+
+/**
+ * struct adc_jack_data - internal data for adc_jack device driver
+ * @edev - extcon device.
+ * @cable_names - list of supported cables.
+ * @num_cables - size of cable_names.
+ * @adc_condition - list of adc value conditions.
+ * @num_condition - size of adc_condition.
+ * @irq - irq number of attach/detach event (0 if not exist).
+ * @handling_delay - interrupt handler will schedule extcon event
+ * handling at handling_delay jiffies.
+ * @handler - extcon event handler called by interrupt handler.
+ * @get_adc - a callback to get ADC value to identify state.
+ * @ready - true if it is safe to run handler.
+ */
+struct adc_jack_data {
+ struct extcon_dev edev;
+
+ const char **cable_names;
+ int num_cables;
+ struct adc_jack_cond *adc_condition;
+ int num_conditions;
+
+ int irq;
+ unsigned long handling_delay; /* in jiffies */
+ struct delayed_work handler;
+
+ struct iio_channel *chan;
+
+ bool ready;
+};
+
+/**
+ * struct adc_jack_cond - condition to use an extcon state
+ * @state - the corresponding extcon state (if 0, this struct denotes
+ * the last adc_jack_cond element among the array)
+ * @min_adc - min adc value for this condition
+ * @max_adc - max adc value for this condition
+ *
+ * For example, if { .state = 0x3, .min_adc = 100, .max_adc = 200}, it means
+ * that if ADC value is between (inclusive) 100 and 200, than the cable 0 and
+ * 1 are attached (1<<0 | 1<<1 == 0x3)
+ *
+ * Note that you don't need to describe condition for "no cable attached"
+ * because when no adc_jack_cond is met, state = 0 is automatically chosen.
+ */
+struct adc_jack_cond {
+ u32 state; /* extcon state value. 0 if invalid */
+ u32 min_adc;
+ u32 max_adc;
+};
+
+/**
+ * struct adc_jack_pdata - platform data for adc jack device.
+ * @name - name of the extcon device. If null, "adc-jack" is used.
+ * @cable_names - array of cable names ending with null. If the array itself
+ * if null, extcon standard cable names are chosen.
+ * @adc_contition - array of struct adc_jack_cond conditions ending
+ * with .state = 0 entry. This describes how to decode
+ * adc values into extcon state.
+ * @irq - IRQ number that is triggerred by cable attach/detach
+ * events. If irq = 0, use should manually update extcon state
+ * with extcon APIs.
+ * @irq_flags - irq flags used for the @irq
+ * @handling_delay_ms - in some devices, we need to read ADC value some
+ * milli-seconds after the interrupt occurs. You may
+ * describe such delays with @handling_delay_ms, which
+ * is rounded-off by jiffies.
+ * @get_adc - the callback to read ADC value to identify cable states.
+ */
+struct adc_jack_pdata {
+ const char *name;
+ const char *consumer_channel;
+ /*
+ * NULL if standard extcon names are used.
+ * The last entry should be NULL
+ */
+ const char **cable_names;
+ /* The last entry's state should be 0 */
+ struct adc_jack_cond *adc_condition;
+
+ int irq; /* Jack insertion/removal interrupt */
+ unsigned long irq_flags;
+ unsigned long handling_delay_ms; /* in ms */
+
+ /* When we have ADC subsystem, this can be generalized. */
+ int (*get_adc)(u32 *value);
+};
+
+#endif /* _EXTCON_ADC_JACK_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices
@ 2012-08-06 2:15 함명주
2012-08-06 2:44 ` anish kumar
0 siblings, 1 reply; 6+ messages in thread
From: 함명주 @ 2012-08-06 2:15 UTC (permalink / raw)
To: Anish Kumar, 최찬우, jic23@cam.ac.uk
Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
ANISH KUMAR
PiBGcm9tOiBhbmlzaCBrdW1hciA8YW5pc2gxOTg1MTk4NTE5ODVAZ21haWwuY29tPg0KPiANCj4g
RXh0ZXJuYWwgY29ubmVjdG9yIGRldmljZXMgdGhhdCBkZWNpZGVzIGNvbm5lY3Rpb24gaW5mb3Jt
YXRpb24gYmFzZWQgb24NCj4gQURDIHZhbHVlcyBtYXkgdXNlIGFkYy1qYWNrIGRldmljZSBkcml2
ZXIuIFRoZSB1c2VyIHNpbXBseSBuZWVkcyB0bw0KPiBwcm92aWRlIGEgdGFibGUgb2YgYWRjIHJh
bmdlIGFuZCBjb25uZWN0aW9uIHN0YXRlcy4gVGhlbiwgZXh0Y29uDQo+IGZyYW1ld29yayB3aWxs
IGF1dG9tYXRpY2FsbHkgbm90aWZ5IG90aGVycy4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IGFuaXNo
IGt1bWFyIDxhbmlzaC5zaW5naEBzYW1zdW5nLmNvbT4NCg0KLSBQbGVhc2UgcmVtb3ZlICJnZXRf
YWRjIiBjYWxsYmFja3Mgc3RpbGwgcmVtYWluaW5nIGluIHRoZSBoZWFkZXIgZmlsZQ0KKGFuZCBp
dHMgY29tbWVudHMpDQoNCi0gTGV0J3Mgbm90IG1vZGlmeSB1bi1yZWxhdGVkIGRyaXZlciBjb2Rl
IChpbiBLY29uZmlnLCBleHRjb24tZ3BpbykNCg0KRXhjZXB0IHRoYXQsIHRoaW5ncyBsb29rIGdv
b2QuDQoNCg0KQ2hlZXJzDQpNeXVuZ0pvbw0KDQoNCg==
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices
2012-08-06 2:15 함명주
@ 2012-08-06 2:44 ` anish kumar
0 siblings, 0 replies; 6+ messages in thread
From: anish kumar @ 2012-08-06 2:44 UTC (permalink / raw)
To: myungjoo.ham
Cc: 최찬우, jic23@cam.ac.uk,
linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
ANISH KUMAR
On Mon, 2012-08-06 at 02:15 +0000, 함명주 wrote:
> > From: anish kumar <anish198519851985@gmail.com>
> >
> > External connector devices that decides connection information based on
> > ADC values may use adc-jack device driver. The user simply needs to
> > provide a table of adc range and connection states. Then, extcon
> > framework will automatically notify others.
> >
> > Signed-off-by: anish kumar <anish.singh@samsung.com>
>
> - Please remove "get_adc" callbacks still remaining in the header file
> (and its comments)
aha.Forgot to remove this.
>
> - Let's not modify un-related driver code (in Kconfig, extcon-gpio)
I think this was unintended(my mistake).Sending the patch again.
>
> Except that, things look good.
>
>
> Cheers
> MyungJoo
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices
@ 2012-08-06 4:54 anish kumar
2012-08-06 6:46 ` Lars-Peter Clausen
0 siblings, 1 reply; 6+ messages in thread
From: anish kumar @ 2012-08-06 4:54 UTC (permalink / raw)
To: cw00.choi, myungjoo.ham, jic23
Cc: linux-kernel, linux-iio, anish kumar, anish kumar
From: anish kumar <anish198519851985@gmail.com>
External connector devices that decides connection information based on
ADC values may use adc-jack device driver. The user simply needs to
provide a table of adc range and connection states. Then, extcon
framework will automatically notify others.
Signed-off-by: anish kumar <anish.singh@samsung.com>
---
drivers/extcon/Kconfig | 5 +
drivers/extcon/Makefile | 1 +
drivers/extcon/adc_jack.c | 183 +++++++++++++++++++++++++++++++++++++++
include/linux/extcon/adc_jack.h | 108 +++++++++++++++++++++++
4 files changed, 297 insertions(+), 0 deletions(-)
create mode 100644 drivers/extcon/adc_jack.c
create mode 100644 include/linux/extcon/adc_jack.h
diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
index e175c8e..596e277 100644
--- a/drivers/extcon/Kconfig
+++ b/drivers/extcon/Kconfig
@@ -21,6 +21,11 @@ config EXTCON_GPIO
Say Y here to enable GPIO based extcon support. Note that GPIO
extcon supports single state per extcon instance.
+config EXTCON_ADC_JACK
+ tristate "ADC Jack extcon support"
+ help
+ Say Y here to enable extcon device driver based on ADC values.
+
config EXTCON_MAX77693
tristate "MAX77693 EXTCON Support"
depends on MFD_MAX77693
diff --git a/drivers/extcon/Makefile b/drivers/extcon/Makefile
index 88961b3..d95c5ea 100644
--- a/drivers/extcon/Makefile
+++ b/drivers/extcon/Makefile
@@ -4,6 +4,7 @@
obj-$(CONFIG_EXTCON) += extcon_class.o
obj-$(CONFIG_EXTCON_GPIO) += extcon_gpio.o
+obj-$(CONFIG_EXTCON_ADC_JACK) += adc_jack.o
obj-$(CONFIG_EXTCON_MAX77693) += extcon-max77693.o
obj-$(CONFIG_EXTCON_MAX8997) += extcon-max8997.o
obj-$(CONFIG_EXTCON_ARIZONA) += extcon-arizona.o
diff --git a/drivers/extcon/adc_jack.c b/drivers/extcon/adc_jack.c
new file mode 100644
index 0000000..fef8334
--- /dev/null
+++ b/drivers/extcon/adc_jack.c
@@ -0,0 +1,183 @@
+/*
+ * drivers/extcon/adc_jack.c
+ *
+ * Analog Jack extcon driver with ADC-based detection capability.
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * MyungJoo Ham <myungjoo.ham@samsung.com>
+ *
+ * Modified for calling to IIO to get adc by <anish.singh@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/slab.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/workqueue.h>
+#include <linux/iio/consumer.h>
+#include <linux/extcon/adc_jack.h>
+#include <linux/extcon.h>
+
+static void adc_jack_handler(struct work_struct *work)
+{
+ struct adc_jack_data *data = container_of(to_delayed_work(work),
+ struct adc_jack_data,
+ handler);
+ u32 state = 0;
+ int ret, adc_val;
+ int i;
+
+ if (!data->ready)
+ return;
+
+ ret = iio_read_channel_raw(data->chan, &adc_val);
+ if (ret < 0) {
+ dev_err(data->edev.dev, "read channel() error: %d\n", ret);
+ return;
+ }
+
+ /* Get state from adc value with adc_condition */
+ for (i = 0; i < data->num_conditions; i++) {
+ struct adc_jack_cond *def = &data->adc_condition[i];
+ if (!def->state)
+ break;
+ if (def->min_adc <= adc_val && def->max_adc >= adc_val) {
+ state = def->state;
+ break;
+ }
+ }
+ /* if no def has met, it means state = 0 (no cables attached) */
+
+ extcon_set_state(&data->edev, state);
+}
+
+static irqreturn_t adc_jack_irq_thread(int irq, void *_data)
+{
+ struct adc_jack_data *data = _data;
+
+ schedule_delayed_work(&data->handler, data->handling_delay);
+
+ return IRQ_HANDLED;
+}
+
+static int adc_jack_probe(struct platform_device *pdev)
+{
+ struct adc_jack_data *data;
+ struct adc_jack_pdata *pdata = pdev->dev.platform_data;
+ int i, err = 0;
+
+ data = kzalloc(sizeof(struct adc_jack_data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->edev.name = pdata->name;
+
+ if (pdata->cable_names)
+ data->edev.supported_cable = pdata->cable_names;
+ else
+ data->edev.supported_cable = extcon_cable_name;
+
+ /* Check the length of array and set num_cables */
+ for (i = 0; data->edev.supported_cable[i]; i++)
+ ;
+ if (i == 0 || i > SUPPORTED_CABLE_MAX) {
+ err = -EINVAL;
+ dev_err(&pdev->dev, "error: pdata->cable_names size = %d\n",
+ i - 1);
+ goto err_alloc;
+ }
+ data->num_cables = i;
+
+ if (!pdata->adc_condition ||
+ !pdata->adc_condition[0].state) {
+ err = -EINVAL;
+ dev_err(&pdev->dev, "error: adc_condition not defined.\n");
+ goto err_alloc;
+ }
+ data->adc_condition = pdata->adc_condition;
+
+ /* Check the length of array and set num_conditions */
+ for (i = 0; data->adc_condition[i].state; i++)
+ ;
+ data->num_conditions = i;
+
+ data->chan = iio_channel_get(dev_name(&pdev->dev),
+ pdata->consumer_channel);
+ data->handling_delay = msecs_to_jiffies(pdata->handling_delay_ms);
+
+ INIT_DELAYED_WORK_DEFERRABLE(&data->handler, adc_jack_handler);
+
+ platform_set_drvdata(pdev, data);
+
+ if (pdata->irq) {
+ data->irq = pdata->irq;
+
+ err = request_threaded_irq(data->irq, NULL,
+ adc_jack_irq_thread,
+ pdata->irq_flags, pdata->name,
+ data);
+
+ if (err) {
+ dev_err(&pdev->dev, "error: irq %d\n", data->irq);
+ err = -EINVAL;
+ goto err_initwork;
+ }
+ }
+ err = extcon_dev_register(&data->edev, &pdev->dev);
+ if (err)
+ goto err_irq;
+
+ data->ready = true;
+
+ goto out;
+
+err_irq:
+ if (data->irq)
+ free_irq(data->irq, data);
+err_initwork:
+ cancel_delayed_work_sync(&data->handler);
+err_alloc:
+ kfree(data);
+out:
+ return err;
+}
+
+static int __devexit adc_jack_remove(struct platform_device *pdev)
+{
+ struct adc_jack_data *data = platform_get_drvdata(pdev);
+
+ extcon_dev_unregister(&data->edev);
+ if (data->irq)
+ free_irq(data->irq, data);
+ platform_set_drvdata(pdev, NULL);
+ kfree(data);
+
+ return 0;
+}
+
+static struct platform_driver adc_jack_driver = {
+ .probe = adc_jack_probe,
+ .remove = __devexit_p(adc_jack_remove),
+ .driver = {
+ .name = "adc-jack",
+ .owner = THIS_MODULE,
+ },
+};
+
+static int __init adc_jack_init(void)
+{
+ return platform_driver_register(&adc_jack_driver);
+}
+
+static void __exit adc_jack_exit(void)
+{
+ platform_driver_unregister(&adc_jack_driver);
+}
+
+module_init(adc_jack_init);
+module_exit(adc_jack_exit);
diff --git a/include/linux/extcon/adc_jack.h b/include/linux/extcon/adc_jack.h
new file mode 100644
index 0000000..4d6a1f7
--- /dev/null
+++ b/include/linux/extcon/adc_jack.h
@@ -0,0 +1,108 @@
+/*
+ * include/linux/extcon/adc_jack.h
+ *
+ * Analog Jack extcon driver with ADC-based detection capability.
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * MyungJoo Ham <myungjoo.ham@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef _EXTCON_ADC_JACK_H_
+#define _EXTCON_ADC_JACK_H_ __FILE__
+
+#include <linux/module.h>
+#include <linux/extcon.h>
+
+/**
+ * struct adc_jack_data - internal data for adc_jack device driver
+ * @edev - extcon device.
+ * @cable_names - list of supported cables.
+ * @num_cables - size of cable_names.
+ * @adc_condition - list of adc value conditions.
+ * @num_condition - size of adc_condition.
+ * @irq - irq number of attach/detach event (0 if not exist).
+ * @handling_delay - interrupt handler will schedule extcon event
+ * handling at handling_delay jiffies.
+ * @handler - extcon event handler called by interrupt handler.
+ * @chan - iio channel being queried.
+ * @ready - true if it is safe to run handler.
+ */
+struct adc_jack_data {
+ struct extcon_dev edev;
+
+ const char **cable_names;
+ int num_cables;
+ struct adc_jack_cond *adc_condition;
+ int num_conditions;
+
+ int irq;
+ unsigned long handling_delay; /* in jiffies */
+ struct delayed_work handler;
+
+ struct iio_channel *chan;
+
+ bool ready;
+};
+
+/**
+ * struct adc_jack_cond - condition to use an extcon state
+ * @state - the corresponding extcon state (if 0, this struct denotes
+ * the last adc_jack_cond element among the array)
+ * @min_adc - min adc value for this condition
+ * @max_adc - max adc value for this condition
+ *
+ * For example, if { .state = 0x3, .min_adc = 100, .max_adc = 200}, it means
+ * that if ADC value is between (inclusive) 100 and 200, than the cable 0 and
+ * 1 are attached (1<<0 | 1<<1 == 0x3)
+ *
+ * Note that you don't need to describe condition for "no cable attached"
+ * because when no adc_jack_cond is met, state = 0 is automatically chosen.
+ */
+struct adc_jack_cond {
+ u32 state; /* extcon state value. 0 if invalid */
+ u32 min_adc;
+ u32 max_adc;
+};
+
+/**
+ * struct adc_jack_pdata - platform data for adc jack device.
+ * @name - name of the extcon device. If null, "adc-jack" is used.
+ * @consumer_channel - Unique name to identify the channel on the consumer
+ * side. This typically describes the channels use within
+ * the consumer. E.g. 'battery_voltage'
+ * @cable_names - array of cable names ending with null. If the array itself
+ * if null, extcon standard cable names are chosen.
+ * @adc_contition - array of struct adc_jack_cond conditions ending
+ * with .state = 0 entry. This describes how to decode
+ * adc values into extcon state.
+ * @irq - IRQ number that is triggerred by cable attach/detach
+ * events. If irq = 0, use should manually update extcon state
+ * with extcon APIs.
+ * @irq_flags - irq flags used for the @irq
+ * @handling_delay_ms - in some devices, we need to read ADC value some
+ * milli-seconds after the interrupt occurs. You may
+ * describe such delays with @handling_delay_ms, which
+ * is rounded-off by jiffies.
+ */
+struct adc_jack_pdata {
+ const char *name;
+ const char *consumer_channel;
+ /*
+ * NULL if standard extcon names are used.
+ * The last entry should be NULL
+ */
+ const char **cable_names;
+ /* The last entry's state should be 0 */
+ struct adc_jack_cond *adc_condition;
+
+ int irq; /* Jack insertion/removal interrupt */
+ unsigned long irq_flags;
+ unsigned long handling_delay_ms; /* in ms */
+};
+
+#endif /* _EXTCON_ADC_JACK_H */
--
1.7.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices
@ 2012-08-06 5:16 MyungJoo Ham
0 siblings, 0 replies; 6+ messages in thread
From: MyungJoo Ham @ 2012-08-06 5:16 UTC (permalink / raw)
To: anish kumar, 최찬우, jic23@cam.ac.uk
Cc: linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org,
ANISH KUMAR
PiBGcm9tOiBhbmlzaCBrdW1hciA8YW5pc2gxOTg1MTk4NTE5ODVAZ21haWwuY29tPg0KPiANCj4g
RXh0ZXJuYWwgY29ubmVjdG9yIGRldmljZXMgdGhhdCBkZWNpZGVzIGNvbm5lY3Rpb24gaW5mb3Jt
YXRpb24gYmFzZWQgb24NCj4gQURDIHZhbHVlcyBtYXkgdXNlIGFkYy1qYWNrIGRldmljZSBkcml2
ZXIuIFRoZSB1c2VyIHNpbXBseSBuZWVkcyB0bw0KPiBwcm92aWRlIGEgdGFibGUgb2YgYWRjIHJh
bmdlIGFuZCBjb25uZWN0aW9uIHN0YXRlcy4gVGhlbiwgZXh0Y29uDQo+IGZyYW1ld29yayB3aWxs
IGF1dG9tYXRpY2FsbHkgbm90aWZ5IG90aGVycy4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IGFuaXNo
IGt1bWFyIDxhbmlzaC5zaW5naEBzYW1zdW5nLmNvbT4NCg0KU2lnbmVkLW9mZi1ieTogTXl1bmdK
b28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+DQoNCj4gLS0tDQo+ICBkcml2ZXJzL2V4
dGNvbi9LY29uZmlnICAgICAgICAgIHwgICAgNSArDQo+ICBkcml2ZXJzL2V4dGNvbi9NYWtlZmls
ZSAgICAgICAgIHwgICAgMSArDQo+ICBkcml2ZXJzL2V4dGNvbi9hZGNfamFjay5jICAgICAgIHwg
IDE4MyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCj4gIGluY2x1ZGUv
bGludXgvZXh0Y29uL2FkY19qYWNrLmggfCAgMTA4ICsrKysrKysrKysrKysrKysrKysrKysrDQo+
ICA0IGZpbGVzIGNoYW5nZWQsIDI5NyBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQ0KPiAg
Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZXh0Y29uL2FkY19qYWNrLmMNCj4gIGNyZWF0ZSBt
b2RlIDEwMDY0NCBpbmNsdWRlL2xpbnV4L2V4dGNvbi9hZGNfamFjay5oDQo+IA0KPiBkaWZmIC0t
Z2l0IGEvZHJpdmVycy9leHRjb24vS2NvbmZpZyBiL2RyaXZlcnMvZXh0Y29uL0tjb25maWcNCj4g
aW5kZXggZTE3NWM4ZS4uNTk2ZTI3NyAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9leHRjb24vS2Nv
bmZpZw0KPiArKysgYi9kcml2ZXJzL2V4dGNvbi9LY29uZmlnDQo+IEBAIC0yMSw2ICsyMSwxMSBA
QCBjb25maWcgRVhUQ09OX0dQSU8NCj4gIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIEdQSU8gYmFz
ZWQgZXh0Y29uIHN1cHBvcnQuIE5vdGUgdGhhdCBHUElPDQo+ICAJICBleHRjb24gc3VwcG9ydHMg
c2luZ2xlIHN0YXRlIHBlciBleHRjb24gaW5zdGFuY2UuDQo+ICANCj4gK2NvbmZpZyBFWFRDT05f
QURDX0pBQ0sNCj4gKyAgICAgICAgdHJpc3RhdGUgIkFEQyBKYWNrIGV4dGNvbiBzdXBwb3J0Ig0K
PiArICAgICAgICBoZWxwDQo+ICsgICAgICAgICAgU2F5IFkgaGVyZSB0byBlbmFibGUgZXh0Y29u
IGRldmljZSBkcml2ZXIgYmFzZWQgb24gQURDIHZhbHVlcy4NCj4gKw0KPiAgY29uZmlnIEVYVENP
Tl9NQVg3NzY5Mw0KPiAgCXRyaXN0YXRlICJNQVg3NzY5MyBFWFRDT04gU3VwcG9ydCINCj4gIAlk
ZXBlbmRzIG9uIE1GRF9NQVg3NzY5Mw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vTWFr
ZWZpbGUgYi9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQ0KPiBpbmRleCA4ODk2MWIzLi5kOTVjNWVh
IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQ0KPiArKysgYi9kcml2ZXJz
L2V4dGNvbi9NYWtlZmlsZQ0KPiBAQCAtNCw2ICs0LDcgQEANCj4gIA0KPiAgb2JqLSQoQ09ORklH
X0VYVENPTikJCSs9IGV4dGNvbl9jbGFzcy5vDQo+ICBvYmotJChDT05GSUdfRVhUQ09OX0dQSU8p
CSs9IGV4dGNvbl9ncGlvLm8NCj4gK29iai0kKENPTkZJR19FWFRDT05fQURDX0pBQ0spICAgKz0g
YWRjX2phY2subw0KPiAgb2JqLSQoQ09ORklHX0VYVENPTl9NQVg3NzY5MykJKz0gZXh0Y29uLW1h
eDc3NjkzLm8NCj4gIG9iai0kKENPTkZJR19FWFRDT05fTUFYODk5NykJKz0gZXh0Y29uLW1heDg5
OTcubw0KPiAgb2JqLSQoQ09ORklHX0VYVENPTl9BUklaT05BKQkrPSBleHRjb24tYXJpem9uYS5v
DQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9hZGNfamFjay5jIGIvZHJpdmVycy9leHRj
b24vYWRjX2phY2suYw0KPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwLi5m
ZWY4MzM0DQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvZHJpdmVycy9leHRjb24vYWRjX2phY2su
Yw0KPiBAQCAtMCwwICsxLDE4MyBAQA0KPiArLyoNCj4gKyAqIGRyaXZlcnMvZXh0Y29uL2FkY19q
YWNrLmMNCj4gKyAqDQo+ICsgKiBBbmFsb2cgSmFjayBleHRjb24gZHJpdmVyIHdpdGggQURDLWJh
c2VkIGRldGVjdGlvbiBjYXBhYmlsaXR5Lg0KPiArICoNCj4gKyAqIENvcHlyaWdodCAoQykgMjAx
MiBTYW1zdW5nIEVsZWN0cm9uaWNzDQo+ICsgKiBNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBz
YW1zdW5nLmNvbT4NCj4gKyAqDQo+ICsgKiBNb2RpZmllZCBmb3IgY2FsbGluZyB0byBJSU8gdG8g
Z2V0IGFkYyBieSA8YW5pc2guc2luZ2hAc2Ftc3VuZy5jb20+DQo+ICsgKg0KPiArICogVGhpcyBw
cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt
b2RpZnkNCj4gKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgdmVyc2lvbiAyIGFzDQo+ICsgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbi4NCj4gKyAqDQo+ICsgKi8NCj4gKw0KPiArI2luY2x1ZGUgPGxpbnV4L3Ns
YWIuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9w
bGF0Zm9ybV9kZXZpY2UuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4NCj4gKyNp
bmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9paW8vY29uc3Vt
ZXIuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9leHRjb24vYWRjX2phY2suaD4NCj4gKyNpbmNsdWRl
IDxsaW51eC9leHRjb24uaD4NCj4gKw0KPiArc3RhdGljIHZvaWQgYWRjX2phY2tfaGFuZGxlcihz
dHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspDQo+ICt7DQo+ICsJc3RydWN0IGFkY19qYWNrX2RhdGEg
KmRhdGEgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLA0KPiArCQkJCQkJICBz
dHJ1Y3QgYWRjX2phY2tfZGF0YSwNCj4gKwkJCQkJCSAgaGFuZGxlcik7DQo+ICsJdTMyIHN0YXRl
ID0gMDsNCj4gKwlpbnQgcmV0LCBhZGNfdmFsOw0KPiArCWludCBpOw0KPiArDQo+ICsJaWYgKCFk
YXRhLT5yZWFkeSkNCj4gKwkJcmV0dXJuOw0KPiArDQo+ICsJcmV0ID0gaWlvX3JlYWRfY2hhbm5l
bF9yYXcoZGF0YS0+Y2hhbiwgJmFkY192YWwpOw0KPiArCWlmIChyZXQgPCAwKSB7DQo+ICsJCWRl
dl9lcnIoZGF0YS0+ZWRldi5kZXYsICJyZWFkIGNoYW5uZWwoKSBlcnJvcjogJWRcbiIsIHJldCk7
DQo+ICsJCXJldHVybjsNCj4gKwl9DQo+ICsNCj4gKwkvKiBHZXQgc3RhdGUgZnJvbSBhZGMgdmFs
dWUgd2l0aCBhZGNfY29uZGl0aW9uICovDQo+ICsJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9j
b25kaXRpb25zOyBpKyspIHsNCj4gKwkJc3RydWN0IGFkY19qYWNrX2NvbmQgKmRlZiA9ICZkYXRh
LT5hZGNfY29uZGl0aW9uW2ldOw0KPiArCQlpZiAoIWRlZi0+c3RhdGUpDQo+ICsJCQlicmVhazsN
Cj4gKwkJaWYgKGRlZi0+bWluX2FkYyA8PSBhZGNfdmFsICYmIGRlZi0+bWF4X2FkYyA+PSBhZGNf
dmFsKSB7DQo+ICsJCQlzdGF0ZSA9IGRlZi0+c3RhdGU7DQo+ICsJCQlicmVhazsNCj4gKwkJfQ0K
PiArCX0NCj4gKwkvKiBpZiBubyBkZWYgaGFzIG1ldCwgaXQgbWVhbnMgc3RhdGUgPSAwIChubyBj
YWJsZXMgYXR0YWNoZWQpICovDQo+ICsNCj4gKwlleHRjb25fc2V0X3N0YXRlKCZkYXRhLT5lZGV2
LCBzdGF0ZSk7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpcnFyZXR1cm5fdCBhZGNfamFja19pcnFf
dGhyZWFkKGludCBpcnEsIHZvaWQgKl9kYXRhKQ0KPiArew0KPiArCXN0cnVjdCBhZGNfamFja19k
YXRhICpkYXRhID0gX2RhdGE7DQo+ICsNCj4gKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRhdGEt
PmhhbmRsZXIsIGRhdGEtPmhhbmRsaW5nX2RlbGF5KTsNCj4gKw0KPiArCXJldHVybiBJUlFfSEFO
RExFRDsNCj4gK30NCj4gKw0KPiArc3RhdGljIGludCBhZGNfamFja19wcm9iZShzdHJ1Y3QgcGxh
dGZvcm1fZGV2aWNlICpwZGV2KQ0KPiArew0KPiArCXN0cnVjdCBhZGNfamFja19kYXRhICpkYXRh
Ow0KPiArCXN0cnVjdCBhZGNfamFja19wZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1f
ZGF0YTsNCj4gKwlpbnQgaSwgZXJyID0gMDsNCj4gKw0KPiArCWRhdGEgPSBremFsbG9jKHNpemVv
ZihzdHJ1Y3QgYWRjX2phY2tfZGF0YSksIEdGUF9LRVJORUwpOw0KPiArCWlmICghZGF0YSkNCj4g
KwkJcmV0dXJuIC1FTk9NRU07DQo+ICsNCj4gKwlkYXRhLT5lZGV2Lm5hbWUgPSBwZGF0YS0+bmFt
ZTsNCj4gKw0KPiArCWlmIChwZGF0YS0+Y2FibGVfbmFtZXMpDQo+ICsJCWRhdGEtPmVkZXYuc3Vw
cG9ydGVkX2NhYmxlID0gcGRhdGEtPmNhYmxlX25hbWVzOw0KPiArCWVsc2UNCj4gKwkJZGF0YS0+
ZWRldi5zdXBwb3J0ZWRfY2FibGUgPSBleHRjb25fY2FibGVfbmFtZTsNCj4gKw0KPiArCS8qIENo
ZWNrIHRoZSBsZW5ndGggb2YgYXJyYXkgYW5kIHNldCBudW1fY2FibGVzICovDQo+ICsJZm9yIChp
ID0gMDsgZGF0YS0+ZWRldi5zdXBwb3J0ZWRfY2FibGVbaV07IGkrKykNCj4gKwkJOw0KPiArCWlm
IChpID09IDAgfHwgaSA+IFNVUFBPUlRFRF9DQUJMRV9NQVgpIHsNCj4gKwkJZXJyID0gLUVJTlZB
TDsNCj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3I6IHBkYXRhLT5jYWJsZV9uYW1lcyBz
aXplID0gJWRcbiIsDQo+ICsJCQlpIC0gMSk7DQo+ICsJCWdvdG8gZXJyX2FsbG9jOw0KPiArCX0N
Cj4gKwlkYXRhLT5udW1fY2FibGVzID0gaTsNCj4gKw0KPiArCWlmICghcGRhdGEtPmFkY19jb25k
aXRpb24gfHwNCj4gKwkgICAgIXBkYXRhLT5hZGNfY29uZGl0aW9uWzBdLnN0YXRlKSB7DQo+ICsJ
CWVyciA9IC1FSU5WQUw7DQo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yOiBhZGNfY29u
ZGl0aW9uIG5vdCBkZWZpbmVkLlxuIik7DQo+ICsJCWdvdG8gZXJyX2FsbG9jOw0KPiArCX0NCj4g
KwlkYXRhLT5hZGNfY29uZGl0aW9uID0gcGRhdGEtPmFkY19jb25kaXRpb247DQo+ICsNCj4gKwkv
KiBDaGVjayB0aGUgbGVuZ3RoIG9mIGFycmF5IGFuZCBzZXQgbnVtX2NvbmRpdGlvbnMgKi8NCj4g
Kwlmb3IgKGkgPSAwOyBkYXRhLT5hZGNfY29uZGl0aW9uW2ldLnN0YXRlOyBpKyspDQo+ICsJCTsN
Cj4gKwlkYXRhLT5udW1fY29uZGl0aW9ucyA9IGk7DQo+ICsNCj4gKwlkYXRhLT5jaGFuID0gaWlv
X2NoYW5uZWxfZ2V0KGRldl9uYW1lKCZwZGV2LT5kZXYpLA0KPiArCQkJCQkJcGRhdGEtPmNvbnN1
bWVyX2NoYW5uZWwpOw0KPiArCWRhdGEtPmhhbmRsaW5nX2RlbGF5ID0gbXNlY3NfdG9famlmZmll
cyhwZGF0YS0+aGFuZGxpbmdfZGVsYXlfbXMpOw0KPiArDQo+ICsJSU5JVF9ERUxBWUVEX1dPUktf
REVGRVJSQUJMRSgmZGF0YS0+aGFuZGxlciwgYWRjX2phY2tfaGFuZGxlcik7DQo+ICsNCj4gKwlw
bGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsNCj4gKw0KPiArCWlmIChwZGF0YS0+aXJx
KSB7DQo+ICsJCWRhdGEtPmlycSA9IHBkYXRhLT5pcnE7DQo+ICsNCj4gKwkJZXJyID0gcmVxdWVz
dF90aHJlYWRlZF9pcnEoZGF0YS0+aXJxLCBOVUxMLA0KPiArCQkJCQkgICBhZGNfamFja19pcnFf
dGhyZWFkLA0KPiArCQkJCQkgICBwZGF0YS0+aXJxX2ZsYWdzLCBwZGF0YS0+bmFtZSwNCj4gKwkJ
CQkJICAgZGF0YSk7DQo+ICsNCj4gKwkJaWYgKGVycikgew0KPiArCQkJZGV2X2VycigmcGRldi0+
ZGV2LCAiZXJyb3I6IGlycSAlZFxuIiwgZGF0YS0+aXJxKTsNCj4gKwkJCWVyciA9IC1FSU5WQUw7
DQo+ICsJCQlnb3RvIGVycl9pbml0d29yazsNCj4gKwkJfQ0KPiArCX0NCj4gKwllcnIgPSBleHRj
b25fZGV2X3JlZ2lzdGVyKCZkYXRhLT5lZGV2LCAmcGRldi0+ZGV2KTsNCj4gKwlpZiAoZXJyKQ0K
PiArCQlnb3RvIGVycl9pcnE7DQo+ICsNCj4gKwlkYXRhLT5yZWFkeSA9IHRydWU7DQo+ICsNCj4g
Kwlnb3RvIG91dDsNCj4gKw0KPiArZXJyX2lycToNCj4gKwlpZiAoZGF0YS0+aXJxKQ0KPiArCQlm
cmVlX2lycShkYXRhLT5pcnEsIGRhdGEpOw0KPiArZXJyX2luaXR3b3JrOg0KPiArCWNhbmNlbF9k
ZWxheWVkX3dvcmtfc3luYygmZGF0YS0+aGFuZGxlcik7DQo+ICtlcnJfYWxsb2M6DQo+ICsJa2Zy
ZWUoZGF0YSk7DQo+ICtvdXQ6DQo+ICsJcmV0dXJuIGVycjsNCj4gK30NCj4gKw0KPiArc3RhdGlj
IGludCBfX2RldmV4aXQgYWRjX2phY2tfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk
ZXYpDQo+ICt7DQo+ICsJc3RydWN0IGFkY19qYWNrX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRf
ZHJ2ZGF0YShwZGV2KTsNCj4gKw0KPiArCWV4dGNvbl9kZXZfdW5yZWdpc3RlcigmZGF0YS0+ZWRl
dik7DQo+ICsJaWYgKGRhdGEtPmlycSkNCj4gKwkJZnJlZV9pcnEoZGF0YS0+aXJxLCBkYXRhKTsN
Cj4gKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsNCj4gKwlrZnJlZShkYXRhKTsN
Cj4gKw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiArDQo+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3Jt
X2RyaXZlciBhZGNfamFja19kcml2ZXIgPSB7DQo+ICsJLnByb2JlCQk9IGFkY19qYWNrX3Byb2Jl
LA0KPiArCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWRjX2phY2tfcmVtb3ZlKSwNCj4gKwkuZHJp
dmVyCQk9IHsNCj4gKwkJLm5hbWUJPSAiYWRjLWphY2siLA0KPiArCQkub3duZXIJPSBUSElTX01P
RFVMRSwNCj4gKwl9LA0KPiArfTsNCj4gKw0KPiArc3RhdGljIGludCBfX2luaXQgYWRjX2phY2tf
aW5pdCh2b2lkKQ0KPiArew0KPiArCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFk
Y19qYWNrX2RyaXZlcik7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyB2b2lkIF9fZXhpdCBhZGNfamFj
a19leGl0KHZvaWQpDQo+ICt7DQo+ICsJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFkY19q
YWNrX2RyaXZlcik7DQo+ICt9DQo+ICsNCj4gK21vZHVsZV9pbml0KGFkY19qYWNrX2luaXQpOw0K
PiArbW9kdWxlX2V4aXQoYWRjX2phY2tfZXhpdCk7DQo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xp
bnV4L2V4dGNvbi9hZGNfamFjay5oIGIvaW5jbHVkZS9saW51eC9leHRjb24vYWRjX2phY2suaA0K
PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwLi40ZDZhMWY3DQo+IC0tLSAv
ZGV2L251bGwNCj4gKysrIGIvaW5jbHVkZS9saW51eC9leHRjb24vYWRjX2phY2suaA0KPiBAQCAt
MCwwICsxLDEwOCBAQA0KPiArLyoNCj4gKyAqIGluY2x1ZGUvbGludXgvZXh0Y29uL2FkY19qYWNr
LmgNCj4gKyAqDQo+ICsgKiBBbmFsb2cgSmFjayBleHRjb24gZHJpdmVyIHdpdGggQURDLWJhc2Vk
IGRldGVjdGlvbiBjYXBhYmlsaXR5Lg0KPiArICoNCj4gKyAqIENvcHlyaWdodCAoQykgMjAxMiBT
YW1zdW5nIEVsZWN0cm9uaWNzDQo+ICsgKiBNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1z
dW5nLmNvbT4NCj4gKyAqDQo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KPiArICogaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMNCj4gKyAq
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KPiArICoNCj4gKyAq
Lw0KPiArDQo+ICsjaWZuZGVmIF9FWFRDT05fQURDX0pBQ0tfSF8NCj4gKyNkZWZpbmUgX0VYVENP
Tl9BRENfSkFDS19IXyBfX0ZJTEVfXw0KPiArDQo+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+
DQo+ICsjaW5jbHVkZSA8bGludXgvZXh0Y29uLmg+DQo+ICsNCj4gKy8qKg0KPiArICogc3RydWN0
IGFkY19qYWNrX2RhdGEgLSBpbnRlcm5hbCBkYXRhIGZvciBhZGNfamFjayBkZXZpY2UgZHJpdmVy
DQo+ICsgKiBAZWRldgktIGV4dGNvbiBkZXZpY2UuDQo+ICsgKiBAY2FibGVfbmFtZXMJLSBsaXN0
IG9mIHN1cHBvcnRlZCBjYWJsZXMuDQo+ICsgKiBAbnVtX2NhYmxlcwktIHNpemUgb2YgY2FibGVf
bmFtZXMuDQo+ICsgKiBAYWRjX2NvbmRpdGlvbgktIGxpc3Qgb2YgYWRjIHZhbHVlIGNvbmRpdGlv
bnMuDQo+ICsgKiBAbnVtX2NvbmRpdGlvbgktIHNpemUgb2YgYWRjX2NvbmRpdGlvbi4NCj4gKyAq
IEBpcnEJCS0gaXJxIG51bWJlciBvZiBhdHRhY2gvZGV0YWNoIGV2ZW50ICgwIGlmIG5vdCBleGlz
dCkuDQo+ICsgKiBAaGFuZGxpbmdfZGVsYXkJLSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIHNjaGVk
dWxlIGV4dGNvbiBldmVudA0KPiArICoJCQloYW5kbGluZyBhdCBoYW5kbGluZ19kZWxheSBqaWZm
aWVzLg0KPiArICogQGhhbmRsZXIJLSBleHRjb24gZXZlbnQgaGFuZGxlciBjYWxsZWQgYnkgaW50
ZXJydXB0IGhhbmRsZXIuDQo+ICsgKiBAY2hhbgktIGlpbyBjaGFubmVsIGJlaW5nIHF1ZXJpZWQu
DQo+ICsgKiBAcmVhZHkJLSB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gcnVuIGhhbmRsZXIuDQo+ICsg
Ki8NCj4gK3N0cnVjdCBhZGNfamFja19kYXRhIHsNCj4gKwlzdHJ1Y3QgZXh0Y29uX2RldiBlZGV2
Ow0KPiArDQo+ICsJY29uc3QgY2hhciAqKmNhYmxlX25hbWVzOw0KPiArCWludCBudW1fY2FibGVz
Ow0KPiArCXN0cnVjdCBhZGNfamFja19jb25kICphZGNfY29uZGl0aW9uOw0KPiArCWludCBudW1f
Y29uZGl0aW9uczsNCj4gKw0KPiArCWludCBpcnE7DQo+ICsJdW5zaWduZWQgbG9uZyBoYW5kbGlu
Z19kZWxheTsgLyogaW4gamlmZmllcyAqLw0KPiArCXN0cnVjdCBkZWxheWVkX3dvcmsgaGFuZGxl
cjsNCj4gKw0KPiArCXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbjsNCj4gKw0KPiArCWJvb2wgcmVh
ZHk7DQo+ICt9Ow0KPiArDQo+ICsvKioNCj4gKyAqIHN0cnVjdCBhZGNfamFja19jb25kIC0gY29u
ZGl0aW9uIHRvIHVzZSBhbiBleHRjb24gc3RhdGUNCj4gKyAqIEBzdGF0ZQktIHRoZSBjb3JyZXNw
b25kaW5nIGV4dGNvbiBzdGF0ZSAoaWYgMCwgdGhpcyBzdHJ1Y3QgZGVub3Rlcw0KPiArICoJCXRo
ZSBsYXN0IGFkY19qYWNrX2NvbmQgZWxlbWVudCBhbW9uZyB0aGUgYXJyYXkpDQo+ICsgKiBAbWlu
X2FkYwktIG1pbiBhZGMgdmFsdWUgZm9yIHRoaXMgY29uZGl0aW9uDQo+ICsgKiBAbWF4X2FkYwkt
IG1heCBhZGMgdmFsdWUgZm9yIHRoaXMgY29uZGl0aW9uDQo+ICsgKg0KPiArICogRm9yIGV4YW1w
bGUsIGlmIHsgLnN0YXRlID0gMHgzLCAubWluX2FkYyA9IDEwMCwgLm1heF9hZGMgPSAyMDB9LCBp
dCBtZWFucw0KPiArICogdGhhdCBpZiBBREMgdmFsdWUgaXMgYmV0d2VlbiAoaW5jbHVzaXZlKSAx
MDAgYW5kIDIwMCwgdGhhbiB0aGUgY2FibGUgMCBhbmQNCj4gKyAqIDEgYXJlIGF0dGFjaGVkICgx
PDwwIHwgMTw8MSA9PSAweDMpDQo+ICsgKg0KPiArICogTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVk
IHRvIGRlc2NyaWJlIGNvbmRpdGlvbiBmb3IgIm5vIGNhYmxlIGF0dGFjaGVkIg0KPiArICogYmVj
YXVzZSB3aGVuIG5vIGFkY19qYWNrX2NvbmQgaXMgbWV0LCBzdGF0ZSA9IDAgaXMgYXV0b21hdGlj
YWxseSBjaG9zZW4uDQo+ICsgKi8NCj4gK3N0cnVjdCBhZGNfamFja19jb25kIHsNCj4gKwl1MzIg
c3RhdGU7IC8qIGV4dGNvbiBzdGF0ZSB2YWx1ZS4gMCBpZiBpbnZhbGlkICovDQo+ICsJdTMyIG1p
bl9hZGM7DQo+ICsJdTMyIG1heF9hZGM7DQo+ICt9Ow0KPiArDQo+ICsvKioNCj4gKyAqIHN0cnVj
dCBhZGNfamFja19wZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIGFkYyBqYWNrIGRldmljZS4NCj4g
KyAqIEBuYW1lCS0gbmFtZSBvZiB0aGUgZXh0Y29uIGRldmljZS4gSWYgbnVsbCwgImFkYy1qYWNr
IiBpcyB1c2VkLg0KPiArICogQGNvbnN1bWVyX2NoYW5uZWwgLSBVbmlxdWUgbmFtZSB0byBpZGVu
dGlmeSB0aGUgY2hhbm5lbCBvbiB0aGUgY29uc3VtZXINCj4gKyAqICAgICAgICAgICAgICAgICAg
IHNpZGUuIFRoaXMgdHlwaWNhbGx5IGRlc2NyaWJlcyB0aGUgY2hhbm5lbHMgdXNlIHdpdGhpbg0K
PiArICogICAgICAgICAgICAgICAgICAgdGhlIGNvbnN1bWVyLiBFLmcuICdiYXR0ZXJ5X3ZvbHRh
Z2UnDQo+ICsgKiBAY2FibGVfbmFtZXMJLSBhcnJheSBvZiBjYWJsZSBuYW1lcyBlbmRpbmcgd2l0
aCBudWxsLiBJZiB0aGUgYXJyYXkgaXRzZWxmDQo+ICsgKgkJaWYgbnVsbCwgZXh0Y29uIHN0YW5k
YXJkIGNhYmxlIG5hbWVzIGFyZSBjaG9zZW4uDQo+ICsgKiBAYWRjX2NvbnRpdGlvbgktIGFycmF5
IG9mIHN0cnVjdCBhZGNfamFja19jb25kIGNvbmRpdGlvbnMgZW5kaW5nDQo+ICsgKgkJCXdpdGgg
LnN0YXRlID0gMCBlbnRyeS4gVGhpcyBkZXNjcmliZXMgaG93IHRvIGRlY29kZQ0KPiArICoJCQlh
ZGMgdmFsdWVzIGludG8gZXh0Y29uIHN0YXRlLg0KPiArICogQGlycQkJLSBJUlEgbnVtYmVyIHRo
YXQgaXMgdHJpZ2dlcnJlZCBieSBjYWJsZSBhdHRhY2gvZGV0YWNoDQo+ICsgKgkJZXZlbnRzLiBJ
ZiBpcnEgPSAwLCB1c2Ugc2hvdWxkIG1hbnVhbGx5IHVwZGF0ZSBleHRjb24gc3RhdGUNCj4gKyAq
CQl3aXRoIGV4dGNvbiBBUElzLg0KPiArICogQGlycV9mbGFncwktIGlycSBmbGFncyB1c2VkIGZv
ciB0aGUgQGlycQ0KPiArICogQGhhbmRsaW5nX2RlbGF5X21zCS0gaW4gc29tZSBkZXZpY2VzLCB3
ZSBuZWVkIHRvIHJlYWQgQURDIHZhbHVlIHNvbWUNCj4gKyAqCQkJbWlsbGktc2Vjb25kcyBhZnRl
ciB0aGUgaW50ZXJydXB0IG9jY3Vycy4gWW91IG1heQ0KPiArICoJCQlkZXNjcmliZSBzdWNoIGRl
bGF5cyB3aXRoIEBoYW5kbGluZ19kZWxheV9tcywgd2hpY2gNCj4gKyAqCQkJaXMgcm91bmRlZC1v
ZmYgYnkgamlmZmllcy4NCj4gKyAqLw0KPiArc3RydWN0IGFkY19qYWNrX3BkYXRhIHsNCj4gKwlj
b25zdCBjaGFyICpuYW1lOw0KPiArCWNvbnN0IGNoYXIgKmNvbnN1bWVyX2NoYW5uZWw7DQo+ICsJ
LyoNCj4gKwkgKiBOVUxMIGlmIHN0YW5kYXJkIGV4dGNvbiBuYW1lcyBhcmUgdXNlZC4NCj4gKwkg
KiBUaGUgbGFzdCBlbnRyeSBzaG91bGQgYmUgTlVMTA0KPiArCSAqLw0KPiArCWNvbnN0IGNoYXIg
KipjYWJsZV9uYW1lczsNCj4gKwkvKiBUaGUgbGFzdCBlbnRyeSdzIHN0YXRlIHNob3VsZCBiZSAw
ICovDQo+ICsJc3RydWN0IGFkY19qYWNrX2NvbmQgKmFkY19jb25kaXRpb247DQo+ICsNCj4gKwlp
bnQgaXJxOyAvKiBKYWNrIGluc2VydGlvbi9yZW1vdmFsIGludGVycnVwdCAqLw0KPiArCXVuc2ln
bmVkIGxvbmcgaXJxX2ZsYWdzOw0KPiArCXVuc2lnbmVkIGxvbmcgaGFuZGxpbmdfZGVsYXlfbXM7
IC8qIGluIG1zICovDQo+ICt9Ow0KPiArDQo+ICsjZW5kaWYgLyogX0VYVENPTl9BRENfSkFDS19I
ICovDQo+IC0tIA0KPiAxLjcuMQ0KPiANCj4gDQo+IA0KPiANCj4gICAgICAgIA0KPiAgIA0KPiAg
ICAgICAgICANCj4gDQo=
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices
2012-08-06 4:54 [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices anish kumar
@ 2012-08-06 6:46 ` Lars-Peter Clausen
0 siblings, 0 replies; 6+ messages in thread
From: Lars-Peter Clausen @ 2012-08-06 6:46 UTC (permalink / raw)
To: anish kumar
Cc: cw00.choi, myungjoo.ham, jic23, linux-kernel, linux-iio,
anish kumar
On 08/06/2012 06:54 AM, anish kumar wrote:
> From: anish kumar <anish198519851985@gmail.com>
>
> External connector devices that decides connection information based on
> ADC values may use adc-jack device driver. The user simply needs to
> provide a table of adc range and connection states. Then, extcon
> framework will automatically notify others.
Hi,
some comments inline.
>
> Signed-off-by: anish kumar <anish.singh@samsung.com>
> ---
> drivers/extcon/Kconfig | 5 +
> drivers/extcon/Makefile | 1 +
> drivers/extcon/adc_jack.c | 183 +++++++++++++++++++++++++++++++++++++++
> include/linux/extcon/adc_jack.h | 108 +++++++++++++++++++++++
> 4 files changed, 297 insertions(+), 0 deletions(-)
> create mode 100644 drivers/extcon/adc_jack.c
> create mode 100644 include/linux/extcon/adc_jack.h
>
[...]
> diff --git a/drivers/extcon/adc_jack.c b/drivers/extcon/adc_jack.c
> new file mode 100644
> index 0000000..fef8334
> --- /dev/null
> +++ b/drivers/extcon/adc_jack.c
> @@ -0,0 +1,183 @@
[...]
> +static irqreturn_t adc_jack_irq_thread(int irq, void *_data)
> +{
> + struct adc_jack_data *data = _data;
> +
> + schedule_delayed_work(&data->handler, data->handling_delay);
If you are just going to schedule a delayed work in the interrupt handler you
don't necessarily need a threaded interrupt handler. I'd use
request_any_context_irq to request the IRQ.
> +
> + return IRQ_HANDLED;
> +}
> +
> +static int adc_jack_probe(struct platform_device *pdev)
> +{
> + struct adc_jack_data *data;
> + struct adc_jack_pdata *pdata = pdev->dev.platform_data;
> + int i, err = 0;
> +
> + data = kzalloc(sizeof(struct adc_jack_data), GFP_KERNEL);
It makes sense to use devm_kzalloc here.
> + if (!data)
> + return -ENOMEM;
> +
> + data->edev.name = pdata->name;
> +
> + if (pdata->cable_names)
> + data->edev.supported_cable = pdata->cable_names;
> + else
> + data->edev.supported_cable = extcon_cable_name;
> +
> + /* Check the length of array and set num_cables */
> + for (i = 0; data->edev.supported_cable[i]; i++)
> + ;
> + if (i == 0 || i > SUPPORTED_CABLE_MAX) {
> + err = -EINVAL;
> + dev_err(&pdev->dev, "error: pdata->cable_names size = %d\n",
> + i - 1);
> + goto err_alloc;
> + }
> + data->num_cables = i;
> +
> + if (!pdata->adc_condition ||
> + !pdata->adc_condition[0].state) {
> + err = -EINVAL;
> + dev_err(&pdev->dev, "error: adc_condition not defined.\n");
> + goto err_alloc;
> + }
> + data->adc_condition = pdata->adc_condition;
> +
> + /* Check the length of array and set num_conditions */
> + for (i = 0; data->adc_condition[i].state; i++)
> + ;
> + data->num_conditions = i;
> +
> + data->chan = iio_channel_get(dev_name(&pdev->dev),
> + pdata->consumer_channel);
You should check the result of iio_channel_get.
> + data->handling_delay = msecs_to_jiffies(pdata->handling_delay_ms);
> +
> + INIT_DELAYED_WORK_DEFERRABLE(&data->handler, adc_jack_handler);
> +
> + platform_set_drvdata(pdev, data);
> +
> + if (pdata->irq) {
Is the driver actually useful without a interrupt? I mean it wouldn't do much
expect always reporting a unconnected cable.
> + data->irq = pdata->irq;
Usually you'd use platform device resources to set the IRQ and not platform
data. E.g. data->irq = platform_get_irq(pdev, 0);
> +
> + err = request_threaded_irq(data->irq, NULL,
> + adc_jack_irq_thread,
> + pdata->irq_flags, pdata->name,
> + data);
> +
> + if (err) {
> + dev_err(&pdev->dev, "error: irq %d\n", data->irq);
> + err = -EINVAL;
> + goto err_initwork;
> + }
> + }
> + err = extcon_dev_register(&data->edev, &pdev->dev);
> + if (err)
> + goto err_irq;
> +
> + data->ready = true;
If you request the irq after you registered the extcon_dev you don't need ready.
> +
> + goto out;
> +
> +err_irq:
> + if (data->irq)
> + free_irq(data->irq, data);
> +err_initwork:
> + cancel_delayed_work_sync(&data->handler);
> +err_alloc:
> + kfree(data);
> +out:
> + return err;
> +}
> +
> +static int __devexit adc_jack_remove(struct platform_device *pdev)
> +{
> + struct adc_jack_data *data = platform_get_drvdata(pdev);
> +
> + extcon_dev_unregister(&data->edev);
> + if (data->irq)
> + free_irq(data->irq, data);
> + platform_set_drvdata(pdev, NULL);
Setting the drvdata to NULL is not necessary.
> + kfree(data);
> +
> + return 0;
> +}
> +
> +static struct platform_driver adc_jack_driver = {
> + .probe = adc_jack_probe,
> + .remove = __devexit_p(adc_jack_remove),
> + .driver = {
> + .name = "adc-jack",
> + .owner = THIS_MODULE,
> + },
> +};
> +
> +static int __init adc_jack_init(void)
> +{
> + return platform_driver_register(&adc_jack_driver);
> +}
> +
> +static void __exit adc_jack_exit(void)
> +{
> + platform_driver_unregister(&adc_jack_driver);
> +}
> +
> +module_init(adc_jack_init);
> +module_exit(adc_jack_exit);
module_platform_driver(adc_jack_driver);
> diff --git a/include/linux/extcon/adc_jack.h b/include/linux/extcon/adc_jack.h
> new file mode 100644
> index 0000000..4d6a1f7
> --- /dev/null
> +++ b/include/linux/extcon/adc_jack.h
> @@ -0,0 +1,108 @@
> +/*
> + * include/linux/extcon/adc_jack.h
> + *
> + * Analog Jack extcon driver with ADC-based detection capability.
> + *
> + * Copyright (C) 2012 Samsung Electronics
> + * MyungJoo Ham <myungjoo.ham@samsung.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + */
> +
> +#ifndef _EXTCON_ADC_JACK_H_
> +#define _EXTCON_ADC_JACK_H_ __FILE__
> +
> +#include <linux/module.h>
> +#include <linux/extcon.h>
> +
> +/**
> + * struct adc_jack_data - internal data for adc_jack device driver
> + * @edev - extcon device.
> + * @cable_names - list of supported cables.
> + * @num_cables - size of cable_names.
> + * @adc_condition - list of adc value conditions.
> + * @num_condition - size of adc_condition.
> + * @irq - irq number of attach/detach event (0 if not exist).
> + * @handling_delay - interrupt handler will schedule extcon event
> + * handling at handling_delay jiffies.
> + * @handler - extcon event handler called by interrupt handler.
> + * @chan - iio channel being queried.
> + * @ready - true if it is safe to run handler.
> + */
> +struct adc_jack_data {
> + struct extcon_dev edev;
> +
> + const char **cable_names;
> + int num_cables;
> + struct adc_jack_cond *adc_condition;
> + int num_conditions;
> +
> + int irq;
> + unsigned long handling_delay; /* in jiffies */
> + struct delayed_work handler;
> +
> + struct iio_channel *chan;
> +
> + bool ready;
> +};
This struct should not go into the public header. The only one who needs this
is the driver itself.
> +
> +/**
> + * struct adc_jack_cond - condition to use an extcon state
> + * @state - the corresponding extcon state (if 0, this struct denotes
> + * the last adc_jack_cond element among the array)
> + * @min_adc - min adc value for this condition
> + * @max_adc - max adc value for this condition
> + *
> + * For example, if { .state = 0x3, .min_adc = 100, .max_adc = 200}, it means
> + * that if ADC value is between (inclusive) 100 and 200, than the cable 0 and
> + * 1 are attached (1<<0 | 1<<1 == 0x3)
> + *
> + * Note that you don't need to describe condition for "no cable attached"
> + * because when no adc_jack_cond is met, state = 0 is automatically chosen.
> + */
> +struct adc_jack_cond {
> + u32 state; /* extcon state value. 0 if invalid */
> + u32 min_adc;
> + u32 max_adc;
> +};
> +
> +/**
> + * struct adc_jack_pdata - platform data for adc jack device.
> + * @name - name of the extcon device. If null, "adc-jack" is used.
> + * @consumer_channel - Unique name to identify the channel on the consumer
> + * side. This typically describes the channels use within
> + * the consumer. E.g. 'battery_voltage'
> + * @cable_names - array of cable names ending with null. If the array itself
> + * if null, extcon standard cable names are chosen.
> + * @adc_contition - array of struct adc_jack_cond conditions ending
> + * with .state = 0 entry. This describes how to decode
> + * adc values into extcon state.
> + * @irq - IRQ number that is triggerred by cable attach/detach
> + * events. If irq = 0, use should manually update extcon state
> + * with extcon APIs.
> + * @irq_flags - irq flags used for the @irq
> + * @handling_delay_ms - in some devices, we need to read ADC value some
> + * milli-seconds after the interrupt occurs. You may
> + * describe such delays with @handling_delay_ms, which
> + * is rounded-off by jiffies.
> + */
> +struct adc_jack_pdata {
> + const char *name;
> + const char *consumer_channel;
> + /*
> + * NULL if standard extcon names are used.
> + * The last entry should be NULL
> + */
> + const char **cable_names;
const char * const *
> + /* The last entry's state should be 0 */
> + struct adc_jack_cond *adc_condition;
> +
> + int irq; /* Jack insertion/removal interrupt */
> + unsigned long irq_flags;
> + unsigned long handling_delay_ms; /* in ms */
> +};
> +
> +#endif /* _EXTCON_ADC_JACK_H */
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-08-06 6:46 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-06 4:54 [PATCH] Extcon: adc_jack: adc-jack driver to support 3.5 pi or simliar devices anish kumar
2012-08-06 6:46 ` Lars-Peter Clausen
-- strict thread matches above, loose matches on Subject: below --
2012-08-06 5:16 MyungJoo Ham
2012-08-06 2:15 함명주
2012-08-06 2:44 ` anish kumar
2012-08-04 2:46 Anish Kumar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).