ARM: mvebu: add Armada 375 support to the coherency code
authorThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Mon, 14 Apr 2014 13:47:04 +0000 (15:47 +0200)
committerJason Cooper <jason@lakedaemon.net>
Thu, 24 Apr 2014 05:00:37 +0000 (05:00 +0000)
The Armada 375, like the Armada 370 and Armada XP, has a coherency
unit. However, unlike the coherency unit of 370/XP which does both CPU
and I/O coherency, the one on Armada 735 only does I/O
coherency. Therefore, instead of having two sets of registers (the
first one being used mainly to register each CPU in the coherency
fabric, the second one being used for the I/O coherency barrier), it
has only one set of register (for the I/O coherency barrier).

This commit adds a new "marvell,armada-375-coherency-fabric"
compatible string for this variant of the coherency fabric. The custom
DMA operations, and the way of triggering an I/O barrier is the same
as Armada 370/XP, so the code changes are minimal. However, the
set_cpu_coherent() function is not needed on Armada 375 and will not
work.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Link: https://lkml.kernel.org/r/1397483228-25625-7-git-send-email-thomas.petazzoni@free-electrons.com
Signed-off-by: Jason Cooper <jason@lakedaemon.net>
Documentation/devicetree/bindings/arm/coherency-fabric.txt
arch/arm/mach-mvebu/coherency.c

index f0bfa37edfc6a6011ab536af7b0bd9bc367a60a2..dcd80d6e04719166c7e9eac73235bfdfee3bf024 100644 (file)
@@ -1,6 +1,6 @@
 Coherency fabric
 ----------------
-Available on Marvell SOCs: Armada 370 and Armada XP
+Available on Marvell SOCs: Armada 370, Armada 375 and Armada XP
 
 Required properties:
 
@@ -9,11 +9,20 @@ Required properties:
  * "marvell,coherency-fabric", to be used for the coherency fabric of
    the Armada 370 and Armada XP.
 
+ * "marvell,armada-375-coherency-fabric", for the Armada 375 coherency
+   fabric.
+
 - reg: Should contain coherency fabric registers location and
-  length. First pair for the coherency fabric registers, second pair
-  for the per-CPU fabric registers registers.
+  length.
+
+ * For "marvell,coherency-fabric", the first pair for the coherency
+   fabric registers, second pair for the per-CPU fabric registers.
+
+ * For "marvell,armada-375-coherency-fabric", only one pair is needed
+   for the per-CPU fabric registers.
 
-Example:
+
+Examples:
 
 coherency-fabric@d0020200 {
        compatible = "marvell,coherency-fabric";
@@ -22,3 +31,8 @@ coherency-fabric@d0020200 {
 
 };
 
+coherency-fabric@21810 {
+       compatible = "marvell,armada-375-coherency-fabric";
+       reg = <0x21810 0x1c>;
+};
+
index 862100f7c8366810a815884494e5a52a916a4c26..7ccaf87fd7729501a4bd1655c30a7681daf4581e 100644 (file)
@@ -41,11 +41,14 @@ static void __iomem *coherency_cpu_base;
 enum {
        COHERENCY_FABRIC_TYPE_NONE,
        COHERENCY_FABRIC_TYPE_ARMADA_370_XP,
+       COHERENCY_FABRIC_TYPE_ARMADA_375,
 };
 
 static struct of_device_id of_coherency_table[] = {
        {.compatible = "marvell,coherency-fabric",
         .data = (void *) COHERENCY_FABRIC_TYPE_ARMADA_370_XP },
+       {.compatible = "marvell,armada-375-coherency-fabric",
+        .data = (void *) COHERENCY_FABRIC_TYPE_ARMADA_375 },
        { /* end of list */ },
 };
 
@@ -145,6 +148,11 @@ static void __init armada_370_coherency_init(struct device_node *np)
        set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
 }
 
+static void __init armada_375_coherency_init(struct device_node *np)
+{
+       coherency_cpu_base = of_iomap(np, 0);
+}
+
 static int coherency_type(void)
 {
        struct device_node *np;
@@ -158,6 +166,10 @@ static int coherency_type(void)
                if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP)
                        return type;
 
+               /* Armada 375 coherency works only on SMP */
+               else if (type == COHERENCY_FABRIC_TYPE_ARMADA_375 && is_smp())
+                       return type;
+
                of_node_put(np);
        }
 
@@ -178,6 +190,8 @@ int __init coherency_init(void)
 
        if (type == COHERENCY_FABRIC_TYPE_ARMADA_370_XP)
                armada_370_coherency_init(np);
+       else if (type == COHERENCY_FABRIC_TYPE_ARMADA_375)
+               armada_375_coherency_init(np);
 
        return 0;
 }