Skip to content

Commit

Permalink
mfd: Only unregister platform devices allocated by the mfd core
Browse files Browse the repository at this point in the history
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.

Cc: [email protected]
Signed-off-by: Charles Keepax <[email protected]>
Tested-by: Peter Tyser <[email protected]>
Reviewed-by: Mark Brown <[email protected]>
Signed-off-by: Samuel Ortiz <[email protected]>
  • Loading branch information
charleskeepax authored and Samuel Ortiz committed Nov 20, 2012
1 parent d511b9c commit b9fbb62
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions drivers/mfd/mfd-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit b9fbb62

Please sign in to comment.