All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chanwoo Choi <cwchoi00@gmail.com>
To: Roger Quadros <rogerq@ti.com>
Cc: Felipe Balbi <balbi@ti.com>,
	tony@atomide.com,
	"myungjoo.ham@samsung.com" <myungjoo.ham@samsung.com>,
	george.cherian@ti.com, nsekhar@ti.com,
	devicetree <devicetree@vger.kernel.org>,
	linux-usb@vger.kernel.org, linux-omap@vger.kernel.org,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 1/7] extcon: usb-gpio: Introduce gpio usb extcon driver
Date: Mon, 26 Jan 2015 22:56:46 +0900	[thread overview]
Message-ID: <CAGTfZH3nmpUGgFJ6RU+xH8tuDkGBFA-NbXWa0CSXZXR+DXrbkQ@mail.gmail.com> (raw)
In-Reply-To: <1422274532-9488-2-git-send-email-rogerq@ti.com>

Hi Roger,

This patch looks good to me. But I add some comment.
If you modify some comment, I'll apply this patch on 3.21 queue.

On Mon, Jan 26, 2015 at 9:15 PM, Roger Quadros <rogerq@ti.com> wrote:
> This driver observes the USB ID pin connected over a GPIO and
> updates the USB cable extcon states accordingly.
>
> The existing GPIO extcon driver is not suitable for this purpose
> as it needs to be taught to understand USB cable states and it
> can't handle more than one cable per instance.
>
> For the USB case we need to handle 2 cable states.
> 1) USB (attach/detach)
> 2) USB-Host (attach/detach)
>
> This driver can be easily updated in the future to handle VBUS
> events in case it happens to be available on GPIO for any platform.
>
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
>  .../devicetree/bindings/extcon/extcon-usb-gpio.txt |  20 ++
>  drivers/extcon/Kconfig                             |   7 +
>  drivers/extcon/Makefile                            |   1 +
>  drivers/extcon/extcon-usb-gpio.c                   | 214 +++++++++++++++++++++
>  4 files changed, 242 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt
>  create mode 100644 drivers/extcon/extcon-usb-gpio.c
>
> diff --git a/Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt b/Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt
> new file mode 100644
> index 0000000..ab52a85
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt
> @@ -0,0 +1,20 @@
> +USB GPIO Extcon device
> +
> +This is a virtual device used to generate USB cable states from the USB ID pin
> +connected to a GPIO pin.
> +
> +Required properties:
> +- compatible: Should be "linux,extcon-usb-gpio"
> +- id-gpio: gpio for USB ID pin. See gpio binding.
> +
> +Example:
> +       extcon_usb1 {
> +               compatible = "linux,extcon-usb-gpio";
> +               id-gpio = <&gpio6 1 GPIO_ACTIVE_HIGH>;
> +       }
> +
> +       usb@1 {
> +               ...
> +               extcon = <&extcon_usb1>;
> +               ...

I don' want to use '...' for example.
How about using omap usecase in your patch4[1] as following?
[1] ARM: dts: dra72-evm: Add extcon nodes for USB

            &omap_dwc3_1 {
                        extcon = <&extcon_usb1>;
            };

> +       };
> diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
> index 6a1f7de..e4c01ab 100644
> --- a/drivers/extcon/Kconfig
> +++ b/drivers/extcon/Kconfig
> @@ -93,4 +93,11 @@ config EXTCON_SM5502
>           Silicon Mitus SM5502. The SM5502 is a USB port accessory
>           detector and switch.
>
> +config EXTCON_USB_GPIO
> +       tristate "USB GPIO extcon support"
> +       depends on GPIOLIB

How about use 'select' keyword instead of 'depends on'?
- depends on GPIOLIB -> select GPIOLIB

