diff options
-rw-r--r-- | drivers/thermal/armada_thermal.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c index c5db07104354..4de6e56a0515 100644 --- a/drivers/thermal/armada_thermal.c +++ b/drivers/thermal/armada_thermal.c | |||
@@ -53,6 +53,11 @@ struct armada_thermal_data { | |||
53 | 53 | ||
54 | /* Test for a valid sensor value (optional) */ | 54 | /* Test for a valid sensor value (optional) */ |
55 | bool (*is_valid)(struct armada_thermal_priv *); | 55 | bool (*is_valid)(struct armada_thermal_priv *); |
56 | |||
57 | /* Formula coeficients: temp = (b + m * reg) / div */ | ||
58 | unsigned long coef_b; | ||
59 | unsigned long coef_m; | ||
60 | unsigned long coef_div; | ||
56 | }; | 61 | }; |
57 | 62 | ||
58 | static void armadaxp_init_sensor(struct armada_thermal_priv *priv) | 63 | static void armadaxp_init_sensor(struct armada_thermal_priv *priv) |
@@ -111,6 +116,7 @@ static int armada_get_temp(struct thermal_zone_device *thermal, | |||
111 | { | 116 | { |
112 | struct armada_thermal_priv *priv = thermal->devdata; | 117 | struct armada_thermal_priv *priv = thermal->devdata; |
113 | unsigned long reg; | 118 | unsigned long reg; |
119 | unsigned long m, b, div; | ||
114 | 120 | ||
115 | /* Valid check */ | 121 | /* Valid check */ |
116 | if (priv->data->is_valid && !priv->data->is_valid(priv)) { | 122 | if (priv->data->is_valid && !priv->data->is_valid(priv)) { |
@@ -121,7 +127,13 @@ static int armada_get_temp(struct thermal_zone_device *thermal, | |||
121 | 127 | ||
122 | reg = readl_relaxed(priv->sensor); | 128 | reg = readl_relaxed(priv->sensor); |
123 | reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK; | 129 | reg = (reg >> THERMAL_TEMP_OFFSET) & THERMAL_TEMP_MASK; |
124 | *temp = (3153000000UL - (10000000UL*reg)) / 13825; | 130 | |
131 | /* Get formula coeficients */ | ||
132 | b = priv->data->coef_b; | ||
133 | m = priv->data->coef_m; | ||
134 | div = priv->data->coef_div; | ||
135 | |||
136 | *temp = (b - (m * reg)) / div; | ||
125 | return 0; | 137 | return 0; |
126 | } | 138 | } |
127 | 139 | ||
@@ -131,11 +143,17 @@ static struct thermal_zone_device_ops ops = { | |||
131 | 143 | ||
132 | static const struct armada_thermal_data armadaxp_data = { | 144 | static const struct armada_thermal_data armadaxp_data = { |
133 | .init_sensor = armadaxp_init_sensor, | 145 | .init_sensor = armadaxp_init_sensor, |
146 | .coef_b = 3153000000UL, | ||
147 | .coef_m = 10000000UL, | ||
148 | .coef_div = 13825, | ||
134 | }; | 149 | }; |
135 | 150 | ||
136 | static const struct armada_thermal_data armada370_data = { | 151 | static const struct armada_thermal_data armada370_data = { |
137 | .is_valid = armada_is_valid, | 152 | .is_valid = armada_is_valid, |
138 | .init_sensor = armada370_init_sensor, | 153 | .init_sensor = armada370_init_sensor, |
154 | .coef_b = 3153000000UL, | ||
155 | .coef_m = 10000000UL, | ||
156 | .coef_div = 13825, | ||
139 | }; | 157 | }; |
140 | 158 | ||
141 | static const struct of_device_id armada_thermal_id_table[] = { | 159 | static const struct of_device_id armada_thermal_id_table[] = { |