]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/thermal/rockchip_thermal.c
Merge remote-tracking branch 'thermal-soc/next'
[karo-tx-linux.git] / drivers / thermal / rockchip_thermal.c
index c89ffb26a35434e67f38c7dfef3a6800cb29b83b..2b58870c3e25f5fad61ca7deda5c6596bfbe7cc8 100644 (file)
@@ -106,16 +106,14 @@ struct rockchip_thermal_data {
 #define TSADCV2_AUTO_PERIOD_HT                 0x6c
 
 #define TSADCV2_AUTO_EN                                BIT(0)
-#define TSADCV2_AUTO_DISABLE                   ~BIT(0)
 #define TSADCV2_AUTO_SRC_EN(chn)               BIT(4 + (chn))
 #define TSADCV2_AUTO_TSHUT_POLARITY_HIGH       BIT(8)
-#define TSADCV2_AUTO_TSHUT_POLARITY_LOW                ~BIT(8)
 
 #define TSADCV2_INT_SRC_EN(chn)                        BIT(chn)
 #define TSADCV2_SHUT_2GPIO_SRC_EN(chn)         BIT(4 + (chn))
 #define TSADCV2_SHUT_2CRU_SRC_EN(chn)          BIT(8 + (chn))
 
-#define TSADCV2_INT_PD_CLEAR                   ~BIT(8)
+#define TSADCV2_INT_PD_CLEAR_MASK              ~BIT(8)
 
 #define TSADCV2_DATA_MASK                      0xfff
 #define TSADCV2_HIGHT_INT_DEBOUNCE_COUNT       4
@@ -124,7 +122,7 @@ struct rockchip_thermal_data {
 #define TSADCV2_AUTO_PERIOD_HT_TIME            50  /* msec */
 
 struct tsadc_table {
-       unsigned long code;
+       u32 code;
        long temp;
 };
 
@@ -164,7 +162,6 @@ static const struct tsadc_table v2_code_table[] = {
        {3452, 115000},
        {3437, 120000},
        {3421, 125000},
-       {0, 125000},
 };
 
 static u32 rk_tsadcv2_temp_to_code(long temp)
@@ -191,19 +188,21 @@ static u32 rk_tsadcv2_temp_to_code(long temp)
        return 0;
 }
 
-static int rk_tsadcv2_code_to_temp(u32 code)
+static int rk_tsadcv2_code_to_temp(u32 code, int *temp)
 {
-       unsigned int low = 0;
+       unsigned int low = 1;
        unsigned int high = ARRAY_SIZE(v2_code_table) - 1;
        unsigned int mid = (low + high) / 2;
        unsigned int num;
        unsigned long denom;
 
-       /* Invalid code, return -EAGAIN */
-       if (code > TSADCV2_DATA_MASK)
-               return -EAGAIN;
+       BUILD_BUG_ON(ARRAY_SIZE(v2_code_table) < 2);
 
-       while (low <= high && mid) {
+       code &= TSADCV2_DATA_MASK;
+       if (code < v2_code_table[high].code)
+               return -EAGAIN;         /* Incorrect reading */
+
+       while (low <= high) {
                if (code >= v2_code_table[mid].code &&
                    code < v2_code_table[mid - 1].code)
                        break;
@@ -223,7 +222,9 @@ static int rk_tsadcv2_code_to_temp(u32 code)
        num = v2_code_table[mid].temp - v2_code_table[mid - 1].temp;
        num *= v2_code_table[mid - 1].code - code;
        denom = v2_code_table[mid - 1].code - v2_code_table[mid].code;
-       return v2_code_table[mid - 1].temp + (num / denom);
+       *temp = v2_code_table[mid - 1].temp + (num / denom);
+
+       return 0;
 }
 
 /**
@@ -241,10 +242,10 @@ static void rk_tsadcv2_initialize(void __iomem *regs,
                                  enum tshut_polarity tshut_polarity)
 {
        if (tshut_polarity == TSHUT_HIGH_ACTIVE)
-               writel_relaxed(0 | (TSADCV2_AUTO_TSHUT_POLARITY_HIGH),
+               writel_relaxed(0U | TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
                               regs + TSADCV2_AUTO_CON);
        else
-               writel_relaxed(0 | (TSADCV2_AUTO_TSHUT_POLARITY_LOW),
+               writel_relaxed(0U & ~TSADCV2_AUTO_TSHUT_POLARITY_HIGH,
                               regs + TSADCV2_AUTO_CON);
 
        writel_relaxed(TSADCV2_AUTO_PERIOD_TIME, regs + TSADCV2_AUTO_PERIOD);
@@ -261,7 +262,7 @@ static void rk_tsadcv2_irq_ack(void __iomem *regs)
        u32 val;
 
        val = readl_relaxed(regs + TSADCV2_INT_PD);
-       writel_relaxed(val & TSADCV2_INT_PD_CLEAR, regs + TSADCV2_INT_PD);
+       writel_relaxed(val & TSADCV2_INT_PD_CLEAR_MASK, regs + TSADCV2_INT_PD);
 }
 
 static void rk_tsadcv2_control(void __iomem *regs, bool enable)
@@ -281,14 +282,9 @@ static int rk_tsadcv2_get_temp(int chn, void __iomem *regs, int *temp)
 {
        u32 val;
 
-       /* the A/D value of the channel last conversion need some time */
        val = readl_relaxed(regs + TSADCV2_DATA(chn));
-       if (val == 0)
-               return -EAGAIN;
 
-       *temp = rk_tsadcv2_code_to_temp(val);
-
-       return 0;
+       return rk_tsadcv2_code_to_temp(val, temp);
 }
 
 static void rk_tsadcv2_tshut_temp(int chn, void __iomem *regs, long temp)
@@ -642,6 +638,8 @@ static int __maybe_unused rockchip_thermal_suspend(struct device *dev)
        clk_disable(thermal->pclk);
        clk_disable(thermal->clk);
 
+       pinctrl_pm_select_sleep_state(dev);
+
        return 0;
 }
 
@@ -678,6 +676,8 @@ static int __maybe_unused rockchip_thermal_resume(struct device *dev)
        for (i = 0; i < ARRAY_SIZE(thermal->sensors); i++)
                rockchip_thermal_toggle_sensor(&thermal->sensors[i], true);
 
+       pinctrl_pm_select_default_state(dev);
+
        return 0;
 }