You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
usb: otg: support for multiple transceivers by a single controller
Add a linked list for keeping multiple PHY instances with different types so that we can have separate USB2 and USB3 PHYs on one single board. _get_phy_ has been changed so that the controller gets the transceiver by type. _remove_phy_ has been added to let the phy be removed from the phy list. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
committed by
Felipe Balbi
parent
721002ec1d
commit
662dca54ca
@@ -2688,7 +2688,7 @@ static int __devinit ab8500_charger_probe(struct platform_device *pdev)
|
||||
goto free_ac;
|
||||
}
|
||||
|
||||
di->usb_phy = usb_get_phy();
|
||||
di->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!di->usb_phy) {
|
||||
dev_err(di->dev, "failed to get usb transceiver\n");
|
||||
ret = -EINVAL;
|
||||
|
||||
@@ -415,7 +415,7 @@ static int __devinit isp1704_charger_probe(struct platform_device *pdev)
|
||||
if (!isp)
|
||||
return -ENOMEM;
|
||||
|
||||
isp->phy = usb_get_phy();
|
||||
isp->phy = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!isp->phy)
|
||||
goto fail0;
|
||||
|
||||
|
||||
@@ -321,7 +321,7 @@ static int pda_power_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USB_OTG_UTILS
|
||||
transceiver = usb_get_phy();
|
||||
transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (transceiver && !pdata->is_usb_online) {
|
||||
pdata->is_usb_online = otg_is_usb_online;
|
||||
}
|
||||
|
||||
@@ -479,7 +479,7 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
|
||||
|
||||
INIT_WORK(&bci->work, twl4030_bci_usb_work);
|
||||
|
||||
bci->transceiver = usb_get_phy();
|
||||
bci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (bci->transceiver != NULL) {
|
||||
bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
|
||||
usb_register_notifier(bci->transceiver, &bci->usb_nb);
|
||||
|
||||
@@ -1687,7 +1687,7 @@ static int udc_start(struct ci13xxx *udc)
|
||||
|
||||
udc->gadget.ep0 = &udc->ep0in->ep;
|
||||
|
||||
udc->transceiver = usb_get_phy();
|
||||
udc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
|
||||
if (udc->udc_driver->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
|
||||
if (udc->transceiver == NULL) {
|
||||
|
||||
@@ -2455,7 +2455,7 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
|
||||
|
||||
#ifdef CONFIG_USB_OTG
|
||||
if (pdata->operating_mode == FSL_USB2_DR_OTG) {
|
||||
udc_controller->transceiver = usb_get_phy();
|
||||
udc_controller->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!udc_controller->transceiver) {
|
||||
ERR("Can't find OTG driver!\n");
|
||||
ret = -ENODEV;
|
||||
|
||||
@@ -2180,7 +2180,7 @@ static int __devinit mv_udc_probe(struct platform_device *dev)
|
||||
|
||||
#ifdef CONFIG_USB_OTG_UTILS
|
||||
if (pdata->mode == MV_USB_MODE_OTG)
|
||||
udc->transceiver = usb_get_phy();
|
||||
udc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
#endif
|
||||
|
||||
udc->clknum = pdata->clknum;
|
||||
|
||||
@@ -2865,7 +2865,7 @@ static int __init omap_udc_probe(struct platform_device *pdev)
|
||||
* use it. Except for OTG, we don't _need_ to talk to one;
|
||||
* but not having one probably means no VBUS detection.
|
||||
*/
|
||||
xceiv = usb_get_phy();
|
||||
xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (xceiv)
|
||||
type = xceiv->label;
|
||||
else if (config->otg) {
|
||||
|
||||
@@ -2159,7 +2159,7 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev)
|
||||
dev->dev = &pdev->dev;
|
||||
dev->mach = pdev->dev.platform_data;
|
||||
|
||||
dev->transceiver = usb_get_phy();
|
||||
dev->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
|
||||
if (gpio_is_valid(dev->mach->gpio_pullup)) {
|
||||
if ((retval = gpio_request(dev->mach->gpio_pullup,
|
||||
|
||||
@@ -2464,7 +2464,7 @@ static int __init pxa_udc_probe(struct platform_device *pdev)
|
||||
|
||||
udc->dev = &pdev->dev;
|
||||
udc->mach = pdev->dev.platform_data;
|
||||
udc->transceiver = usb_get_phy();
|
||||
udc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
|
||||
gpio = udc->mach->gpio_pullup;
|
||||
if (gpio_is_valid(gpio)) {
|
||||
|
||||
@@ -1282,7 +1282,7 @@ static int __devinit s3c_hsudc_probe(struct platform_device *pdev)
|
||||
hsudc->dev = dev;
|
||||
hsudc->pd = pdev->dev.platform_data;
|
||||
|
||||
hsudc->transceiver = usb_get_phy();
|
||||
hsudc->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hsudc->supplies); i++)
|
||||
hsudc->supplies[i].supply = s3c_hsudc_supply_names[i];
|
||||
|
||||
@@ -142,7 +142,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver,
|
||||
if (pdata->operating_mode == FSL_USB2_DR_OTG) {
|
||||
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
|
||||
|
||||
ehci->transceiver = usb_get_phy();
|
||||
ehci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, transceiver=0x%p\n",
|
||||
hcd, ehci, ehci->transceiver);
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ static int ehci_msm_probe(struct platform_device *pdev)
|
||||
* powering up VBUS, mapping of registers address space and power
|
||||
* management.
|
||||
*/
|
||||
phy = usb_get_phy();
|
||||
phy = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!phy) {
|
||||
dev_err(&pdev->dev, "unable to find transceiver\n");
|
||||
ret = -ENODEV;
|
||||
|
||||
@@ -253,7 +253,7 @@ static int mv_ehci_probe(struct platform_device *pdev)
|
||||
ehci_mv->mode = pdata->mode;
|
||||
if (ehci_mv->mode == MV_USB_MODE_OTG) {
|
||||
#ifdef CONFIG_USB_OTG_UTILS
|
||||
ehci_mv->otg = usb_get_phy();
|
||||
ehci_mv->otg = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!ehci_mv->otg) {
|
||||
dev_err(&pdev->dev,
|
||||
"unable to find transceiver\n");
|
||||
|
||||
@@ -749,7 +749,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
|
||||
|
||||
#ifdef CONFIG_USB_OTG_UTILS
|
||||
if (pdata->operating_mode == TEGRA_USB_OTG) {
|
||||
tegra->transceiver = usb_get_phy();
|
||||
tegra->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (tegra->transceiver)
|
||||
otg_set_host(tegra->transceiver->otg, &hcd->self);
|
||||
}
|
||||
|
||||
@@ -211,7 +211,7 @@ static int ohci_omap_init(struct usb_hcd *hcd)
|
||||
|
||||
#ifdef CONFIG_USB_OTG
|
||||
if (need_transceiver) {
|
||||
ohci->transceiver = usb_get_phy();
|
||||
ohci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (ohci->transceiver) {
|
||||
int status = otg_set_host(ohci->transceiver->otg,
|
||||
&ohci_to_hcd(ohci)->self);
|
||||
|
||||
@@ -364,7 +364,7 @@ static int am35x_musb_init(struct musb *musb)
|
||||
return -ENODEV;
|
||||
|
||||
usb_nop_xceiv_register();
|
||||
musb->xceiv = usb_get_phy();
|
||||
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!musb->xceiv)
|
||||
return -ENODEV;
|
||||
|
||||
|
||||
@@ -415,7 +415,7 @@ static int bfin_musb_init(struct musb *musb)
|
||||
gpio_direction_output(musb->config->gpio_vrsel, 0);
|
||||
|
||||
usb_nop_xceiv_register();
|
||||
musb->xceiv = usb_get_phy();
|
||||
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!musb->xceiv) {
|
||||
gpio_free(musb->config->gpio_vrsel);
|
||||
return -ENODEV;
|
||||
|
||||
@@ -425,7 +425,7 @@ static int da8xx_musb_init(struct musb *musb)
|
||||
goto fail;
|
||||
|
||||
usb_nop_xceiv_register();
|
||||
musb->xceiv = usb_get_phy();
|
||||
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!musb->xceiv)
|
||||
goto fail;
|
||||
|
||||
|
||||
@@ -384,7 +384,7 @@ static int davinci_musb_init(struct musb *musb)
|
||||
u32 revision;
|
||||
|
||||
usb_nop_xceiv_register();
|
||||
musb->xceiv = usb_get_phy();
|
||||
musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
|
||||
if (!musb->xceiv)
|
||||
goto unregister;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user