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:
parent
b9b3a41893
commit
3d821a1747
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue