]> git.karo-electronics.de Git - linux-beck.git/commitdiff
thermal: armada: Support Armada 380 SoC
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Tue, 6 May 2014 16:59:51 +0000 (13:59 -0300)
committerZhang Rui <rui.zhang@intel.com>
Thu, 15 May 2014 09:12:49 +0000 (17:12 +0800)
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>
Documentation/devicetree/bindings/thermal/armada-thermal.txt
drivers/thermal/armada_thermal.c

index 2a67e51358359a2dad7935d0fbd40d0939a333d1..4cf024929a3f4bc900524278cec2b863aff4d714 100644 (file)
@@ -1,4 +1,4 @@
-* Marvell Armada 370/375/XP thermal management
+* Marvell Armada 370/375/380/XP thermal management
 
 Required properties:
 
@@ -6,6 +6,7 @@ Required properties:
                marvell,armada370-thermal
                marvell,armada375-thermal
                marvell,armada375-z1-thermal
+               marvell,armada380-thermal
                marvell,armadaxp-thermal
 
                Note: As the name suggests, "marvell,armada375-z1-thermal"
index e65c5e442ed582f97487459c6d57ef522e4d0603..9d1420acb391b0967ddb60db3c6daae940d908df 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 */
        },