mirror of
https://github.com/torvalds/linux.git
synced 2024-12-03 17:41:22 +00:00
soc: ti: k3: ringacc: add am65x sr2.0 support
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>
This commit is contained in:
parent
9123e3a74e
commit
95e7be062a
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user