| From e0c21530fa91f119bfca19640a67380c6b14f12a Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Fri, 15 May 2015 16:27:40 +0200 |
| Subject: mfd: da9052: Fix broken regulator probe |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit e0c21530fa91f119bfca19640a67380c6b14f12a upstream. |
| |
| Fix broken probe of da9052 regulators, which since commit b3f6c73db732 |
| ("mfd: da9052-core: Fix platform-device id collision") use a |
| non-deterministic platform-device id to retrieve static regulator |
| information. Fortunately, adequate error handling was in place so probe |
| would simply fail with an error message. |
| |
| Update the mfd-cell ids to be zero-based and use those to identify the |
| cells when probing the regulator devices. |
| |
| Fixes: b3f6c73db732 ("mfd: da9052-core: Fix platform-device id collision") |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> |
| Reviewed-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Lee Jones <lee.jones@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mfd/da9052-core.c | 8 ++++---- |
| drivers/regulator/da9052-regulator.c | 5 +++-- |
| 2 files changed, 7 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/mfd/da9052-core.c |
| +++ b/drivers/mfd/da9052-core.c |
| @@ -433,6 +433,10 @@ EXPORT_SYMBOL_GPL(da9052_adc_read_temp); |
| static const struct mfd_cell da9052_subdev_info[] = { |
| { |
| .name = "da9052-regulator", |
| + .id = 0, |
| + }, |
| + { |
| + .name = "da9052-regulator", |
| .id = 1, |
| }, |
| { |
| @@ -484,10 +488,6 @@ static const struct mfd_cell da9052_subd |
| .id = 13, |
| }, |
| { |
| - .name = "da9052-regulator", |
| - .id = 14, |
| - }, |
| - { |
| .name = "da9052-onkey", |
| }, |
| { |
| --- a/drivers/regulator/da9052-regulator.c |
| +++ b/drivers/regulator/da9052-regulator.c |
| @@ -394,6 +394,7 @@ static inline struct da9052_regulator_in |
| |
| static int da9052_regulator_probe(struct platform_device *pdev) |
| { |
| + const struct mfd_cell *cell = mfd_get_cell(pdev); |
| struct regulator_config config = { }; |
| struct da9052_regulator *regulator; |
| struct da9052 *da9052; |
| @@ -409,7 +410,7 @@ static int da9052_regulator_probe(struct |
| regulator->da9052 = da9052; |
| |
| regulator->info = find_regulator_info(regulator->da9052->chip_id, |
| - pdev->id); |
| + cell->id); |
| if (regulator->info == NULL) { |
| dev_err(&pdev->dev, "invalid regulator ID specified\n"); |
| return -EINVAL; |
| @@ -419,7 +420,7 @@ static int da9052_regulator_probe(struct |
| config.driver_data = regulator; |
| config.regmap = da9052->regmap; |
| if (pdata && pdata->regulators) { |
| - config.init_data = pdata->regulators[pdev->id]; |
| + config.init_data = pdata->regulators[cell->id]; |
| } else { |
| #ifdef CONFIG_OF |
| struct device_node *nproot = da9052->dev->of_node; |