thermal: armada: Support Armada 380 SoC
[cascardo/linux.git] / drivers / thermal / armada_thermal.c
index e65c5e4..9d1420a 100644 (file)
@@ -43,6 +43,7 @@
 #define A375_UNIT_CONTROL_MASK         0x7
 #define A375_READOUT_INVERT            BIT(15)
 #define A375_HW_RESETn                 BIT(8)
+#define A380_HW_RESET                  BIT(8)
 
 struct armada_thermal_data;
 
@@ -149,6 +150,19 @@ static void armada375_init_sensor(struct platform_device *pdev,
        mdelay(50);
 }
 
+static void armada380_init_sensor(struct platform_device *pdev,
+                                 struct armada_thermal_priv *priv)
+{
+       unsigned long reg = readl_relaxed(priv->control);
+
+       /* Reset hardware once */
+       if (!(reg & A380_HW_RESET)) {
+               reg |= A380_HW_RESET;
+               writel(reg, priv->control);
+               mdelay(10);
+       }
+}
+
 static bool armada_is_valid(struct armada_thermal_priv *priv)
 {
        unsigned long reg = readl_relaxed(priv->sensor);
@@ -220,6 +234,18 @@ static const struct armada_thermal_data armada375_data = {
        .coef_div = 13616,
 };
 
+static const struct armada_thermal_data armada380_data = {
+       .is_valid = armada_is_valid,
+       .init_sensor = armada380_init_sensor,
+       .is_valid_shift = 10,
+       .temp_shift = 0,
+       .temp_mask = 0x3ff,
+       .coef_b = 1169498786UL,
+       .coef_m = 2000000UL,
+       .coef_div = 4289,
+       .inverted = true,
+};
+
 static const struct of_device_id armada_thermal_id_table[] = {
        {
                .compatible = "marvell,armadaxp-thermal",
@@ -237,6 +263,10 @@ static const struct of_device_id armada_thermal_id_table[] = {
                .compatible = "marvell,armada375-z1-thermal",
                .data       = &armada375_data,
        },
+       {
+               .compatible = "marvell,armada380-thermal",
+               .data       = &armada380_data,
+       },
        {
                /* sentinel */
        },