soc: ti: k3: ringacc: add am65x sr2.0 support
authorGrygorii Strashko <grygorii.strashko@ti.com>
Sat, 12 Sep 2020 04:29:56 +0000 (21:29 -0700)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Sat, 12 Sep 2020 04:34:17 +0000 (21:34 -0700)
The AM65x SR2.0 Ringacc has fixed errata i2023 "RINGACC, UDMA: RINGACC and
UDMA Ring State Interoperability Issue after Channel Teardown". This errata
also fixed for J271E SoC.

Use SOC bus data for K3 SoC identification and enable i2023 errate w/a only
for the AM65x SR1.0. This also makes obsolete "ti,dma-ring-reset-quirk" DT
property.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
drivers/soc/ti/k3-ringacc.c

index 6dcc21d..1147dc4 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/init.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/sys_soc.h>
 #include <linux/soc/ti/k3-ringacc.h>
 #include <linux/soc/ti/ti_sci_protocol.h>
 #include <linux/soc/ti/ti_sci_inta_msi.h>
@@ -208,6 +209,15 @@ struct k3_ringacc {
        const struct k3_ringacc_ops *ops;
 };
 
+/**
+ * struct k3_ringacc - Rings accelerator SoC data
+ *
+ * @dma_ring_reset_quirk:  DMA reset w/a enable
+ */
+struct k3_ringacc_soc_data {
+       unsigned dma_ring_reset_quirk:1;
+};
+
 static long k3_ringacc_ring_get_fifo_pos(struct k3_ring *ring)
 {
        return K3_RINGACC_FIFO_WINDOW_SIZE_BYTES -
@@ -1051,9 +1061,6 @@ static int k3_ringacc_probe_dt(struct k3_ringacc *ringacc)
                return ret;
        }
 
-       ringacc->dma_ring_reset_quirk =
-                       of_property_read_bool(node, "ti,dma-ring-reset-quirk");
-
        ringacc->tisci = ti_sci_get_by_phandle(node, "ti,sci");
        if (IS_ERR(ringacc->tisci)) {
                ret = PTR_ERR(ringacc->tisci);
@@ -1084,9 +1091,22 @@ static int k3_ringacc_probe_dt(struct k3_ringacc *ringacc)
                                                 ringacc->rm_gp_range);
 }
 
+static const struct k3_ringacc_soc_data k3_ringacc_soc_data_sr1 = {
+       .dma_ring_reset_quirk = 1,
+};
+
+static const struct soc_device_attribute k3_ringacc_socinfo[] = {
+       { .family = "AM65X",
+         .revision = "SR1.0",
+         .data = &k3_ringacc_soc_data_sr1
+       },
+       {/* sentinel */}
+};
+
 static int k3_ringacc_init(struct platform_device *pdev,
                           struct k3_ringacc *ringacc)
 {
+       const struct soc_device_attribute *soc;
        void __iomem *base_fifo, *base_rt;
        struct device *dev = &pdev->dev;
        struct resource *res;
@@ -1103,6 +1123,13 @@ static int k3_ringacc_init(struct platform_device *pdev,
        if (ret)
                return ret;
 
+       soc = soc_device_match(k3_ringacc_socinfo);
+       if (soc && soc->data) {
+               const struct k3_ringacc_soc_data *soc_data = soc->data;
+
+               ringacc->dma_ring_reset_quirk = soc_data->dma_ring_reset_quirk;
+       }
+
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rt");
        base_rt = devm_ioremap_resource(dev, res);
        if (IS_ERR(base_rt))