Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regulator: max77686: Don't update max77686->opmode if update register fails

Ensure max77686->opmode always has correct status.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Mark Brown <broonie@sirena.org.uk>

authored by

Axel Lin and committed by
Mark Brown
3ecf198e 60d509fa

+21 -11
+21 -11
drivers/regulator/max77686.c
··· 75 75 { 76 76 unsigned int val; 77 77 struct max77686_data *max77686 = rdev_get_drvdata(rdev); 78 - int id = rdev_get_id(rdev); 78 + int ret, id = rdev_get_id(rdev); 79 79 80 80 if (id == MAX77686_BUCK1) 81 81 val = 0x1; 82 82 else 83 83 val = 0x1 << MAX77686_OPMODE_BUCK234_SHIFT; 84 84 85 + ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 86 + rdev->desc->enable_mask, val); 87 + if (ret) 88 + return ret; 89 + 85 90 max77686->opmode[id] = val; 86 - return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 87 - rdev->desc->enable_mask, 88 - val); 91 + return 0; 89 92 } 90 93 91 94 /* Some LDOs supports [LPM/Normal]ON mode during suspend state */ ··· 97 94 { 98 95 struct max77686_data *max77686 = rdev_get_drvdata(rdev); 99 96 unsigned int val; 100 - int id = rdev_get_id(rdev); 97 + int ret, id = rdev_get_id(rdev); 101 98 102 99 /* BUCK[5-9] doesn't support this feature */ 103 100 if (id >= MAX77686_BUCK5) ··· 116 113 return -EINVAL; 117 114 } 118 115 116 + ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 117 + rdev->desc->enable_mask, val); 118 + if (ret) 119 + return ret; 120 + 119 121 max77686->opmode[id] = val; 120 - return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 121 - rdev->desc->enable_mask, 122 - val); 122 + return 0; 123 123 } 124 124 125 125 /* Some LDOs supports LPM-ON/OFF/Normal-ON mode during suspend state */ ··· 131 125 { 132 126 unsigned int val; 133 127 struct max77686_data *max77686 = rdev_get_drvdata(rdev); 128 + int ret; 134 129 135 130 switch (mode) { 136 131 case REGULATOR_MODE_STANDBY: /* switch off */ ··· 149 142 return -EINVAL; 150 143 } 151 144 145 + ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 146 + rdev->desc->enable_mask, val); 147 + if (ret) 148 + return ret; 149 + 152 150 max77686->opmode[rdev_get_id(rdev)] = val; 153 - return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 154 - rdev->desc->enable_mask, 155 - val); 151 + return 0; 156 152 } 157 153 158 154 static int max77686_enable(struct regulator_dev *rdev)