> +       help
> +         Say Y here to enable GPIO based USB cable detection extcon support.
> +         Used typically if GPIO is used for USB ID pin detection.
> +
>  endif # MULTISTATE_SWITCH
> diff --git a/drivers/extcon/Makefile b/drivers/extcon/Makefile
> index 0370b42..6a08a98 100644
> --- a/drivers/extcon/Makefile
> +++ b/drivers/extcon/Makefile
> @@ -12,3 +12,4 @@ obj-$(CONFIG_EXTCON_MAX8997)  += extcon-max8997.o
>  obj-$(CONFIG_EXTCON_PALMAS)    += extcon-palmas.o
>  obj-$(CONFIG_EXTCON_RT8973A)   += extcon-rt8973a.o
>  obj-$(CONFIG_EXTCON_SM5502)    += extcon-sm5502.o
> +obj-$(CONFIG_EXTCON_USB_GPIO)  += extcon-usb-gpio.o
> diff --git a/drivers/extcon/extcon-usb-gpio.c b/drivers/extcon/extcon-usb-gpio.c
> new file mode 100644
> index 0000000..a20aa39
> --- /dev/null
> +++ b/drivers/extcon/extcon-usb-gpio.c
> @@ -0,0 +1,214 @@
> +/**
> + * drivers/extcon/extcon_usb_gpio.c - USB GPIO extcon driver

You should use the '-' instead of '_'.
- s/extcon_usb_gpio.c/extcon-usb-gpio.c

> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com
> + * Author: Roger Quadros <rogerq@ti.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.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/extcon.h>
> +#include <linux/init.h>
> +#include <linux/interrupt.h>
> +#include <linux/irq.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/of_gpio.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/workqueue.h>
> +
> +#define USB_GPIO_DEBOUNCE_MS   20      /* ms */
> +
> +struct usb_extcon_info {
> +       struct device *dev;
> +       struct extcon_dev *edev;
> +
> +       struct gpio_desc *id_gpiod;
> +       int id_irq;
> +
> +       unsigned long debounce_jiffies;
> +       struct delayed_work wq_detcable;
> +};
> +
> +/* List of detectable cables */
> +enum {
> +       EXTCON_CABLE_USB = 0,
> +       EXTCON_CABLE_USB_HOST,
> +
> +       EXTCON_CABLE_END,
> +};
> +
> +static const char *usb_extcon_cable[] = {
> +       [EXTCON_CABLE_USB] = "USB",
> +       [EXTCON_CABLE_USB_HOST] = "USB-Host",
> +       NULL,
> +};
> +
> +static void usb_extcon_detect_cable(struct work_struct *work)
> +{
> +       int id;
> +       struct usb_extcon_info *info;
> +
> +       info  = container_of(to_delayed_work(work), struct usb_extcon_info,
> +                            wq_detcable);

Simplify container_of statement as following:
            struct usb_extcon_info *info  = container_of(to_delayed_work(work),
                                                                struct
usb_extcon_info, wq_detcable);

> +
> +       /* check ID and update cable state */
> +       id = gpiod_get_value_cansleep(info->id_gpiod);
> +       if (id) {
> +               /*
> +                * ID = 1 means USB HOST cable detached.
> +                * As we don't have event for USB peripheral cable attached,
> +                * we simulate USB peripheral attach here.
> +                */
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB_HOST],
> +                                      false);
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB],
> +                                      true);
> +       } else {
> +               /*
> +                * ID = 0 means USB HOST cable attached.
> +                * As we don't have event for USB peripheral cable detached,
> +                * we simulate USB peripheral detach here.
> +                */
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB],
> +                                      false);
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB_HOST],
> +                                      true);
> +       }
> +}
> +
> +static irqreturn_t usb_irq_handler(int irq, void *dev_id)
> +{
> +       struct usb_extcon_info *info = dev_id;
> +
> +       queue_delayed_work(system_power_efficient_wq, &info->wq_detcable,
> +                          info->debounce_jiffies);

Need to add blank line.

> +       return IRQ_HANDLED;
> +}
> +
> +static int usb_extcon_probe(struct platform_device *pdev)
> +{
> +       struct device *dev = &pdev->dev;
> +       struct device_node *np = dev->of_node;
> +       struct usb_extcon_info *info;
> +       int ret;
> +
> +       if (!np)
> +               return -EINVAL;
> +
> +       info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
> +       if (!info)
> +               return -ENOMEM;
> +
> +       info->dev = dev;
> +       info->id_gpiod = devm_gpiod_get(&pdev->dev, "id");
> +       if (IS_ERR(info->id_gpiod)) {
> +               dev_err(dev, "failed to get ID GPIO\n");
> +               return PTR_ERR(info->id_gpiod);
> +       }
> +
> +       ret = gpiod_set_debounce(info->id_gpiod,
> +                                USB_GPIO_DEBOUNCE_MS * 1000);
> +       if (ret < 0)
> +               info->debounce_jiffies = msecs_to_jiffies(USB_GPIO_DEBOUNCE_MS);
> +
> +       INIT_DELAYED_WORK(&info->wq_detcable, usb_extcon_detect_cable);
> +
> +       info->id_irq = gpiod_to_irq(info->id_gpiod);
> +       if (info->id_irq < 0) {
> +               dev_err(dev, "failed to get ID IRQ\n");
> +               return info->id_irq;
> +       }
> +
> +       ret = devm_request_threaded_irq(dev, info->id_irq, NULL,
> +                                       usb_irq_handler,
> +                                       IRQF_SHARED | IRQF_ONESHOT |
> +                                       IRQF_NO_SUSPEND,
> +                                       pdev->name, info);
> +       if (ret < 0) {
> +               dev_err(dev, "failed to request handler for ID IRQ\n");
> +               return ret;
> +       }
> +
> +       info->edev = devm_extcon_dev_allocate(dev, usb_extcon_cable);
> +       if (IS_ERR(info->edev)) {
> +               dev_err(dev, "failed to allocate extcon device\n");
> +               return -ENOMEM;
> +       }
> +
> +       ret = devm_extcon_dev_register(dev, info->edev);
> +       if (ret < 0) {
> +               dev_err(dev, "failed to register extcon device\n");
> +               return ret;
> +       }
> +
> +       platform_set_drvdata(pdev, info);

I prefer to execute the device_init_wakeup() function as following
for suspend/resume function:
            device_init_wakeup(&pdev->dev, 1);

> +
> +       /* Perform initial detection */
> +       usb_extcon_detect_cable(&info->wq_detcable.work);
> +
> +       return 0;
> +}
> +
> +static int usb_extcon_remove(struct platform_device *pdev)
> +{
> +       struct usb_extcon_info *info = platform_get_drvdata(pdev);
> +
> +       cancel_delayed_work_sync(&info->wq_detcable);

Need to add blank line.

> +       return 0;
> +}
> +
> +#ifdef CONFIG_PM_SLEEP
> +static int usb_extcon_suspend(struct device *dev)
> +{
> +       struct usb_extcon_info *info = dev_get_drvdata(dev);
> +
> +       enable_irq_wake(info->id_irq);

I prefer to use device_may_wakeup() function for whether
executing enable_irq_wake() or not. Also, The disable_irq()
in the suspend function would prevent us from discarding interrupt
before wakeup from suspend completely.

            if (device_may_wakeup(dev))
                     enable_irq_wake(info->id_irq);
            disable_irq(info->id_irq);


> +       return 0;
> +}
> +
> +static int usb_extcon_resume(struct device *dev)
> +{
> +       struct usb_extcon_info *info = dev_get_drvdata(dev);
> +
> +       disable_irq_wake(info->id_irq);

ditto as following:

            if (device_may_wakeup(dev))
                     disable_irq_wake(info->id_irq);
            enable_irq(info->id_irq);

> +       return 0;
> +}
> +#endif
> +
> +static SIMPLE_DEV_PM_OPS(usb_extcon_pm_ops,
> +                        usb_extcon_suspend, usb_extcon_resume);
> +
> +static struct of_device_id usb_extcon_dt_match[] = {
> +       { .compatible = "linux,extcon-usb-gpio", },
> +       { /* end */ }

I prefer to use 'sentinel' word instead of 'end'

> +};
> +MODULE_DEVICE_TABLE(of, usb_extcon_dt_match);
> +
> +static struct platform_driver usb_extcon_driver = {
> +       .probe          = usb_extcon_probe,
> +       .remove         = usb_extcon_remove,
> +       .driver         = {
> +               .name   = "extcon-usb-gpio",
> +               .pm     = &usb_extcon_pm_ops,
> +               .of_match_table = usb_extcon_dt_match,
> +       },
> +};
> +
> +module_platform_driver(usb_extcon_driver);
> +
> +MODULE_AUTHOR("Roger Quadros <rogerq@ti.com>");
> +MODULE_DESCRIPTION("USB GPIO extcon driver");
> +MODULE_LICENSE("GPL v2");

