Re: [PATCH v19 3/5] usb: misc: Add onboard_usb_hub driver

From: Doug Anderson
Date: Wed Jan 12 2022 - 20:02:38 EST


Hi,

On Wed, Jan 12, 2022 at 11:11 AM Matthias Kaehlcke <mka@xxxxxxxxxxxx> wrote:
>
> The main issue this driver addresses is that a USB hub needs to be
> powered before it can be discovered. For discrete onboard hubs (an
> example for such a hub is the Realtek RTS5411) this is often solved
> by supplying the hub with an 'always-on' regulator, which is kind
> of a hack. Some onboard hubs may require further initialization
> steps, like changing the state of a GPIO or enabling a clock, which
> requires even more hacks. This driver creates a platform device
> representing the hub which performs the necessary initialization.
> Currently it only supports switching on a single regulator, support
> for multiple regulators or other actions can be added as needed.
> Different initialization sequences can be supported based on the
> compatible string.
>
> Besides performing the initialization the driver can be configured
> to power the hub off during system suspend. This can help to extend
> battery life on battery powered devices which have no requirements
> to keep the hub powered during suspend. The driver can also be
> configured to leave the hub powered when a wakeup capable USB device
> is connected when suspending, and power it off otherwise.
>
> Technically the driver consists of two drivers, the platform driver
> described above and a very thin USB driver that subclasses the
> generic driver. The purpose of this driver is to provide the platform
> driver with the USB devices corresponding to the hub(s) (a hub
> controller may provide multiple 'logical' hubs, e.g. one to support
> USB 2.0 and another for USB 3.x).
>
> Note: the current series only supports hubs connected directly to
> a root hub, support for other configurations could be added if
> needed.
>
> Co-developed-by: Ravi Chandra Sadineni <ravisadineni@xxxxxxxxxxxx>
> Signed-off-by: Ravi Chandra Sadineni <ravisadineni@xxxxxxxxxxxx>
> Signed-off-by: Matthias Kaehlcke <mka@xxxxxxxxxxxx>
> Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
> ---
>
> Changes in v19:
> - added VID:PID pairs and compatible strings for RTS5414 hub
> - updated comments with RTS5411 USB versions to reflect those
> reported/supported by the hub
>
> Changes in v18:
> - introduced hidden Kconfig option to align module vs. builtin
> choice with CONFIG_USB (thanks Doug!)
> - refactored onboard_hub_create_pdevs()
>
> Changes in v17:
> - updated date and kernel version in ABI documentation for
> 'always_powered_in_suspend' attribute
> - removed obsolete .yaml entry from MAINTAINERS file
> - added entry for ABI documentation to MAINTAINERS file
> - renamed struct 'udev_node' to 'usbdev_node'
> - changed return logic in onboard_hub_suspend/resume() to
> get rid of 'rc' variable
> - added helper set_udev_link_name() to set link names for
> onboard hub USB devices
> - use of_parse_phandle() instead of of_property_read_u32() +
> of_find_node_by_phandle() combo
> - defer probing in _find_onboard_hub() if the platform device
> isn't bound yet
> - initialize list head passed as parameter to
> onboard_hub_create_pdevs() instead of relying on the caller
> to do so
> - don't require the 'companion-hub' property to be specified.
> This is needed to support hubs without companion hub
> - use devm_kzalloc() to allocate platform device list entries
> and stop freeing them explicitly
> - remove unnecessary INIT_LIST_HEAD() of platform device list
> entries
> - use '%pOF' to print DT node name
> - delete platform device list entries from the list of devices
> in onboard_hub_destroy_pdevs(). It shouldn't be strictly
> necessary, but better be on the safe side.
>
> Changes in v16:
> - none
>
> Changes in v15:
> - none
>
> Changes in v14:
> - none
>
> Changes in v13:
> - none
>
> Changes in v12:
> - use IS_ENABLED(CONFIG_USB_ONBOARD_HUB_MODULE) in onboard_hub.h to
> also check for the driver built as module
> - include onboard_hub.h again from the driver to make sure there are
> prototype declarations for the public functions
> - remove indentation from label in onboard_hub_create_pdevs()
>
> Changes in v11:
> - added onboard_hub_create/destroy_pdevs() helpers, to support multiple onboard
> hubs connected to the same parent hub
> - don't include ‘onboard_hub.h’ from the onboard hub driver
> - updated commit message
> - added ‘Acked-by' from Alan
>
> Changes in v10:
> - always use of_is_onboard_usb_hub() stub unless ONBOARD_USB_HUB=y/m
>
> Changes in v9:
> - none
>
> Changes in v8:
> - none
>
> Changes in v7:
> - don't declare stub for of_is_onboard_usb_hub() when
> CONFIG_COMPILE_TEST is defined
>
> Changes in v6:
> - use 'companion-hub' to locate the platform device, instead of
> scanning through the nodes of the parent
> - added ABI documentation for 'always_powered_in_suspend'
> - sysfs_emit() instead of sprintf() in always_powered_in_suspend_show()
> - register sysfs attribute through driver.dev_groups
> - evaluate return value of driver_attach() in _probe()
> - use dev_warn() instead of WARN_ON() in _probe()
> - include 'onboard_hub.h'
>
> Changes in v5:
> - the platform device is now instantiated from the same DT node
> as the 'primary' USB hub device
> - use the USB compatible strings for the platform device
> - refactored _find_onboard_hub() to search the parents child
> nodes for a platform device with a matching compatible string
> - added exported function of_is_onboard_usb_hub() to allow other
> drivers (like xhci_plat) to check if one of their child DT nodes
> is a supported hub
> - use late suspend to make sure info about wakeup enabled descendants
> is updated
> - call driver_attach() for the USB driver in onboard_hub_probe() to
> make sure the driver is re-attached after the device_release_driver()
> calls in onboard_hub_remove()
> - renamed sysfs attribute 'power_off_in_suspend' to
> 'always_powered_in_suspend'
> - added sysfs symlinks between platform device and USB devices
> - marked 'onboard_hub_pm_ops' as __maybe_unused
> - removed 'realtek' compatible string which is not needed at this
> point
> - fix log for regulator_disable() failure
>
> Changes in v4:
> - updated Kconfig documentation
> - changed the loop in onboard_hub_remove() to release the hub lock
> before unbinding the USB device and make self deadlock prevention
> less clunky
> - fixed return value in onboard_hub_usbdev_probe()
> - added entry to MAINTAINERS file
>
> Changes in v3:
> - updated the commit message
> - updated description in Kconfig
> - remove include of 'core/usb.h'
> - use 'is_powered_on' flag instead of 'has_wakeup_capable_descendants'
> - added 'going_away' flag to struct onboard_hub
> - don't allow adding new USB devices when the platform device is going away
> - don't bother with deleting the list item in onboard_hub_remove_usbdev()
> when the platform device is going away
> - don't assume in onboard_hub_suspend() that all USB hub devices are
> connected to the same controller
> - removed unnecessary devm_kfree() from onboard_hub_remove_usbdev()
> - fixed error handling in onboard_hub_remove_usbdev()
> - use kstrtobool() instead of strtobool() in power_off_in_suspend_store()
> - unbind USB devices in onboard_hub_remove() to avoid dangling references
> to the platform device
> - moved put_device() for platform device to _find_onboard_hub()
> - changed return value of onboard_hub_remove_usbdev() to void
> - evaluate return value of onboard_hub_add_usbdev()
> - register 'power_off_in_suspend' as managed device attribute
> - use USB_DEVICE macro instead manual initialization
> - add unwinding to onboard_hub_init()
> - updated MODULE_DESCRIPTION
> - use module_init() instead of device_initcall()
>
> Changes in v2:
> - check wakeup enabled state of the USB controller instead of
> using 'wakeup-source' property
> - use sysfs attribute instead of DT property to determine if
> the hub should be powered off at all during system suspend
> - added missing brace in onboard_hub_suspend()
> - updated commit message
> - use pm_ptr for pm_ops as suggested by Alan
>
> Changes in v1:
> - renamed the driver to 'onboard_usb_hub'
> - single file for platform and USB driver
> - USB hub devices register with the platform device
> - the DT includes a phandle of the platform device
> - the platform device now controls when power is turned off
> - the USB driver became a very thin subclass of the generic USB
> driver
> - enabled autosuspend support
>
> .../sysfs-bus-platform-onboard-usb-hub | 8 +
> MAINTAINERS | 7 +
> drivers/usb/misc/Kconfig | 23 +
> drivers/usb/misc/Makefile | 1 +
> drivers/usb/misc/onboard_usb_hub.c | 494 ++++++++++++++++++
> include/linux/usb/onboard_hub.h | 18 +
> 6 files changed, 551 insertions(+)
> create mode 100644 Documentation/ABI/testing/sysfs-bus-platform-onboard-usb-hub
> create mode 100644 drivers/usb/misc/onboard_usb_hub.c
> create mode 100644 include/linux/usb/onboard_hub.h

Sorry for not reviewing v18, but this looks peachy to me now.

Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>