diff mbox

[v3] USB: mxs-phy: add basic otg support

Message ID 1347872703-15167-1-git-send-email-richard.zhao@freescale.com (mailing list archive)
State New, archived
Headers show

Commit Message

Richard Zhao Sept. 17, 2012, 9:05 a.m. UTC
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Acked-by: Felipe Balbi <balbi@ti.com>
---
Changes from v2:
 - assign host/gadget in mxs_phy_set_host/mxs_phy_set_peripheral

 drivers/usb/otg/mxs-phy.c |   25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

Comments

Alexander Shishkin Sept. 17, 2012, 10:06 a.m. UTC | #1
Richard Zhao <richard.zhao@freescale.com> writes:

> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> Acked-by: Felipe Balbi <balbi@ti.com>

Felipe said, 

> if you add a commit log you can add my:
> 
> Acked-by: Felipe Balbi <balbi@ti.com>

but the commit message is still totally missing. I would like to ask you
to pay attention to the commit messages in the patches that you
submit. They should explain the problem that your patch is solving, how
you are solving it and why, so that anyone immediately knows what the
patch is about without digging up mailing list conversations. There's
also a nice blog entry [1] on how to write good commit messages.

[1] http://who-t.blogspot.com/2009/12/on-commit-messages.html

> ---
> Changes from v2:
>  - assign host/gadget in mxs_phy_set_host/mxs_phy_set_peripheral
>
>  drivers/usb/otg/mxs-phy.c |   25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c
> index 88db976..3255112 100644
> --- a/drivers/usb/otg/mxs-phy.c
> +++ b/drivers/usb/otg/mxs-phy.c
> @@ -129,12 +129,28 @@ static int mxs_phy_on_disconnect(struct usb_phy *phy, int port)
>  	return 0;
>  }
>  
> +static int mxs_phy_set_host(struct usb_otg *otg, struct usb_bus *host)
> +{
> +	otg->host = host;
> +
> +	return 0;
> +}
> +
> +static int mxs_phy_set_peripheral(struct usb_otg *otg,
> +					struct usb_gadget *gadget)
> +{
> +	otg->gadget = gadget;
> +
> +	return 0;
> +}
> +
>  static int mxs_phy_probe(struct platform_device *pdev)
>  {
>  	struct resource *res;
>  	void __iomem *base;
>  	struct clk *clk;
>  	struct mxs_phy *mxs_phy;
> +	struct usb_otg *otg;
>  
>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>  	if (!res) {
> @@ -171,6 +187,15 @@ static int mxs_phy_probe(struct platform_device *pdev)
>  
>  	mxs_phy->clk = clk;
>  
> +	otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), GFP_KERNEL);
> +	if (!otg)
> +		return -ENOMEM;
> +	otg->phy = &mxs_phy->phy;
> +	otg->set_host = mxs_phy_set_host;
> +	otg->set_peripheral = mxs_phy_set_peripheral;
> +
> +	mxs_phy->phy.otg = otg;
> +
>  	platform_set_drvdata(pdev, &mxs_phy->phy);
>  
>  	return 0;
> -- 
> 1.7.9.5
Chen Peter-B29397 Sept. 17, 2012, 10:08 a.m. UTC | #2
The purpose for this patch is to have set_peripheral implementation,
but in current chipidea code, we don't need to know gadget at all,
as when id switch occurs, the core code know its role (device or host)
very well, and will call related stop/start function.

We have already many code bind struct otg with struct phy, we'd better
split them at later code.
 
A better approach to fix this problem is to either not call set_peripheral
if both device and host use chipidea driver, or implement otg struct
at chipidea driver.


