Commit b0a24289 authored by Quentin Schulz's avatar Quentin Schulz Committed by Jonathan Cameron
Browse files

iio: adc: sun4i-gpadc-iio: register in the thermal after registering in pm



This driver has a get_temp function used by the thermal framework that
uses pm functions.

However, the driver isn't registered in pm before it is registered in
thermal framework, resulting in the pm_resume not being called and thus
the IP not enabled.

When the IP is disabled, the raw temp value is always 0. With the
devices currently supported, it isn't a problem since with their
respective formula, they return a really cold SoC temperature which
isn't a problem for the thermal framework. But for future SoC that have
a different formula, it could return a critically hot temperature,
forcing the thermal framework to shutdown the board.

Signed-off-by: default avatarQuentin Schulz <quentin.schulz@free-electrons.com>
Acked-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent d632a2bd
Loading
Loading
Loading
Loading
+15 −19
Original line number Diff line number Diff line
@@ -528,17 +528,10 @@ static int sun4i_gpadc_probe_dt(struct platform_device *pdev,
		return ret;
	}

	if (!IS_ENABLED(CONFIG_THERMAL_OF))
		return 0;

	if (IS_ENABLED(CONFIG_THERMAL_OF))
		info->sensor_device = &pdev->dev;
	info->tzd = thermal_zone_of_sensor_register(info->sensor_device, 0,
						    info, &sun4i_ts_tz_ops);
	if (IS_ERR(info->tzd))
		dev_err(&pdev->dev, "could not register thermal sensor: %ld\n",
			PTR_ERR(info->tzd));

	return PTR_ERR_OR_ZERO(info->tzd);
	return 0;
}

static int sun4i_gpadc_probe_mfd(struct platform_device *pdev,
@@ -585,15 +578,6 @@ static int sun4i_gpadc_probe_mfd(struct platform_device *pdev,
		 * return the temperature.
		 */
		info->sensor_device = pdev->dev.parent;
		info->tzd = thermal_zone_of_sensor_register(info->sensor_device,
							    0, info,
							    &sun4i_ts_tz_ops);
		if (IS_ERR(info->tzd)) {
			dev_err(&pdev->dev,
				"could not register thermal sensor: %ld\n",
				PTR_ERR(info->tzd));
			return PTR_ERR(info->tzd);
		}
	} else {
		indio_dev->num_channels =
			ARRAY_SIZE(sun4i_gpadc_channels_no_temp);
@@ -663,6 +647,18 @@ static int sun4i_gpadc_probe(struct platform_device *pdev)
	pm_runtime_set_suspended(&pdev->dev);
	pm_runtime_enable(&pdev->dev);

	if (IS_ENABLED(CONFIG_THERMAL_OF)) {
		info->tzd = thermal_zone_of_sensor_register(info->sensor_device,
							    0, info,
							    &sun4i_ts_tz_ops);
		if (IS_ERR(info->tzd)) {
			dev_err(&pdev->dev,
				"could not register thermal sensor: %ld\n",
				PTR_ERR(info->tzd));
			return PTR_ERR(info->tzd);
		}
	}

	ret = devm_iio_device_register(&pdev->dev, indio_dev);
	if (ret < 0) {
		dev_err(&pdev->dev, "could not register the device\n");