aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/thermal
diff options
context:
space:
mode:
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>2014-05-06 12:59:51 -0400
committerZhang Rui <rui.zhang@intel.com>2014-05-15 05:12:49 -0400
commite6e0a68c6cd585773fa1fbbd1ca71272afe15203 (patch)
treeeee8fac79a9842b4fb2529833baa6a5c2a1571a3 /drivers/thermal
parente2d5f05b745d19bc889c79977325b14853f3fc38 (diff)
thermal: armada: Support Armada 380 SoC
Now that a generic infrastructure is in place, it's possible to support the Armada 380 SoC thermal sensor. This sensor is similar to the one available in the already supported SoCs, with its specific temperature formula and specific sensor initialization. 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')
-rw-r--r--drivers/thermal/armada_thermal.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/thermal/armada_thermal.c b/drivers/thermal/armada_thermal.c
index e65c5e442ed5..9d1420acb391 100644
--- a/drivers/thermal/armada_thermal.c
+++ b/drivers/thermal/armada_thermal.c
@@ -43,6 +43,7 @@
43#define A375_UNIT_CONTROL_MASK 0x7 43#define A375_UNIT_CONTROL_MASK 0x7
44#define A375_READOUT_INVERT BIT(15) 44#define A375_READOUT_INVERT BIT(15)
45#define A375_HW_RESETn BIT(8) 45#define A375_HW_RESETn BIT(8)
46#define A380_HW_RESET BIT(8)
46 47
47struct armada_thermal_data; 48struct armada_thermal_data;
48 49
@@ -149,6 +150,19 @@ static void armada375_init_sensor(struct platform_device *pdev,
149 mdelay(50); 150 mdelay(50);
150} 151}
151 152
153static void armada380_init_sensor(struct platform_device *pdev,
154 struct armada_thermal_priv *priv)
155{
156 unsigned long reg = readl_relaxed(priv->control);
157
158 /* Reset hardware once */
159 if (!(reg & A380_HW_RESET)) {
160 reg |= A380_HW_RESET;
161 writel(reg, priv->control);
162 mdelay(10);
163 }
164}
165
152static bool armada_is_valid(struct armada_thermal_priv *priv) 166static bool armada_is_valid(struct armada_thermal_priv *priv)
153{ 167{
154 unsigned long reg = readl_relaxed(priv->sensor); 168 unsigned long reg = readl_relaxed(priv->sensor);
@@ -220,6 +234,18 @@ static const struct armada_thermal_data armada375_data = {
220 .coef_div = 13616, 234 .coef_div = 13616,
221}; 235};
222 236
237static const struct armada_thermal_data armada380_data = {
238 .is_valid = armada_is_valid,
239 .init_sensor = armada380_init_sensor,
240 .is_valid_shift = 10,
241 .temp_shift = 0,
242 .temp_mask = 0x3ff,
243 .coef_b = 1169498786UL,
244 .coef_m = 2000000UL,
245 .coef_div = 4289,
246 .inverted = true,
247};
248
223static const struct of_device_id armada_thermal_id_table[] = { 249static const struct of_device_id armada_thermal_id_table[] = {
224 { 250 {
225 .compatible = "marvell,armadaxp-thermal", 251 .compatible = "marvell,armadaxp-thermal",
@@ -238,6 +264,10 @@ static const struct of_device_id armada_thermal_id_table[] = {
238 .data = &armada375_data, 264 .data = &armada375_data,
239 }, 265 },
240 { 266 {
267 .compatible = "marvell,armada380-thermal",
268 .data = &armada380_data,
269 },
270 {
241 /* sentinel */ 271 /* sentinel */
242 }, 272 },
243}; 273};