lkml.org 
[lkml]   [2016]   [May]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v7 14/14] usb: host: xhci-plat: Add otg device to platform data
    Date
    Host controllers that are part of an OTG/dual-role instance
    need to somehow pass the OTG controller device information
    to the HCD core.

    We use platform data to pass the OTG controller device.

    Signed-off-by: Roger Quadros <rogerq@ti.com>
    ---
    drivers/usb/host/xhci-plat.c | 35 ++++++++++++++++++++++++++++-------
    include/linux/usb/xhci_pdriver.h | 3 +++
    2 files changed, 31 insertions(+), 7 deletions(-)

    diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
    index 5c15e9b..84ebe18 100644
    --- a/drivers/usb/host/xhci-plat.c
    +++ b/drivers/usb/host/xhci-plat.c
    @@ -230,11 +230,20 @@ static int xhci_plat_probe(struct platform_device *pdev)
    goto put_usb3_hcd;
    }

    - ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
    + if (pdata && pdata->otg_dev)
    + ret = usb_otg_add_hcd(hcd, irq, IRQF_SHARED, pdata->otg_dev);
    + else
    + ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
    +
    if (ret)
    goto disable_usb_phy;

    - ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
    + if (pdata && pdata->otg_dev)
    + ret = usb_otg_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED,
    + pdata->otg_dev);
    + else
    + ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
    +
    if (ret)
    goto dealloc_usb2_hcd;

    @@ -242,7 +251,10 @@ static int xhci_plat_probe(struct platform_device *pdev)


    dealloc_usb2_hcd:
    - usb_remove_hcd(hcd);
    + if (pdata && pdata->otg_dev)
    + usb_otg_remove_hcd(hcd);
    + else
    + usb_remove_hcd(hcd);

    disable_usb_phy:
    usb_phy_shutdown(hcd->usb_phy);
    @@ -260,16 +272,25 @@ put_hcd:
    return ret;
    }

    -static int xhci_plat_remove(struct platform_device *dev)
    +static int xhci_plat_remove(struct platform_device *pdev)
    {
    - struct usb_hcd *hcd = platform_get_drvdata(dev);
    + struct usb_hcd *hcd = platform_get_drvdata(pdev);
    struct xhci_hcd *xhci = hcd_to_xhci(hcd);
    struct clk *clk = xhci->clk;
    + struct usb_xhci_pdata *pdata = dev_get_platdata(&pdev->dev);
    +
    + if (pdata && pdata->otg_dev)
    + usb_otg_remove_hcd(xhci->shared_hcd);
    + else
    + usb_remove_hcd(xhci->shared_hcd);

    - usb_remove_hcd(xhci->shared_hcd);
    usb_phy_shutdown(hcd->usb_phy);

    - usb_remove_hcd(hcd);
    + if (pdata && pdata->otg_dev)
    + usb_otg_remove_hcd(hcd);
    + else
    + usb_remove_hcd(hcd);
    +
    usb_put_hcd(xhci->shared_hcd);

    if (!IS_ERR(clk))
    diff --git a/include/linux/usb/xhci_pdriver.h b/include/linux/usb/xhci_pdriver.h
    index 376654b..5c68b83 100644
    --- a/include/linux/usb/xhci_pdriver.h
    +++ b/include/linux/usb/xhci_pdriver.h
    @@ -18,10 +18,13 @@
    *
    * @usb3_lpm_capable: determines if this xhci platform supports USB3
    * LPM capability
    + * @otg_dev: OTG controller device. Only requied if part of
    + * OTG/dual-role.
    *
    */
    struct usb_xhci_pdata {
    unsigned usb3_lpm_capable:1;
    + struct device *otg_dev;
    };

    #endif /* __USB_CORE_XHCI_PDRIVER_H */
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-05-02 14:41    [W:4.621 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site