This patch use devm_extcon_dev_allocate() to simplify the memory control
of extcon device.

Signed-off-by: Chanwoo Choi <cw00.c...@samsung.com>
---
 drivers/extcon/extcon-gpio.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/extcon/extcon-gpio.c b/drivers/extcon/extcon-gpio.c
index 13d5222..567eba2 100644
--- a/drivers/extcon/extcon-gpio.c
+++ b/drivers/extcon/extcon-gpio.c
@@ -32,7 +32,7 @@
 #include <linux/extcon/extcon-gpio.h>
 
 struct gpio_extcon_data {
-       struct extcon_dev edev;
+       struct extcon_dev *edev;
        unsigned gpio;
        bool gpio_active_low;
        const char *state_on;
@@ -53,7 +53,7 @@ static void gpio_extcon_work(struct work_struct *work)
        state = gpio_get_value(data->gpio);
        if (data->gpio_active_low)
                state = !state;
-       extcon_set_state(&data->edev, state);
+       extcon_set_state(data->edev, state);
 }
 
 static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
@@ -67,9 +67,10 @@ static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
 
 static ssize_t extcon_gpio_print_state(struct extcon_dev *edev, char *buf)
 {
-       struct gpio_extcon_data *extcon_data =
-               container_of(edev, struct gpio_extcon_data, edev);
+       struct device *dev = edev->dev.parent;
+       struct gpio_extcon_data *extcon_data = dev_get_drvdata(dev);
        const char *state;
+
        if (extcon_get_state(edev))
                state = extcon_data->state_on;
        else
@@ -98,15 +99,21 @@ static int gpio_extcon_probe(struct platform_device *pdev)
        if (!extcon_data)
                return -ENOMEM;
 
-       extcon_data->edev.name = pdata->name;
-       extcon_data->edev.dev.parent = &pdev->dev;
+       extcon_data->edev = devm_extcon_dev_allocate(&pdev->dev, NULL);
+       if (!extcon_data->edev) {
+               dev_err(&pdev->dev, "failed to allocate extcon device\n");
+               return -ENOMEM;
+       }
+       extcon_data->edev->name = pdata->name;
+       extcon_data->edev->dev.parent = &pdev->dev;
+
        extcon_data->gpio = pdata->gpio;
        extcon_data->gpio_active_low = pdata->gpio_active_low;
        extcon_data->state_on = pdata->state_on;
        extcon_data->state_off = pdata->state_off;
        extcon_data->check_on_resume = pdata->check_on_resume;
        if (pdata->state_on && pdata->state_off)
-               extcon_data->edev.print_state = extcon_gpio_print_state;
+               extcon_data->edev->print_state = extcon_gpio_print_state;
 
        ret = devm_gpio_request_one(&pdev->dev, extcon_data->gpio, GPIOF_DIR_IN,
                                    pdev->name);
@@ -121,7 +128,7 @@ static int gpio_extcon_probe(struct platform_device *pdev)
                                msecs_to_jiffies(pdata->debounce);
        }
 
-       ret = extcon_dev_register(&extcon_data->edev);
+       ret = extcon_dev_register(extcon_data->edev);
        if (ret < 0)
                return ret;
 
@@ -146,7 +153,7 @@ static int gpio_extcon_probe(struct platform_device *pdev)
        return 0;
 
 err:
-       extcon_dev_unregister(&extcon_data->edev);
+       extcon_dev_unregister(extcon_data->edev);
 
        return ret;
 }
@@ -157,7 +164,7 @@ static int gpio_extcon_remove(struct platform_device *pdev)
 
        cancel_delayed_work_sync(&extcon_data->work);
        free_irq(extcon_data->irq, extcon_data);
-       extcon_dev_unregister(&extcon_data->edev);
+       extcon_dev_unregister(extcon_data->edev);
 
        return 0;
 }
-- 
1.8.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to