Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba1aff67 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Greg Kroah-Hartman
Browse files

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: default avatarFelipe Balbi <balbi@ti.com>
Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 78f0357e
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -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,6 +83,11 @@ 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;

	memset(res, 0, sizeof(res));
	res[0].start	= pci_resource_start(pdev, 0);
	res[0].end	= pci_resource_end(pdev, 0);
@@ -80,13 +95,14 @@ static int ci_hdrc_pci_probe(struct pci_dev *pdev,
	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 +117,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);
}

/**