lkml.org 
[lkml]   [2021]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 4/5] usb: host: xhci-plat: Create platform device for onboard hubs in probe()
    Date
    Check during probe() if a hub supported by the onboard_usb_hub
    driver is connected to the controller. If such a hub is found
    create the corresponding platform device. This requires the
    device tree to have a node for the hub with its vendor and
    product id (which is not common for USB devices). Further the
    platform device is only created when CONFIG_USB_ONBOARD_HUB=y/m.

    Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
    ---

    Changes in v10:
    - none

    Changes in v9:
    - added dependency on USB_ONBOARD_HUB (or !!USB_ONBOARD_HUB) to
    USB_XHCI_PLATFORM

    Changes in v8:
    - none

    Changes in v7:
    - none

    Changes in v6:
    - none

    Changes in v5:
    - patch added to the series

    drivers/usb/host/Kconfig | 1 +
    drivers/usb/host/xhci-plat.c | 16 ++++++++++++++++
    include/linux/usb/hcd.h | 2 ++
    3 files changed, 19 insertions(+)

    diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
    index b94f2a070c05..da50496787fe 100644
    --- a/drivers/usb/host/Kconfig
    +++ b/drivers/usb/host/Kconfig
    @@ -54,6 +54,7 @@ config USB_XHCI_PCI_RENESAS
    config USB_XHCI_PLATFORM
    tristate "Generic xHCI driver for a platform device"
    select USB_XHCI_RCAR if ARCH_RENESAS
    + depends on USB_ONBOARD_HUB || !USB_ONBOARD_HUB
    help
    Adds an xHCI host driver for a generic platform device, which
    provides a memory space and an irq.
    diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
    index c1edcc9b13ce..9c0fb7e8df1f 100644
    --- a/drivers/usb/host/xhci-plat.c
    +++ b/drivers/usb/host/xhci-plat.c
    @@ -15,6 +15,7 @@
    #include <linux/of.h>
    #include <linux/of_device.h>
    #include <linux/platform_device.h>
    +#include <linux/usb/onboard_hub.h>
    #include <linux/usb/phy.h>
    #include <linux/slab.h>
    #include <linux/acpi.h>
    @@ -195,6 +196,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
    int ret;
    int irq;
    struct xhci_plat_priv *priv = NULL;
    + struct device_node *np;


    if (usb_disabled())
    @@ -374,6 +376,17 @@ static int xhci_plat_probe(struct platform_device *pdev)
    */
    pm_runtime_forbid(&pdev->dev);

    + np = usb_of_get_device_node(hcd->self.root_hub, hcd->self.busnum);
    + if (np && of_is_onboard_usb_hub(np)) {
    + struct platform_device *pdev;
    +
    + pdev = of_platform_device_create(np, NULL, NULL);
    + if (pdev)
    + hcd->onboard_hub_dev = &pdev->dev;
    + else
    + xhci_warn(xhci, "failed to create onboard hub platform device\n");
    + }
    +
    return 0;


    @@ -420,6 +433,9 @@ static int xhci_plat_remove(struct platform_device *dev)
    usb_remove_hcd(hcd);
    usb_put_hcd(shared_hcd);

    + if (hcd->onboard_hub_dev)
    + of_platform_device_destroy(hcd->onboard_hub_dev, NULL);
    +
    clk_disable_unprepare(clk);
    clk_disable_unprepare(reg_clk);
    usb_put_hcd(hcd);
    diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
    index 96281cd50ff6..d02a508e19b0 100644
    --- a/include/linux/usb/hcd.h
    +++ b/include/linux/usb/hcd.h
    @@ -225,6 +225,8 @@ struct usb_hcd {
    * (ohci 32, uhci 1024, ehci 256/512/1024).
    */

    + struct device *onboard_hub_dev;
    +
    /* The HC driver's private data is stored at the end of
    * this structure.
    */
    --
    2.31.1.607.g51e8a6a459-goog
    \
     
     \ /
      Last update: 2021-05-12 00:53    [W:2.842 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site