[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220630123445.v24.4.Ic9dd36078f9d803de82ca01a6700c58b8e4de27e@changeid>
Date: Thu, 30 Jun 2022 12:35:30 -0700
From: Matthias Kaehlcke <mka@...omium.org>
To: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Alan Stern <stern@...land.harvard.edu>,
Rob Herring <robh+dt@...nel.org>,
Frank Rowand <frowand.list@...il.com>,
Mathias Nyman <mathias.nyman@...el.com>,
Felipe Balbi <balbi@...nel.org>
Cc: linux-kernel@...r.kernel.org, devicetree@...r.kernel.org,
Douglas Anderson <dianders@...omium.org>,
Michal Simek <michal.simek@...inx.com>,
linux-usb@...r.kernel.org,
Ravi Chandra Sadineni <ravisadineni@...omium.org>,
Roger Quadros <rogerq@...nel.org>,
Bastien Nocera <hadess@...ess.net>,
Peter Chen <peter.chen@...nel.org>,
Stephen Boyd <swboyd@...omium.org>,
Krzysztof Kozlowski <krzk@...nel.org>,
Matthias Kaehlcke <mka@...omium.org>,
Bhuvanesh Surachari <Bhuvanesh_Surachari@...tor.com>,
Dan Carpenter <dan.carpenter@...cle.com>,
Kai-Heng Feng <kai.heng.feng@...onical.com>,
Mathias Nyman <mathias.nyman@...ux.intel.com>,
Vincent Mailhol <mailhol.vincent@...adoo.fr>
Subject: [PATCH v24 4/4] usb: core: hub: Create platform devices for onboard hubs in hub_probe()
Call onboard_hub_create/destroy_pdevs() from hub_probe/disconnect()
to create/destroy platform devices for onboard USB hubs that may be
connected to the hub. The onboard hubs must have nodes in the
device tree.
onboard_hub_create/destroy_pdevs() are NOPs unless
CONFIG_USB_ONBOARD_HUB=y/m.
Also add a field to struct usb_hub to keep track of the onboard hub
platform devices that are owned by the hub.
Signed-off-by: Matthias Kaehlcke <mka@...omium.org>
Reviewed-by: Douglas Anderson <dianders@...omium.org>
---
Changes in v24:
- none
Changes in v23:
- added Doug's 'Reviewed-by' tag
Changes in v22:
- patch added to the series (moved creation/deletion from HCD)
drivers/usb/core/hub.c | 9 ++++++++-
drivers/usb/core/hub.h | 1 +
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 68e9121c1878..8055130ee602 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -23,6 +23,7 @@
#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
#include <linux/usb/hcd.h>
+#include <linux/usb/onboard_hub.h>
#include <linux/usb/otg.h>
#include <linux/usb/quirks.h>
#include <linux/workqueue.h>
@@ -1752,6 +1753,8 @@ static void hub_disconnect(struct usb_interface *intf)
if (hub->quirk_disable_autosuspend)
usb_autopm_put_interface(intf);
+ onboard_hub_destroy_pdevs(&hub->onboard_hub_devs);
+
kref_put(&hub->kref, hub_release);
}
@@ -1869,6 +1872,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
INIT_DELAYED_WORK(&hub->leds, led_work);
INIT_DELAYED_WORK(&hub->init_work, NULL);
INIT_WORK(&hub->events, hub_event);
+ INIT_LIST_HEAD(&hub->onboard_hub_devs);
spin_lock_init(&hub->irq_urb_lock);
timer_setup(&hub->irq_urb_retry, hub_retry_irq_urb, 0);
usb_get_intf(intf);
@@ -1889,8 +1893,11 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
usb_autopm_get_interface_no_resume(intf);
}
- if (hub_configure(hub, &desc->endpoint[0].desc) >= 0)
+ if (hub_configure(hub, &desc->endpoint[0].desc) >= 0) {
+ onboard_hub_create_pdevs(hdev, &hub->onboard_hub_devs);
+
return 0;
+ }
hub_disconnect(intf);
return -ENODEV;
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
index 22ea1f4f2d66..ccf90052d12a 100644
--- a/drivers/usb/core/hub.h
+++ b/drivers/usb/core/hub.h
@@ -73,6 +73,7 @@ struct usb_hub {
spinlock_t irq_urb_lock;
struct timer_list irq_urb_retry;
struct usb_port **ports;
+ struct list_head onboard_hub_devs;
};
/**
--
2.37.0.rc0.161.g10f37bed90-goog
Powered by blists - more mailing lists