Message ID | 7AAC1BF4-8B60-448D-A3C1-B7E80330BE42@live.com |
---|---|
State | Superseded |
Headers | show |
Series | USB: Simplify running code on shutdown for USB devices | expand |
On Sat, Jul 06, 2024 at 12:03:23PM +0000, Aditya Garg wrote: > From: Kerem Karabay <kekrby@gmail.com> > > Currently there is no standardized method for USB drivers to handle > shutdown events. This patch simplifies running code on shutdown for USB > devices by adding a shutdown callback to usb_driver. > > Signed-off-by: Kerem Karabay <kekrby@gmail.com> Where did Kerem do this work? Any reason why they aren't submitting these themselves? Not that this is a problem, just trying to figure out what went wrong with the development process here. thanks, greg k-h
> On 6 Jul 2024, at 6:15 PM, Aditya Garg <gargaditya08@live.com> wrote: > > > >> On 6 Jul 2024, at 6:06 PM, gregkh@linuxfoundation.org wrote: >> >> On Sat, Jul 06, 2024 at 12:03:23PM +0000, Aditya Garg wrote: >>> From: Kerem Karabay <kekrby@gmail.com> >>> >>> Currently there is no standardized method for USB drivers to handle >>> shutdown events. This patch simplifies running code on shutdown for USB >>> devices by adding a shutdown callback to usb_driver. >>> >>> Signed-off-by: Kerem Karabay <kekrby@gmail.com> >> >> Where did Kerem do this work? Any reason why they aren't submitting >> these themselves? Not that this is a problem, just trying to figure out >> what went wrong with the development process here. > > I work at https://t2linux.org/, a project aimed to bring Linux to T2 Macs. > > Kerem helped in developing the driver for the Touch Bar on these Macs. > During development, he did some improvements to the HID core, USB core > and DRM, which are not specific to the Macs, but are used in the driver. > > As to why he didn't submit himself, unfortunately Kerem seems to have left > the project and is not contactable at all. Fortunately, the patches he contributed > were signed off by him. Since we have his Signed-off-by and the code is GPL2, > IMO, I can legally submit this. > > Link to our patchset: https://github.com/t2linux/linux-t2-patches You can also find his linux tree with the driver over here: https://github.com/kekrby/linux-t2/tree/touchbar >> >> thanks, >> >> greg k-h
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index e02ba15f6..b35734d03 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -517,6 +517,19 @@ static int usb_unbind_interface(struct device *dev) return 0; } +static void usb_shutdown_interface(struct device *dev) +{ + struct usb_interface *intf = to_usb_interface(dev); + struct usb_driver *driver; + + if (!dev->driver) + return; + + driver = to_usb_driver(dev->driver); + if (driver->shutdown) + driver->shutdown(intf); +} + /** * usb_driver_claim_interface - bind a driver to an interface * @driver: the driver to be bound @@ -1059,6 +1072,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner, new_driver->driver.bus = &usb_bus_type; new_driver->driver.probe = usb_probe_interface; new_driver->driver.remove = usb_unbind_interface; + new_driver->driver.shutdown = usb_shutdown_interface; new_driver->driver.owner = owner; new_driver->driver.mod_name = mod_name; new_driver->driver.dev_groups = new_driver->dev_groups; diff --git a/include/linux/usb.h b/include/linux/usb.h index 1913a1383..832997a9d 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -1171,6 +1171,7 @@ extern ssize_t usb_show_dynids(struct usb_dynids *dynids, char *buf); * post_reset method is called. * @post_reset: Called by usb_reset_device() after the device * has been reset + * @shutdown: Called at shut-down time to quiesce the device. * @id_table: USB drivers use ID table to support hotplugging. * Export this with MODULE_DEVICE_TABLE(usb,...). This must be set * or your driver's probe function will never get called. @@ -1222,6 +1223,8 @@ struct usb_driver { int (*pre_reset)(struct usb_interface *intf); int (*post_reset)(struct usb_interface *intf); + void (*shutdown)(struct usb_interface *intf); + const struct usb_device_id *id_table; const struct attribute_group **dev_groups;