Skip to content

Commit fe9569b

Browse files
committed
soundwire: intel_ace2x: handle the max_data_per_frame property
The optional property indicates the maximum data payload size for the BRA mode. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
1 parent bc476b6 commit fe9569b

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

drivers/soundwire/intel_ace2x.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ static int intel_ace2x_bpt_open_stream(struct sdw_intel *sdw, struct sdw_slave *
5757
struct sdw_port_config *pconfig;
5858
unsigned int pdi0_buf_size_pre_frame;
5959
unsigned int pdi1_buf_size_pre_frame;
60+
unsigned int max_data_per_frame;
6061
unsigned int pdi0_buffer_size_;
6162
unsigned int pdi1_buffer_size_;
6263
unsigned int pdi0_buffer_size;
@@ -168,11 +169,24 @@ static int intel_ace2x_bpt_open_stream(struct sdw_intel *sdw, struct sdw_slave *
168169
pdi0_buffer_size = 0;
169170
pdi1_buffer_size = 0;
170171
num_frames = 0;
172+
173+
if (slave->prop.bra_max_data_per_frame) {
174+
max_data_per_frame = slave->prop.bra_max_data_per_frame;
175+
if (max_data_per_frame > SDW_BRA_MAX_BYTES_PER_FRAME) {
176+
dev_warn(&slave->dev,
177+
"BRA max_data_per_frame %u exceeds limit %u, clamping\n",
178+
max_data_per_frame, SDW_BRA_MAX_BYTES_PER_FRAME);
179+
max_data_per_frame = SDW_BRA_MAX_BYTES_PER_FRAME;
180+
}
181+
} else {
182+
max_data_per_frame = SDW_BRA_MAX_BYTES_PER_FRAME;
183+
}
184+
171185
/* Add up pdi buffer size and frame numbers of each BPT sections */
172186
for (i = 0; i < msg->sections; i++) {
173187
ret = sdw_cdns_bpt_find_buffer_sizes(command, cdns->bus.params.row,
174188
cdns->bus.params.col,
175-
msg->sec[i].len, SDW_BPT_MSG_MAX_BYTES,
189+
msg->sec[i].len, max_data_per_frame,
176190
slave->prop.bra_block_alignment,
177191
&data_per_frame, &pdi0_buffer_size_,
178192
&pdi1_buffer_size_, &num_frames_);
@@ -197,7 +211,7 @@ static int intel_ace2x_bpt_open_stream(struct sdw_intel *sdw, struct sdw_slave *
197211
/* Get buffer size of a full frame */
198212
ret = sdw_cdns_bpt_find_buffer_sizes(command, cdns->bus.params.row,
199213
cdns->bus.params.col,
200-
data_per_frame, SDW_BPT_MSG_MAX_BYTES,
214+
data_per_frame, max_data_per_frame,
201215
slave->prop.bra_block_alignment,
202216
&data_per_frame, &pdi0_buf_size_pre_frame,
203217
&pdi1_buf_size_pre_frame, &fake_num_frames);

include/linux/soundwire/sdw.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,12 @@ struct sdw_defer {
844844
*/
845845
#define SDW_BPT_MSG_MAX_BYTES (1024 * 1024)
846846

847+
/*
848+
* According to mipi SoundWire DisCo Specification_v2-1,
849+
* this maximum value shall not exceed 470.
850+
*/
851+
#define SDW_BRA_MAX_BYTES_PER_FRAME 470
852+
847853
struct sdw_bpt_msg;
848854

849855
/**

0 commit comments

Comments
 (0)