Skip to content

Commit 5db5dd5

Browse files
AxelLinbroonie
authored andcommitted
regulator: hi6421v600: Fix getting wrong drvdata that causes boot failure
Since config.dev = pdev->dev.parent in current code, so dev_get_drvdata(rdev->dev.parent) actually returns the drvdata of the mfd device rather than the regulator. Fix it. Fixes: 9bc146a ("regulator: hi6421v600: Fix setting wrong driver_data") Reported-by: Mauro Carvalho Chehab <[email protected]> Signed-off-by: Axel Lin <[email protected]> Tested-by: Mauro Carvalho Chehab <[email protected]> Reviewed-by: Mauro Carvalho Chehab <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 6549c46 commit 5db5dd5

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

drivers/regulator/hi6421v600-regulator.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,9 @@ static const unsigned int ldo34_voltages[] = {
9898

9999
static int hi6421_spmi_regulator_enable(struct regulator_dev *rdev)
100100
{
101-
struct hi6421_spmi_reg_priv *priv;
101+
struct hi6421_spmi_reg_priv *priv = rdev_get_drvdata(rdev);
102102
int ret;
103103

104-
priv = dev_get_drvdata(rdev->dev.parent);
105104
/* cannot enable more than one regulator at one time */
106105
mutex_lock(&priv->enable_mutex);
107106

@@ -119,9 +118,10 @@ static int hi6421_spmi_regulator_enable(struct regulator_dev *rdev)
119118

120119
static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev)
121120
{
122-
struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev);
121+
struct hi6421_spmi_reg_info *sreg;
123122
unsigned int reg_val;
124123

124+
sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
125125
regmap_read(rdev->regmap, rdev->desc->enable_reg, &reg_val);
126126

127127
if (reg_val & sreg->eco_mode_mask)
@@ -133,9 +133,10 @@ static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev)
133133
static int hi6421_spmi_regulator_set_mode(struct regulator_dev *rdev,
134134
unsigned int mode)
135135
{
136-
struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev);
136+
struct hi6421_spmi_reg_info *sreg;
137137
unsigned int val;
138138

139+
sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
139140
switch (mode) {
140141
case REGULATOR_MODE_NORMAL:
141142
val = 0;
@@ -159,7 +160,9 @@ hi6421_spmi_regulator_get_optimum_mode(struct regulator_dev *rdev,
159160
int input_uV, int output_uV,
160161
int load_uA)
161162
{
162-
struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev);
163+
struct hi6421_spmi_reg_info *sreg;
164+
165+
sreg = container_of(rdev->desc, struct hi6421_spmi_reg_info, desc);
163166

164167
if (!sreg->eco_uA || ((unsigned int)load_uA > sreg->eco_uA))
165168
return REGULATOR_MODE_NORMAL;
@@ -252,13 +255,12 @@ static int hi6421_spmi_regulator_probe(struct platform_device *pdev)
252255
return -ENOMEM;
253256

254257
mutex_init(&priv->enable_mutex);
255-
platform_set_drvdata(pdev, priv);
256258

257259
for (i = 0; i < ARRAY_SIZE(regulator_info); i++) {
258260
info = &regulator_info[i];
259261

260262
config.dev = pdev->dev.parent;
261-
config.driver_data = info;
263+
config.driver_data = priv;
262264
config.regmap = pmic->regmap;
263265

264266
rdev = devm_regulator_register(dev, &info->desc, &config);

0 commit comments

Comments
 (0)