| From 3644180bf2cca0a9d1bf37325eef7a63f4e623e9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 11 Sep 2020 21:29:56 -0700 |
| Subject: soc: ti: k3: ringacc: add am65x sr2.0 support |
| |
| From: Grygorii Strashko <grygorii.strashko@ti.com> |
| |
| [ Upstream commit 95e7be062aea6d2e09116cd4d28957d310c04781 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/soc/ti/k3-ringacc.c | 33 ++++++++++++++++++++++++++++++--- |
| 1 file changed, 30 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/soc/ti/k3-ringacc.c b/drivers/soc/ti/k3-ringacc.c |
| index 6dcc21dde0cb7..1147dc4c1d596 100644 |
| --- a/drivers/soc/ti/k3-ringacc.c |
| +++ b/drivers/soc/ti/k3-ringacc.c |
| @@ -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)) |
| -- |
| 2.27.0 |
| |