Skip to content

Commit f0989c9

Browse files
committed
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>
1 parent 8a33543 commit f0989c9

3 files changed

Lines changed: 123 additions & 85 deletions

File tree

drivers/soundwire/cadence_master.c

Lines changed: 112 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,65 +2328,78 @@ static int sdw_cdns_prepare_read_pd0_buffer(u8 *header, unsigned int header_size
23282328

23292329
#define CDNS_BPT_ROLLING_COUNTER_START 1
23302330

2331-
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data, int data_size,
2332-
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
2333-
int *dma_buffer_total_bytes)
2331+
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
2332+
int data_per_frame, u8 *dma_buffer,
2333+
int dma_buffer_size, int *dma_buffer_total_bytes)
23342334
{
23352335
int total_dma_data_written = 0;
23362336
u8 *p_dma_buffer = dma_buffer;
23372337
u8 header[SDW_CDNS_BRA_HDR];
2338+
unsigned int start_register;
2339+
unsigned int section_size;
23382340
int dma_data_written;
2339-
u8 *p_data = data;
2341+
u8 *p_data;
23402342
u8 counter;
23412343
int ret;
2344+
int i;
23422345

23432346
counter = CDNS_BPT_ROLLING_COUNTER_START;
23442347

23452348
header[0] = BIT(1); /* write command: BIT(1) set */
23462349
header[0] |= GENMASK(7, 6); /* header is active */
23472350
header[0] |= (dev_num << 2);
23482351

2349-
while (data_size >= data_per_frame) {
2350-
header[1] = data_per_frame;
2351-
header[2] = start_register >> 24 & 0xFF;
2352-
header[3] = start_register >> 16 & 0xFF;
2353-
header[4] = start_register >> 8 & 0xFF;
2354-
header[5] = start_register >> 0 & 0xFF;
2355-
2356-
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
2357-
p_data, data_per_frame,
2358-
p_dma_buffer, dma_buffer_size,
2359-
&dma_data_written, counter);
2360-
if (ret < 0)
2361-
return ret;
2352+
for (i = 0; i < num_sec; i++) {
2353+
start_register = sec[i].addr;
2354+
section_size = sec[i].len;
2355+
p_data = sec[i].buf;
23622356

2363-
counter++;
2357+
while (section_size >= data_per_frame) {
2358+
header[1] = data_per_frame;
2359+
header[2] = start_register >> 24 & 0xFF;
2360+
header[3] = start_register >> 16 & 0xFF;
2361+
header[4] = start_register >> 8 & 0xFF;
2362+
header[5] = start_register >> 0 & 0xFF;
23642363

2365-
p_data += data_per_frame;
2366-
data_size -= data_per_frame;
2364+
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
2365+
p_data, data_per_frame,
2366+
p_dma_buffer, dma_buffer_size,
2367+
&dma_data_written, counter);
2368+
if (ret < 0)
2369+
return ret;
23672370

2368-
p_dma_buffer += dma_data_written;
2369-
dma_buffer_size -= dma_data_written;
2370-
total_dma_data_written += dma_data_written;
2371+
counter++;
23712372

2372-
start_register += data_per_frame;
2373-
}
2373+
p_data += data_per_frame;
2374+
section_size -= data_per_frame;
23742375

2375-
if (data_size) {
2376-
header[1] = data_size;
2377-
header[2] = start_register >> 24 & 0xFF;
2378-
header[3] = start_register >> 16 & 0xFF;
2379-
header[4] = start_register >> 8 & 0xFF;
2380-
header[5] = start_register >> 0 & 0xFF;
2376+
p_dma_buffer += dma_data_written;
2377+
dma_buffer_size -= dma_data_written;
2378+
total_dma_data_written += dma_data_written;
23812379

2382-
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
2383-
p_data, data_size,
2384-
p_dma_buffer, dma_buffer_size,
2385-
&dma_data_written, counter);
2386-
if (ret < 0)
2387-
return ret;
2380+
start_register += data_per_frame;
2381+
}
23882382

2389-
total_dma_data_written += dma_data_written;
2383+
if (section_size) {
2384+
header[1] = section_size;
2385+
header[2] = start_register >> 24 & 0xFF;
2386+
header[3] = start_register >> 16 & 0xFF;
2387+
header[4] = start_register >> 8 & 0xFF;
2388+
header[5] = start_register >> 0 & 0xFF;
2389+
2390+
ret = sdw_cdns_prepare_write_pd0_buffer(header, SDW_CDNS_BRA_HDR,
2391+
p_data, section_size,
2392+
p_dma_buffer, dma_buffer_size,
2393+
&dma_data_written, counter);
2394+
if (ret < 0)
2395+
return ret;
2396+
2397+
counter++;
2398+
2399+
p_dma_buffer += dma_data_written;
2400+
dma_buffer_size -= dma_data_written;
2401+
total_dma_data_written += dma_data_written;
2402+
}
23902403
}
23912404