Thanks,
Chanwoo Choi

WARNING: multiple messages have this Message-ID (diff)
From: Chanwoo Choi <cwchoi00-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Roger Quadros <rogerq-l0cyMroinI0@public.gmane.org>
Cc: Felipe Balbi <balbi-l0cyMroinI0@public.gmane.org>,
	tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org,
	"myungjoo.ham-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org"
	<myungjoo.ham-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>,
	george.cherian-l0cyMroinI0@public.gmane.org,
	nsekhar-l0cyMroinI0@public.gmane.org,
	devicetree <devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel
	<linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH v2 1/7] extcon: usb-gpio: Introduce gpio usb extcon driver
Date: Mon, 26 Jan 2015 22:56:46 +0900	[thread overview]
Message-ID: <CAGTfZH3nmpUGgFJ6RU+xH8tuDkGBFA-NbXWa0CSXZXR+DXrbkQ@mail.gmail.com> (raw)
In-Reply-To: <1422274532-9488-2-git-send-email-rogerq-l0cyMroinI0@public.gmane.org>

Hi Roger,

This patch looks good to me. But I add some comment.
If you modify some comment, I'll apply this patch on 3.21 queue.

On Mon, Jan 26, 2015 at 9:15 PM, Roger Quadros <rogerq-l0cyMroinI0@public.gmane.org> wrote:
> This driver observes the USB ID pin connected over a GPIO and
> updates the USB cable extcon states accordingly.
>
> The existing GPIO extcon driver is not suitable for this purpose
> as it needs to be taught to understand USB cable states and it
> can't handle more than one cable per instance.
>
> For the USB case we need to handle 2 cable states.
> 1) USB (attach/detach)
> 2) USB-Host (attach/detach)
>
> This driver can be easily updated in the future to handle VBUS
> events in case it happens to be available on GPIO for any platform.
>
> Signed-off-by: Roger Quadros <rogerq-l0cyMroinI0@public.gmane.org>
> ---
>  .../devicetree/bindings/extcon/extcon-usb-gpio.txt |  20 ++
>  drivers/extcon/Kconfig                             |   7 +
>  drivers/extcon/Makefile                            |   1 +
>  drivers/extcon/extcon-usb-gpio.c                   | 214 +++++++++++++++++++++
>  4 files changed, 242 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt
>  create mode 100644 drivers/extcon/extcon-usb-gpio.c
>
> diff --git a/Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt b/Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt
> new file mode 100644
> index 0000000..ab52a85
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/extcon/extcon-usb-gpio.txt
> @@ -0,0 +1,20 @@
> +USB GPIO Extcon device
> +
> +This is a virtual device used to generate USB cable states from the USB ID pin
> +connected to a GPIO pin.
> +
> +Required properties:
> +- compatible: Should be "linux,extcon-usb-gpio"
> +- id-gpio: gpio for USB ID pin. See gpio binding.
> +
> +Example:
> +       extcon_usb1 {
> +               compatible = "linux,extcon-usb-gpio";
> +               id-gpio = <&gpio6 1 GPIO_ACTIVE_HIGH>;
> +       }
> +
> +       usb@1 {
> +               ...
> +               extcon = <&extcon_usb1>;
> +               ...

I don' want to use '...' for example.
How about using omap usecase in your patch4[1] as following?
[1] ARM: dts: dra72-evm: Add extcon nodes for USB

            &omap_dwc3_1 {
                        extcon = <&extcon_usb1>;
            };

> +       };
> diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
> index 6a1f7de..e4c01ab 100644
> --- a/drivers/extcon/Kconfig
> +++ b/drivers/extcon/Kconfig
> @@ -93,4 +93,11 @@ config EXTCON_SM5502
>           Silicon Mitus SM5502. The SM5502 is a USB port accessory
>           detector and switch.
>
> +config EXTCON_USB_GPIO
> +       tristate "USB GPIO extcon support"
> +       depends on GPIOLIB

