diff mbox

[U-Boot] sunxi: musb: Properly put the musb controller back in reset on exit

Message ID 1432132840-9106-1-git-send-email-hdegoede@redhat.com
State Superseded
Delegated to: Hans de Goede
Headers show

Commit Message

Hans de Goede May 20, 2015, 2:40 p.m. UTC
Assert reset and disable the clock to properly put the musb controller
back in reset on exit.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/usb/musb-new/sunxi.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Chen-Yu Tsai May 21, 2015, 12:45 p.m. UTC | #1
On Wed, May 20, 2015 at 10:40 PM, Hans de Goede <hdegoede@redhat.com> wrote:
> Assert reset and disable the clock to properly put the musb controller
> back in reset on exit.

Last I checked the exit functions are not called except for error handling
in the probe sequence. Has this been fixed?

ChenYu

> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  drivers/usb/musb-new/sunxi.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
> index e8a3a23..e2c9d5a 100644
> --- a/drivers/usb/musb-new/sunxi.c
> +++ b/drivers/usb/musb-new/sunxi.c
> @@ -284,6 +284,8 @@ static int sunxi_musb_init(struct musb *musb)
>
>  static int sunxi_musb_exit(struct musb *musb)
>  {
> +       struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
> +
>         pr_debug("%s():\n", __func__);
>
>         USBC_DisableDpDmPullUp(musb->mregs);
> @@ -291,6 +293,11 @@ static int sunxi_musb_exit(struct musb *musb)
>         sunxi_usb_phy_power_off(0);
>         sunxi_usb_phy_exit(0);
>
> +#ifdef CONFIG_SUNXI_GEN_SUN6I
> +       clrbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_GATE_OFFSET_USB0);
> +#endif
> +       clrbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_USB0);
> +
>         return 0;
>  }
>
> --
> 2.4.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Hans de Goede May 21, 2015, 1:13 p.m. UTC | #2
Hi,

On 21-05-15 14:45, Chen-Yu Tsai wrote:
> On Wed, May 20, 2015 at 10:40 PM, Hans de Goede <hdegoede@redhat.com> wrote:
>> Assert reset and disable the clock to properly put the musb controller
>> back in reset on exit.
>
> Last I checked the exit functions are not called except for error handling
> in the probe sequence. Has this been fixed?

It seems not, I made this patch because Paul (added to the Cc) was having
some troubles when changing the gadget role. It looks like you're right and
unfortunately this function never gets called though ...

Worse it seems that in gadget mode even all calls to musb_stop() are commented
out of the musb-new code...

Note all this does not mean that this patch is incorrect though, just that it
is not really useful atm.

Regards,

Hans


>
> ChenYu
>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>>   drivers/usb/musb-new/sunxi.c | 7 +++++++
>>   1 file changed, 7 insertions(+)
>>
>> diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
>> index e8a3a23..e2c9d5a 100644
>> --- a/drivers/usb/musb-new/sunxi.c
>> +++ b/drivers/usb/musb-new/sunxi.c
>> @@ -284,6 +284,8 @@ static int sunxi_musb_init(struct musb *musb)
>>
>>   static int sunxi_musb_exit(struct musb *musb)
>>   {
>> +       struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
>> +
>>          pr_debug("%s():\n", __func__);
>>
>>          USBC_DisableDpDmPullUp(musb->mregs);
>> @@ -291,6 +293,11 @@ static int sunxi_musb_exit(struct musb *musb)
>>          sunxi_usb_phy_power_off(0);
>>          sunxi_usb_phy_exit(0);
>>
>> +#ifdef CONFIG_SUNXI_GEN_SUN6I
>> +       clrbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_GATE_OFFSET_USB0);
>> +#endif
>> +       clrbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_USB0);
>> +
>>          return 0;
>>   }
>>
>> --
>> 2.4.1
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot@lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
Paul Kocialkowski May 24, 2015, 9:36 a.m. UTC | #3
Le jeudi 21 mai 2015 à 15:13 +0200, Hans de Goede a écrit :
> Hi,
> 
> On 21-05-15 14:45, Chen-Yu Tsai wrote:
> > On Wed, May 20, 2015 at 10:40 PM, Hans de Goede <hdegoede@redhat.com> wrote:
> >> Assert reset and disable the clock to properly put the musb controller
> >> back in reset on exit.
> >
> > Last I checked the exit functions are not called except for error handling
> > in the probe sequence. Has this been fixed?
> 
> It seems not, I made this patch because Paul (added to the Cc) was having
> some troubles when changing the gadget role. It looks like you're right and
> unfortunately this function never gets called though ...
> 
> Worse it seems that in gadget mode even all calls to musb_stop() are commented
> out of the musb-new code...

It seems to be the problem here. I added an explicit call to musb_stop
in usb_gadget_unregister_driver and it seems to solve the problem: I can
run fastboot multiple times and the host always enumerates it correctly.

I'll submit some patches implementing this correctly, probably next
week-end.

However, it doesn't work as well with the USB mass storage function.
I'll have to take a closer look at it later.

> Note all this does not mean that this patch is incorrect though, just that it
> is not really useful atm.
> 
> Regards,
> 
> Hans
> 
> 
> >
> > ChenYu
> >
> >> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> >> ---
> >>   drivers/usb/musb-new/sunxi.c | 7 +++++++
> >>   1 file changed, 7 insertions(+)
> >>
> >> diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
> >> index e8a3a23..e2c9d5a 100644
> >> --- a/drivers/usb/musb-new/sunxi.c
> >> +++ b/drivers/usb/musb-new/sunxi.c
> >> @@ -284,6 +284,8 @@ static int sunxi_musb_init(struct musb *musb)
> >>
> >>   static int sunxi_musb_exit(struct musb *musb)
> >>   {
> >> +       struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
> >> +
> >>          pr_debug("%s():\n", __func__);
> >>
> >>          USBC_DisableDpDmPullUp(musb->mregs);
> >> @@ -291,6 +293,11 @@ static int sunxi_musb_exit(struct musb *musb)
> >>          sunxi_usb_phy_power_off(0);
> >>          sunxi_usb_phy_exit(0);
> >>
> >> +#ifdef CONFIG_SUNXI_GEN_SUN6I
> >> +       clrbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_GATE_OFFSET_USB0);
> >> +#endif
> >> +       clrbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_USB0);
> >> +
> >>          return 0;
> >>   }
> >>
> >> --
> >> 2.4.1
> >>
> >> _______________________________________________
> >> U-Boot mailing list
> >> U-Boot@lists.denx.de
> >> http://lists.denx.de/mailman/listinfo/u-boot
diff mbox

Patch

diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
index e8a3a23..e2c9d5a 100644
--- a/drivers/usb/musb-new/sunxi.c
+++ b/drivers/usb/musb-new/sunxi.c
@@ -284,6 +284,8 @@  static int sunxi_musb_init(struct musb *musb)
 
 static int sunxi_musb_exit(struct musb *musb)
 {
+	struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
+
 	pr_debug("%s():\n", __func__);
 
 	USBC_DisableDpDmPullUp(musb->mregs);
@@ -291,6 +293,11 @@  static int sunxi_musb_exit(struct musb *musb)
 	sunxi_usb_phy_power_off(0);
 	sunxi_usb_phy_exit(0);
 
+#ifdef CONFIG_SUNXI_GEN_SUN6I
+	clrbits_le32(&ccm->ahb_reset0_cfg, 1 << AHB_GATE_OFFSET_USB0);
+#endif
+	clrbits_le32(&ccm->ahb_gate0, 1 << AHB_GATE_OFFSET_USB0);
+
 	return 0;
 }