]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/thermal/hisi_thermal.c
Merge branch 'for-upstream/hdlcd' of git://linux-arm.org/linux-ld into drm-fixes
[mirror_ubuntu-bionic-kernel.git] / drivers / thermal / hisi_thermal.c
index 65f9e5c80741e34bf74454c82372cda9602bff98..2d855a96cdd9886c5f3abbcfb4e1d8a5c1ea8666 100644 (file)
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
+#include <linux/of_device.h>
 
 #include "thermal_core.h"
 
-#define TEMP0_LAG                      (0x0)
-#define TEMP0_TH                       (0x4)
-#define TEMP0_RST_TH                   (0x8)
-#define TEMP0_CFG                      (0xC)
-#define TEMP0_CFG_SS_MSK               (0xF000)
-#define TEMP0_CFG_HDAK_MSK             (0x30)
-#define TEMP0_EN                       (0x10)
-#define TEMP0_INT_EN                   (0x14)
-#define TEMP0_INT_CLR                  (0x18)
-#define TEMP0_RST_MSK                  (0x1C)
-#define TEMP0_VALUE                    (0x28)
-
-#define HISI_TEMP_BASE                 (-60000)
-#define HISI_TEMP_RESET                        (100000)
-#define HISI_TEMP_STEP                 (785)
-#define HISI_TEMP_LAG                  (3500)
-
-#define HISI_MAX_SENSORS               4
-#define HISI_DEFAULT_SENSOR            2
+#define HI6220_TEMP0_LAG                       (0x0)
+#define HI6220_TEMP0_TH                                (0x4)
+#define HI6220_TEMP0_RST_TH                    (0x8)
+#define HI6220_TEMP0_CFG                       (0xC)
+#define HI6220_TEMP0_CFG_SS_MSK                        (0xF000)
+#define HI6220_TEMP0_CFG_HDAK_MSK              (0x30)
+#define HI6220_TEMP0_EN                                (0x10)
+#define HI6220_TEMP0_INT_EN                    (0x14)
+#define HI6220_TEMP0_INT_CLR                   (0x18)
+#define HI6220_TEMP0_RST_MSK                   (0x1C)
+#define HI6220_TEMP0_VALUE                     (0x28)
+
+#define HI3660_OFFSET(chan)            ((chan) * 0x40)
+#define HI3660_TEMP(chan)              (HI3660_OFFSET(chan) + 0x1C)
+#define HI3660_TH(chan)                        (HI3660_OFFSET(chan) + 0x20)
+#define HI3660_LAG(chan)               (HI3660_OFFSET(chan) + 0x28)
+#define HI3660_INT_EN(chan)            (HI3660_OFFSET(chan) + 0x2C)
+#define HI3660_INT_CLR(chan)           (HI3660_OFFSET(chan) + 0x30)
+
+#define HI6220_TEMP_BASE                       (-60000)
+#define HI6220_TEMP_RESET                      (100000)
+#define HI6220_TEMP_STEP                       (785)
+#define HI6220_TEMP_LAG                                (3500)
+
+#define HI3660_TEMP_BASE               (-63780)
+#define HI3660_TEMP_STEP               (205)
+#define HI3660_TEMP_LAG                        (4000)
+
+#define HI6220_DEFAULT_SENSOR          2
+#define HI3660_DEFAULT_SENSOR          1
 
 struct hisi_thermal_sensor {
        struct thermal_zone_device *tzd;
@@ -53,6 +65,10 @@ struct hisi_thermal_sensor {
 };
 
 struct hisi_thermal_data {
+       int (*get_temp)(struct hisi_thermal_data *data);
+       int (*enable_sensor)(struct hisi_thermal_data *data);
+       int (*disable_sensor)(struct hisi_thermal_data *data);
+       int (*irq_handler)(struct hisi_thermal_data *data);
        struct platform_device *pdev;
        struct clk *clk;
        struct hisi_thermal_sensor sensor;
@@ -78,14 +94,32 @@ struct hisi_thermal_data {
  *     steps = (Temp - TempBase) / 785
  *
  */
-static inline int hisi_thermal_step_to_temp(int step)
+static inline int hi6220_thermal_step_to_temp(int step)
 {
-       return HISI_TEMP_BASE + (step * HISI_TEMP_STEP);
+       return HI6220_TEMP_BASE + (step * HI6220_TEMP_STEP);
 }
 
-static inline int hisi_thermal_temp_to_step(int temp)
+static inline int hi6220_thermal_temp_to_step(int temp)
 {
-       return DIV_ROUND_UP(temp - HISI_TEMP_BASE, HISI_TEMP_STEP);
+       return DIV_ROUND_UP(temp - HI6220_TEMP_BASE, HI6220_TEMP_STEP);
+}
+
+/*
+ * for Hi3660,
+ *     Step: 189/922 (0.205)
+ *     Temperature base: -63.780°C
+ *
+ * The register is programmed in temperature steps, every step is 205
+ * millidegree and begins at -63 780 m°C
+ */
+static inline int hi3660_thermal_step_to_temp(int step)
+{
+       return HI3660_TEMP_BASE + step * HI3660_TEMP_STEP;
+}
+
+static inline int hi3660_thermal_temp_to_step(int temp)
+{
+       return DIV_ROUND_UP(temp - HI3660_TEMP_BASE, HI3660_TEMP_STEP);
 }
 
 /*
@@ -112,51 +146,92 @@ static inline int hisi_thermal_temp_to_step(int temp)
  *
  * [0:4] : lag register
  *
- * The temperature is coded in steps, cf. HISI_TEMP_STEP.
+ * The temperature is coded in steps, cf. HI6220_TEMP_STEP.
  *
  * Min : 0x00 :  0.0 °C
  * Max : 0x1F : 24.3 °C
  *
  * The 'value' parameter is in milliCelsius.
  */
-static inline void hisi_thermal_set_lag(void __iomem *addr, int value)
+static inline void hi6220_thermal_set_lag(void __iomem *addr, int value)
 {
-       writel(DIV_ROUND_UP(value, HISI_TEMP_STEP) & 0x1F, addr + TEMP0_LAG);
+       writel(DIV_ROUND_UP(value, HI6220_TEMP_STEP) & 0x1F,
+                       addr + HI6220_TEMP0_LAG);
 }
 
-static inline void hisi_thermal_alarm_clear(void __iomem *addr, int value)
+static inline void hi6220_thermal_alarm_clear(void __iomem *addr, int value)
 {
-       writel(value, addr + TEMP0_INT_CLR);
+       writel(value, addr + HI6220_TEMP0_INT_CLR);
 }
 
-static inline void hisi_thermal_alarm_enable(void __iomem *addr, int value)
+static inline void hi6220_thermal_alarm_enable(void __iomem *addr, int value)
 {
-       writel(value, addr + TEMP0_INT_EN);
+       writel(value, addr + HI6220_TEMP0_INT_EN);
 }
 
-static inline void hisi_thermal_alarm_set(void __iomem *addr, int temp)
+static inline void hi6220_thermal_alarm_set(void __iomem *addr, int temp)
 {
-       writel(hisi_thermal_temp_to_step(temp) | 0x0FFFFFF00, addr + TEMP0_TH);
+       writel(hi6220_thermal_temp_to_step(temp) | 0x0FFFFFF00,
+              addr + HI6220_TEMP0_TH);
 }
 
-static inline void hisi_thermal_reset_set(void __iomem *addr, int temp)
+static inline void hi6220_thermal_reset_set(void __iomem *addr, int temp)
 {
-       writel(hisi_thermal_temp_to_step(temp), addr + TEMP0_RST_TH);
+       writel(hi6220_thermal_temp_to_step(temp), addr + HI6220_TEMP0_RST_TH);
 }
 
-static inline void hisi_thermal_reset_enable(void __iomem *addr, int value)
+static inline void hi6220_thermal_reset_enable(void __iomem *addr, int value)
 {
-       writel(value, addr + TEMP0_RST_MSK);
+       writel(value, addr + HI6220_TEMP0_RST_MSK);
 }
 
-static inline void hisi_thermal_enable(void __iomem *addr, int value)
+static inline void hi6220_thermal_enable(void __iomem *addr, int value)
 {
-       writel(value, addr + TEMP0_EN);
+       writel(value, addr + HI6220_TEMP0_EN);
 }
 
-static inline int hisi_thermal_get_temperature(void __iomem *addr)
+static inline int hi6220_thermal_get_temperature(void __iomem *addr)
 {
-       return hisi_thermal_step_to_temp(readl(addr + TEMP0_VALUE));
+       return hi6220_thermal_step_to_temp(readl(addr + HI6220_TEMP0_VALUE));
+}
+
+/*
+ * [0:6] lag register
+ *
+ * The temperature is coded in steps, cf. HI3660_TEMP_STEP.
+ *
+ * Min : 0x00 :  0.0 °C
+ * Max : 0x7F : 26.0 °C
+ *
+ */
+static inline void hi3660_thermal_set_lag(void __iomem *addr,
+                                         int id, int value)
+{
+       writel(DIV_ROUND_UP(value, HI3660_TEMP_STEP) & 0x7F,
+                       addr + HI3660_LAG(id));
+}
+
+static inline void hi3660_thermal_alarm_clear(void __iomem *addr,
+                                             int id, int value)
+{
+       writel(value, addr + HI3660_INT_CLR(id));
+}
+
+static inline void hi3660_thermal_alarm_enable(void __iomem *addr,
+                                              int id, int value)
+{
+       writel(value, addr + HI3660_INT_EN(id));
+}
+
+static inline void hi3660_thermal_alarm_set(void __iomem *addr,
+                                           int id, int value)
+{
+       writel(value, addr + HI3660_TH(id));
+}
+
+static inline int hi3660_thermal_get_temperature(void __iomem *addr, int id)
+{
+       return hi3660_thermal_step_to_temp(readl(addr + HI3660_TEMP(id)));
 }
 
 /*
@@ -169,10 +244,10 @@ static inline int hisi_thermal_get_temperature(void __iomem *addr)
  * 0x2: remote sensor 2 (ACPU cluster 0)
  * 0x3: remote sensor 3 (G3D)
  */
-static inline void hisi_thermal_sensor_select(void __iomem *addr, int sensor)
+static inline void hi6220_thermal_sensor_select(void __iomem *addr, int sensor)
 {
-       writel((readl(addr + TEMP0_CFG) & ~TEMP0_CFG_SS_MSK) |
-              (sensor << 12), addr + TEMP0_CFG);
+       writel((readl(addr + HI6220_TEMP0_CFG) & ~HI6220_TEMP0_CFG_SS_MSK) |
+              (sensor << 12), addr + HI6220_TEMP0_CFG);
 }
 
 /*
@@ -185,20 +260,174 @@ static inline void hisi_thermal_sensor_select(void __iomem *addr, int sensor)
  * 0x2 :  49.152 ms
  * 0x3 : 393.216 ms
  */
-static inline void hisi_thermal_hdak_set(void __iomem *addr, int value)
+static inline void hi6220_thermal_hdak_set(void __iomem *addr, int value)
+{
+       writel((readl(addr + HI6220_TEMP0_CFG) & ~HI6220_TEMP0_CFG_HDAK_MSK) |
+              (value << 4), addr + HI6220_TEMP0_CFG);
+}
+
+static int hi6220_thermal_irq_handler(struct hisi_thermal_data *data)
+{
+       hi6220_thermal_alarm_clear(data->regs, 1);
+       return 0;
+}
+
+static int hi3660_thermal_irq_handler(struct hisi_thermal_data *data)
 {
-       writel((readl(addr + TEMP0_CFG) & ~TEMP0_CFG_HDAK_MSK) |
-              (value << 4), addr + TEMP0_CFG);
+       hi3660_thermal_alarm_clear(data->regs, data->sensor.id, 1);
+       return 0;
 }
 
-static void hisi_thermal_disable_sensor(struct hisi_thermal_data *data)
+static int hi6220_thermal_get_temp(struct hisi_thermal_data *data)
+{
+       return hi6220_thermal_get_temperature(data->regs);
+}
+
+static int hi3660_thermal_get_temp(struct hisi_thermal_data *data)
+{
+       return hi3660_thermal_get_temperature(data->regs, data->sensor.id);
+}
+
+static int hi6220_thermal_disable_sensor(struct hisi_thermal_data *data)
 {
        /* disable sensor module */
-       hisi_thermal_enable(data->regs, 0);
-       hisi_thermal_alarm_enable(data->regs, 0);
-       hisi_thermal_reset_enable(data->regs, 0);
+       hi6220_thermal_enable(data->regs, 0);
+       hi6220_thermal_alarm_enable(data->regs, 0);
+       hi6220_thermal_reset_enable(data->regs, 0);
 
        clk_disable_unprepare(data->clk);
+
+       return 0;
+}
+
+static int hi3660_thermal_disable_sensor(struct hisi_thermal_data *data)
+{
+       /* disable sensor module */
+       hi3660_thermal_alarm_enable(data->regs, data->sensor.id, 0);
+       return 0;
+}
+
+static int hi6220_thermal_enable_sensor(struct hisi_thermal_data *data)
+{
+       struct hisi_thermal_sensor *sensor = &data->sensor;
+       int ret;
+
+       /* enable clock for tsensor */
+       ret = clk_prepare_enable(data->clk);
+       if (ret)
+               return ret;
+
+       /* disable module firstly */
+       hi6220_thermal_reset_enable(data->regs, 0);
+       hi6220_thermal_enable(data->regs, 0);
+
+       /* select sensor id */
+       hi6220_thermal_sensor_select(data->regs, sensor->id);
+
+       /* setting the hdak time */
+       hi6220_thermal_hdak_set(data->regs, 0);
+
+       /* setting lag value between current temp and the threshold */
+       hi6220_thermal_set_lag(data->regs, HI6220_TEMP_LAG);
+
+       /* enable for interrupt */
+       hi6220_thermal_alarm_set(data->regs, sensor->thres_temp);
+
+       hi6220_thermal_reset_set(data->regs, HI6220_TEMP_RESET);
+
+       /* enable module */
+       hi6220_thermal_reset_enable(data->regs, 1);
+       hi6220_thermal_enable(data->regs, 1);
+
+       hi6220_thermal_alarm_clear(data->regs, 0);
+       hi6220_thermal_alarm_enable(data->regs, 1);
+
+       return 0;
+}
+
+static int hi3660_thermal_enable_sensor(struct hisi_thermal_data *data)
+{
+       unsigned int value;
+       struct hisi_thermal_sensor *sensor = &data->sensor;
+
+       /* disable interrupt */
+       hi3660_thermal_alarm_enable(data->regs, sensor->id, 0);
+
+       /* setting lag value between current temp and the threshold */
+       hi3660_thermal_set_lag(data->regs, sensor->id, HI3660_TEMP_LAG);
+
+       /* set interrupt threshold */
+       value = hi3660_thermal_temp_to_step(sensor->thres_temp);
+       hi3660_thermal_alarm_set(data->regs, sensor->id, value);
+
+       /* enable interrupt */
+       hi3660_thermal_alarm_clear(data->regs, sensor->id, 1);
+       hi3660_thermal_alarm_enable(data->regs, sensor->id, 1);
+
+       return 0;
+}
+
+static int hi6220_thermal_probe(struct hisi_thermal_data *data)
+{
+       struct platform_device *pdev = data->pdev;
+       struct device *dev = &pdev->dev;
+       struct resource *res;
+       int ret;
+
+       data->get_temp = hi6220_thermal_get_temp;
+       data->enable_sensor = hi6220_thermal_enable_sensor;
+       data->disable_sensor = hi6220_thermal_disable_sensor;
+       data->irq_handler = hi6220_thermal_irq_handler;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       data->regs = devm_ioremap_resource(dev, res);
+       if (IS_ERR(data->regs)) {
+               dev_err(dev, "failed to get io address\n");
+               return PTR_ERR(data->regs);
+       }
+
+       data->clk = devm_clk_get(dev, "thermal_clk");
+       if (IS_ERR(data->clk)) {
+               ret = PTR_ERR(data->clk);
+               if (ret != -EPROBE_DEFER)
+                       dev_err(dev, "failed to get thermal clk: %d\n", ret);
+               return ret;
+       }
+
+       data->irq = platform_get_irq(pdev, 0);
+       if (data->irq < 0)
+               return data->irq;
+
+       data->sensor.id = HI6220_DEFAULT_SENSOR;
+
+       return 0;
+}
+
+static int hi3660_thermal_probe(struct hisi_thermal_data *data)
+{
+       struct platform_device *pdev = data->pdev;
+       struct device *dev = &pdev->dev;
+       struct resource *res;
+
+       data->get_temp = hi3660_thermal_get_temp;
+       data->enable_sensor = hi3660_thermal_enable_sensor;
+       data->disable_sensor = hi3660_thermal_disable_sensor;
+       data->irq_handler = hi3660_thermal_irq_handler;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       data->regs = devm_ioremap_resource(dev, res);
+       if (IS_ERR(data->regs)) {
+               dev_err(dev, "failed to get io address\n");
+               return PTR_ERR(data->regs);
+       }
+
+       data->irq = platform_get_irq(pdev, 0);
+       if (data->irq < 0)
+               return data->irq;
+
+       data->sensor.id = HI3660_DEFAULT_SENSOR;
+
+       return 0;
 }
 
 static int hisi_thermal_get_temp(void *__data, int *temp)
@@ -206,7 +435,7 @@ static int hisi_thermal_get_temp(void *__data, int *temp)
        struct hisi_thermal_data *data = __data;
        struct hisi_thermal_sensor *sensor = &data->sensor;
 
-       *temp = hisi_thermal_get_temperature(data->regs);
+       *temp = data->get_temp(data);
 
        dev_dbg(&data->pdev->dev, "id=%d, temp=%d, thres=%d\n",
                sensor->id, *temp, sensor->thres_temp);
@@ -222,11 +451,11 @@ static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev)
 {
        struct hisi_thermal_data *data = dev;
        struct hisi_thermal_sensor *sensor = &data->sensor;
-       int temp;
+       int temp = 0;
 
-       hisi_thermal_alarm_clear(data->regs, 1);
+       data->irq_handler(data);
 
-       temp = hisi_thermal_get_temperature(data->regs);
+       hisi_thermal_get_temp(data, &temp);
 
        if (temp >= sensor->thres_temp) {
                dev_crit(&data->pdev->dev, "THERMAL ALARM: %d > %d\n",
@@ -235,7 +464,7 @@ static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev)
                thermal_zone_device_update(data->sensor.tzd,
                                           THERMAL_EVENT_UNSPECIFIED);
 
-       } else if (temp < sensor->thres_temp) {
+       } else {
                dev_crit(&data->pdev->dev, "THERMAL ALARM stopped: %d < %d\n",
                         temp, sensor->thres_temp);
        }
@@ -245,14 +474,11 @@ static irqreturn_t hisi_thermal_alarm_irq_thread(int irq, void *dev)
 
 static int hisi_thermal_register_sensor(struct platform_device *pdev,
                                        struct hisi_thermal_data *data,
-                                       struct hisi_thermal_sensor *sensor,
-                                       int index)
+                                       struct hisi_thermal_sensor *sensor)
 {
        int ret, i;
        const struct thermal_trip *trip;
 
-       sensor->id = index;
-
        sensor->tzd = devm_thermal_zone_of_sensor_register(&pdev->dev,
                                                           sensor->id, data,
                                                           &hisi_of_thermal_ops);
@@ -277,7 +503,14 @@ static int hisi_thermal_register_sensor(struct platform_device *pdev,
 }
 
 static const struct of_device_id of_hisi_thermal_match[] = {
-       { .compatible = "hisilicon,tsensor" },
+       {
+               .compatible = "hisilicon,tsensor",
+               .data = hi6220_thermal_probe
+       },
+       {
+               .compatible = "hisilicon,hi3660-tsensor",
+               .data = hi3660_thermal_probe
+       },
        { /* end */ }
 };
 MODULE_DEVICE_TABLE(of, of_hisi_thermal_match);
@@ -291,99 +524,51 @@ static void hisi_thermal_toggle_sensor(struct hisi_thermal_sensor *sensor,
                on ? THERMAL_DEVICE_ENABLED : THERMAL_DEVICE_DISABLED);
 }
 
-static int hisi_thermal_setup(struct hisi_thermal_data *data)
-{
-       struct hisi_thermal_sensor *sensor = &data->sensor;
-       int ret;
-
-       /* enable clock for tsensor */
-       ret = clk_prepare_enable(data->clk);
-       if (ret)
-               return ret;
-
-       /* disable module firstly */
-       hisi_thermal_reset_enable(data->regs, 0);
-       hisi_thermal_enable(data->regs, 0);
-
-       /* select sensor id */
-       hisi_thermal_sensor_select(data->regs, sensor->id);
-
-       /* setting the hdak time */
-       hisi_thermal_hdak_set(data->regs, 0);
-
-       /* setting lag value between current temp and the threshold */
-       hisi_thermal_set_lag(data->regs, HISI_TEMP_LAG);
-
-       /* enable for interrupt */
-       hisi_thermal_alarm_set(data->regs, sensor->thres_temp);
-
-       hisi_thermal_reset_set(data->regs, HISI_TEMP_RESET);
-
-       /* enable module */
-       hisi_thermal_reset_enable(data->regs, 1);
-       hisi_thermal_enable(data->regs, 1);
-
-       hisi_thermal_alarm_clear(data->regs, 0);
-       hisi_thermal_alarm_enable(data->regs, 1);
-
-       return 0;
-}
-
 static int hisi_thermal_probe(struct platform_device *pdev)
 {
        struct hisi_thermal_data *data;
-       struct resource *res;
+       int const (*platform_probe)(struct hisi_thermal_data *);
+       struct device *dev = &pdev->dev;
        int ret;
 
-       data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+       data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
        if (!data)
                return -ENOMEM;
 
        data->pdev = pdev;
+       platform_set_drvdata(pdev, data);
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       data->regs = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(data->regs)) {
-               dev_err(&pdev->dev, "failed to get io address\n");
-               return PTR_ERR(data->regs);
+       platform_probe = of_device_get_match_data(dev);
+       if (!platform_probe) {
+               dev_err(dev, "failed to get probe func\n");
+               return -EINVAL;
        }
 
-       data->irq = platform_get_irq(pdev, 0);
-       if (data->irq < 0)
-               return data->irq;
-
-       platform_set_drvdata(pdev, data);
-
-       data->clk = devm_clk_get(&pdev->dev, "thermal_clk");
-       if (IS_ERR(data->clk)) {
-               ret = PTR_ERR(data->clk);
-               if (ret != -EPROBE_DEFER)
-                       dev_err(&pdev->dev,
-                               "failed to get thermal clk: %d\n", ret);
+       ret = platform_probe(data);
+       if (ret)
                return ret;
-       }
 
        ret = hisi_thermal_register_sensor(pdev, data,
-                                          &data->sensor,
-                                          HISI_DEFAULT_SENSOR);
+                                          &data->sensor);
        if (ret) {
-               dev_err(&pdev->dev, "failed to register thermal sensor: %d\n",
-                       ret);
+               dev_err(dev, "failed to register thermal sensor: %d\n", ret);
                return ret;
        }
 
-       ret = hisi_thermal_setup(data);
+       ret = data->enable_sensor(data);
        if (ret) {
-               dev_err(&pdev->dev, "Failed to setup the sensor: %d\n", ret);
+               dev_err(dev, "Failed to setup the sensor: %d\n", ret);
                return ret;
        }
 
-       ret = devm_request_threaded_irq(&pdev->dev, data->irq, NULL,
-                                       hisi_thermal_alarm_irq_thread,
-                                       IRQF_ONESHOT, "hisi_thermal", data);
-       if (ret < 0) {
-               dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret);
-               return ret;
+       if (data->irq) {
+               ret = devm_request_threaded_irq(dev, data->irq, NULL,
+                               hisi_thermal_alarm_irq_thread,
+                               IRQF_ONESHOT, "hisi_thermal", data);
+               if (ret < 0) {
+                       dev_err(dev, "failed to request alarm irq: %d\n", ret);
+                       return ret;
+               }
        }
 
        hisi_thermal_toggle_sensor(&data->sensor, true);
@@ -397,7 +582,8 @@ static int hisi_thermal_remove(struct platform_device *pdev)
        struct hisi_thermal_sensor *sensor = &data->sensor;
 
        hisi_thermal_toggle_sensor(sensor, false);
-       hisi_thermal_disable_sensor(data);
+
+       data->disable_sensor(data);
 
        return 0;
 }
@@ -407,7 +593,7 @@ static int hisi_thermal_suspend(struct device *dev)
 {
        struct hisi_thermal_data *data = dev_get_drvdata(dev);
 
-       hisi_thermal_disable_sensor(data);
+       data->disable_sensor(data);
 
        return 0;
 }
@@ -416,7 +602,7 @@ static int hisi_thermal_resume(struct device *dev)
 {
        struct hisi_thermal_data *data = dev_get_drvdata(dev);
 
-       return hisi_thermal_setup(data);
+       return data->enable_sensor(data);
 }
 #endif