thermal: armada: Add infrastructure to support generic formulas
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Tue, 6 May 2014 16:59:46 +0000 (13:59 -0300)
committerZhang Rui <rui.zhang@intel.com>
Thu, 15 May 2014 09:12:34 +0000 (17:12 +0800)
In order to support other similar SoC, with different sensor
coefficients, this commit adds the coeficients to the per-variant
structure, instead of having the formula 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 c5db071043548fca62d64b7f1f530619e4c7be63..4de6e56a051512f0ca2c6e747027086aca9a91dd 100644 (file)
@@ -53,6 +53,11 @@ struct armada_thermal_data {
 
        /* Test for a valid sensor value (optional) */
        bool (*is_valid)(struct armada_thermal_priv *);
+
+       /* Formula coeficients: temp = (b + m * reg) / div */
+       unsigned long coef_b;
+       unsigned long coef_m;
+       unsigned long coef_div;
 };
 
 static void armadaxp_init_sensor(struct armada_thermal_priv *priv)
@@ -111,6 +116,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal,
 {
        struct armada_thermal_priv *priv = thermal->devdata;
        unsigned long reg;
+       unsigned long m, b, div;
 
        /* Valid check */
        if (priv->data->is_valid && !priv->data->is_valid(priv)) {
@@ -121,7 +127,13 @@ static int armada_get_temp(struct thermal_zone_device *thermal,
 
        reg = readl_relaxed(priv->sensor);
        reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK;
-       *temp = (3153000000UL - (10000000UL*reg)) / 13825;
+
+       /* Get formula coeficients */
+       b = priv->data->coef_b;
+       m = priv->data->coef_m;
+       div = priv->data->coef_div;
+
+       *temp = (b - (m * reg)) / div;
        return 0;
 }
 
@@ -131,11 +143,17 @@ static struct thermal_zone_device_ops ops = {
 
 static const struct armada_thermal_data armadaxp_data = {
        .init_sensor = armadaxp_init_sensor,
+       .coef_b = 3153000000UL,
+       .coef_m = 10000000UL,
+       .coef_div = 13825,
 };
 
 static const struct armada_thermal_data armada370_data = {
        .is_valid = armada_is_valid,
        .init_sensor = armada370_init_sensor,
+       .coef_b = 3153000000UL,
+       .coef_m = 10000000UL,
+       .coef_div = 13825,
 };
 
 static const struct of_device_id armada_thermal_id_table[] = {