aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/regulator/arizona-micsupp.c82
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
234static int arizona_micsupp_probe(struct platform_device *pdev) 234static 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
289static 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
314static struct platform_driver arizona_micsupp_driver = { 324static struct platform_driver arizona_micsupp_driver = {
315 .probe = arizona_micsupp_probe, 325 .probe = arizona_micsupp_probe,
316 .driver = { 326 .driver = {