mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
ASoC: qcom: q6asm: add q6asm_get_hw_pointer
Currently q6asm-dai is performing an extra layer of calculation on the hw_ptr, which is always prone to errors and redundant. q6asm already has tokens to indentify the pointer pointers which an be used to get the hw_ptr and this is more accurate then doing the artificial calculation at upper layers. Add helper function q6asm_get_hw_pointer() to get this hw_ptr. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com> Tested-by: Alexey Klimov <alexey.klimov@linaro.org> # RB5, RB3 Link: https://patch.msgid.link/20251023102444.88158-8-srinivas.kandagatla@oss.qualcomm.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
committed by
Mark Brown
parent
e386c2cf3d
commit
b6a1d7243e
@@ -6,6 +6,7 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/soc/qcom/apr.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_platform.h>
|
||||
@@ -248,6 +249,7 @@ struct audio_port_data {
|
||||
uint32_t num_periods;
|
||||
uint32_t dsp_buf;
|
||||
uint32_t mem_map_handle;
|
||||
atomic_t hw_ptr;
|
||||
};
|
||||
|
||||
struct q6asm {
|
||||
@@ -598,6 +600,14 @@ err:
|
||||
return ac;
|
||||
}
|
||||
|
||||
int q6asm_get_hw_pointer(struct audio_client *ac, unsigned int dir)
|
||||
{
|
||||
struct audio_port_data *data = &ac->port[dir];
|
||||
|
||||
return (int)atomic_read(&data->hw_ptr);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(q6asm_get_hw_pointer);
|
||||
|
||||
static int32_t q6asm_stream_callback(struct apr_device *adev,
|
||||
struct apr_resp_pkt *data,
|
||||
int session_id)
|
||||
@@ -703,6 +713,7 @@ static int32_t q6asm_stream_callback(struct apr_device *adev,
|
||||
goto done;
|
||||
}
|
||||
spin_unlock_irqrestore(&ac->lock, flags);
|
||||
atomic_set(&port->hw_ptr, token + 1);
|
||||
}
|
||||
break;
|
||||
case ASM_DATA_EVENT_READ_DONE_V2:
|
||||
@@ -721,6 +732,7 @@ static int32_t q6asm_stream_callback(struct apr_device *adev,
|
||||
}
|
||||
|
||||
phys = port->buf[hdr->token].phys;
|
||||
atomic_set(&port->hw_ptr, hdr->token + 1);
|
||||
|
||||
if (upper_32_bits(phys) != done->buf_addr_msw ||
|
||||
lower_32_bits(phys) != done->buf_addr_lsw) {
|
||||
|
||||
@@ -148,4 +148,5 @@ int q6asm_map_memory_regions(unsigned int dir,
|
||||
phys_addr_t phys,
|
||||
size_t period_sz, unsigned int periods);
|
||||
int q6asm_unmap_memory_regions(unsigned int dir, struct audio_client *ac);
|
||||
int q6asm_get_hw_pointer(struct audio_client *ac, unsigned int dir);
|
||||
#endif /* __Q6_ASM_H__ */
|
||||
|
||||
Reference in New Issue
Block a user