On 20-01-26 21:35:48, Peter Geis wrote: > The ci_hdrc_tegra driver does not currently support dual role mode, but > it does not explicitly prevent its use. > Certain devices support dual role mode, but not automatic role switch. > This can cause the device to lock up during initialization of the > driver. If the driver only supports peripheral mode, you could set dr_mode as peripheral-only at glue layer, it would not be override by core.c. See ci_get_platdata. But one thing I could not understand, if the driver doesn't support dual-role, how could you do manual role switch? > > Detect this state by checking for the extcon phandle when dual role mode > is set to otg. > If it doesn't exist request the driver to only enable manual role > switching. > > Fixes: dfebb5f ("usb: chipidea: Add support for Tegra20/30/114/124") > Signed-off-by: Peter Geis <pgwipeout@xxxxxxxxx> > --- > drivers/usb/chipidea/ci_hdrc_tegra.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/usb/chipidea/ci_hdrc_tegra.c b/drivers/usb/chipidea/ci_hdrc_tegra.c > index 7455df0ede49..2f6f6ce3e8f5 100644 > --- a/drivers/usb/chipidea/ci_hdrc_tegra.c > +++ b/drivers/usb/chipidea/ci_hdrc_tegra.c > @@ -89,6 +89,13 @@ static int tegra_udc_probe(struct platform_device *pdev) > udc->data.usb_phy = udc->phy; > udc->data.capoffset = DEF_CAPOFFSET; > > + /* check the dual mode and warn about bad configurations */ > + if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_OTG && > + !of_property_read_bool(pdev->dev.of_node, "extcon")) { > + dev_warn(&pdev->dev, "no extcon registered, otg unavailable"); > + udc->data.flags |= CI_HDRC_DUAL_ROLE_NOT_OTG; > + } > + The CI_HDRC_DUAL_ROLE_NOT_OTG flag may not be suitable here, please see comments for it. > udc->dev = ci_hdrc_add_device(&pdev->dev, pdev->resource, > pdev->num_resources, &udc->data); > if (IS_ERR(udc->dev)) { > -- > 2.17.1 > -- Thanks, Peter Chen