Merge tag 'thermal-v5.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/thermal...
[linux-block.git] / drivers / thermal / imx_thermal.c
index 1b84ea674edb740d140ae547f3da685266e64b68..3f74ab4c1ab9f184a3e0c449a0f91951a7bd46a4 100644 (file)
@@ -197,7 +197,6 @@ struct imx_thermal_data {
        struct cpufreq_policy *policy;
        struct thermal_zone_device *tz;
        struct thermal_cooling_device *cdev;
-       enum thermal_device_mode mode;
        struct regmap *tempmon;
        u32 c1, c2; /* See formula in imx_init_calib() */
        int temp_passive;
@@ -253,10 +252,11 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
        const struct thermal_soc_data *soc_data = data->socdata;
        struct regmap *map = data->tempmon;
        unsigned int n_meas;
-       bool wait;
+       bool wait, run_measurement;
        u32 val;
 
-       if (data->mode == THERMAL_DEVICE_ENABLED) {
+       run_measurement = !data->irq_enabled;
+       if (!run_measurement) {
                /* Check if a measurement is currently in progress */
                regmap_read(map, soc_data->temp_data, &val);
                wait = !(val & soc_data->temp_valid_mask);
@@ -283,7 +283,7 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
 
        regmap_read(map, soc_data->temp_data, &val);
 
-       if (data->mode != THERMAL_DEVICE_ENABLED) {
+       if (run_measurement) {
                regmap_write(map, soc_data->sensor_ctrl + REG_CLR,
                             soc_data->measure_temp_mask);
                regmap_write(map, soc_data->sensor_ctrl + REG_SET,
@@ -331,27 +331,14 @@ static int imx_get_temp(struct thermal_zone_device *tz, int *temp)
        return 0;
 }
 
-static int imx_get_mode(struct thermal_zone_device *tz,
-                       enum thermal_device_mode *mode)
-{
-       struct imx_thermal_data *data = tz->devdata;
-
-       *mode = data->mode;
-
-       return 0;
-}
-
-static int imx_set_mode(struct thermal_zone_device *tz,
-                       enum thermal_device_mode mode)
+static int imx_change_mode(struct thermal_zone_device *tz,
+                          enum thermal_device_mode mode)
 {
        struct imx_thermal_data *data = tz->devdata;
        struct regmap *map = data->tempmon;
        const struct thermal_soc_data *soc_data = data->socdata;
 
        if (mode == THERMAL_DEVICE_ENABLED) {
-               tz->polling_delay = IMX_POLLING_DELAY;
-               tz->passive_delay = IMX_PASSIVE_DELAY;
-
                regmap_write(map, soc_data->sensor_ctrl + REG_CLR,
                             soc_data->power_down_mask);
                regmap_write(map, soc_data->sensor_ctrl + REG_SET,
@@ -367,18 +354,12 @@ static int imx_set_mode(struct thermal_zone_device *tz,
                regmap_write(map, soc_data->sensor_ctrl + REG_SET,
                             soc_data->power_down_mask);
 
-               tz->polling_delay = 0;
-               tz->passive_delay = 0;
-
                if (data->irq_enabled) {
                        disable_irq(data->irq);
                        data->irq_enabled = false;
                }
        }
 
-       data->mode = mode;
-       thermal_zone_device_update(tz, THERMAL_EVENT_UNSPECIFIED);
-
        return 0;
 }
 
@@ -467,8 +448,7 @@ static struct thermal_zone_device_ops imx_tz_ops = {
        .bind = imx_bind,
        .unbind = imx_unbind,
        .get_temp = imx_get_temp,
-       .get_mode = imx_get_mode,
-       .set_mode = imx_set_mode,
+       .change_mode = imx_change_mode,
        .get_trip_type = imx_get_trip_type,
        .get_trip_temp = imx_get_trip_temp,
        .get_crit_temp = imx_get_crit_temp,
@@ -832,7 +812,9 @@ static int imx_thermal_probe(struct platform_device *pdev)
                     data->socdata->measure_temp_mask);
 
        data->irq_enabled = true;
-       data->mode = THERMAL_DEVICE_ENABLED;
+       ret = thermal_zone_device_enable(data->tz);
+       if (ret)
+               goto thermal_zone_unregister;
 
        ret = devm_request_threaded_irq(&pdev->dev, data->irq,
                        imx_thermal_alarm_irq, imx_thermal_alarm_irq_thread,
@@ -874,19 +856,18 @@ static int imx_thermal_remove(struct platform_device *pdev)
 static int __maybe_unused imx_thermal_suspend(struct device *dev)
 {
        struct imx_thermal_data *data = dev_get_drvdata(dev);
-       struct regmap *map = data->tempmon;
+       int ret;
 
        /*
         * Need to disable thermal sensor, otherwise, when thermal core
         * try to get temperature before thermal sensor resume, a wrong
         * temperature will be read as the thermal sensor is powered
-        * down.
+        * down. This is done in change_mode() operation called from
+        * thermal_zone_device_disable()
         */
-       regmap_write(map, data->socdata->sensor_ctrl + REG_CLR,
-                    data->socdata->measure_temp_mask);
-       regmap_write(map, data->socdata->sensor_ctrl + REG_SET,
-                    data->socdata->power_down_mask);
-       data->mode = THERMAL_DEVICE_DISABLED;
+       ret = thermal_zone_device_disable(data->tz);
+       if (ret)
+               return ret;
        clk_disable_unprepare(data->thermal_clk);
 
        return 0;
@@ -895,18 +876,15 @@ static int __maybe_unused imx_thermal_suspend(struct device *dev)
 static int __maybe_unused imx_thermal_resume(struct device *dev)
 {
        struct imx_thermal_data *data = dev_get_drvdata(dev);
-       struct regmap *map = data->tempmon;
        int ret;
 
        ret = clk_prepare_enable(data->thermal_clk);
        if (ret)
                return ret;
        /* Enabled thermal sensor after resume */
-       regmap_write(map, data->socdata->sensor_ctrl + REG_CLR,
-                    data->socdata->power_down_mask);
-       regmap_write(map, data->socdata->sensor_ctrl + REG_SET,
-                    data->socdata->measure_temp_mask);
-       data->mode = THERMAL_DEVICE_ENABLED;
+       ret = thermal_zone_device_enable(data->tz);
+       if (ret)
+               return ret;
 
        return 0;
 }