diff options
author | Ezequiel Garcia <ezequiel.garcia@free-electrons.com> | 2014-05-06 13:59:47 -0300 |
---|---|---|
committer | Zhang Rui <rui.zhang@intel.com> | 2014-05-15 17:12:46 +0800 |
commit | 1fcacca40a1c9b45b5390c86c4eefd99ad0f2418 (patch) | |
tree | 53c8b2b49a7bd2b5a636e59a85bdbbf60637ffb6 /drivers/thermal/armada_thermal.c | |
parent | 9484bc62cadd919f072ed1232f25ccc156d8bacf (diff) | |
download | linux-stable-1fcacca40a1c9b45b5390c86c4eefd99ad0f2418.tar.gz linux-stable-1fcacca40a1c9b45b5390c86c4eefd99ad0f2418.tar.bz2 linux-stable-1fcacca40a1c9b45b5390c86c4eefd99ad0f2418.zip |
thermal: armada: Add generic infrastructure to handle the sensor
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>
Diffstat (limited to 'drivers/thermal/armada_thermal.c')
-rw-r--r-- | drivers/thermal/armada_thermal.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c index 4de6e56a0515..2fecccf71e9a 100644 --- a/drivers/thermal/armada_thermal.c +++ b/drivers/thermal/armada_thermal.c @@ -24,10 +24,7 @@ #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, |