BACKPORT: thermal/drivers/hisi: Remove the multiple sensors support
authorDaniel Lezcano <daniel.lezcano@linaro.org>
Thu, 19 Oct 2017 17:05:44 +0000 (19:05 +0200)
committerKevin Wangtao <kevin.wangtao@hisilicon.com>
Fri, 26 Jan 2018 01:58:15 +0000 (09:58 +0800)
By essence, the tsensor does not really support multiple sensor at the same
time. It allows to set a sensor and use it to get the temperature, another
sensor could be switched but with a delay of 3-5ms. It is difficult to read
simultaneously several sensors without a big delay.

Today, just one sensor is used, it is not necessary to deal with multiple
sensors in the code. Remove them and if it is needed in the future add them
on top of a code which will be clean up in the meantime.

Change-Id: Ia1eaa1c3291f28871f1e22b9467d4d48f55eb4fe
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Leo Yan <leo.yan@linaro.org>
Acked-by: Wangtao (Kevin, Kirin) <kevin.wangtao@hisilicon.com>
Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
(cherry picked from commit ff4ec2997df8fe7cc40513dbe5f86d9f88fb6be7)
Signed-off-by: Kevin Wangtao <kevin.wangtao@hisilicon.com>
drivers/thermal/hisi_thermal.c

index 6d8906d6547638d91f9aeb804e08c5eaba7c0c2c..aecbfe9fc8f23675a0f2859260928d8f5c962cf8 100644 (file)
@@ -40,6 +40,7 @@
 #define HISI_TEMP_STEP                 (784)
 
 #define HISI_MAX_SENSORS               4
+#define HISI_DEFAULT_SENSOR            2
 
 struct hisi_thermal_sensor {
        struct hisi_thermal_data *thermal;
@@ -54,9 +55,8 @@ struct hisi_thermal_data {
        struct mutex thermal_lock;    /* protects register data */
        struct platform_device *pdev;
        struct clk *clk;
-       struct hisi_thermal_sensor sensors[HISI_MAX_SENSORS];
-
-       int irq, irq_bind_sensor;
+       struct hisi_thermal_sensor sensors;
+       int irq;
        bool irq_enabled;
 
        void __iomem *regs;
@@ -133,7 +133,7 @@ static void hisi_thermal_enable_bind_irq_sensor
 
        mutex_lock(&data->thermal_lock);
 
-       sensor = &data->sensors[data->irq_bind_sensor];
+       sensor = &data->sensors;
 
        /* setting the hdak time */
        writel(0x0, data->regs + TEMP0_CFG);
@@ -181,31 +181,8 @@ static int hisi_thermal_get_temp(void *_sensor, int *temp)
        struct hisi_thermal_sensor *sensor = _sensor;
        struct hisi_thermal_data *data = sensor->thermal;
 
-       int sensor_id = -1, i;
-       long max_temp = 0;
-
        *temp = hisi_thermal_get_sensor_temp(data, sensor);
 
-       sensor->sensor_temp = *temp;
-
-       for (i = 0; i < HISI_MAX_SENSORS; i++) {
-               if (!data->sensors[i].tzd)
-                       continue;
-
-               if (data->sensors[i].sensor_temp >= max_temp) {
-                       max_temp = data->sensors[i].sensor_temp;
-                       sensor_id = i;
-               }
-       }
-
-       /* If no sensor has been enabled, then skip to enable irq */
-       if (sensor_id == -1)
-               return 0;
-
-       mutex_lock(&data->thermal_lock);
-       data->irq_bind_sensor = sensor_id;
-       mutex_unlock(&data->thermal_lock);
-
        dev_dbg(&data->pdev->dev, "id=%d, irq=%d, temp=%d, thres=%d\n",
                sensor->id, data->irq_enabled, *temp, sensor->thres_temp);
        /*
@@ -218,7 +195,7 @@ static int hisi_thermal_get_temp(void *_sensor, int *temp)
                return 0;
        }
 
-       if (max_temp < sensor->thres_temp) {
+       if (*temp < sensor->thres_temp) {
                data->irq_enabled = true;
                hisi_thermal_enable_bind_irq_sensor(data);
                enable_irq(data->irq);
@@ -245,22 +222,16 @@ static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev)
 {
        struct hisi_thermal_data *data = dev;
        struct hisi_thermal_sensor *sensor;
-       int i;
 
        mutex_lock(&data->thermal_lock);
-       sensor = &data->sensors[data->irq_bind_sensor];
+       sensor = &data->sensors;
 
        dev_crit(&data->pdev->dev, "THERMAL ALARM: T > %d\n",
                 sensor->thres_temp);
        mutex_unlock(&data->thermal_lock);
 
-       for (i = 0; i < HISI_MAX_SENSORS; i++) {
-               if (!data->sensors[i].tzd)
-                       continue;
-
-               thermal_zone_device_update(data->sensors[i].tzd,
-                                          THERMAL_EVENT_UNSPECIFIED);
-       }
+       thermal_zone_device_update(data->sensors.tzd,
+                                  THERMAL_EVENT_UNSPECIFIED);
 
        return IRQ_HANDLED;
 }
@@ -317,7 +288,6 @@ static int hisi_thermal_probe(struct platform_device *pdev)
 {
        struct hisi_thermal_data *data;
        struct resource *res;
-       int i;
        int ret;
 
        data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
@@ -359,14 +329,13 @@ static int hisi_thermal_probe(struct platform_device *pdev)
        hisi_thermal_enable_bind_irq_sensor(data);
        data->irq_enabled = true;
 
-       for (i = 0; i < HISI_MAX_SENSORS; ++i) {
-               ret = hisi_thermal_register_sensor(pdev, data,
-                                                  &data->sensors[i], i);
-               if (ret)
-                       dev_err(&pdev->dev,
-                               "failed to register thermal sensor: %d\n", ret);
-               else
-                       hisi_thermal_toggle_sensor(&data->sensors[i], true);
+       ret = hisi_thermal_register_sensor(pdev, data,
+                                          &data->sensors,
+                                          HISI_DEFAULT_SENSOR);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to register thermal sensor: %d\n",
+                       ret);
+               return ret;
        }
 
        ret = devm_request_threaded_irq(&pdev->dev, data->irq,
@@ -378,6 +347,8 @@ static int hisi_thermal_probe(struct platform_device *pdev)
                return ret;
        }
 
+       hisi_thermal_toggle_sensor(&data->sensors, true);
+
        enable_irq(data->irq);
 
        return 0;
@@ -386,17 +357,9 @@ static int hisi_thermal_probe(struct platform_device *pdev)
 static int hisi_thermal_remove(struct platform_device *pdev)
 {
        struct hisi_thermal_data *data = platform_get_drvdata(pdev);
-       int i;
-
-       for (i = 0; i < HISI_MAX_SENSORS; i++) {
-               struct hisi_thermal_sensor *sensor = &data->sensors[i];
-
-               if (!sensor->tzd)
-                       continue;
-
-               hisi_thermal_toggle_sensor(sensor, false);
-       }
+       struct hisi_thermal_sensor *sensor = &data->sensors;
 
+       hisi_thermal_toggle_sensor(sensor, false);
        hisi_thermal_disable_sensor(data);
        clk_disable_unprepare(data->clk);