mfd: Only unregister platform devices allocated by the mfd core
PATCH 1/1 mfd: Only unregister platform devices allocated by the mfd core
mfd_remove_devices would iterate over all devices sharing a parent with an mfd device regardless of whether they were allocated by the mfd core or not. This especially caused problems when the device structure was not contained within a platform_device, because to_platform_device is used on each device pointer.
This patch defines a device_type for mfd devices and checks this is present from mfd_remove_devices_fn before processing the device.
Signed-off-by Charles Keepax <[email protected]>
--- drivers/mfd/mfd-core.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-)
drivers/mfd/mfd-core.c +13 -2
@@ -21,6 +21,10 @@#include <linux/irqdomain.h> #include <linux/of.h> +static struct device_type mfd_dev_type = { + .name ="MFD_DEVICE" , +}; +int mfd_cell_enable (struct platform_device *pdev) {const struct mfd_cell *cell =mfd_get_cell (pdev);
@@ -91,6 +95,7 @@ static int mfd_add_device(struct device *parent, int id, goto fail_device; pdev->dev.parent = parent; + pdev->dev.type = &mfd_dev_type;if (parent->of_node && cell->of_compatible) {for_each_child_of_node (parent->of_node, np) {
@@ -204,10 +209,16 @@ EXPORT_SYMBOL(mfd_add_devices);static int mfd_remove_devices_fn (struct device *dev,void *c) { -struct platform_device *pdev =to_platform_device (dev); -const struct mfd_cell *cell =mfd_get_cell (pdev); +struct platform_device *pdev; +const struct mfd_cell *cell;atomic_t **usage_count = c; +if (dev->type != &mfd_dev_type) +return 0 ; + + pdev =to_platform_device (dev); + cell =mfd_get_cell (pdev); +/* find the base address of usage_count pointers (for freeing) */ if (!*usage_count || (cell->usage_count < *usage_count)) *usage_count = cell->usage_count;
Signature · 1 line
1.7.2.5
drivers/mfd/mfd-core.c line 26
Quoted 3 lines · Charles Keepax
drivers/mfd/mfd-core.c +3
-0+static struct device_type mfd_dev_type = { + .name ="MFD_DEVICE" , +};
This seems non-idiomatic, other device types all have lower case names (which are much more common in Unixish systems in general).