diff options
-rw-r--r-- | drivers/regulator/arizona-micsupp.c | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/drivers/regulator/arizona-micsupp.c b/drivers/regulator/arizona-micsupp.c index db4fecf228b7..120de94caf02 100644 --- a/drivers/regulator/arizona-micsupp.c +++ b/drivers/regulator/arizona-micsupp.c | |||
@@ -231,52 +231,27 @@ static int arizona_micsupp_of_get_pdata(struct arizona_micsupp_pdata *pdata, | |||
231 | return 0; | 231 | return 0; |
232 | } | 232 | } |
233 | 233 | ||
234 | static int arizona_micsupp_probe(struct platform_device *pdev) | 234 | static int arizona_micsupp_common_init(struct platform_device *pdev, |
235 | struct arizona_micsupp *micsupp, | ||
236 | const struct regulator_desc *desc, | ||
237 | struct arizona_micsupp_pdata *pdata) | ||
235 | { | 238 | { |
236 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); | ||
237 | const struct regulator_desc *desc; | ||
238 | struct regulator_config config = { }; | 239 | struct regulator_config config = { }; |
239 | struct arizona_micsupp_pdata *pdata = &arizona->pdata.micvdd; | ||
240 | struct arizona_micsupp *micsupp; | ||
241 | int ret; | 240 | int ret; |
242 | 241 | ||
243 | micsupp = devm_kzalloc(&pdev->dev, sizeof(*micsupp), GFP_KERNEL); | ||
244 | if (!micsupp) | ||
245 | return -ENOMEM; | ||
246 | |||
247 | micsupp->regmap = arizona->regmap; | ||
248 | micsupp->dapm = &arizona->dapm; | ||
249 | micsupp->dev = arizona->dev; | ||
250 | INIT_WORK(&micsupp->check_cp_work, arizona_micsupp_check_cp); | 242 | INIT_WORK(&micsupp->check_cp_work, arizona_micsupp_check_cp); |
251 | 243 | ||
252 | /* | ||
253 | * Since the chip usually supplies itself we provide some | ||
254 | * default init_data for it. This will be overridden with | ||
255 | * platform data if provided. | ||
256 | */ | ||
257 | switch (arizona->type) { | ||
258 | case WM5110: | ||
259 | case WM8280: | ||
260 | desc = &arizona_micsupp_ext; | ||
261 | micsupp->init_data = arizona_micsupp_ext_default; | ||
262 | break; | ||
263 | default: | ||
264 | desc = &arizona_micsupp; | ||
265 | micsupp->init_data = arizona_micsupp_default; | ||
266 | break; | ||
267 | } | ||
268 | |||
269 | micsupp->init_data.consumer_supplies = &micsupp->supply; | 244 | micsupp->init_data.consumer_supplies = &micsupp->supply; |
270 | micsupp->supply.supply = "MICVDD"; | 245 | micsupp->supply.supply = "MICVDD"; |
271 | micsupp->supply.dev_name = dev_name(arizona->dev); | 246 | micsupp->supply.dev_name = dev_name(micsupp->dev); |
272 | micsupp->enable_reg = desc->enable_reg; | 247 | micsupp->enable_reg = desc->enable_reg; |
273 | 248 | ||
274 | config.dev = arizona->dev; | 249 | config.dev = micsupp->dev; |
275 | config.driver_data = micsupp; | 250 | config.driver_data = micsupp; |
276 | config.regmap = arizona->regmap; | 251 | config.regmap = micsupp->regmap; |
277 | 252 | ||
278 | if (IS_ENABLED(CONFIG_OF)) { | 253 | if (IS_ENABLED(CONFIG_OF)) { |
279 | if (!dev_get_platdata(arizona->dev)) { | 254 | if (!dev_get_platdata(micsupp->dev)) { |
280 | ret = arizona_micsupp_of_get_pdata(pdata, &config, | 255 | ret = arizona_micsupp_of_get_pdata(pdata, &config, |
281 | desc); | 256 | desc); |
282 | if (ret < 0) | 257 | if (ret < 0) |
@@ -289,8 +264,8 @@ static int arizona_micsupp_probe(struct platform_device *pdev) | |||
289 | else | 264 | else |
290 | config.init_data = &micsupp->init_data; | 265 | config.init_data = &micsupp->init_data; |
291 | 266 | ||
292 | /* Default to regulated mode until the API supports bypass */ | 267 | /* Default to regulated mode */ |
293 | regmap_update_bits(arizona->regmap, ARIZONA_MIC_CHARGE_PUMP_1, | 268 | regmap_update_bits(micsupp->regmap, micsupp->enable_reg, |
294 | ARIZONA_CPMIC_BYPASS, 0); | 269 | ARIZONA_CPMIC_BYPASS, 0); |
295 | 270 | ||
296 | micsupp->regulator = devm_regulator_register(&pdev->dev, | 271 | micsupp->regulator = devm_regulator_register(&pdev->dev, |
@@ -301,7 +276,7 @@ static int arizona_micsupp_probe(struct platform_device *pdev) | |||
301 | 276 | ||
302 | if (IS_ERR(micsupp->regulator)) { | 277 | if (IS_ERR(micsupp->regulator)) { |
303 | ret = PTR_ERR(micsupp->regulator); | 278 | ret = PTR_ERR(micsupp->regulator); |
304 | dev_err(arizona->dev, "Failed to register mic supply: %d\n", | 279 | dev_err(micsupp->dev, "Failed to register mic supply: %d\n", |
305 | ret); | 280 | ret); |
306 | return ret; | 281 | return ret; |
307 | } | 282 | } |
@@ -311,6 +286,41 @@ static int arizona_micsupp_probe(struct platform_device *pdev) | |||
311 | return 0; | 286 | return 0; |
312 | } | 287 | } |
313 | 288 | ||
289 | static int arizona_micsupp_probe(struct platform_device *pdev) | ||
290 | { | ||
291 | struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); | ||
292 | const struct regulator_desc *desc; | ||
293 | struct arizona_micsupp *micsupp; | ||
294 | |||
295 | micsupp = devm_kzalloc(&pdev->dev, sizeof(*micsupp), GFP_KERNEL); | ||
296 | if (!micsupp) | ||
297 | return -ENOMEM; | ||
298 | |||
299 | micsupp->regmap = arizona->regmap; | ||
300 | micsupp->dapm = &arizona->dapm; | ||
301 | micsupp->dev = arizona->dev; | ||
302 | |||
303 | /* | ||
304 | * Since the chip usually supplies itself we provide some | ||
305 | * default init_data for it. This will be overridden with | ||
306 | * platform data if provided. | ||
307 | */ | ||
308 | switch (arizona->type) { | ||
309 | case WM5110: | ||
310 | case WM8280: | ||
311 | desc = &arizona_micsupp_ext; | ||
312 | micsupp->init_data = arizona_micsupp_ext_default; | ||
313 | break; | ||
314 | default: | ||
315 | desc = &arizona_micsupp; | ||
316 | micsupp->init_data = arizona_micsupp_default; | ||
317 | break; | ||
318 | } | ||
319 | |||
320 | return arizona_micsupp_common_init(pdev, micsupp, desc, | ||
321 | &arizona->pdata.micvdd); | ||
322 | } | ||
323 | |||
314 | static struct platform_driver arizona_micsupp_driver = { | 324 | static struct platform_driver arizona_micsupp_driver = { |
315 | .probe = arizona_micsupp_probe, | 325 | .probe = arizona_micsupp_probe, |
316 | .driver = { | 326 | .driver = { |