The existing helper k3_ringacc_ring_get_free() updates the count of free elements only when the software maintained counter decrements to zero. As a result, for batch processing, we may read a lower count of free elements than the actual count. To address this, introduce a new helper that provides realtime count of free elements. Signed-off-by: Siddharth Vadapalli --- drivers/soc/ti/k3-ringacc.c | 11 +++++++++++ include/linux/soc/ti/k3-ringacc.h | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/drivers/soc/ti/k3-ringacc.c b/drivers/soc/ti/k3-ringacc.c index 7602b8a909b0..1751d42ee2d3 100644 --- a/drivers/soc/ti/k3-ringacc.c +++ b/drivers/soc/ti/k3-ringacc.c @@ -905,6 +905,17 @@ u32 k3_ringacc_ring_get_free(struct k3_ring *ring) } EXPORT_SYMBOL_GPL(k3_ringacc_ring_get_free); +u32 k3_ringacc_ring_get_rt_free(struct k3_ring *ring) +{ + if (!ring || !(ring->flags & K3_RING_FLAG_BUSY)) + return -EINVAL; + + ring->state.free = ring->size - k3_ringacc_ring_read_occ(ring); + + return ring->state.free; +} +EXPORT_SYMBOL_GPL(k3_ringacc_ring_get_rt_free); + u32 k3_ringacc_ring_get_occ(struct k3_ring *ring) { if (!ring || !(ring->flags & K3_RING_FLAG_BUSY)) diff --git a/include/linux/soc/ti/k3-ringacc.h b/include/linux/soc/ti/k3-ringacc.h index 39b022b92598..091cf551932d 100644 --- a/include/linux/soc/ti/k3-ringacc.h +++ b/include/linux/soc/ti/k3-ringacc.h @@ -184,6 +184,14 @@ u32 k3_ringacc_ring_get_size(struct k3_ring *ring); */ u32 k3_ringacc_ring_get_free(struct k3_ring *ring); +/** + * k3_ringacc_ring_get_rt_free - get realtime value of free elements + * @ring: pointer on ring + * + * Returns realtime count of free elements in the ring. + */ +u32 k3_ringacc_ring_get_rt_free(struct k3_ring *ring); + /** * k3_ringacc_ring_get_occ - get ring occupancy * @ring: pointer on ring -- 2.51.1