mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-17 22:23:45 -04:00
soundwire: pass sdw_bpt_section to cdns BPT helpers
We can get start_register, data_size, and buffer data from the new sdw_bpt_section parameter. Also, handle all register sections in the cdns BRA helpers. No function changes as section number is 1. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Tested-by: Shuming Fan <shumingf@realtek.com> Link: https://patch.msgid.link/20251021094355.132943-3-yung-chuan.liao@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
@@ -2324,17 +2324,20 @@ static int sdw_cdns_prepare_read_pd0_buffer(u8 *header, unsigned int header_size
|
|||||||
|
|
||||||
#define CDNS_BPT_ROLLING_COUNTER_START 1
|
#define CDNS_BPT_ROLLING_COUNTER_START 1
|
||||||
|
|
||||||
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data, int data_size,
|
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
|
||||||
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
|
int data_per_frame, u8 *dma_buffer,
|
||||||
int *dma_buffer_total_bytes)
|
int dma_buffer_size, int *dma_buffer_total_bytes)
|
||||||
{
|
{
|
||||||
int total_dma_data_written = 0;
|
int total_dma_data_written = 0;
|
||||||
u8 *p_dma_buffer = dma_buffer;
|
u8 *p_dma_buffer = dma_buffer;
|
||||||
u8 header[SDW_CDNS_BRA_HDR];
|
u8 header[SDW_CDNS_BRA_HDR];
|
||||||
|
unsigned int start_register;
|
||||||
|
unsigned int section_size;
|
||||||
int dma_data_written;
|
int dma_data_written;
|
||||||
u8 *p_data = data;
|
u8 *p_data;
|
||||||
u8 counter;
|
u8 counter;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
counter = CDNS_BPT_ROLLING_COUNTER_START;
|
counter = CDNS_BPT_ROLLING_COUNTER_START;
|
||||||
|
|
||||||
@@ -2342,47 +2345,57 @@ int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data,
|
|||||||
header[0] |= GENMASK(7, 6); /* header is active */
|
header[0] |= GENMASK(7, 6); /* header is active */
|
||||||
header[0] |= (dev_num << 2);
|
header[0] |= (dev_num << 2);
|
||||||
|
|
||||||
while (data_size >= data_per_frame) {
|
for (i = 0; i < num_sec; i++) {
|
||||||
header[1] = data_per_frame;
|
start_register = sec[i].addr;
|
||||||
header[2] = start_register >> 24 & 0xFF;
|
section_size = sec[i].len;
|
||||||
header[3] = start_register >> 16 & 0xFF;
|
p_data = sec[i].buf;
|
||||||
header[4] = start_register >> 8 & 0xFF;
|
|
||||||
header[5] = start_register >> 0 & 0xFF;
|
|
||||||
|
|
||||||
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
|
while (section_size >= data_per_frame) {
|
||||||
p_data, data_per_frame,
|
header[1] = data_per_frame;
|
||||||
p_dma_buffer, dma_buffer_size,
|
header[2] = start_register >> 24 & 0xFF;
|
||||||
&dma_data_written, counter);
|
header[3] = start_register >> 16 & 0xFF;
|
||||||
if (ret < 0)
|
header[4] = start_register >> 8 & 0xFF;
|
||||||
return ret;
|
header[5] = start_register >> 0 & 0xFF;
|
||||||
|
|
||||||
counter++;
|
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
|
||||||
|
p_data, data_per_frame,
|
||||||
|
p_dma_buffer, dma_buffer_size,
|
||||||
|
&dma_data_written, counter);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
p_data += data_per_frame;
|
counter++;
|
||||||
data_size -= data_per_frame;
|
|
||||||
|
|
||||||
p_dma_buffer += dma_data_written;
|
p_data += data_per_frame;
|
||||||
dma_buffer_size -= dma_data_written;
|
section_size -= data_per_frame;
|
||||||
total_dma_data_written += dma_data_written;
|
|
||||||
|
|
||||||
start_register += data_per_frame;
|
p_dma_buffer += dma_data_written;
|
||||||
}
|
dma_buffer_size -= dma_data_written;
|
||||||
|
total_dma_data_written += dma_data_written;
|
||||||
|
|
||||||
if (data_size) {
|
start_register += data_per_frame;
|
||||||
header[1] = data_size;
|
}
|
||||||
header[2] = start_register >> 24 & 0xFF;
|
|
||||||
header[3] = start_register >> 16 & 0xFF;
|
|
||||||
header[4] = start_register >> 8 & 0xFF;
|
|
||||||
header[5] = start_register >> 0 & 0xFF;
|
|
||||||
|
|
||||||
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
|
if (section_size) {
|
||||||
p_data, data_size,
|
header[1] = section_size;
|
||||||
p_dma_buffer, dma_buffer_size,
|
header[2] = start_register >> 24 & 0xFF;
|
||||||
&dma_data_written, counter);
|
header[3] = start_register >> 16 & 0xFF;
|
||||||
if (ret < 0)
|
header[4] = start_register >> 8 & 0xFF;
|
||||||
return ret;
|
header[5] = start_register >> 0 & 0xFF;
|
||||||
|
|
||||||
total_dma_data_written += dma_data_written;
|
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
|
||||||
|
p_data, section_size,
|
||||||
|
p_dma_buffer, dma_buffer_size,
|
||||||
|
&dma_data_written, counter);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
counter++;
|
||||||
|
|
||||||
|
p_dma_buffer += dma_data_written;
|
||||||
|
dma_buffer_size -= dma_data_written;
|
||||||
|
total_dma_data_written += dma_data_written;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*dma_buffer_total_bytes = total_dma_data_written;
|
*dma_buffer_total_bytes = total_dma_data_written;
|
||||||
@@ -2391,16 +2404,19 @@ int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(sdw_cdns_prepare_write_dma_buffer);
|
EXPORT_SYMBOL(sdw_cdns_prepare_write_dma_buffer);
|
||||||
|
|
||||||
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, u32 start_register, int data_size,
|
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
|
||||||
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
|
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
|
||||||
int *dma_buffer_total_bytes, unsigned int fake_size)
|
int *dma_buffer_total_bytes, unsigned int fake_size)
|
||||||
{
|
{
|
||||||
int total_dma_data_written = 0;
|
int total_dma_data_written = 0;
|
||||||
u8 *p_dma_buffer = dma_buffer;
|
u8 *p_dma_buffer = dma_buffer;
|
||||||
u8 header[SDW_CDNS_BRA_HDR];
|
u8 header[SDW_CDNS_BRA_HDR];
|
||||||
|
unsigned int start_register;
|
||||||
|
unsigned int data_size;
|
||||||
int dma_data_written;
|
int dma_data_written;
|
||||||
u8 counter;
|
u8 counter;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
counter = CDNS_BPT_ROLLING_COUNTER_START;
|
counter = CDNS_BPT_ROLLING_COUNTER_START;
|
||||||
|
|
||||||
@@ -2408,48 +2424,52 @@ int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, u32 start_register, int data_si
|
|||||||
header[0] |= GENMASK(7, 6); /* header is active */
|
header[0] |= GENMASK(7, 6); /* header is active */
|
||||||
header[0] |= (dev_num << 2);
|
header[0] |= (dev_num << 2);
|
||||||
|
|
||||||
while (data_size >= data_per_frame) {
|
for (i = 0; i < num_sec; i++) {
|
||||||
header[1] = data_per_frame;
|
start_register = sec[i].addr;
|
||||||
header[2] = start_register >> 24 & 0xFF;
|
data_size = sec[i].len;
|
||||||
header[3] = start_register >> 16 & 0xFF;
|
while (data_size >= data_per_frame) {
|
||||||
header[4] = start_register >> 8 & 0xFF;
|
header[1] = data_per_frame;
|
||||||
header[5] = start_register >> 0 & 0xFF;
|
header[2] = start_register >> 24 & 0xFF;
|
||||||
|
header[3] = start_register >> 16 & 0xFF;
|
||||||
|
header[4] = start_register >> 8 & 0xFF;
|
||||||
|
header[5] = start_register >> 0 & 0xFF;
|
||||||
|
|
||||||
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR, p_dma_buffer,
|
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR,
|
||||||
dma_buffer_size, &dma_data_written,
|
p_dma_buffer, dma_buffer_size,
|
||||||
counter);
|
&dma_data_written, counter);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
counter++;
|
counter++;
|
||||||
|
|
||||||
data_size -= data_per_frame;
|
data_size -= data_per_frame;
|
||||||
|
|
||||||
p_dma_buffer += dma_data_written;
|
p_dma_buffer += dma_data_written;
|
||||||
dma_buffer_size -= dma_data_written;
|
dma_buffer_size -= dma_data_written;
|
||||||
total_dma_data_written += dma_data_written;
|
total_dma_data_written += dma_data_written;
|
||||||
|
|
||||||
start_register += data_per_frame;
|
start_register += data_per_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_size) {
|
if (data_size) {
|
||||||
header[1] = data_size;
|
header[1] = data_size;
|
||||||
header[2] = start_register >> 24 & 0xFF;
|
header[2] = start_register >> 24 & 0xFF;
|
||||||
header[3] = start_register >> 16 & 0xFF;
|
header[3] = start_register >> 16 & 0xFF;
|
||||||
header[4] = start_register >> 8 & 0xFF;
|
header[4] = start_register >> 8 & 0xFF;
|
||||||
header[5] = start_register >> 0 & 0xFF;
|
header[5] = start_register >> 0 & 0xFF;
|
||||||
|
|
||||||
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR, p_dma_buffer,
|
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR,
|
||||||
dma_buffer_size, &dma_data_written,
|
p_dma_buffer, dma_buffer_size,
|
||||||
counter);
|
&dma_data_written, counter);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
counter++;
|
counter++;
|
||||||
|
|
||||||
p_dma_buffer += dma_data_written;
|
p_dma_buffer += dma_data_written;
|
||||||
dma_buffer_size -= dma_data_written;
|
dma_buffer_size -= dma_data_written;
|
||||||
total_dma_data_written += dma_data_written;
|
total_dma_data_written += dma_data_written;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add fake frame */
|
/* Add fake frame */
|
||||||
@@ -2616,9 +2636,12 @@ static u8 extract_read_data(u32 *data, int num_bytes, u8 *buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buffer_size,
|
int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buffer_size,
|
||||||
u8 *buffer, int buffer_size, int num_frames, int data_per_frame)
|
struct sdw_bpt_section *sec, int num_sec, int num_frames,
|
||||||
|
int data_per_frame)
|
||||||
{
|
{
|
||||||
int total_num_bytes = 0;
|
int total_num_bytes = 0;
|
||||||
|
int buffer_size = 0;
|
||||||
|
int sec_index;
|
||||||
u32 *p_data;
|
u32 *p_data;
|
||||||
u8 *p_buf;
|
u8 *p_buf;
|
||||||
int counter;
|
int counter;
|
||||||
@@ -2632,7 +2655,10 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
|
|||||||
|
|
||||||
counter = CDNS_BPT_ROLLING_COUNTER_START;
|
counter = CDNS_BPT_ROLLING_COUNTER_START;
|
||||||
p_data = (u32 *)dma_buffer;
|
p_data = (u32 *)dma_buffer;
|
||||||
p_buf = buffer;
|
|
||||||
|
sec_index = 0;
|
||||||
|
p_buf = sec[sec_index].buf;
|
||||||
|
buffer_size = sec[sec_index].len;
|
||||||
|
|
||||||
for (i = 0; i < num_frames; i++) {
|
for (i = 0; i < num_frames; i++) {
|
||||||
header = *p_data++;
|
header = *p_data++;
|
||||||
@@ -2672,6 +2698,18 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
|
|||||||
|
|
||||||
counter++;
|
counter++;
|
||||||
counter &= GENMASK(3, 0);
|
counter &= GENMASK(3, 0);
|
||||||
|
|
||||||
|
if (buffer_size == total_num_bytes && (i + 1) < num_frames) {
|
||||||
|
sec_index++;
|
||||||
|
if (sec_index >= num_sec) {
|
||||||
|
dev_err(dev, "%s: incorrect section index %d i %d\n",
|
||||||
|
__func__, sec_index, i);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
p_buf = sec[sec_index].buf;
|
||||||
|
buffer_size = sec[sec_index].len;
|
||||||
|
total_num_bytes = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
|
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
|
||||||
/* Copyright(c) 2015-17 Intel Corporation. */
|
/* Copyright(c) 2015-17 Intel Corporation. */
|
||||||
#include <sound/soc.h>
|
#include <sound/soc.h>
|
||||||
|
#include "bus.h"
|
||||||
|
|
||||||
#ifndef __SDW_CADENCE_H
|
#ifndef __SDW_CADENCE_H
|
||||||
#define __SDW_CADENCE_H
|
#define __SDW_CADENCE_H
|
||||||
@@ -220,11 +221,11 @@ int sdw_cdns_bpt_find_buffer_sizes(int command, /* 0: write, 1: read */
|
|||||||
unsigned int *data_per_frame, unsigned int *pdi0_buffer_size,
|
unsigned int *data_per_frame, unsigned int *pdi0_buffer_size,
|
||||||
unsigned int *pdi1_buffer_size, unsigned int *num_frames);
|
unsigned int *pdi1_buffer_size, unsigned int *num_frames);
|
||||||
|
|
||||||
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data, int data_size,
|
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
|
||||||
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
|
int data_per_frame, u8 *dma_buffer,
|
||||||
int *dma_buffer_total_bytes);
|
int dma_buffer_size, int *dma_buffer_total_bytes);
|
||||||
|
|
||||||
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, u32 start_register, int data_size,
|
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
|
||||||
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
|
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
|
||||||
int *dma_buffer_total_bytes, unsigned int fake_size);
|
int *dma_buffer_total_bytes, unsigned int fake_size);
|
||||||
|
|
||||||
@@ -232,5 +233,6 @@ int sdw_cdns_check_write_response(struct device *dev, u8 *dma_buffer,
|
|||||||
int dma_buffer_size, int num_frames);
|
int dma_buffer_size, int num_frames);
|
||||||
|
|
||||||
int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buffer_size,
|
int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buffer_size,
|
||||||
u8 *buffer, int buffer_size, int num_frames, int data_per_frame);
|
struct sdw_bpt_section *sec, int num_sec, int num_frames,
|
||||||
|
int data_per_frame);
|
||||||
#endif /* __SDW_CADENCE_H */
|
#endif /* __SDW_CADENCE_H */
|
||||||
|
|||||||
@@ -220,14 +220,12 @@ static int intel_ace2x_bpt_open_stream(struct sdw_intel *sdw, struct sdw_slave *
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!command) {
|
if (!command) {
|
||||||
ret = sdw_cdns_prepare_write_dma_buffer(msg->dev_num, msg->sec[0].addr,
|
ret = sdw_cdns_prepare_write_dma_buffer(msg->dev_num, msg->sec, 1,
|
||||||
msg->sec[0].buf,
|
data_per_frame,
|
||||||
msg->sec[0].len, data_per_frame,
|
|
||||||
sdw->bpt_ctx.dmab_tx_bdl.area,
|
sdw->bpt_ctx.dmab_tx_bdl.area,
|
||||||
pdi0_buffer_size, &tx_total_bytes);
|
pdi0_buffer_size, &tx_total_bytes);
|
||||||
} else {
|
} else {
|
||||||
ret = sdw_cdns_prepare_read_dma_buffer(msg->dev_num, msg->sec[0].addr,
|
ret = sdw_cdns_prepare_read_dma_buffer(msg->dev_num, msg->sec, 1,
|
||||||
msg->sec[0].len,
|
|
||||||
data_per_frame,
|
data_per_frame,
|
||||||
sdw->bpt_ctx.dmab_tx_bdl.area,
|
sdw->bpt_ctx.dmab_tx_bdl.area,
|
||||||
pdi0_buffer_size, &tx_total_bytes,
|
pdi0_buffer_size, &tx_total_bytes,
|
||||||
@@ -370,8 +368,7 @@ static int intel_ace2x_bpt_wait(struct sdw_intel *sdw, struct sdw_slave *slave,
|
|||||||
} else {
|
} else {
|
||||||
ret = sdw_cdns_check_read_response(cdns->dev, sdw->bpt_ctx.dmab_rx_bdl.area,
|
ret = sdw_cdns_check_read_response(cdns->dev, sdw->bpt_ctx.dmab_rx_bdl.area,
|
||||||
sdw->bpt_ctx.pdi1_buffer_size,
|
sdw->bpt_ctx.pdi1_buffer_size,
|
||||||
msg->sec[0].buf, msg->sec[0].len,
|
msg->sec, 1, sdw->bpt_ctx.num_frames,
|
||||||
sdw->bpt_ctx.num_frames,
|
|
||||||
sdw->bpt_ctx.data_per_frame);
|
sdw->bpt_ctx.data_per_frame);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
dev_err(cdns->dev, "%s: BPT Read failed %d\n", __func__, ret);
|
dev_err(cdns->dev, "%s: BPT Read failed %d\n", __func__, ret);
|
||||||
|
|||||||
Reference in New Issue
Block a user