How about use 'select' keyword instead of 'depends on'?
- depends on GPIOLIB -> select GPIOLIB

> +       help
> +         Say Y here to enable GPIO based USB cable detection extcon support.
> +         Used typically if GPIO is used for USB ID pin detection.
> +
>  endif # MULTISTATE_SWITCH
> diff --git a/drivers/extcon/Makefile b/drivers/extcon/Makefile
> index 0370b42..6a08a98 100644
> --- a/drivers/extcon/Makefile
> +++ b/drivers/extcon/Makefile
> @@ -12,3 +12,4 @@ obj-$(CONFIG_EXTCON_MAX8997)  += extcon-max8997.o
>  obj-$(CONFIG_EXTCON_PALMAS)    += extcon-palmas.o
>  obj-$(CONFIG_EXTCON_RT8973A)   += extcon-rt8973a.o
>  obj-$(CONFIG_EXTCON_SM5502)    += extcon-sm5502.o
> +obj-$(CONFIG_EXTCON_USB_GPIO)  += extcon-usb-gpio.o
> diff --git a/drivers/extcon/extcon-usb-gpio.c b/drivers/extcon/extcon-usb-gpio.c
> new file mode 100644
> index 0000000..a20aa39
> --- /dev/null
> +++ b/drivers/extcon/extcon-usb-gpio.c
> @@ -0,0 +1,214 @@
> +/**
> + * drivers/extcon/extcon_usb_gpio.c - USB GPIO extcon driver

You should use the '-' instead of '_'.
- s/extcon_usb_gpio.c/extcon-usb-gpio.c

> + *
> + * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com
> + * Author: Roger Quadros <rogerq-l0cyMroinI0@public.gmane.org>
> + *
> + * 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.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/extcon.h>
> +#include <linux/init.h>
> +#include <linux/interrupt.h>
> +#include <linux/irq.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/of_gpio.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/workqueue.h>
> +
> +#define USB_GPIO_DEBOUNCE_MS   20      /* ms */
> +
> +struct usb_extcon_info {
> +       struct device *dev;
> +       struct extcon_dev *edev;
> +
> +       struct gpio_desc *id_gpiod;
> +       int id_irq;
> +
> +       unsigned long debounce_jiffies;
> +       struct delayed_work wq_detcable;
> +};
> +
> +/* List of detectable cables */
> +enum {
> +       EXTCON_CABLE_USB = 0,
> +       EXTCON_CABLE_USB_HOST,
> +
> +       EXTCON_CABLE_END,
> +};
> +
> +static const char *usb_extcon_cable[] = {
> +       [EXTCON_CABLE_USB] = "USB",
> +       [EXTCON_CABLE_USB_HOST] = "USB-Host",
> +       NULL,
> +};
> +
> +static void usb_extcon_detect_cable(struct work_struct *work)
> +{
> +       int id;
> +       struct usb_extcon_info *info;
> +
> +       info  = container_of(to_delayed_work(work), struct usb_extcon_info,
> +                            wq_detcable);

Simplify container_of statement as following:
            struct usb_extcon_info *info  = container_of(to_delayed_work(work),
                                                                struct
usb_extcon_info, wq_detcable);

> +
> +       /* check ID and update cable state */
> +       id = gpiod_get_value_cansleep(info->id_gpiod);
> +       if (id) {
> +               /*
> +                * ID = 1 means USB HOST cable detached.
> +                * As we don't have event for USB peripheral cable attached,
> +                * we simulate USB peripheral attach here.
> +                */
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB_HOST],
> +                                      false);
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB],
> +                                      true);
> +       } else {
> +               /*
> +                * ID = 0 means USB HOST cable attached.
> +                * As we don't have event for USB peripheral cable detached,
> +                * we simulate USB peripheral detach here.
> +                */
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB],
> +                                      false);
> +               extcon_set_cable_state(info->edev,
> +                                      usb_extcon_cable[EXTCON_CABLE_USB_HOST],
> +                                      true);
> +       }
> +}
> +
> +static irqreturn_t usb_irq_handler(int irq, void *dev_id)
> +{
> +       struct usb_extcon_info *info = dev_id;
> +
> +       queue_delayed_work(system_power_efficient_wq, &info->wq_detcable,
> +                          info->debounce_jiffies);

Need to add blank line.

> +       return IRQ_HANDLED;
> +}
> +
> +static int usb_extcon_probe(struct platform_device *pdev)
> +{
> +       struct device *dev = &pdev->dev;
> +       struct device_node *np = dev->of_node;
> +       struct usb_extcon_info *info;
> +       int ret;
> +
> +       if (!np)
> +               return -EINVAL;
> +
> +       info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
> +       if (!info)
> +               return -ENOMEM;
> +
> +       info->dev = dev;
> +       info->id_gpiod = devm_gpiod_get(&pdev->dev, "id");
> +       if (IS_ERR(info->id_gpiod)) {
> +               dev_err(dev, "failed to get ID GPIO\n");
> +               return PTR_ERR(info->id_gpiod);
> +       }
> +
> +       ret = gpiod_set_debounce(info->id_gpiod,
> +                                USB_GPIO_DEBOUNCE_MS * 1000);
> +       if (ret < 0)
> +               info->debounce_jiffies = msecs_to_jiffies(USB_GPIO_DEBOUNCE_MS);
> +
> +       INIT_DELAYED_WORK(&info->wq_detcable, usb_extcon_detect_cable);
> +
> +       info->id_irq = gpiod_to_irq(info->id_gpiod);
> +       if (info->id_irq < 0) {
> +               dev_err(dev, "failed to get ID IRQ\n");
> +               return info->id_irq;
> +       }
> +
> +       ret = devm_request_threaded_irq(dev, info->id_irq, NULL,
> +                                       usb_irq_handler,
> +                                       IRQF_SHARED | IRQF_ONESHOT |
> +                                       IRQF_NO_SUSPEND,
> +                                       pdev->name, info);
> +       if (ret < 0) {
> +               dev_err(dev, "failed to request handler for ID IRQ\n");
> +               return ret;
> +       }
> +
> +       info->edev = devm_extcon_dev_allocate(dev, usb_extcon_cable);
> +       if (IS_ERR(info->edev)) {
> +               dev_err(dev, "failed to allocate extcon device\n");
> +               return -ENOMEM;
> +       }
> +
> +       ret = devm_extcon_dev_register(dev, info->edev);
> +       if (ret < 0) {
> +               dev_err(dev, "failed to register extcon device\n");
> +               return ret;
> +       }
> +
> +       platform_set_drvdata(pdev, info);

I prefer to execute the device_init_wakeup() function as following
for suspend/resume function:
            device_init_wakeup(&pdev->dev, 1);

> +
> +       /* Perform initial detection */
> +       usb_extcon_detect_cable(&info->wq_detcable.work);
> +
> +       return 0;
> +}
> +
> +static int usb_extcon_remove(struct platform_device *pdev)
> +{
> +       struct usb_extcon_info *info = platform_get_drvdata(pdev);
> +
> +       cancel_delayed_work_sync(&info->wq_detcable);

Need to add blank line.

> +       return 0;
> +}
> +
> +#ifdef CONFIG_PM_SLEEP
> +static int usb_extcon_suspend(struct device *dev)
> +{
> +       struct usb_extcon_info *info = dev_get_drvdata(dev);
> +
> +       enable_irq_wake(info->id_irq);

I prefer to use device_may_wakeup() function for whether
executing enable_irq_wake() or not. Also, The disable_irq()
in the suspend function would prevent us from discarding interrupt
before wakeup from suspend completely.

            if (device_may_wakeup(dev))
                     enable_irq_wake(info->id_irq);
            disable_irq(info->id_irq);


> +       return 0;
> +}
> +
> +static int usb_extcon_resume(struct device *dev)
> +{
> +       struct usb_extcon_info *info = dev_get_drvdata(dev);
> +
> +       disable_irq_wake(info->id_irq);

ditto as following:

            if (device_may_wakeup(dev))
                     disable_irq_wake(info->id_irq);
            enable_irq(info->id_irq);

> +       return 0;
> +}
> +#endif
> +
> +static SIMPLE_DEV_PM_OPS(usb_extcon_pm_ops,
> +                        usb_extcon_suspend, usb_extcon_resume);
> +
> +static struct of_device_id usb_extcon_dt_match[] = {
> +       { .compatible = "linux,extcon-usb-gpio", },
> +       { /* end */ }

I prefer to use 'sentinel' word instead of 'end'

> +};
> +MODULE_DEVICE_TABLE(of, usb_extcon_dt_match);
> +
> +static struct platform_driver usb_extcon_driver = {
> +       .probe          = usb_extcon_probe,
> +       .remove         = usb_extcon_remove,
> +       .driver         = {
> +               .name   = "extcon-usb-gpio",
> +               .pm     = &usb_extcon_pm_ops,
> +               .of_match_table = usb_extcon_dt_match,
> +       },
> +};
> +
> +module_platform_driver(usb_extcon_driver);
> +
> +MODULE_AUTHOR("Roger Quadros <rogerq-l0cyMroinI0@public.gmane.org>");
> +MODULE_DESCRIPTION("USB GPIO extcon driver");
> +MODULE_LICENSE("GPL v2");

