Re: [U-Boot] [PATCH v3] usb: dwc2: Add reset ctrl to driver

2018-08-28 Thread Marek Vasut
On 08/29/2018 02:52 AM, Ley Foon Tan wrote:
> On Tue, Aug 28, 2018 at 5:53 PM Marek Vasut  wrote:
>>
>> On 08/28/2018 06:08 PM, Ley Foon Tan wrote:
>>> Add code to reset all reset signals as in usb DT node. A reset property
>>> is an optional feature, so only print out a warning and do not fail if a
>>> reset property is not present.
>>>
>>> If a reset property is discovered, then use it to deassert, thus
>>> bringing the IP out of reset.
>>>
>>> Signed-off-by: Ley Foon Tan 
>>>
>>> ---
>>> v3:
>>> - Add error handling when return non-zero from reset_get_bulk().
>>>
>>> v2:
>>> - Add reset_release_bulk() in _remove function.
>>> ---
>>>  drivers/usb/host/dwc2.c |   37 +
>>>  1 files changed, 37 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
>>> index cbe065b..b6f008a 100644
>>> --- a/drivers/usb/host/dwc2.c
>>> +++ b/drivers/usb/host/dwc2.c
>>> @@ -15,6 +15,7 @@
>>>  #include 
>>>  #include 
>>>  #include 
>>> +#include 
>>>
>>>  #include "dwc2.h"
>>>
>>> @@ -49,6 +50,8 @@ struct dwc2_priv {
>>>*/
>>>   bool hnp_srp_disable;
>>>   bool oc_disable;
>>> +
>>> + struct reset_ctl_bulk   resets;
>>>  };
>>>
>>>  #ifndef CONFIG_DM_USB
>>> @@ -1124,11 +1127,43 @@ int _submit_int_msg(struct dwc2_priv *priv, struct 
>>> usb_device *dev,
>>>   }
>>>  }
>>>
>>> +static int dwc2_reset(struct udevice *dev)
>>> +{
>>> + int ret;
>>> + struct dwc2_priv *priv = dev_get_priv(dev);
>>> +
>>> + ret = reset_get_bulk(dev, >resets);
>>> + if (ret) {
>>> + dev_warn(dev, "Can't get reset: %d\n", ret);
>>> + /* Return 0 if error due to !CONFIG_DM_RESET and reset
>>> +  * DT property is not present.
>>> +  */
>>> + if (ret == -ENOENT || ret == -ENOTSUPP)
>>> + return 0;
>>> + else
>>> + return ret;
>>> + }
>>> +
>>> + ret = reset_deassert_bulk(>resets);
>>> + if (ret) {
>>> + reset_release_bulk(>resets);
>>> + dev_err(dev, "Failed to reset: %d\n", ret);
>>> + return ret;
>>> + }
>>> +
>>> + return 0;
>>> +}
>>> +
>>>  static int dwc2_init_common(struct udevice *dev, struct dwc2_priv *priv)
>>>  {
>>>   struct dwc2_core_regs *regs = priv->regs;
>>>   uint32_t snpsid;
>>>   int i, j;
>>> + int ret;
>>> +
>>> + ret = dwc2_reset(dev);
>>> + if (ret)
>>> + return ret;
>>>
>>>   snpsid = readl(>gsnpsid);
>>>   dev_info(dev, "Core Release: %x.%03x\n",
>>> @@ -1303,6 +1338,8 @@ static int dwc2_usb_remove(struct udevice *dev)
>>>
>>>   dwc2_uninit_common(priv->regs);
>>>
>>
>> Don't you need to assert the reset here ?
> reset_release_bulk() function will assert the reset and free reset struct.

Ah, OK, applied, thanks.

-- 
Best regards,
Marek Vasut
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v3] usb: dwc2: Add reset ctrl to driver

2018-08-28 Thread Ley Foon Tan
On Tue, Aug 28, 2018 at 5:53 PM Marek Vasut  wrote:
>
> On 08/28/2018 06:08 PM, Ley Foon Tan wrote:
> > Add code to reset all reset signals as in usb DT node. A reset property
> > is an optional feature, so only print out a warning and do not fail if a
> > reset property is not present.
> >
> > If a reset property is discovered, then use it to deassert, thus
> > bringing the IP out of reset.
> >
> > Signed-off-by: Ley Foon Tan 
> >
> > ---
> > v3:
> > - Add error handling when return non-zero from reset_get_bulk().
> >
> > v2:
> > - Add reset_release_bulk() in _remove function.
> > ---
> >  drivers/usb/host/dwc2.c |   37 +
> >  1 files changed, 37 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
> > index cbe065b..b6f008a 100644
> > --- a/drivers/usb/host/dwc2.c
> > +++ b/drivers/usb/host/dwc2.c
> > @@ -15,6 +15,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >
> >  #include "dwc2.h"
> >
> > @@ -49,6 +50,8 @@ struct dwc2_priv {
> >*/
> >   bool hnp_srp_disable;
> >   bool oc_disable;
> > +
> > + struct reset_ctl_bulk   resets;
> >  };
> >
> >  #ifndef CONFIG_DM_USB
> > @@ -1124,11 +1127,43 @@ int _submit_int_msg(struct dwc2_priv *priv, struct 
> > usb_device *dev,
> >   }
> >  }
> >
> > +static int dwc2_reset(struct udevice *dev)
> > +{
> > + int ret;
> > + struct dwc2_priv *priv = dev_get_priv(dev);
> > +
> > + ret = reset_get_bulk(dev, >resets);
> > + if (ret) {
> > + dev_warn(dev, "Can't get reset: %d\n", ret);
> > + /* Return 0 if error due to !CONFIG_DM_RESET and reset
> > +  * DT property is not present.
> > +  */
> > + if (ret == -ENOENT || ret == -ENOTSUPP)
> > + return 0;
> > + else
> > + return ret;
> > + }
> > +
> > + ret = reset_deassert_bulk(>resets);
> > + if (ret) {
> > + reset_release_bulk(>resets);
> > + dev_err(dev, "Failed to reset: %d\n", ret);
> > + return ret;
> > + }
> > +
> > + return 0;
> > +}
> > +
> >  static int dwc2_init_common(struct udevice *dev, struct dwc2_priv *priv)
> >  {
> >   struct dwc2_core_regs *regs = priv->regs;
> >   uint32_t snpsid;
> >   int i, j;
> > + int ret;
> > +
> > + ret = dwc2_reset(dev);
> > + if (ret)
> > + return ret;
> >
> >   snpsid = readl(>gsnpsid);
> >   dev_info(dev, "Core Release: %x.%03x\n",
> > @@ -1303,6 +1338,8 @@ static int dwc2_usb_remove(struct udevice *dev)
> >
> >   dwc2_uninit_common(priv->regs);
> >
>
> Don't you need to assert the reset here ?
reset_release_bulk() function will assert the reset and free reset struct.
>
> > + reset_release_bulk(>resets);
> > +
> >   return 0;
> >  }
> >
> >
>
Regards
Ley Foon
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v3] usb: dwc2: Add reset ctrl to driver

