thermal: armada: Add generic infrastructure to handle the sensor
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Tue, 6 May 2014 16:59:47 +0000 (13:59 -0300)
committerZhang Rui <rui.zhang@intel.com>
Thu, 15 May 2014 09:12:46 +0000 (17:12 +0800)
In order to support similar SoC where the sensor value and valid
bit can have different shifts and/or mask, we add such fields to the
per-variant structure, instead of having the values hardcoded.

Acked-by: Jason Cooper <jason@lakedaemon.net>
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
drivers/thermal/armada_thermal.c

index 4de6e56a051512f0ca2c6e747027086aca9a91dd..2fecccf71e9a09603a6e4af82df00bbd6e3034d2 100644 (file)
 #include <linux/of_device.h>
 #include <linux/thermal.h>
 
-#define THERMAL_VALID_OFFSET           9
 #define THERMAL_VALID_MASK             0x1
-#define THERMAL_TEMP_OFFSET            10
-#define THERMAL_TEMP_MASK              0x1ff
 
 /* Thermal Manager Control and Status Register */
 #define PMU_TDC0_SW_RST_MASK           (0x1 << 1)
@@ -58,6 +55,11 @@ struct armada_thermal_data {
        unsigned long coef_b;
        unsigned long coef_m;
        unsigned long coef_div;
+
+       /* Register shift and mask to access the sensor temperature */
+       unsigned int temp_shift;
+       unsigned int temp_mask;
+       unsigned int is_valid_shift;
 };
 
 static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
@@ -108,7 +110,7 @@ static bool armada_is_valid(struct armada_thermal_priv *priv)
 {
        unsigned long reg = readl_relaxed(priv->sensor);
 
-       return (reg >> THERMAL_VALID_OFFSET) & THERMAL_VALID_MASK;
+       return (reg >> priv->data->is_valid_shift) & THERMAL_VALID_MASK;
 }
 
 static int armada_get_temp(struct thermal_zone_device *thermal,
@@ -126,7 +128,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal,
        }
 
        reg = readl_relaxed(priv->sensor);
-       reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
+       reg = (reg >> priv->data->temp_shift) & priv->data->temp_mask;
 
        /* Get formula coeficients */
        b = priv->data->coef_b;
@@ -143,6 +145,8 @@ static struct thermal_zone_device_ops ops = {
 
 static const struct armada_thermal_data armadaxp_data = {
        .init_sensor = armadaxp_init_sensor,
+       .temp_shift = 10,
+       .temp_mask = 0x1ff,
        .coef_b = 3153000000UL,
        .coef_m = 10000000UL,
        .coef_div = 13825,
@@ -151,6 +155,9 @@ static const struct armada_thermal_data armadaxp_data = {
 static const struct armada_thermal_data armada370_data = {
        .is_valid = armada_is_valid,
        .init_sensor = armada370_init_sensor,
+       .is_valid_shift = 9,
+       .temp_shift = 10,
+       .temp_mask = 0x1ff,
        .coef_b = 3153000000UL,
        .coef_m = 10000000UL,
        .coef_div = 13825,