aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>2014-04-24 13:27:25 -0400
committerLee Jones <lee.jones@linaro.org>2014-06-03 03:11:18 -0400
commitd137be00ee017bc40e6027cb66d667a2e0b450fd (patch)
tree50ceb31fcd2babe58e41d7103d6fb86ecab67c39
parent1ec93b9b176b3c4e065c326ccf40458fcc01e6c0 (diff)
mfd: core: Don't use devres functions before device is added
The supply aliases for the MFD devices were being added using devres but the device hasn't been added at this point and as such we can't use devres. The MFD already has a function that removes devices this patch uses the non-devres versions of the supply alias functions and adds an unregister in mfd_remove_devices_fn. Reported-by: Carlo Caione <carlo@caione.org> Reported-by: Mark Brown <broonie@kernel.org> Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Reviewed-by: Mark Brown <broonie@kernel.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/mfd/mfd-core.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index 267649244737..892d343193ad 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -102,7 +102,7 @@ static int mfd_add_device(struct device *parent, int id,
102 pdev->dev.dma_mask = parent->dma_mask; 102 pdev->dev.dma_mask = parent->dma_mask;
103 pdev->dev.dma_parms = parent->dma_parms; 103 pdev->dev.dma_parms = parent->dma_parms;
104 104
105 ret = devm_regulator_bulk_register_supply_alias( 105 ret = regulator_bulk_register_supply_alias(
106 &pdev->dev, cell->parent_supplies, 106 &pdev->dev, cell->parent_supplies,
107 parent, cell->parent_supplies, 107 parent, cell->parent_supplies,
108 cell->num_parent_supplies); 108 cell->num_parent_supplies);
@@ -182,9 +182,9 @@ static int mfd_add_device(struct device *parent, int id,
182 return 0; 182 return 0;
183 183
184fail_alias: 184fail_alias:
185 devm_regulator_bulk_unregister_supply_alias(&pdev->dev, 185 regulator_bulk_unregister_supply_alias(&pdev->dev,
186 cell->parent_supplies, 186 cell->parent_supplies,
187 cell->num_parent_supplies); 187 cell->num_parent_supplies);
188fail_res: 188fail_res:
189 kfree(res); 189 kfree(res);
190fail_device: 190fail_device:
@@ -238,6 +238,9 @@ static int mfd_remove_devices_fn(struct device *dev, void *c)
238 pdev = to_platform_device(dev); 238 pdev = to_platform_device(dev);
239 cell = mfd_get_cell(pdev); 239 cell = mfd_get_cell(pdev);
240 240
241 regulator_bulk_unregister_supply_alias(dev, cell->parent_supplies,
242 cell->num_parent_supplies);
243
241 /* find the base address of usage_count pointers (for freeing) */ 244 /* find the base address of usage_count pointers (for freeing) */
242 if (!*usage_count || (cell->usage_count < *usage_count)) 245 if (!*usage_count || (cell->usage_count < *usage_count))
243 *usage_count = cell->usage_count; 246 *usage_count = cell->usage_count;