Thread (14 messages) 14 messages, 5 authors, 2020-07-24

Re: [PATCH 1/3] usb: dwc2: override PHY input signals with usb role switch support

From: Amelie DELAUNAY <hidden>
Date: 2020-07-23 07:15:41
Also in: linux-arm-kernel, linux-usb, lkml

Hi Felipe,
Hi Martin,

I saw the issue reported ([balbi-usb:testing/next 2/17] 
drivers/usb/dwc2/drd.c:80:38: error: no member named 'test_mode' in 
'struct dwc2_hsotg'). I prepare a V2 fixing it + adressing Martin's 
comments.

Regards,
Amelie

On 7/19/20 9:56 PM, Martin Blumenstingl wrote:
Hello Amelie,

sorry for the late reply

On Wed, Jul 8, 2020 at 6:00 PM Amelie DELAUNAY [off-list ref] 
wrote:
[...]
quoted
Could you please test with:

static int dwc2_drd_role_sw_set(struct device *dev, enum usb_role role)
{
        struct dwc2_hsotg *hsotg = dev_get_drvdata(dev);
        unsigned long flags;
        int already = 0;

        /* Skip session not in line with dr_mode */
        if ((role == USB_ROLE_DEVICE && hsotg->dr_mode == USB_DR_MODE_HOST) ||
            (role == USB_ROLE_HOST && hsotg->dr_mode == USB_DR_MODE_PERIPHERAL))
                return -EINVAL;

        /* Skip session if core is in test mode */
        if (role == USB_ROLE_NONE && hsotg->test_mode) {
                dev_dbg(hsotg->dev, "Core is in test mode\n");
                return -EBUSY;
        }

        spin_lock_irqsave(&hsotg->lock, flags);

        if (role == USB_ROLE_HOST) {
                already = dwc2_ovr_avalid(hsotg, true);
        } else if (role == USB_ROLE_DEVICE) {
                already = dwc2_ovr_bvalid(hsotg, true);
                /* This clear DCTL.SFTDISCON bit */
                dwc2_hsotg_core_connect(hsotg);
        } else {
                if (dwc2_is_device_mode(hsotg)) {
                    if (!dwc2_ovr_bvalid(hsotg, false))
                        /* This set DCTL.SFTDISCON bit */
                        dwc2_hsotg_core_disconnect(hsotg);
                } else {
                        dwc2_ovr_avalid(hsotg, false);
                }
        }

        spin_unlock_irqrestore(&hsotg->lock, flags);

        if (!already &&
            role != USB_ROLE_NONE && hsotg->dr_mode == USB_DR_MODE_OTG)
                /* This will raise a Connector ID Status Change Interrupt */
                dwc2_force_mode(hsotg, role == USB_ROLE_HOST);

        dev_dbg(hsotg->dev, "%s-session valid\n",
                role == USB_ROLE_NONE ? "No" :
                role == USB_ROLE_HOST ? "A" : "B");

        return 0;
}


dwc2_force_mode is called outside the spin_lock_irqsave so the kernel
should not complain. I've tested on my setup and the behavior seems the
same.
this one is looking good - the previous kernel warnings are now gone!
thank you very much


Best regards,
Martin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help