> Changes from v2:
>  - assign host/gadget in mxs_phy_set_host/mxs_phy_set_peripheral
> 
>  drivers/usb/otg/mxs-phy.c |   25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c
> index 88db976..3255112 100644
> --- a/drivers/usb/otg/mxs-phy.c
> +++ b/drivers/usb/otg/mxs-phy.c
> @@ -129,12 +129,28 @@ static int mxs_phy_on_disconnect(struct usb_phy
> *phy, int port)
>  	return 0;
>  }
> 
> +static int mxs_phy_set_host(struct usb_otg *otg, struct usb_bus *host)
> +{
> +	otg->host = host;
> +
> +	return 0;
> +}
> +
> +static int mxs_phy_set_peripheral(struct usb_otg *otg,
> +					struct usb_gadget *gadget)
> +{
> +	otg->gadget = gadget;
> +
> +	return 0;
> +}
> +
>  static int mxs_phy_probe(struct platform_device *pdev)
>  {
>  	struct resource *res;
>  	void __iomem *base;
>  	struct clk *clk;
>  	struct mxs_phy *mxs_phy;
> +	struct usb_otg *otg;
> 
>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>  	if (!res) {
> @@ -171,6 +187,15 @@ static int mxs_phy_probe(struct platform_device
> *pdev)
> 
>  	mxs_phy->clk = clk;
> 
> +	otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), GFP_KERNEL);
> +	if (!otg)
> +		return -ENOMEM;
> +	otg->phy = &mxs_phy->phy;
> +	otg->set_host = mxs_phy_set_host;
> +	otg->set_peripheral = mxs_phy_set_peripheral;
> +
> +	mxs_phy->phy.otg = otg;
> +
>  	platform_set_drvdata(pdev, &mxs_phy->phy);
> 
>  	return 0;
> --
> 1.7.9.5
Alexander Shishkin Sept. 17, 2012, 10:18 a.m. UTC | #3
Chen Peter-B29397 <B29397@freescale.com> writes:

> The purpose for this patch is to have set_peripheral implementation,
> but in current chipidea code, we don't need to know gadget at all,
> as when id switch occurs, the core code know its role (device or host)
> very well, and will call related stop/start function.
>
> We have already many code bind struct otg with struct phy, we'd better
> split them at later code.
>  
> A better approach to fix this problem is to either not call set_peripheral
> if both device and host use chipidea driver, or implement otg struct
> at chipidea driver.

Yes, I think the otg driver should be part of the chipidea driver, the
only concern is the msm, although it can probably be converted once we
have an otg driver. I'll have a look at it soon unless someone beats me
to it.

The bigger plan was to implement a generic otg framework and base the
chipidea's otg driver on that, instead of dragging in one more state
machine and whatnot.

Regards,
--
Alex
Chen Peter-B29397 Sept. 17, 2012, 11:39 p.m. UTC | #4
> 
> > The purpose for this patch is to have set_peripheral implementation,
> > but in current chipidea code, we don't need to know gadget at all,
> > as when id switch occurs, the core code know its role (device or host)
> > very well, and will call related stop/start function.
> >
> > We have already many code bind struct otg with struct phy, we'd better
> > split them at later code.
> >
> > A better approach to fix this problem is to either not call
> set_peripheral
> > if both device and host use chipidea driver, or implement otg struct
> > at chipidea driver.
> 
> Yes, I think the otg driver should be part of the chipidea driver, the
> only concern is the msm, although it can probably be converted once we
> have an otg driver. I'll have a look at it soon unless someone beats me
> to it.

Currently, we still have no auto-suspend and wakeup support, but msm supports
them, it may need much effort to move msm to current whole chipidea framework.
As it affects we go on implement id-switch function and other usb functions 
at chipidea, I hope we can have it soon, thanks. I also would like to help it
if you are busy on other things. 

> 
> The bigger plan was to implement a generic otg framework and base the
> chipidea's otg driver on that, instead of dragging in one more state
> machine and whatnot.
> 

Yes, we can transfer it to use generic otg framework once it is ready, but
first, it is better has own otg driver at chipidea.

> Regards,
> --
> Alex
Richard Zhao Sept. 19, 2012, 1:11 a.m. UTC | #5
On Mon, Sep 17, 2012 at 01:06:21PM +0300, Alexander Shishkin wrote:
> Richard Zhao <richard.zhao@freescale.com> writes:
> 
> > Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> > Acked-by: Felipe Balbi <balbi@ti.com>
> 
> Felipe said, 
> 
> > if you add a commit log you can add my:
> > 
> > Acked-by: Felipe Balbi <balbi@ti.com>
> 
> but the commit message is still totally missing. I would like to ask you
> to pay attention to the commit messages in the patches that you
> submit. They should explain the problem that your patch is solving, how
> you are solving it and why, so that anyone immediately knows what the
> patch is about without digging up mailing list conversations. There's
> also a nice blog entry [1] on how to write good commit messages.
> 
> [1] http://who-t.blogspot.com/2009/12/on-commit-messages.html
Will you agree to give ack if commit message changed to below?

    USB: mxs-phy: add fake otg support
    
    It has nothing to do with phy driver, but for now chipidea driver calls
    struct usb_otg callbacks. So we implement a fake one.
    
    When chipidea implement its own otg driver, this commit can be reverted.
    
    Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
    Acked-by: Felipe Balbi <balbi@ti.com