23922405
*dma_buffer_total_bytes = total_dma_data_written;
@@ -2395,65 +2408,72 @@ int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data,
23952408
}
23962409
EXPORT_SYMBOL(sdw_cdns_prepare_write_dma_buffer);
23972410

2398-
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, u32 start_register, int data_size,
2411+
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
23992412
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
24002413
int *dma_buffer_total_bytes, unsigned int fake_size)
24012414
{
24022415
int total_dma_data_written = 0;
24032416
u8 *p_dma_buffer = dma_buffer;
24042417
u8 header[SDW_CDNS_BRA_HDR];
2418+
unsigned int start_register;
2419+
unsigned int data_size;
24052420
int dma_data_written;
24062421
u8 counter;
24072422
int ret;
2423+
int i;
24082424

24092425
counter = CDNS_BPT_ROLLING_COUNTER_START;
24102426

24112427
header[0] = 0; /* read command: BIT(1) cleared */
24122428
header[0] |= GENMASK(7, 6); /* header is active */
24132429
header[0] |= (dev_num << 2);
24142430

2415-
while (data_size >= data_per_frame) {
2416-
header[1] = data_per_frame;
2417-
header[2] = start_register >> 24 & 0xFF;
2418-
header[3] = start_register >> 16 & 0xFF;
2419-
header[4] = start_register >> 8 & 0xFF;
2420-
header[5] = start_register >> 0 & 0xFF;
2431+
for (i = 0; i < num_sec; i++) {
2432+
start_register = sec[i].addr;
2433+
data_size = sec[i].len;
2434+
while (data_size >= data_per_frame) {
2435+
header[1] = data_per_frame;
2436+
header[2] = start_register >> 24 & 0xFF;
2437+
header[3] = start_register >> 16 & 0xFF;
2438+
header[4] = start_register >> 8 & 0xFF;
2439+
header[5] = start_register >> 0 & 0xFF;
24212440

2422-
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR, p_dma_buffer,
2423-
dma_buffer_size, &dma_data_written,
2424-
counter);
2425-
if (ret < 0)
2426-
return ret;
2441+
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR,
2442+
p_dma_buffer, dma_buffer_size,
2443+
&dma_data_written, counter);
2444+
if (ret < 0)
2445+
return ret;
24272446

2428-
counter++;
2447+
counter++;
24292448

2430-
data_size -= data_per_frame;
2449+
data_size -= data_per_frame;
24312450

2432-
p_dma_buffer += dma_data_written;
2433-
dma_buffer_size -= dma_data_written;
2434-
total_dma_data_written += dma_data_written;
2451+
p_dma_buffer += dma_data_written;
2452+
dma_buffer_size -= dma_data_written;
2453+
total_dma_data_written += dma_data_written;
24352454

2436-
start_register += data_per_frame;
2437-
}
2455+
start_register += data_per_frame;
2456+
}
24382457

2439-
if (data_size) {
2440-
header[1] = data_size;
2441-
header[2] = start_register >> 24 & 0xFF;
2442-
header[3] = start_register >> 16 & 0xFF;
2443-
header[4] = start_register >> 8 & 0xFF;
2444-
header[5] = start_register >> 0 & 0xFF;
2458+
if (data_size) {
2459+
header[1] = data_size;
2460+
header[2] = start_register >> 24 & 0xFF;
2461+
header[3] = start_register >> 16 & 0xFF;
2462+
header[4] = start_register >> 8 & 0xFF;
2463+
header[5] = start_register >> 0 & 0xFF;
24452464

2446-
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR, p_dma_buffer,
2447-
dma_buffer_size, &dma_data_written,
2448-
counter);
2449-
if (ret < 0)
2450-
return ret;
2465+
ret = sdw_cdns_prepare_read_pd0_buffer(header, SDW_CDNS_BRA_HDR,
2466+
p_dma_buffer, dma_buffer_size,
2467+
&dma_data_written, counter);
2468+
if (ret < 0)
2469+
return ret;
24512470

2452-
counter++;
2471+
counter++;
24532472

2454-
p_dma_buffer += dma_data_written;
2455-
dma_buffer_size -= dma_data_written;
2456-
total_dma_data_written += dma_data_written;
2473+
p_dma_buffer += dma_data_written;
2474+
dma_buffer_size -= dma_data_written;
2475+
total_dma_data_written += dma_data_written;
2476+
}
24572477
}
24582478

24592479
/* Add fake frame */
@@ -2620,9 +2640,12 @@ static u8 extract_read_data(u32 *data, int num_bytes, u8 *buffer)
26202640
}
26212641

