| From bbcf109983fdbb64839e8c9dcd77e65a52fca70c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 20 Jun 2021 21:27:15 +0800 |
| Subject: regulator: hi655x: Fix pass wrong pointer to config.driver_data |
| |
| From: Axel Lin <axel.lin@ingics.com> |
| |
| [ Upstream commit 61eb1b24f9e4f4e0725aa5f8164a932c933f3339 ] |
| |
| Current code sets config.driver_data to a zero initialized regulator |
| which is obviously wrong. Fix it. |
| |
| Fixes: 4618119b9be5 ("regulator: hi655x: enable regulator for hi655x PMIC") |
| Signed-off-by: Axel Lin <axel.lin@ingics.com> |
| Link: https://lore.kernel.org/r/20210620132715.60215-1-axel.lin@ingics.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/regulator/hi655x-regulator.c | 16 +++++----------- |
| 1 file changed, 5 insertions(+), 11 deletions(-) |
| |
| diff --git a/drivers/regulator/hi655x-regulator.c b/drivers/regulator/hi655x-regulator.c |
| index ac2ee2030211..b44f492a2b83 100644 |
| --- a/drivers/regulator/hi655x-regulator.c |
| +++ b/drivers/regulator/hi655x-regulator.c |
| @@ -72,7 +72,7 @@ enum hi655x_regulator_id { |
| static int hi655x_is_enabled(struct regulator_dev *rdev) |
| { |
| unsigned int value = 0; |
| - struct hi655x_regulator *regulator = rdev_get_drvdata(rdev); |
| + const struct hi655x_regulator *regulator = rdev_get_drvdata(rdev); |
| |
| regmap_read(rdev->regmap, regulator->status_reg, &value); |
| return (value & rdev->desc->enable_mask); |
| @@ -80,7 +80,7 @@ static int hi655x_is_enabled(struct regulator_dev *rdev) |
| |
| static int hi655x_disable(struct regulator_dev *rdev) |
| { |
| - struct hi655x_regulator *regulator = rdev_get_drvdata(rdev); |
| + const struct hi655x_regulator *regulator = rdev_get_drvdata(rdev); |
| |
| return regmap_write(rdev->regmap, regulator->disable_reg, |
| rdev->desc->enable_mask); |
| @@ -169,7 +169,6 @@ static const struct hi655x_regulator regulators[] = { |
| static int hi655x_regulator_probe(struct platform_device *pdev) |
| { |
| unsigned int i; |
| - struct hi655x_regulator *regulator; |
| struct hi655x_pmic *pmic; |
| struct regulator_config config = { }; |
| struct regulator_dev *rdev; |
| @@ -180,22 +179,17 @@ static int hi655x_regulator_probe(struct platform_device *pdev) |
| return -ENODEV; |
| } |
| |
| - regulator = devm_kzalloc(&pdev->dev, sizeof(*regulator), GFP_KERNEL); |
| - if (!regulator) |
| - return -ENOMEM; |
| - |
| - platform_set_drvdata(pdev, regulator); |
| - |
| config.dev = pdev->dev.parent; |
| config.regmap = pmic->regmap; |
| - config.driver_data = regulator; |
| for (i = 0; i < ARRAY_SIZE(regulators); i++) { |
| + config.driver_data = (void *) ®ulators[i]; |
| + |
| rdev = devm_regulator_register(&pdev->dev, |
| ®ulators[i].rdesc, |
| &config); |
| if (IS_ERR(rdev)) { |
| dev_err(&pdev->dev, "failed to register regulator %s\n", |
| - regulator->rdesc.name); |
| + regulators[i].rdesc.name); |
| return PTR_ERR(rdev); |
| } |
| } |
| -- |
| 2.30.2 |
| |