Hi, On Fri, May 31, 2013 at 08:38:45PM +0200, Michael Grzeschik wrote: > From: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx> > > This patch makes it possible to configure the PTW, PTS and STS bits > inside the portsc register for host and device mode before the driver > starts and the phy can be addressed as hardware implementation is > designed. > > Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx> > Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > .../devicetree/bindings/usb/ci13xxx-imx.txt | 5 +++ > drivers/usb/chipidea/bits.h | 15 ++++++- > drivers/usb/chipidea/core.c | 49 ++++++++++++++++++++++ > include/linux/usb/chipidea.h | 1 + > 4 files changed, 69 insertions(+), 1 deletion(-) > [snip] > diff --git a/drivers/usb/chipidea/bits.h b/drivers/usb/chipidea/bits.h > index 050de85..93efe4e 100644 > --- a/drivers/usb/chipidea/bits.h > +++ b/drivers/usb/chipidea/bits.h [snip] > /** > * hw_device_reset: resets chip (execute without interruption) > * @ci: the controller > @@ -369,6 +410,9 @@ static int ci_hdrc_probe(struct platform_device *pdev) > return -ENODEV; > } > > + if (!dev->of_node && dev->parent) > + dev->of_node = dev->parent->of_node; > + > res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > base = devm_ioremap_resource(dev, res); > if (IS_ERR(base)) > @@ -408,6 +452,9 @@ static int ci_hdrc_probe(struct platform_device *pdev) > return -ENODEV; > } > > + if (!ci->platdata->phy_mode) > + ci->platdata->phy_mode = of_usb_get_phy_mode(dev->of_node); > + > /* initialize role(s) before the interrupt is requested */ > ret = ci_hdrc_host_init(ci); > if (ret) > @@ -434,6 +481,8 @@ static int ci_hdrc_probe(struct platform_device *pdev) > : CI_ROLE_GADGET; > } > > + hw_phymode_configure(ci); > + I just realised that this call has to be moved to hw_device_reset. As otherwise we will loose the configuration on any OTG case while changing from Host to Device and vice versa. The datasheet says that its value got reset on every controller reset. I will fix it in the next series. > ret = ci_role_start(ci, ci->role); > if (ret) { > dev_err(dev, "can't start %s role\n", ci_role(ci)->name); Michael -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html