platform/surface: aggregator: Make client device removal more generic

Currently, there are similar functions defined in the Aggregator
Registry and the controller core.

Make client device removal more generic and export it. We can then use
this function later on to remove client devices from device hubs as well
as the controller and avoid re-defining similar things.

Signed-off-by: Maximilian Luz <luzmaximilian@gmail.com>
Link: https://lore.kernel.org/r/20211028002243.1586083-2-luzmaximilian@gmail.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Maximilian Luz 2021-10-28 02:22:41 +02:00 committed by Hans de Goede
parent 0f0ac158d2
commit 38543b72fb
4 changed files with 19 additions and 20 deletions

View file

@ -374,27 +374,19 @@ static int ssam_remove_device(struct device *dev, void *_data)
} }
/** /**
* ssam_controller_remove_clients() - Remove SSAM client devices registered as * ssam_remove_clients() - Remove SSAM client devices registered as direct
* direct children under the given controller. * children under the given parent device.
* @ctrl: The controller to remove all direct clients for. * @dev: The (parent) device to remove all direct clients for.
* *
* Remove all SSAM client devices registered as direct children under the * Remove all SSAM client devices registered as direct children under the given
* given controller. Note that this only accounts for direct children of the * device. Note that this only accounts for direct children of the device.
* controller device. This does not take care of any client devices where the * Refer to ssam_device_add()/ssam_device_remove() for more details.
* parent device has been manually set before calling ssam_device_add. Refer
* to ssam_device_add()/ssam_device_remove() for more details on those cases.
*
* To avoid new devices being added in parallel to this call, the main
* controller lock (not statelock) must be held during this (and if
* necessary, any subsequent deinitialization) call.
*/ */
void ssam_controller_remove_clients(struct ssam_controller *ctrl) void ssam_remove_clients(struct device *dev)
{ {
struct device *dev;
dev = ssam_controller_device(ctrl);
device_for_each_child_reverse(dev, NULL, ssam_remove_device); device_for_each_child_reverse(dev, NULL, ssam_remove_device);
} }
EXPORT_SYMBOL_GPL(ssam_remove_clients);
/** /**
* ssam_bus_register() - Register and set-up the SSAM client device bus. * ssam_bus_register() - Register and set-up the SSAM client device bus.

View file

@ -12,14 +12,11 @@
#ifdef CONFIG_SURFACE_AGGREGATOR_BUS #ifdef CONFIG_SURFACE_AGGREGATOR_BUS
void ssam_controller_remove_clients(struct ssam_controller *ctrl);
int ssam_bus_register(void); int ssam_bus_register(void);
void ssam_bus_unregister(void); void ssam_bus_unregister(void);
#else /* CONFIG_SURFACE_AGGREGATOR_BUS */ #else /* CONFIG_SURFACE_AGGREGATOR_BUS */
static inline void ssam_controller_remove_clients(struct ssam_controller *ctrl) {}
static inline int ssam_bus_register(void) { return 0; } static inline int ssam_bus_register(void) { return 0; }
static inline void ssam_bus_unregister(void) {} static inline void ssam_bus_unregister(void) {}

View file

@ -22,6 +22,7 @@
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/surface_aggregator/controller.h> #include <linux/surface_aggregator/controller.h>
#include <linux/surface_aggregator/device.h>
#include "bus.h" #include "bus.h"
#include "controller.h" #include "controller.h"
@ -735,7 +736,7 @@ static void ssam_serial_hub_remove(struct serdev_device *serdev)
ssam_controller_lock(ctrl); ssam_controller_lock(ctrl);
/* Remove all client devices. */ /* Remove all client devices. */
ssam_controller_remove_clients(ctrl); ssam_remove_clients(&serdev->dev);
/* Act as if suspending to silence events. */ /* Act as if suspending to silence events. */
status = ssam_ctrl_notif_display_off(ctrl); status = ssam_ctrl_notif_display_off(ctrl);

View file

@ -319,6 +319,15 @@ void ssam_device_driver_unregister(struct ssam_device_driver *d);
ssam_device_driver_unregister) ssam_device_driver_unregister)
/* -- Helpers for controller and hub devices. ------------------------------- */
#ifdef CONFIG_SURFACE_AGGREGATOR_BUS
void ssam_remove_clients(struct device *dev);
#else /* CONFIG_SURFACE_AGGREGATOR_BUS */
static inline void ssam_remove_clients(struct device *dev) {}
#endif /* CONFIG_SURFACE_AGGREGATOR_BUS */
/* -- Helpers for client-device requests. ----------------------------------- */ /* -- Helpers for client-device requests. ----------------------------------- */
/** /**