aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaveen Krishna Ch <ch.naveen@samsung.com>2014-04-30 05:26:00 -0400
committerJonathan Cameron <jic23@kernel.org>2014-04-30 16:42:53 -0400
commit2bbc7247259f0d27c84b0e0746bd5e9831e39c36 (patch)
tree0887f782c905de7d38a545518db3ca3b065b3811
parentb4a2d475ae9baf8fcaa311ba62a404ba1efad147 (diff)
iio: exynos_adc: rearrange clk and regulator enable/disable calls
This patch maintains the following order in probe(), remove(), resume() and suspend() calls regulator enable, clk prepare enable ... clk disable unprepare, regulator disable While at it, 1. enable the regulator before the iio_device_register() 2. handle the return values for enable/disable calls Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com> Reviewed-by: Doug Anderson <dianders@chromium.org> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/adc/exynos_adc.c62
1 files changed, 33 insertions, 29 deletions
diff --git a/drivers/iio/adc/exynos_adc.c b/drivers/iio/adc/exynos_adc.c
index d25b262193a7..9d296094892d 100644
--- a/drivers/iio/adc/exynos_adc.c
+++ b/drivers/iio/adc/exynos_adc.c
@@ -290,32 +290,30 @@ static int exynos_adc_probe(struct platform_device *pdev)
290 290
291 init_completion(&info->completion); 291 init_completion(&info->completion);
292 292
293 ret = request_irq(info->irq, exynos_adc_isr,
294 0, dev_name(&pdev->dev), info);
295 if (ret < 0) {
296 dev_err(&pdev->dev, "failed requesting irq, irq = %d\n",
297 info->irq);
298 return ret;
299 }
300
301 writel(1, info->enable_reg);
302
303 info->clk = devm_clk_get(&pdev->dev, "adc"); 293 info->clk = devm_clk_get(&pdev->dev, "adc");
304 if (IS_ERR(info->clk)) { 294 if (IS_ERR(info->clk)) {
305 dev_err(&pdev->dev, "failed getting clock, err = %ld\n", 295 dev_err(&pdev->dev, "failed getting clock, err = %ld\n",
306 PTR_ERR(info->clk)); 296 PTR_ERR(info->clk));
307 ret = PTR_ERR(info->clk); 297 return PTR_ERR(info->clk);
308 goto err_irq;
309 } 298 }
310 299
311 info->vdd = devm_regulator_get(&pdev->dev, "vdd"); 300 info->vdd = devm_regulator_get(&pdev->dev, "vdd");
312 if (IS_ERR(info->vdd)) { 301 if (IS_ERR(info->vdd)) {
313 dev_err(&pdev->dev, "failed getting regulator, err = %ld\n", 302 dev_err(&pdev->dev, "failed getting regulator, err = %ld\n",
314 PTR_ERR(info->vdd)); 303 PTR_ERR(info->vdd));
315 ret = PTR_ERR(info->vdd); 304 return PTR_ERR(info->vdd);
316 goto err_irq;
317 } 305 }
318 306
307 ret = regulator_enable(info->vdd);
308 if (ret)
309 return ret;
310
311 ret = clk_prepare_enable(info->clk);
312 if (ret)
313 goto err_disable_reg;
314
315 writel(1, info->enable_reg);
316
319 info->version = exynos_adc_get_version(pdev); 317 info->version = exynos_adc_get_version(pdev);
320 318
321 platform_set_drvdata(pdev, indio_dev); 319 platform_set_drvdata(pdev, indio_dev);
@@ -332,16 +330,18 @@ static int exynos_adc_probe(struct platform_device *pdev)
332 else 330 else
333 indio_dev->num_channels = MAX_ADC_V2_CHANNELS; 331 indio_dev->num_channels = MAX_ADC_V2_CHANNELS;
334 332
333 ret = request_irq(info->irq, exynos_adc_isr,
334 0, dev_name(&pdev->dev), info);
335 if (ret < 0) {
336 dev_err(&pdev->dev, "failed requesting irq, irq = %d\n",
337 info->irq);
338 goto err_disable_clk;
339 }
340
335 ret = iio_device_register(indio_dev); 341 ret = iio_device_register(indio_dev);
336 if (ret) 342 if (ret)
337 goto err_irq; 343 goto err_irq;
338 344
339 ret = regulator_enable(info->vdd);
340 if (ret)
341 goto err_iio_dev;
342
343 clk_prepare_enable(info->clk);
344
345 exynos_adc_hw_init(info); 345 exynos_adc_hw_init(info);
346 346
347 ret = of_platform_populate(np, exynos_adc_match, NULL, &pdev->dev); 347 ret = of_platform_populate(np, exynos_adc_match, NULL, &pdev->dev);
@@ -355,12 +355,14 @@ static int exynos_adc_probe(struct platform_device *pdev)
355err_of_populate: 355err_of_populate:
356 device_for_each_child(&pdev->dev, NULL, 356 device_for_each_child(&pdev->dev, NULL,
357 exynos_adc_remove_devices); 357 exynos_adc_remove_devices);
358 regulator_disable(info->vdd);
359 clk_disable_unprepare(info->clk);
360err_iio_dev:
361 iio_device_unregister(indio_dev); 358 iio_device_unregister(indio_dev);
362err_irq: 359err_irq:
363 free_irq(info->irq, info); 360 free_irq(info->irq, info);
361err_disable_clk:
362 writel(0, info->enable_reg);
363 clk_disable_unprepare(info->clk);
364err_disable_reg:
365 regulator_disable(info->vdd);
364 return ret; 366 return ret;
365} 367}
366 368
@@ -371,11 +373,11 @@ static int exynos_adc_remove(struct platform_device *pdev)
371 373
372 device_for_each_child(&pdev->dev, NULL, 374 device_for_each_child(&pdev->dev, NULL,
373 exynos_adc_remove_devices); 375 exynos_adc_remove_devices);
374 regulator_disable(info->vdd);
375 clk_disable_unprepare(info->clk);
376 writel(0, info->enable_reg);
377 iio_device_unregister(indio_dev); 376 iio_device_unregister(indio_dev);
378 free_irq(info->irq, info); 377 free_irq(info->irq, info);
378 writel(0, info->enable_reg);
379 clk_disable_unprepare(info->clk);
380 regulator_disable(info->vdd);
379 381
380 return 0; 382 return 0;
381} 383}
@@ -397,8 +399,8 @@ static int exynos_adc_suspend(struct device *dev)
397 writel(con, ADC_V1_CON(info->regs)); 399 writel(con, ADC_V1_CON(info->regs));
398 } 400 }
399 401
400 clk_disable_unprepare(info->clk);
401 writel(0, info->enable_reg); 402 writel(0, info->enable_reg);
403 clk_disable_unprepare(info->clk);
402 regulator_disable(info->vdd); 404 regulator_disable(info->vdd);
403 405
404 return 0; 406 return 0;
@@ -414,9 +416,11 @@ static int exynos_adc_resume(struct device *dev)
414 if (ret) 416 if (ret)
415 return ret; 417 return ret;
416 418
417 writel(1, info->enable_reg); 419 ret = clk_prepare_enable(info->clk);
418 clk_prepare_enable(info->clk); 420 if (ret)
421 return ret;
419 422
423 writel(1, info->enable_reg);
420 exynos_adc_hw_init(info); 424 exynos_adc_hw_init(info);
421 425
422 return 0; 426 return 0;