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

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
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -344,7 +344,7 @@ static int exynos_adc_probe(struct platform_device *pdev)

	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) {
		dev_err(&pdev->dev, "failed adding child nodes\n");
		goto err_of_populate;
@@ -353,7 +353,7 @@ static int exynos_adc_probe(struct platform_device *pdev)
	return 0;

err_of_populate:
	device_for_each_child(&pdev->dev, NULL,
	device_for_each_child(&indio_dev->dev, NULL,
				exynos_adc_remove_devices);
	regulator_disable(info->vdd);
	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 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);
	regulator_disable(info->vdd);
	clk_disable_unprepare(info->clk);