UPSTREAM: extcon: adc-jack: Remove the usage of extcon_set_state()
authorChanwoo Choi <cw00.choi@samsung.com>
Mon, 18 Jul 2016 07:16:29 +0000 (16:16 +0900)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 3 Aug 2016 02:07:00 +0000 (10:07 +0800)
This patch removes the usage of extcon_set_state() because it uses the bit
masking to change the state of external connectors. The extcon framework
should handle the state by extcon_set/get_cable_state_() with extcon id.

Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
(cherry picked from commit 0ddde3db610d57d28c1fe9a61e32dff1dc55ea59
 git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon.git extcon-next)

Change-Id: I64d5ff0c054ca0bab9a59105bf5c395d998665ff
Signed-off-by: Chris Zhong <zyw@rock-chips.com>
drivers/extcon/extcon-adc-jack.c
include/linux/extcon/extcon-adc-jack.h

index 7fc0ae1912f855c586ef0a9b064ea3bba68ff3b6..8df3eea9e6cb5b389340d4f6badcb1d836ec0012 100644 (file)
@@ -3,6 +3,9 @@
  *
  * Analog Jack extcon driver with ADC-based detection capability.
  *
+ * Copyright (C) 2016 Samsung Electronics
+ * Chanwoo Choi <cw00.choi@samsung.com>
+ *
  * Copyright (C) 2012 Samsung Electronics
  * MyungJoo Ham <myungjoo.ham@samsung.com>
  *
@@ -56,7 +59,7 @@ 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;
+       struct adc_jack_cond *def;
        int ret, adc_val;
        int i;
 
@@ -68,17 +71,18 @@ static void adc_jack_handler(struct work_struct *work)
 
        /* Get state from adc value with adc_conditions */
        for (i = 0; i < data->num_conditions; i++) {
-               struct adc_jack_cond *def = &data->adc_conditions[i];
-               if (!def->state)
-                       break;
+               def = &data->adc_conditions[i];
                if (def->min_adc <= adc_val && def->max_adc >= adc_val) {
-                       state = def->state;
-                       break;
+                       extcon_set_cable_state_(data->edev, def->id, true);
+                       return;
                }
        }
-       /* if no def has met, it means state = 0 (no cables attached) */
 
-       extcon_set_state(data->edev, state);
+       /* Set the detached state if adc value is not included in the range */
+       for (i = 0; i < data->num_conditions; i++) {
+               def = &data->adc_conditions[i];
+               extcon_set_cable_state_(data->edev, def->id, false);
+       }
 }
 
 static irqreturn_t adc_jack_irq_thread(int irq, void *_data)
@@ -111,16 +115,14 @@ static int adc_jack_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
-       if (!pdata->adc_conditions ||
-                       !pdata->adc_conditions[0].state) {
+       if (!pdata->adc_conditions) {
                dev_err(&pdev->dev, "error: adc_conditions not defined.\n");
                return -EINVAL;
        }
        data->adc_conditions = pdata->adc_conditions;
 
        /* Check the length of array and set num_conditions */
-       for (i = 0; data->adc_conditions[i].state; i++)
-               ;
+       for (i = 0; data->adc_conditions[i].id != EXTCON_NONE; i++);
        data->num_conditions = i;
 
        data->chan = iio_channel_get(&pdev->dev, pdata->consumer_channel);
index 53c60806bcfb6d28cdb209aa41a619fee928513f..9666a8830758ab164964c9b4943968781a55c0a1 100644 (file)
@@ -20,8 +20,8 @@
 
 /**
  * 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)
+ * @id:                        the unique id of each external connector
  * @min_adc:           min adc value for this condition
  * @max_adc:           max adc value for this condition
  *
@@ -33,7 +33,7 @@
  * 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 */
+       unsigned int id;
        u32 min_adc;
        u32 max_adc;
 };