Commit 3d821a17 authored by Naveen Krishna Ch's avatar Naveen Krishna Ch Committed by Jonathan Cameron

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: default avatarDoug Anderson <dianders@chromium.org>
Signed-off-by: default avatarNaveen Krishna Ch <ch.naveen@samsung.com>
Reviewed-by: default avatarDoug Anderson <dianders@chromium.org>
Tested-by: default avatarDoug Anderson <dianders@chromium.org>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent b9b3a418
...@@ -344,7 +344,7 @@ static int exynos_adc_probe(struct platform_device *pdev) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment