iio: adc: sun4i-gpadc-iio: register in the thermal after registering in pm
authorQuentin Schulz <quentin.schulz@free-electrons.com>
Tue, 26 Sep 2017 12:52:18 +0000 (14:52 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 9 Oct 2017 19:49:42 +0000 (20:49 +0100)
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: Quentin Schulz <quentin.schulz@free-electrons.com>
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/sun4i-gpadc-iio.c

index a146160..430b06c 100644 (file)
@@ -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->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");