Thanks
Richard
> 
> > ---
> > Changes from v2:
> >  - assign host/gadget in mxs_phy_set_host/mxs_phy_set_peripheral
> >
> >  drivers/usb/otg/mxs-phy.c |   25 +++++++++++++++++++++++++
> >  1 file changed, 25 insertions(+)
> >
> > diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c
> > index 88db976..3255112 100644
> > --- a/drivers/usb/otg/mxs-phy.c
> > +++ b/drivers/usb/otg/mxs-phy.c
> > @@ -129,12 +129,28 @@ static int mxs_phy_on_disconnect(struct usb_phy *phy, int port)
> >  	return 0;
> >  }
> >  
> > +static int mxs_phy_set_host(struct usb_otg *otg, struct usb_bus *host)
> > +{
> > +	otg->host = host;
> > +
> > +	return 0;
> > +}
> > +
> > +static int mxs_phy_set_peripheral(struct usb_otg *otg,
> > +					struct usb_gadget *gadget)
> > +{
> > +	otg->gadget = gadget;
> > +
> > +	return 0;
> > +}
> > +
> >  static int mxs_phy_probe(struct platform_device *pdev)
> >  {
> >  	struct resource *res;
> >  	void __iomem *base;
> >  	struct clk *clk;
> >  	struct mxs_phy *mxs_phy;
> > +	struct usb_otg *otg;
> >  
> >  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> >  	if (!res) {
> > @@ -171,6 +187,15 @@ static int mxs_phy_probe(struct platform_device *pdev)
> >  
> >  	mxs_phy->clk = clk;
> >  
> > +	otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), GFP_KERNEL);
> > +	if (!otg)
> > +		return -ENOMEM;
> > +	otg->phy = &mxs_phy->phy;
> > +	otg->set_host = mxs_phy_set_host;
> > +	otg->set_peripheral = mxs_phy_set_peripheral;
> > +
> > +	mxs_phy->phy.otg = otg;
> > +
> >  	platform_set_drvdata(pdev, &mxs_phy->phy);
> >  
> >  	return 0;
> > -- 
> > 1.7.9.5
>
Marc Kleine-Budde Sept. 19, 2012, 7:27 a.m. UTC | #6
On 09/19/2012 03:11 AM, Richard Zhao wrote:
> On Mon, Sep 17, 2012 at 01:06:21PM +0300, Alexander Shishkin wrote:
>> Richard Zhao <richard.zhao@freescale.com> writes:
>>
>>> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
>>> Acked-by: Felipe Balbi <balbi@ti.com>
>>
>> Felipe said, 
>>
>>> if you add a commit log you can add my:
>>>
>>> Acked-by: Felipe Balbi <balbi@ti.com>
>>
>> but the commit message is still totally missing. I would like to ask you
>> to pay attention to the commit messages in the patches that you
>> submit. They should explain the problem that your patch is solving, how
>> you are solving it and why, so that anyone immediately knows what the
>> patch is about without digging up mailing list conversations. There's
>> also a nice blog entry [1] on how to write good commit messages.
>>
>> [1] http://who-t.blogspot.com/2009/12/on-commit-messages.html
> Will you agree to give ack if commit message changed to below?
> 
>     USB: mxs-phy: add fake otg support
>     
>     It has nothing to do with phy driver, but for now chipidea driver calls
>     struct usb_otg callbacks. So we implement a fake one.
>     
>     When chipidea implement its own otg driver, this commit can be reverted.
>     
>     Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
>     Acked-by: Felipe Balbi <balbi@ti.com
> 
> Thanks
> Richard
>>
>>> ---
>>> Changes from v2:
>>>  - assign host/gadget in mxs_phy_set_host/mxs_phy_set_peripheral
>>>
>>>  drivers/usb/otg/mxs-phy.c |   25 +++++++++++++++++++++++++
>>>  1 file changed, 25 insertions(+)
>>>
>>> diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c
>>> index 88db976..3255112 100644
>>> --- a/drivers/usb/otg/mxs-phy.c
>>> +++ b/drivers/usb/otg/mxs-phy.c
>>> @@ -129,12 +129,28 @@ static int mxs_phy_on_disconnect(struct usb_phy *phy, int port)
>>>  	return 0;
>>>  }
>>>  
>>> +static int mxs_phy_set_host(struct usb_otg *otg, struct usb_bus *host)
>>> +{
>>> +	otg->host = host;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>> +static int mxs_phy_set_peripheral(struct usb_otg *otg,
>>> +					struct usb_gadget *gadget)
>>> +{
>>> +	otg->gadget = gadget;
>>> +
>>> +	return 0;
>>> +}
>>> +
>>>  static int mxs_phy_probe(struct platform_device *pdev)
>>>  {
>>>  	struct resource *res;
>>>  	void __iomem *base;
>>>  	struct clk *clk;
>>>  	struct mxs_phy *mxs_phy;
>>> +	struct usb_otg *otg;
>>>  
>>>  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>>  	if (!res) {
>>> @@ -171,6 +187,15 @@ static int mxs_phy_probe(struct platform_device *pdev)
>>>  
>>>  	mxs_phy->clk = clk;
>>>  
>>> +	otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), GFP_KERNEL);

In order to save some overhead you can embed the struct usb_otg in the
struct mxs_phy.

Marc
>>> +	if (!otg)
>>> +		return -ENOMEM;
>>> +	otg->phy = &mxs_phy->phy;
>>> +	otg->set_host = mxs_phy_set_host;
>>> +	otg->set_peripheral = mxs_phy_set_peripheral;
>>> +
>>> +	mxs_phy->phy.otg = otg;
>>> +
>>>  	platform_set_drvdata(pdev, &mxs_phy->phy);
>>>  
>>>  	return 0;
>>> -- 
>>> 1.7.9.5
>>
>
diff mbox

Patch

diff --git a/drivers/usb/otg/mxs-phy.c b/drivers/usb/otg/mxs-phy.c
index 88db976..3255112 100644
--- a/drivers/usb/otg/mxs-phy.c
+++ b/drivers/usb/otg/mxs-phy.c
@@ -129,12 +129,28 @@  static int mxs_phy_on_disconnect(struct usb_phy *phy, int port)
 	return 0;
 }
 
+static int mxs_phy_set_host(struct usb_otg *otg, struct usb_bus *host)
+{
+	otg->host = host;
+
+	return 0;
+}
+
+static int mxs_phy_set_peripheral(struct usb_otg *otg,
+					struct usb_gadget *gadget)
+{
+	otg->gadget = gadget;
+
+	return 0;
+}
+
 static int mxs_phy_probe(struct platform_device *pdev)
 {
 	struct resource *res;
 	void __iomem *base;
 	struct clk *clk;
 	struct mxs_phy *mxs_phy;
+	struct usb_otg *otg;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!res) {
@@ -171,6 +187,15 @@  static int mxs_phy_probe(struct platform_device *pdev)
 
 	mxs_phy->clk = clk;
 
+	otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), GFP_KERNEL);
+	if (!otg)
+		return -ENOMEM;
+	otg->phy = &mxs_phy->phy;
+	otg->set_host = mxs_phy_set_host;
+	otg->set_peripheral = mxs_phy_set_peripheral;
+
+	mxs_phy->phy.otg = otg;
+
 	platform_set_drvdata(pdev, &mxs_phy->phy);
 
 	return 0;