2018-08-28 Thread Marek Vasut
On 08/28/2018 06:08 PM, Ley Foon Tan wrote:
> Add code to reset all reset signals as in usb DT node. A reset property
> is an optional feature, so only print out a warning and do not fail if a
> reset property is not present.
> 
> If a reset property is discovered, then use it to deassert, thus
> bringing the IP out of reset.
> 
> Signed-off-by: Ley Foon Tan 
> 
> ---
> v3:
> - Add error handling when return non-zero from reset_get_bulk().
> 
> v2:
> - Add reset_release_bulk() in _remove function.
> ---
>  drivers/usb/host/dwc2.c |   37 +
>  1 files changed, 37 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
> index cbe065b..b6f008a 100644
> --- a/drivers/usb/host/dwc2.c
> +++ b/drivers/usb/host/dwc2.c
> @@ -15,6 +15,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  #include "dwc2.h"
>  
> @@ -49,6 +50,8 @@ struct dwc2_priv {
>*/
>   bool hnp_srp_disable;
>   bool oc_disable;
> +
> + struct reset_ctl_bulk   resets;
>  };
>  
>  #ifndef CONFIG_DM_USB
> @@ -1124,11 +1127,43 @@ int _submit_int_msg(struct dwc2_priv *priv, struct 
> usb_device *dev,
>   }
>  }
>  
> +static int dwc2_reset(struct udevice *dev)
> +{
> + int ret;
> + struct dwc2_priv *priv = dev_get_priv(dev);
> +
> + ret = reset_get_bulk(dev, >resets);
> + if (ret) {
> + dev_warn(dev, "Can't get reset: %d\n", ret);
> + /* Return 0 if error due to !CONFIG_DM_RESET and reset
> +  * DT property is not present.
> +  */
> + if (ret == -ENOENT || ret == -ENOTSUPP)
> + return 0;
> + else
> + return ret;
> + }
> +
> + ret = reset_deassert_bulk(>resets);
> + if (ret) {
> + reset_release_bulk(>resets);
> + dev_err(dev, "Failed to reset: %d\n", ret);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
>  static int dwc2_init_common(struct udevice *dev, struct dwc2_priv *priv)
>  {
>   struct dwc2_core_regs *regs = priv->regs;
>   uint32_t snpsid;
>   int i, j;
> + int ret;
> +
> + ret = dwc2_reset(dev);
> + if (ret)
> + return ret;
>  
>   snpsid = readl(>gsnpsid);
>   dev_info(dev, "Core Release: %x.%03x\n",
> @@ -1303,6 +1338,8 @@ static int dwc2_usb_remove(struct udevice *dev)
>  
>   dwc2_uninit_common(priv->regs);
>  

Don't you need to assert the reset here ?

> + reset_release_bulk(>resets);
> +
>   return 0;
>  }
>  
> 


-- 
Best regards,
Marek Vasut
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [PATCH v3] usb: dwc2: Add reset ctrl to driver

2018-08-28 Thread Ley Foon Tan
Add code to reset all reset signals as in usb DT node. A reset property
is an optional feature, so only print out a warning and do not fail if a
reset property is not present.

If a reset property is discovered, then use it to deassert, thus
bringing the IP out of reset.

Signed-off-by: Ley Foon Tan 

---
v3:
- Add error handling when return non-zero from reset_get_bulk().

v2:
- Add reset_release_bulk() in _remove function.
---
 drivers/usb/host/dwc2.c |   37 +
 1 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/host/dwc2.c b/drivers/usb/host/dwc2.c
index cbe065b..b6f008a 100644
--- a/drivers/usb/host/dwc2.c
+++ b/drivers/usb/host/dwc2.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "dwc2.h"
 
@@ -49,6 +50,8 @@ struct dwc2_priv {
 */
bool hnp_srp_disable;
bool oc_disable;
+
+   struct reset_ctl_bulk   resets;
 };
 
 #ifndef CONFIG_DM_USB
@@ -1124,11 +1127,43 @@ int _submit_int_msg(struct dwc2_priv *priv, struct 
usb_device *dev,
}
 }
 
+static int dwc2_reset(struct udevice *dev)
+{
+   int ret;
+   struct dwc2_priv *priv = dev_get_priv(dev);
+
+   ret = reset_get_bulk(dev, >resets);
+   if (ret) {
+   dev_warn(dev, "Can't get reset: %d\n", ret);
+   /* Return 0 if error due to !CONFIG_DM_RESET and reset
+* DT property is not present.
+*/
+   if (ret == -ENOENT || ret == -ENOTSUPP)
+   return 0;
+   else
+   return ret;
+   }
+
+   ret = reset_deassert_bulk(>resets);
+   if (ret) {
+   reset_release_bulk(>resets);
+   dev_err(dev, "Failed to reset: %d\n", ret);
+   return ret;
+   }
+
+   return 0;
+}
+
 static int dwc2_init_common(struct udevice *dev, struct dwc2_priv *priv)
 {
struct dwc2_core_regs *regs = priv->regs;
uint32_t snpsid;
int i, j;
+   int ret;
+
+   ret = dwc2_reset(dev);
+   if (ret)
+   return ret;
 
snpsid = readl(>gsnpsid);
dev_info(dev, "Core Release: %x.%03x\n",
@@ -1303,6 +1338,8 @@ static int dwc2_usb_remove(struct udevice *dev)
 
dwc2_uninit_common(priv->regs);
 
+   reset_release_bulk(>resets);
+
return 0;
 }
 
-- 
1.7.1

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot