All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chanwoo Choi <cw00.choi-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
To: George Cherian <george.cherian-l0cyMroinI0@public.gmane.org>
Cc: balbi-l0cyMroinI0@public.gmane.org,
	myungjoo.ham-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
	linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	rob-VoJi6FS/r0vR7s880joybQ@public.gmane.org,
	ian.campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org,
	swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org,
	mark.rutland-5wv7dgnIgG8@public.gmane.org,
	pawel.moll-5wv7dgnIgG8@public.gmane.org,
	rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org,
	linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	bcousson-rdvid1DuHRBWk0Htik3J/w@public.gmane.org
Subject: Re: [PATCH 1/2] extcon: extcon-dra7xx: Add extcon driver for USB ID detection
Date: Tue, 20 Aug 2013 19:29:39 +0900	[thread overview]
Message-ID: <52134513.1060304@samsung.com> (raw)
In-Reply-To: <521338B7.7040208-l0cyMroinI0@public.gmane.org>

Hi George,

>>> diff --git a/Documentation/devicetree/bindings/extcon/extcon-dra7xx.txt b/Documentation/devicetree/bindings/extcon/extcon-dra7xx.txt
>>> new file mode 100644
>>> index 0000000..37e4c22
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/extcon/extcon-dra7xx.txt
>>> @@ -0,0 +1,19 @@
>>> +EXTCON FOR DRA7xx
>>> +
>>> +Required Properties:
>>> + - compatible : Should be "ti,dra7xx-usb"
>>> + - gpios : phandle to ID pin and interrupt gpio.
>>> +
>>> +Optional Properties:
>>> +  - interrupt-parent : interrupt controller phandle
>>> +  - interrupts : interrupt number
>>> +
>>> +
>>> +dra7x_extcon1 {
>> You used 'dra7xx-usb' device name. Why did you use 'dra7x_extcon1' name?
>> What is meaning 'dra7x_extcon1'?
> 
> I will rename it to  dra7xx_extcon.

extcon naming means various external connector device. e.g., usb, jack, etc...
So, I prefer 'dra7xx_usb' instead of 'dra7xx_extcon'. I have plan to divide
extcon device driver according to the kind of device.


>>> +static int id_poll_func(void *data)
>>> +{
>>> +    struct dra7xx_usb *dra7xx_usb = (struct dra7xx_usb *) data;
>>> +
>>> +    allow_signal(SIGINT);
>>> +    allow_signal(SIGTERM);
>>> +    allow_signal(SIGKILL);
>>> +    allow_signal(SIGUSR1);
>>> +
>>> +    set_freezable();
>>> +
>>> +    while (!kthread_should_stop()) {
>>> +        dra7xx_usb->id_current = gpio_get_value_cansleep
>>> +                        (dra7xx_usb->id_gpio);
>>> +        if (dra7xx_usb->id_current == dra7xx_usb->id_prev) {
>>> +            schedule_timeout_interruptible
>>> +                        (msecs_to_jiffies(2*1000));
>>> +            continue;
>>> +        } else if (dra7xx_usb->id_current == 0) {
>>> +            extcon_set_cable_state(&dra7xx_usb->edev, "USB", false);
>>> +            extcon_set_cable_state(&dra7xx_usb->edev,
>>> +                        "USB-HOST", true);
>>> +        } else {
>>> +            extcon_set_cable_state(&dra7xx_usb->edev,
>>> +                        "USB-HOST", false);
>>> +            extcon_set_cable_state(&dra7xx_usb->edev, "USB", true);
>>> +        }
>> Should dra7xx_usb keep always connected state with either USB or USB-HOST cable?
>> I don't understand. So please explain detailed operation method of dra7xx_usb device.
> 
> In dra7xx only ID pin is connected to the SoC gpio. There is no way, currently to detect the VBUS on/off.
> So I always default to either HOST/DEVICE mode solely depending on the ID pin value.
OK.

But I don't want to use kthread with polling method.
I recommend that you use interrupt method for cable detection.
All of extcon device driver have only used interrupt method without polling.

> 
>>
>>> +        dra7xx_usb->id_prev = dra7xx_usb->id_current;
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +static irqreturn_t id_irq_handler(int irq, void *data)
>>> +{
>>> +    struct dra7xx_usb *dra7xx_usb = (struct dra7xx_usb *) data;
>>> +
>>> +    dra7xx_usb->id_current = gpio_get_value_cansleep(dra7xx_usb->id_gpio);
>>> +
>>> +    if (dra7xx_usb->id_current == dra7xx_usb->id_prev) {
>>> +        return IRQ_NONE;
>>> +    } else if (dra7xx_usb->id_current == 0) {

You should define some constant variable to clarify '0' meaning instead of using '0' directly.


>>> +    dra7xx_usb = devm_kzalloc(&pdev->dev, sizeof(*dra7xx_usb), GFP_KERNEL);
>>> +    if (!dra7xx_usb)
>>> +        return -ENOMEM;
>> You have to add error message with dev_err().
> 
> devm_kzalloc itself should give some message.

ok.


>>> +    status = extcon_dev_register(&dra7xx_usb->edev, dra7xx_usb->dev);
>>> +    if (status) {
>>> +        dev_err(&pdev->dev, "failed to register extcon device\n");
>>> +        return status;
>> You should restore previous operation about dra7xx_usb->irq_gpio.
> 
> okay
>>
>>> +    }
>>> +
>>> +    dra7xx_usb->id_prev = gpio_get_value_cansleep(dra7xx_usb->id_gpio);
>>> +    if (dra7xx_usb->id_prev) {

ditto.
You should define some constant variable to clarify 'dra7xx_usb->id_prev' meaning.

>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB-HOST", false);
>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB", true);
>>> +    } else {
>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB", false);
>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB-HOST", true);
>>> +    }
>> why did you do keep always connected state?
> 
> There is no way, currently to detect the VBUS on/off.
> So I always default to either HOST/DEVICE mode solely depending on the ID pin value.
> 
>>> +
>>> +    if (dra7xx_usb->irq_gpio) {
>>> +        status = devm_request_threaded_irq(dra7xx_usb->dev, irq_num,
>>> +                NULL, id_irq_handler, IRQF_SHARED |
>>> +                IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
>>> +                dev_name(&pdev->dev), (void *) dra7xx_usb);
>>> +        if (status)
>>> +            dev_err(dra7xx_usb->dev, "failed to request irq #%d\n",
>>> +                        irq_num);
>> If devm_request_threaded_irq() return fail state, why did not you do add error exception?
> 
> If interrupt fails I fallback to polling thread.
>>> +        else
>>> +            return 0;
>> If devm_request_threaded_irq() return success state, why did you directly call 'return'?
>> kthread_create operation isn't necessary?
> 
> Yes kthread is optional. Some boards doenot have the ID pin hooked onto the GPIO.
> In such cases we will run the kthread and poll on the ID pin values.
>>
>>> +    }
>>> +
>>> +    dra7xx_usb->thread_task = kthread_create(id_poll_func, dra7xx_usb,
>>> +                         dev_name(&pdev->dev));
>> Should you use polling method with kthread? I think it isn't proper method.
>> You did get the irq number by using DT helper function and register irq handler
>> with devm_request_threaded_irq(). I prefer interrupt method for detection of cable state.
> 
> I also prefer interrupt method. If any implementation does not have ID pin connected to GPIOs then still
> it could use the driver in polling mode.

As I mentioned above, I don't prefer interrupt method for cable detection.
Polling method for detection isn't appropriate for extcon device driver.

Instead, I will consider whether to support polling method or not on extcon core.

Thanks,
Chanwoo Choi


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

WARNING: multiple messages have this Message-ID (diff)
From: Chanwoo Choi <cw00.choi@samsung.com>
To: George Cherian <george.cherian@ti.com>
Cc: balbi@ti.com, myungjoo.ham@samsung.com,
	linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
	devicetree@vger.kernel.org, grant.likely@linaro.org,
	rob@landley.net, ian.campbell@citrix.com, swarren@wwwdotorg.org,
	mark.rutland@arm.com, pawel.moll@arm.com,
	rob.herring@calxeda.com, linux-omap@vger.kernel.org,
	linux-usb@vger.kernel.org, bcousson@baylibre.com
Subject: Re: [PATCH 1/2] extcon: extcon-dra7xx: Add extcon driver for USB ID detection
Date: Tue, 20 Aug 2013 19:29:39 +0900	[thread overview]
Message-ID: <52134513.1060304@samsung.com> (raw)
In-Reply-To: <521338B7.7040208@ti.com>

Hi George,

>>> diff --git a/Documentation/devicetree/bindings/extcon/extcon-dra7xx.txt b/Documentation/devicetree/bindings/extcon/extcon-dra7xx.txt
>>> new file mode 100644
>>> index 0000000..37e4c22
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/extcon/extcon-dra7xx.txt
>>> @@ -0,0 +1,19 @@
>>> +EXTCON FOR DRA7xx
>>> +
>>> +Required Properties:
>>> + - compatible : Should be "ti,dra7xx-usb"
>>> + - gpios : phandle to ID pin and interrupt gpio.
>>> +
>>> +Optional Properties:
>>> +  - interrupt-parent : interrupt controller phandle
>>> +  - interrupts : interrupt number
>>> +
>>> +
>>> +dra7x_extcon1 {
>> You used 'dra7xx-usb' device name. Why did you use 'dra7x_extcon1' name?
>> What is meaning 'dra7x_extcon1'?
> 
> I will rename it to  dra7xx_extcon.

extcon naming means various external connector device. e.g., usb, jack, etc...
So, I prefer 'dra7xx_usb' instead of 'dra7xx_extcon'. I have plan to divide
extcon device driver according to the kind of device.


>>> +static int id_poll_func(void *data)
>>> +{
>>> +    struct dra7xx_usb *dra7xx_usb = (struct dra7xx_usb *) data;
>>> +
>>> +    allow_signal(SIGINT);
>>> +    allow_signal(SIGTERM);
>>> +    allow_signal(SIGKILL);
>>> +    allow_signal(SIGUSR1);
>>> +
>>> +    set_freezable();
>>> +
>>> +    while (!kthread_should_stop()) {
>>> +        dra7xx_usb->id_current = gpio_get_value_cansleep
>>> +                        (dra7xx_usb->id_gpio);
>>> +        if (dra7xx_usb->id_current == dra7xx_usb->id_prev) {
>>> +            schedule_timeout_interruptible
>>> +                        (msecs_to_jiffies(2*1000));
>>> +            continue;
>>> +        } else if (dra7xx_usb->id_current == 0) {
>>> +            extcon_set_cable_state(&dra7xx_usb->edev, "USB", false);
>>> +            extcon_set_cable_state(&dra7xx_usb->edev,
>>> +                        "USB-HOST", true);
>>> +        } else {
>>> +            extcon_set_cable_state(&dra7xx_usb->edev,
>>> +                        "USB-HOST", false);
>>> +            extcon_set_cable_state(&dra7xx_usb->edev, "USB", true);
>>> +        }
>> Should dra7xx_usb keep always connected state with either USB or USB-HOST cable?
>> I don't understand. So please explain detailed operation method of dra7xx_usb device.
> 
> In dra7xx only ID pin is connected to the SoC gpio. There is no way, currently to detect the VBUS on/off.
> So I always default to either HOST/DEVICE mode solely depending on the ID pin value.
OK.

But I don't want to use kthread with polling method.
I recommend that you use interrupt method for cable detection.
All of extcon device driver have only used interrupt method without polling.

> 
>>
>>> +        dra7xx_usb->id_prev = dra7xx_usb->id_current;
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>> +
>>> +static irqreturn_t id_irq_handler(int irq, void *data)
>>> +{
>>> +    struct dra7xx_usb *dra7xx_usb = (struct dra7xx_usb *) data;
>>> +
>>> +    dra7xx_usb->id_current = gpio_get_value_cansleep(dra7xx_usb->id_gpio);
>>> +
>>> +    if (dra7xx_usb->id_current == dra7xx_usb->id_prev) {
>>> +        return IRQ_NONE;
>>> +    } else if (dra7xx_usb->id_current == 0) {

You should define some constant variable to clarify '0' meaning instead of using '0' directly.


>>> +    dra7xx_usb = devm_kzalloc(&pdev->dev, sizeof(*dra7xx_usb), GFP_KERNEL);
>>> +    if (!dra7xx_usb)
>>> +        return -ENOMEM;
>> You have to add error message with dev_err().
> 
> devm_kzalloc itself should give some message.

ok.


>>> +    status = extcon_dev_register(&dra7xx_usb->edev, dra7xx_usb->dev);
>>> +    if (status) {
>>> +        dev_err(&pdev->dev, "failed to register extcon device\n");
>>> +        return status;
>> You should restore previous operation about dra7xx_usb->irq_gpio.
> 
> okay
>>
>>> +    }
>>> +
>>> +    dra7xx_usb->id_prev = gpio_get_value_cansleep(dra7xx_usb->id_gpio);
>>> +    if (dra7xx_usb->id_prev) {

ditto.
You should define some constant variable to clarify 'dra7xx_usb->id_prev' meaning.

>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB-HOST", false);
>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB", true);
>>> +    } else {
>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB", false);
>>> +        extcon_set_cable_state(&dra7xx_usb->edev, "USB-HOST", true);
>>> +    }
>> why did you do keep always connected state?
> 
> There is no way, currently to detect the VBUS on/off.
> So I always default to either HOST/DEVICE mode solely depending on the ID pin value.
> 
>>> +
>>> +    if (dra7xx_usb->irq_gpio) {
>>> +        status = devm_request_threaded_irq(dra7xx_usb->dev, irq_num,
>>> +                NULL, id_irq_handler, IRQF_SHARED |
>>> +                IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
>>> +                dev_name(&pdev->dev), (void *) dra7xx_usb);
>>> +        if (status)
>>> +            dev_err(dra7xx_usb->dev, "failed to request irq #%d\n",
>>> +                        irq_num);
>> If devm_request_threaded_irq() return fail state, why did not you do add error exception?
> 
> If interrupt fails I fallback to polling thread.
>>> +        else
>>> +            return 0;
>> If devm_request_threaded_irq() return success state, why did you directly call 'return'?
>> kthread_create operation isn't necessary?
> 
> Yes kthread is optional. Some boards doenot have the ID pin hooked onto the GPIO.
> In such cases we will run the kthread and poll on the ID pin values.
>>
>>> +    }
>>> +
>>> +    dra7xx_usb->thread_task = kthread_create(id_poll_func, dra7xx_usb,
>>> +                         dev_name(&pdev->dev));
>> Should you use polling method with kthread? I think it isn't proper method.
>> You did get the irq number by using DT helper function and register irq handler
>> with devm_request_threaded_irq(). I prefer interrupt method for detection of cable state.
> 
> I also prefer interrupt method. If any implementation does not have ID pin connected to GPIOs then still
> it could use the driver in polling mode.

As I mentioned above, I don't prefer interrupt method for cable detection.
Polling method for detection isn't appropriate for extcon device driver.

Instead, I will consider whether to support polling method or not on extcon core.

Thanks,
Chanwoo Choi



  parent reply	other threads:[~2013-08-20 10:29 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-16 10:13 [PATCH 0/2] Enable USB ID pin detection using extcon for DRA7xx George Cherian
2013-08-16 10:13 ` George Cherian
2013-08-16 10:13 ` [PATCH 1/2] extcon: extcon-dra7xx: Add extcon driver for USB ID detection George Cherian
2013-08-16 10:13   ` George Cherian
2013-08-19 19:31   ` Stephen Warren
     [not found]     ` <52127284.6030506-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-08-20  6:55       ` George Cherian
2013-08-20  6:55         ` George Cherian
2013-08-20  6:55         ` George Cherian
2013-08-20 16:53         ` Stephen Warren
2013-08-21 13:06           ` George Cherian
2013-08-21 13:06             ` George Cherian
2013-08-21 17:35             ` Stephen Warren
2013-08-22  5:14               ` George Cherian
2013-08-22  5:14                 ` George Cherian
2013-08-25  5:30           ` Guenter Roeck
2013-08-30  0:20             ` Chanwoo Choi
2013-08-30  4:33               ` Guenter Roeck
2013-08-20  0:24   ` Chanwoo Choi
2013-08-20  9:36     ` George Cherian
2013-08-20  9:36       ` George Cherian
     [not found]       ` <521338B7.7040208-l0cyMroinI0@public.gmane.org>
2013-08-20 10:29         ` Chanwoo Choi [this message]
2013-08-20 10:29           ` Chanwoo Choi
2013-08-20 13:24           ` George Cherian
2013-08-20 13:24             ` George Cherian
2013-08-20 23:07             ` Chanwoo Choi
2013-08-16 10:13 ` [PATCH 2/2] arm: dts: dra7-evm: Add extcon dt nodes " George Cherian
2013-08-16 10:13   ` George Cherian

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=52134513.1060304@samsung.com \
    --to=cw00.choi-sze3o3uu22jbdgjk7y7tuq@public.gmane.org \
    --cc=balbi-l0cyMroinI0@public.gmane.org \
    --cc=bcousson-rdvid1DuHRBWk0Htik3J/w@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=george.cherian-l0cyMroinI0@public.gmane.org \
    --cc=grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=ian.campbell-Sxgqhf6Nn4DQT0dZR+AlfA@public.gmane.org \
    --cc=linux-doc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
    --cc=myungjoo.ham-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
    --cc=pawel.moll-5wv7dgnIgG8@public.gmane.org \
    --cc=rob-VoJi6FS/r0vR7s880joybQ@public.gmane.org \
    --cc=rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org \
    --cc=swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org \
    /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.