iio: exynos_adc: use indio_dev->dev structure to handle child nodes

Using pdev->dev with device_for_each_child() would iterate over all
of the children of the platform device and delete them.
Thus, causing crashes during module unload.

We should be using the indio_dev->dev structure for
registering/unregistering child nodes.

Reported-by: Doug Anderson <dianders@chromium.org>
Signed-off-by: Naveen Krishna Ch <ch.naveen@samsung.com>
Reviewed-by: Doug Anderson <dianders@chromium.org>
Tested-by: Doug Anderson <dianders@chromium.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
Naveen Krishna Ch 2014-04-25 11:14:00 +01:00 committed by Jonathan Cameron
parent b9b3a41893
commit 3d821a1747
1 changed files with 3 additions and 3 deletions

View File

@ -344,7 +344,7 @@ static int exynos_adc_probe(struct platform_device *pdev)
exynos_adc_hw_init(info); exynos_adc_hw_init(info);
ret = of_platform_populate(np, exynos_adc_match, NULL, &pdev->dev); ret = of_platform_populate(np, exynos_adc_match, NULL, &indio_dev->dev);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "failed adding child nodes\n"); dev_err(&pdev->dev, "failed adding child nodes\n");
goto err_of_populate; goto err_of_populate;
@ -353,7 +353,7 @@ static int exynos_adc_probe(struct platform_device *pdev)
return 0; return 0;
err_of_populate: err_of_populate:
device_for_each_child(&pdev->dev, NULL, device_for_each_child(&indio_dev->dev, NULL,
exynos_adc_remove_devices); exynos_adc_remove_devices);
regulator_disable(info->vdd); regulator_disable(info->vdd);
clk_disable_unprepare(info->clk); clk_disable_unprepare(info->clk);
@ -369,7 +369,7 @@ static int exynos_adc_remove(struct platform_device *pdev)
struct iio_dev *indio_dev = platform_get_drvdata(pdev); struct iio_dev *indio_dev = platform_get_drvdata(pdev);
struct exynos_adc *info = iio_priv(indio_dev); struct exynos_adc *info = iio_priv(indio_dev);
device_for_each_child(&pdev->dev, NULL, device_for_each_child(&indio_dev->dev, NULL,
exynos_adc_remove_devices); exynos_adc_remove_devices);
regulator_disable(info->vdd); regulator_disable(info->vdd);
clk_disable_unprepare(info->clk); clk_disable_unprepare(info->clk);