Thanks,
Chanwoo Choi
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2015-01-26 13:56 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-26 12:15 [PATCH v2 0/7] extcon: usb: Introduce USB GPIO extcon driver. Fix DRA7 & AM57xx USB Roger Quadros
2015-01-26 12:15 ` Roger Quadros
2015-01-26 12:15 ` [PATCH v2 1/7] extcon: usb-gpio: Introduce gpio usb extcon driver Roger Quadros
2015-01-26 12:15   ` Roger Quadros
2015-01-26 13:56   ` Chanwoo Choi [this message]
2015-01-26 13:56     ` Chanwoo Choi
2015-01-26 16:27     ` Roger Quadros
2015-01-26 16:27       ` Roger Quadros
2015-01-27  1:54       ` Chanwoo Choi
2015-01-27  1:54         ` Chanwoo Choi
2015-01-27 15:38         ` Roger Quadros
2015-01-27 15:38           ` Roger Quadros
2015-01-28  2:19           ` Chanwoo Choi
2015-01-28 12:12             ` Roger Quadros
2015-01-28 12:12               ` Roger Quadros
2015-01-28 17:09               ` Tony Lindgren
2015-01-29 11:31                 ` Roger Quadros
2015-01-29 11:31                   ` Roger Quadros
2015-01-29 16:56                   ` Tony Lindgren
2015-01-30 10:58                     ` Roger Quadros
2015-01-30 10:58                       ` Roger Quadros
2015-01-28 12:15   ` [PATCH v3 " Roger Quadros
2015-01-28 12:15     ` Roger Quadros
2015-01-29  1:49     ` Chanwoo Choi
2015-01-29 11:26       ` Roger Quadros
2015-01-29 11:26         ` Roger Quadros
2015-01-30  0:06         ` Chanwoo Choi
2015-01-30 11:09           ` Roger Quadros
2015-01-30 11:09             ` Roger Quadros
2015-01-30 13:57             ` Roger Quadros
2015-01-30 13:57               ` Roger Quadros
2015-01-30  0:11     ` Chanwoo Choi
2015-01-30 14:03       ` Roger Quadros
2015-01-30 14:03         ` Roger Quadros
2015-02-02  5:06         ` Chanwoo Choi
2015-02-02  5:06           ` Chanwoo Choi
2015-02-02 10:21     ` [PATCH v4 1/1] " Roger Quadros
2015-02-02 10:21       ` Roger Quadros
2015-02-03  1:13       ` Chanwoo Choi
2015-03-16 12:32       ` Ivan T. Ivanov
2015-03-16 13:11         ` Roger Quadros
2015-03-16 13:11           ` Roger Quadros
2015-03-16 14:23           ` Ivan T. Ivanov
2015-03-17  2:01             ` Chanwoo Choi
2015-03-17  7:52               ` Ivan T. Ivanov
2015-03-17  8:00                 ` Ivan T. Ivanov
2015-03-17  8:00                   ` Ivan T. Ivanov
2015-01-26 12:15 ` [PATCH v2 2/7] usb: extcon: Fix USB-Host cable name Roger Quadros
2015-01-26 12:15   ` Roger Quadros
2015-01-30 11:04   ` Roger Quadros
2015-01-30 11:04     ` Roger Quadros
2015-01-30 14:05     ` Roger Quadros
2015-01-30 14:05       ` Roger Quadros
2015-02-02  5:04       ` Chanwoo Choi
2015-02-02  9:09         ` Roger Quadros
2015-02-02  9:09           ` Roger Quadros
2015-02-02  9:55           ` Chanwoo Choi
2015-02-02 10:01             ` Roger Quadros
2015-02-02 10:01               ` Roger Quadros
2015-02-02 10:06               ` Chanwoo Choi
2015-02-02 10:06                 ` Chanwoo Choi
2015-01-26 12:15 ` [PATCH v2 3/7] ARM: dts: dra7-evm: Add extcon nodes for USB Roger Quadros
2015-01-26 12:15   ` Roger Quadros
2015-01-26 12:15 ` [PATCH v2 4/7] ARM: dts: dra72-evm: " Roger Quadros
2015-01-26 12:15   ` Roger Quadros
2015-01-26 12:15 ` [PATCH v2 5/7] ARM: dts: am57xx-beagle-x15: " Roger Quadros
2015-01-26 12:15   ` Roger Quadros
2015-01-26 12:15 ` [PATCH v2 6/7] ARM: dts: am57xx-beagle-x15: Fix USB2 mode Roger Quadros
2015-01-26 12:15   ` Roger Quadros
2015-01-26 12:15 ` [PATCH v2 7/7] ARM: omap2plus_defconfig: Enable EXTCON_GPIO_USB Roger Quadros
2015-01-26 12:15   ` Roger Quadros
2015-03-16 17:53   ` Tony Lindgren
2015-03-16 17:53     ` Tony Lindgren
2015-03-17  9:29     ` Roger Quadros
2015-03-17  9:29       ` Roger Quadros

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAGTfZH3nmpUGgFJ6RU+xH8tuDkGBFA-NbXWa0CSXZXR+DXrbkQ@mail.gmail.com \
    --to=cwchoi00@gmail.com \
    --cc=balbi@ti.com \
    --cc=cw00.choi@samsung.com \
    --cc=devicetree@vger.kernel.org \
    --cc=george.cherian@ti.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=myungjoo.ham@samsung.com \
    --cc=nsekhar@ti.com \
    --cc=rogerq@ti.com \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.