public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Mattijs Korpershoek <mkorpershoek@baylibre.com>
To: Harald Seiler <hws@denx.de>, Lukasz Majewski <lukma@denx.de>,
	Marek Vasut <marex@denx.de>
Cc: Dario Binacchi <dario.binacchi@amarulasolutions.com>,
	Michael Trimarchi <michael@amarulasolutions.com>,
	u-boot@lists.denx.de
Subject: Re: [PATCH] usb: gadget: dwc2_udc_otg: implement pullup()
Date: Tue, 10 Jan 2023 14:39:45 +0100	[thread overview]
Message-ID: <87eds28q5a.fsf@baylibre.com> (raw)
In-Reply-To: <45c496c31b29671a1f3d38c95362db0d238c70a6.camel@denx.de>

Hi Harald,

Thank you for your review.

On Tue, Jan 10, 2023 at 14:30, Harald Seiler <hws@denx.de> wrote:

> Hi,
>
> On Tue, 2023-01-10 at 10:11 +0100, Mattijs Korpershoek wrote:
>> Pullup is used by the usb framework in order to do software-controlled
>> usb_gadget_connect() and usb_gadget_disconnect().
>> 
>> Implement pullup() for dwc2 using the SOFT_DISCONNECT bit in the dctl
>> register.
>> 
>> This is especially useful when a gadget disconnection is initiated but
>> no board_usb_cleanup() is called.
>> 
>> Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
>> ---
>> On some boards using the dwc2 controller, like the Khadas VIM3L, whenever
>> usb_gadget_release() is called, the D+ and D- lines are in an unknown state.
>> 
>> Because of that, the host can't detect usb disconnection.
>> 
>> It was attempted to be be fixed with [1] but ended up doing the gadget disconnection
>> too early, creating issues on NXP-based boards which use uuu [2].
>> 
>> By implementing pullup() in the controller driver, we ensure that the disconnection will
>> only be done when the framework calls usb_gadget_disconnect().
>> 
>> [1] https://lore.kernel.org/all/20220728-reset-usb-controller-v2-1-ef7657ce78b1@baylibre.com/
>> [2] https://lore.kernel.org/all/20230107164807.3597020-1-dario.binacchi@amarulasolutions.com/
>> ---
>>  drivers/usb/gadget/dwc2_udc_otg.c | 16 ++++++++++++++++
>>  1 file changed, 16 insertions(+)
>> 
>> diff --git a/drivers/usb/gadget/dwc2_udc_otg.c b/drivers/usb/gadget/dwc2_udc_otg.c
>> index 77988f78ab30..93ed9712d18a 100644
>> --- a/drivers/usb/gadget/dwc2_udc_otg.c
>> +++ b/drivers/usb/gadget/dwc2_udc_otg.c
>> @@ -236,6 +236,21 @@ static int udc_enable(struct dwc2_udc *dev)
>>  	return 0;
>>  }
>>  
>> +static int dwc2_gadget_pullup(struct usb_gadget *g, int is_on)
>> +{
>> +	unsigned int uTemp;
>
> Just some minor points about style...
>
> I think the `u32` type should be used for 32-bit registers instead.
> More explicit and no room for accidentally choosing the wrong size.
>
> Also, U-Boot and Linux don't use hungarian notation for variable names,
> just call it `tmp` or even better `dctl` to be explicit.

I agree with this. I actually picked up some of the code from
reconfig_usbd() where hungarian nototation is used. That's also where
the unsigned int comes from.

Sorry I did not convert it to some more Linux/U-Boot oriented style
before submitting.

>
>> +
>> +	is_on = !!is_on;
>
> This is superfluous, the if condition works either way.

Ack.

The maintainer (Marek) already picked this up in his usb tree:
https://lore.kernel.org/all/1f2c5d74-faae-42f8-5d4d-dfc08cb093aa@denx.de/

Should I send a clean-up/follow-up patch for this?


>
>> +	uTemp = readl(&reg->dctl);
>> +	if (is_on)
>> +		uTemp = uTemp & ~SOFT_DISCONNECT;
>> +	else
>> +		uTemp |= SOFT_DISCONNECT;
>> +	writel(uTemp, &reg->dctl);
>> +
>> +	return 0;
>> +}
>> +
>>  #if !CONFIG_IS_ENABLED(DM_USB_GADGET)
>>  /*
>>    Register entry point for the peripheral controller driver.
>> @@ -805,6 +820,7 @@ static void dwc2_fifo_flush(struct usb_ep *_ep)
>>  }
>>  
>>  static const struct usb_gadget_ops dwc2_udc_ops = {
>> +	.pullup = dwc2_gadget_pullup,
>>  	/* current versions must always be self-powered */
>>  #if CONFIG_IS_ENABLED(DM_USB_GADGET)
>>  	.udc_start		= dwc2_gadget_start,
>> 
>> ---
>> base-commit: 7b84c973b96775576dcff228d865e8570be26c82
>> change-id: 20230110-dwc2-pullup-5b0f5a073d6b
>> 
>> Best regards,
>
> Regards,
>
> Harald

  parent reply	other threads:[~2023-01-10 13:39 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-10  9:11 [PATCH] usb: gadget: dwc2_udc_otg: implement pullup() Mattijs Korpershoek
2023-01-10 13:30 ` Harald Seiler
2023-01-10 13:35   ` Marek Vasut
2023-01-10 13:39   ` Mattijs Korpershoek [this message]
2023-01-10 13:45     ` Marek Vasut
2023-01-10 13:55       ` Mattijs Korpershoek

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=87eds28q5a.fsf@baylibre.com \
    --to=mkorpershoek@baylibre.com \
    --cc=dario.binacchi@amarulasolutions.com \
    --cc=hws@denx.de \
    --cc=lukma@denx.de \
    --cc=marex@denx.de \
    --cc=michael@amarulasolutions.com \
    --cc=u-boot@lists.denx.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox