On Fri, Nov 14, 2014 at 04:33:22PM +0200, Andy Shevchenko wrote: > Since PHY for Chipidea is optional (not all SoCs having PHY for Chipidea should > be programmed), we register 'nop' PHY for platforms that does not have > programmable PHY. > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > --- > drivers/usb/chipidea/ci_hdrc_pci.c | 32 +++++++++++++++++++++++++------- > 1 file changed, 25 insertions(+), 7 deletions(-) > > diff --git a/drivers/usb/chipidea/ci_hdrc_pci.c b/drivers/usb/chipidea/ci_hdrc_pci.c > index 241ae34..7e0b701 100644 > --- a/drivers/usb/chipidea/ci_hdrc_pci.c > +++ b/drivers/usb/chipidea/ci_hdrc_pci.c > @@ -16,10 +16,16 @@ > #include <linux/interrupt.h> > #include <linux/usb/gadget.h> > #include <linux/usb/chipidea.h> > +#include <linux/usb/usb_phy_generic.h> > > /* driver name */ > #define UDC_DRIVER_NAME "ci_hdrc_pci" > > +struct ci_hdrc_pci { > + struct platform_device *ci; > + struct platform_device *phy; > +}; > + > /****************************************************************************** > * PCI block > *****************************************************************************/ > @@ -52,7 +58,7 @@ static int ci_hdrc_pci_probe(struct pci_dev *pdev, > const struct pci_device_id *id) > { > struct ci_hdrc_platform_data *platdata = (void *)id->driver_data; > - struct platform_device *plat_ci; > + struct ci_hdrc_pci *ci; > struct resource res[3]; > int retval = 0, nres = 2; > > @@ -61,6 +67,10 @@ static int ci_hdrc_pci_probe(struct pci_dev *pdev, > return -ENODEV; > } > > + ci = devm_kzalloc(&pdev->dev, sizeof(*ci), GFP_KERNEL); > + if (!ci) > + return -ENOMEM; > + > retval = pcim_enable_device(pdev); > if (retval) > return retval; > @@ -73,20 +83,27 @@ static int ci_hdrc_pci_probe(struct pci_dev *pdev, > pci_set_master(pdev); > pci_try_set_mwi(pdev); > > + /* register a nop PHY */ > + ci->phy = usb_phy_generic_register(); > + if (!ci->phy) > + return -ENOMEM; Rebase my next tree where antoine's generic phy support for chipidea driver in it, and for usb phy, the "phy" changes to "usb_phy". > + > memset(res, 0, sizeof(res)); > + Why this blank line is needed? > res[0].start = pci_resource_start(pdev, 0); > res[0].end = pci_resource_end(pdev, 0); > res[0].flags = IORESOURCE_MEM; > res[1].start = pdev->irq; > res[1].flags = IORESOURCE_IRQ; > > - plat_ci = ci_hdrc_add_device(&pdev->dev, res, nres, platdata); > - if (IS_ERR(plat_ci)) { > + ci->ci = ci_hdrc_add_device(&pdev->dev, res, nres, platdata); > + if (IS_ERR(ci->ci)) { > dev_err(&pdev->dev, "ci_hdrc_add_device failed!\n"); > - return PTR_ERR(plat_ci); > + usb_phy_generic_unregister(ci->phy); > + return PTR_ERR(ci->ci); > } > > - pci_set_drvdata(pdev, plat_ci); > + pci_set_drvdata(pdev, ci); > > return 0; > } > @@ -101,9 +118,10 @@ static int ci_hdrc_pci_probe(struct pci_dev *pdev, > */ > static void ci_hdrc_pci_remove(struct pci_dev *pdev) > { > - struct platform_device *plat_ci = pci_get_drvdata(pdev); > + struct ci_hdrc_pci *ci = pci_get_drvdata(pdev); > > - ci_hdrc_remove_device(plat_ci); > + ci_hdrc_remove_device(ci->ci); > + usb_phy_generic_unregister(ci->phy); > } > > /** > -- > 2.1.3 > -- Best Regards, Peter Chen -- 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