diff options
Diffstat (limited to 'drivers/regulator/max8660.c')
-rw-r--r-- | drivers/regulator/max8660.c | 71 |
1 files changed, 15 insertions, 56 deletions
diff --git a/drivers/regulator/max8660.c b/drivers/regulator/max8660.c index 93bcfc8d58ee..8d531742f593 100644 --- a/drivers/regulator/max8660.c +++ b/drivers/regulator/max8660.c | |||
@@ -135,27 +135,13 @@ static int max8660_dcdc_get_voltage_sel(struct regulator_dev *rdev) | |||
135 | return selector; | 135 | return selector; |
136 | } | 136 | } |
137 | 137 | ||
138 | static int max8660_dcdc_set(struct regulator_dev *rdev, int min_uV, int max_uV, | 138 | static int max8660_dcdc_set_voltage_sel(struct regulator_dev *rdev, |
139 | unsigned int *s) | 139 | unsigned int selector) |
140 | { | 140 | { |
141 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | 141 | struct max8660 *max8660 = rdev_get_drvdata(rdev); |
142 | u8 reg, selector, bits; | 142 | u8 reg, bits; |
143 | int ret; | 143 | int ret; |
144 | 144 | ||
145 | if (min_uV < MAX8660_DCDC_MIN_UV || min_uV > MAX8660_DCDC_MAX_UV) | ||
146 | return -EINVAL; | ||
147 | if (max_uV < MAX8660_DCDC_MIN_UV || max_uV > MAX8660_DCDC_MAX_UV) | ||
148 | return -EINVAL; | ||
149 | |||
150 | selector = DIV_ROUND_UP(min_uV - MAX8660_DCDC_MIN_UV, | ||
151 | MAX8660_DCDC_STEP); | ||
152 | |||
153 | ret = regulator_list_voltage_linear(rdev, selector); | ||
154 | if (ret < 0 || ret > max_uV) | ||
155 | return -EINVAL; | ||
156 | |||
157 | *s = selector; | ||
158 | |||
159 | reg = (rdev_get_id(rdev) == MAX8660_V3) ? MAX8660_ADTV2 : MAX8660_SDTV2; | 145 | reg = (rdev_get_id(rdev) == MAX8660_V3) ? MAX8660_ADTV2 : MAX8660_SDTV2; |
160 | ret = max8660_write(max8660, reg, 0, selector); | 146 | ret = max8660_write(max8660, reg, 0, selector); |
161 | if (ret) | 147 | if (ret) |
@@ -169,7 +155,8 @@ static int max8660_dcdc_set(struct regulator_dev *rdev, int min_uV, int max_uV, | |||
169 | static struct regulator_ops max8660_dcdc_ops = { | 155 | static struct regulator_ops max8660_dcdc_ops = { |
170 | .is_enabled = max8660_dcdc_is_enabled, | 156 | .is_enabled = max8660_dcdc_is_enabled, |
171 | .list_voltage = regulator_list_voltage_linear, | 157 | .list_voltage = regulator_list_voltage_linear, |
172 | .set_voltage = max8660_dcdc_set, | 158 | .map_voltage = regulator_map_voltage_linear, |
159 | .set_voltage_sel = max8660_dcdc_set_voltage_sel, | ||
173 | .get_voltage_sel = max8660_dcdc_get_voltage_sel, | 160 | .get_voltage_sel = max8660_dcdc_get_voltage_sel, |
174 | }; | 161 | }; |
175 | 162 | ||
@@ -186,27 +173,12 @@ static int max8660_ldo5_get_voltage_sel(struct regulator_dev *rdev) | |||
186 | return selector; | 173 | return selector; |
187 | } | 174 | } |
188 | 175 | ||
189 | static int max8660_ldo5_set(struct regulator_dev *rdev, int min_uV, int max_uV, | 176 | static int max8660_ldo5_set_voltage_sel(struct regulator_dev *rdev, |
190 | unsigned int *s) | 177 | unsigned int selector) |
191 | { | 178 | { |
192 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | 179 | struct max8660 *max8660 = rdev_get_drvdata(rdev); |
193 | u8 selector; | ||
194 | int ret; | 180 | int ret; |
195 | 181 | ||
196 | if (min_uV < MAX8660_LDO5_MIN_UV || min_uV > MAX8660_LDO5_MAX_UV) | ||
197 | return -EINVAL; | ||
198 | if (max_uV < MAX8660_LDO5_MIN_UV || max_uV > MAX8660_LDO5_MAX_UV) | ||
199 | return -EINVAL; | ||
200 | |||
201 | selector = DIV_ROUND_UP(min_uV - MAX8660_LDO5_MIN_UV, | ||
202 | MAX8660_LDO5_STEP); | ||
203 | |||
204 | ret = regulator_list_voltage_linear(rdev, selector); | ||
205 | if (ret < 0 || ret > max_uV) | ||
206 | return -EINVAL; | ||
207 | |||
208 | *s = selector; | ||
209 | |||
210 | ret = max8660_write(max8660, MAX8660_MDTV2, 0, selector); | 182 | ret = max8660_write(max8660, MAX8660_MDTV2, 0, selector); |
211 | if (ret) | 183 | if (ret) |
212 | return ret; | 184 | return ret; |
@@ -217,7 +189,8 @@ static int max8660_ldo5_set(struct regulator_dev *rdev, int min_uV, int max_uV, | |||
217 | 189 | ||
218 | static struct regulator_ops max8660_ldo5_ops = { | 190 | static struct regulator_ops max8660_ldo5_ops = { |
219 | .list_voltage = regulator_list_voltage_linear, | 191 | .list_voltage = regulator_list_voltage_linear, |
220 | .set_voltage = max8660_ldo5_set, | 192 | .map_voltage = regulator_map_voltage_linear, |
193 | .set_voltage_sel = max8660_ldo5_set_voltage_sel, | ||
221 | .get_voltage_sel = max8660_ldo5_get_voltage_sel, | 194 | .get_voltage_sel = max8660_ldo5_get_voltage_sel, |
222 | }; | 195 | }; |
223 | 196 | ||
@@ -257,31 +230,16 @@ static int max8660_ldo67_get_voltage_sel(struct regulator_dev *rdev) | |||
257 | return selector; | 230 | return selector; |
258 | } | 231 | } |
259 | 232 | ||
260 | static int max8660_ldo67_set(struct regulator_dev *rdev, int min_uV, | 233 | static int max8660_ldo67_set_voltage_sel(struct regulator_dev *rdev, |
261 | int max_uV, unsigned int *s) | 234 | unsigned int selector) |
262 | { | 235 | { |
263 | struct max8660 *max8660 = rdev_get_drvdata(rdev); | 236 | struct max8660 *max8660 = rdev_get_drvdata(rdev); |
264 | u8 selector; | ||
265 | int ret; | ||
266 | |||
267 | if (min_uV < MAX8660_LDO67_MIN_UV || min_uV > MAX8660_LDO67_MAX_UV) | ||
268 | return -EINVAL; | ||
269 | if (max_uV < MAX8660_LDO67_MIN_UV || max_uV > MAX8660_LDO67_MAX_UV) | ||
270 | return -EINVAL; | ||
271 | |||
272 | selector = DIV_ROUND_UP(min_uV - MAX8660_LDO67_MIN_UV, | ||
273 | MAX8660_LDO67_STEP); | ||
274 | |||
275 | ret = regulator_list_voltage_linear(rdev, selector); | ||
276 | if (ret < 0 || ret > max_uV) | ||
277 | return -EINVAL; | ||
278 | |||
279 | *s = selector; | ||
280 | 237 | ||
281 | if (rdev_get_id(rdev) == MAX8660_V6) | 238 | if (rdev_get_id(rdev) == MAX8660_V6) |
282 | return max8660_write(max8660, MAX8660_L12VCR, 0xf0, selector); | 239 | return max8660_write(max8660, MAX8660_L12VCR, 0xf0, selector); |
283 | else | 240 | else |
284 | return max8660_write(max8660, MAX8660_L12VCR, 0x0f, selector << 4); | 241 | return max8660_write(max8660, MAX8660_L12VCR, 0x0f, |
242 | selector << 4); | ||
285 | } | 243 | } |
286 | 244 | ||
287 | static struct regulator_ops max8660_ldo67_ops = { | 245 | static struct regulator_ops max8660_ldo67_ops = { |
@@ -289,8 +247,9 @@ static struct regulator_ops max8660_ldo67_ops = { | |||
289 | .enable = max8660_ldo67_enable, | 247 | .enable = max8660_ldo67_enable, |
290 | .disable = max8660_ldo67_disable, | 248 | .disable = max8660_ldo67_disable, |
291 | .list_voltage = regulator_list_voltage_linear, | 249 | .list_voltage = regulator_list_voltage_linear, |
250 | .map_voltage = regulator_map_voltage_linear, | ||
292 | .get_voltage_sel = max8660_ldo67_get_voltage_sel, | 251 | .get_voltage_sel = max8660_ldo67_get_voltage_sel, |
293 | .set_voltage = max8660_ldo67_set, | 252 | .set_voltage_sel = max8660_ldo67_set_voltage_sel, |
294 | }; | 253 | }; |
295 | 254 | ||
296 | static const struct regulator_desc max8660_reg[] = { | 255 | static const struct regulator_desc max8660_reg[] = { |