26222642
int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buffer_size,
2623-
u8 *buffer, int buffer_size, int num_frames, int data_per_frame)
2643+
struct sdw_bpt_section *sec, int num_sec, int num_frames,
2644+
int data_per_frame)
26242645
{
26252646
int total_num_bytes = 0;
2647+
int buffer_size = 0;
2648+
int sec_index;
26262649
u32 *p_data;
26272650
u8 *p_buf;
26282651
int counter;
@@ -2636,7 +2659,10 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
26362659

26372660
counter = CDNS_BPT_ROLLING_COUNTER_START;
26382661
p_data = (u32 *)dma_buffer;
2639-
p_buf = buffer;
2662+
2663+
sec_index = 0;
2664+
p_buf = sec[sec_index].buf;
2665+
buffer_size = sec[sec_index].len;
26402666

26412667
for (i = 0; i < num_frames; i++) {
26422668
header = *p_data++;
@@ -2676,6 +2702,18 @@ int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buf
26762702

26772703
counter++;
26782704
counter &= GENMASK(3, 0);
2705+
2706+
if (buffer_size == total_num_bytes && (i + 1) < num_frames) {
2707+
sec_index++;
2708+
if (sec_index >= num_sec) {
2709+
dev_err(dev, "%s: incorrect section index %d i %d\n",
2710+
__func__, sec_index, i);
2711+
return -EINVAL;
2712+
}
2713+
p_buf = sec[sec_index].buf;
2714+
buffer_size = sec[sec_index].len;
2715+
total_num_bytes = 0;
2716+
}
26792717
}
26802718
return 0;
26812719
}

drivers/soundwire/cadence_master.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
22
/* Copyright(c) 2015-17 Intel Corporation. */
33
#include <sound/soc.h>
4+
#include "bus.h"
45

56
#ifndef __SDW_CADENCE_H
67
#define __SDW_CADENCE_H
@@ -220,17 +221,18 @@ int sdw_cdns_bpt_find_buffer_sizes(int command, /* 0: write, 1: read */
220221
unsigned int *data_per_frame, unsigned int *pdi0_buffer_size,
221222
unsigned int *pdi1_buffer_size, unsigned int *num_frames);
222223

223-
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, u32 start_register, u8 *data, int data_size,
224-
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
225-
int *dma_buffer_total_bytes);
224+
int sdw_cdns_prepare_write_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
225+
int data_per_frame, u8 *dma_buffer,
226+
int dma_buffer_size, int *dma_buffer_total_bytes);
226227

227-
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, u32 start_register, int data_size,
228+
int sdw_cdns_prepare_read_dma_buffer(u8 dev_num, struct sdw_bpt_section *sec, int num_sec,
228229
int data_per_frame, u8 *dma_buffer, int dma_buffer_size,
229230
int *dma_buffer_total_bytes, unsigned int fake_size);
230231

231232
int sdw_cdns_check_write_response(struct device *dev, u8 *dma_buffer,
232233
int dma_buffer_size, int num_frames);
233234

234235
int sdw_cdns_check_read_response(struct device *dev, u8 *dma_buffer, int dma_buffer_size,
235-
u8 *buffer, int buffer_size, int num_frames, int data_per_frame);
236+
struct sdw_bpt_section *sec, int num_sec, int num_frames,
237+
int data_per_frame);
236238
#endif /* __SDW_CADENCE_H */

drivers/soundwire/intel_ace2x.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,12 @@ static int intel_ace2x_bpt_open_stream(struct sdw_intel *sdw, struct sdw_slave *
219219
}
220220

221221
if (!command) {
222-
ret = sdw_cdns_prepare_write_dma_buffer(msg->dev_num, msg->sec[0].addr,
223-
msg->sec[0].buf,
224-
msg->sec[0].len, data_per_frame,
222+
ret = sdw_cdns_prepare_write_dma_buffer(msg->dev_num, msg->sec, 1,
223+
data_per_frame,
225224
sdw->bpt_ctx.dmab_tx_bdl.area,
226225
pdi0_buffer_size, &tx_total_bytes);
227226
} else {
228-
ret = sdw_cdns_prepare_read_dma_buffer(msg->dev_num, msg->sec[0].addr,
229-
msg->sec[0].len,
227+
ret = sdw_cdns_prepare_read_dma_buffer(msg->dev_num, msg->sec, 1,
230228
data_per_frame,
231229
sdw->bpt_ctx.dmab_tx_bdl.area,
232230
pdi0_buffer_size, &tx_total_bytes,
@@ -369,7 +367,7 @@ static int intel_ace2x_bpt_wait(struct sdw_intel *sdw, struct sdw_slave *slave,
369367
} else {
370368
ret = sdw_cdns_check_read_response(cdns->dev, sdw->bpt_ctx.dmab_rx_bdl.area,
371369
sdw->bpt_ctx.pdi1_buffer_size,
372-
msg->sec[0].buf, msg->sec[0].len, sdw->bpt_ctx.num_frames,
370+
msg->sec, 1, sdw->bpt_ctx.num_frames,
373371
sdw->bpt_ctx.data_per_frame);
374372
if (ret < 0)
375373
dev_err(cdns->dev, "%s: BPT Read failed %d\n", __func__, ret);

0 commit comments

Comments
 (0)