Based on Linux downstream commit: | commit 5591c7f9a0fedc8dde70e6f2143165e296084249 | Author: Sai Sree Kartheek Adivi <s-ad...@ti.com> | Date: Fri Mar 7 03:26:59 2025 +0530 | | PENDING: drivers: soc: ti: k3-ringacc: fix k3_ringacc_ring_reset_sci | | Add non-tisci implementation for k3_ringacc_ring_reset_sci using direct | register writes. | | Fixes: a621a1075550f ("PENDING: drivers: soc: ti: k3-ringacc: handle absence of tisci") | Signed-off-by: Sai Sree Kartheek Adivi <s-ad...@ti.com>
Signed-off-by: Sascha Hauer <s.ha...@pengutronix.de> --- drivers/soc/ti/k3-navss-ringacc.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/drivers/soc/ti/k3-navss-ringacc.c b/drivers/soc/ti/k3-navss-ringacc.c index dfc397a1f5aca08a90ed773540bdeae9f50b8173..18fb9153caa467b3159e035448e16da65563b36e 100644 --- a/drivers/soc/ti/k3-navss-ringacc.c +++ b/drivers/soc/ti/k3-navss-ringacc.c @@ -472,20 +472,29 @@ static void k3_ringacc_ring_reset_sci(struct k3_ring *ring) struct ti_sci_msg_rm_ring_cfg ring_cfg = { 0 }; struct k3_ringacc *ringacc = ring->parent; int ret; + u32 reg; - /* TODO: Implement ring reset without tisci */ - if (!ringacc->tisci) - return; + if (!ringacc->tisci) { + if (ring->cfg == NULL) + return; + reg = readl(&ring->cfg->size); + reg &= ~K3_DMARING_CFG_SIZE_MASK; - ring_cfg.nav_id = ringacc->tisci_dev_id; - ring_cfg.index = ring->ring_id; - ring_cfg.valid_params = TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID; - ring_cfg.count = ring->size; + writel(reg, &ring->cfg->size); + reg |= ring->size; - ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg); - if (ret) - dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n", - ret, ring->ring_id); + writel(reg, &ring->cfg->size); + } else { + ring_cfg.nav_id = ringacc->tisci_dev_id; + ring_cfg.index = ring->ring_id; + ring_cfg.valid_params = TI_SCI_MSG_VALUE_RM_RING_COUNT_VALID; + ring_cfg.count = ring->size; + + ret = ringacc->tisci_ring_ops->set_cfg(ringacc->tisci, &ring_cfg); + if (ret) + dev_err(ringacc->dev, "TISCI reset ring fail (%d) ring_idx %d\n", + ret, ring->ring_id); + } } void k3_ringacc_ring_reset(struct k3_ring *ring) -- 2.39.5