Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

chipidea: pci: register nop PHY

Since PHY for ChipIdea is optional (not all SoCs having PHY for ChipIdea should
be programmed), we register 'nop' PHY for platforms that do not have
programmable PHY.

Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Andy Shevchenko and committed by
Greg Kroah-Hartman
ba1aff67 78f0357e

+24 -7
+24 -7
drivers/usb/chipidea/ci_hdrc_pci.c
··· 16 16 #include <linux/interrupt.h> 17 17 #include <linux/usb/gadget.h> 18 18 #include <linux/usb/chipidea.h> 19 + #include <linux/usb/usb_phy_generic.h> 19 20 20 21 /* driver name */ 21 22 #define UDC_DRIVER_NAME "ci_hdrc_pci" 23 + 24 + struct ci_hdrc_pci { 25 + struct platform_device *ci; 26 + struct platform_device *phy; 27 + }; 22 28 23 29 /****************************************************************************** 24 30 * PCI block ··· 58 52 const struct pci_device_id *id) 59 53 { 60 54 struct ci_hdrc_platform_data *platdata = (void *)id->driver_data; 61 - struct platform_device *plat_ci; 55 + struct ci_hdrc_pci *ci; 62 56 struct resource res[3]; 63 57 int retval = 0, nres = 2; 64 58 ··· 66 60 dev_err(&pdev->dev, "device doesn't provide driver data\n"); 67 61 return -ENODEV; 68 62 } 63 + 64 + ci = devm_kzalloc(&pdev->dev, sizeof(*ci), GFP_KERNEL); 65 + if (!ci) 66 + return -ENOMEM; 69 67 70 68 retval = pcim_enable_device(pdev); 71 69 if (retval) ··· 83 73 pci_set_master(pdev); 84 74 pci_try_set_mwi(pdev); 85 75 76 + /* register a nop PHY */ 77 + ci->phy = usb_phy_generic_register(); 78 + if (!ci->phy) 79 + return -ENOMEM; 80 + 86 81 memset(res, 0, sizeof(res)); 87 82 res[0].start = pci_resource_start(pdev, 0); 88 83 res[0].end = pci_resource_end(pdev, 0); ··· 95 80 res[1].start = pdev->irq; 96 81 res[1].flags = IORESOURCE_IRQ; 97 82 98 - plat_ci = ci_hdrc_add_device(&pdev->dev, res, nres, platdata); 99 - if (IS_ERR(plat_ci)) { 83 + ci->ci = ci_hdrc_add_device(&pdev->dev, res, nres, platdata); 84 + if (IS_ERR(ci->ci)) { 100 85 dev_err(&pdev->dev, "ci_hdrc_add_device failed!\n"); 101 - return PTR_ERR(plat_ci); 86 + usb_phy_generic_unregister(ci->phy); 87 + return PTR_ERR(ci->ci); 102 88 } 103 89 104 - pci_set_drvdata(pdev, plat_ci); 90 + pci_set_drvdata(pdev, ci); 105 91 106 92 return 0; 107 93 } ··· 117 101 */ 118 102 static void ci_hdrc_pci_remove(struct pci_dev *pdev) 119 103 { 120 - struct platform_device *plat_ci = pci_get_drvdata(pdev); 104 + struct ci_hdrc_pci *ci = pci_get_drvdata(pdev); 121 105 122 - ci_hdrc_remove_device(plat_ci); 106 + ci_hdrc_remove_device(ci->ci); 107 + usb_phy_generic_unregister(ci->phy); 123 108 } 124 109 125 110 /**