Skip to content

Commit f490794

Browse files
committed
soundwire: use bra if msg size > threshold
It is more efficient to read/write with bra if the message size is larger than a predefined threshold. Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
1 parent 8832e9e commit f490794

1 file changed

Lines changed: 53 additions & 0 deletions

File tree

drivers/soundwire/bus.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,33 @@ static int sdw_ntransfer_no_pm(struct sdw_slave *slave, u32 addr, u8 flags,
447447
return 0;
448448
}
449449

450+
static int sdw_ntransfer_no_pm_bpt(struct sdw_slave *slave, u32 addr, u8 flags,
451+
size_t count, u8 *val)
452+
{
453+
struct sdw_bpt_section sec;
454+
struct sdw_bpt_msg msg;
455+
int retry = 5;
456+
int ret;
457+
458+
sec.addr = addr;
459+
sec.len = count;
460+
sec.buf = val;
461+
462+
msg.sections = 1;
463+
msg.dev_num = slave->dev_num;
464+
msg.flags = flags;
465+
msg.sec = &sec;
466+
467+
do {
468+
ret = sdw_bpt_send_sync(slave->bus, slave, &msg);
469+
if (ret == -EAGAIN)
470+
msleep(10);
471+
retry--;
472+
} while (ret == -EAGAIN && retry > 0);
473+
474+
return ret;
475+
}
476+
450477
/**
451478
* sdw_nread_no_pm() - Read "n" contiguous SDW Slave registers with no PM
452479
* @slave: SDW Slave
@@ -459,6 +486,19 @@ static int sdw_ntransfer_no_pm(struct sdw_slave *slave, u32 addr, u8 flags,
459486
*/
460487
int sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
461488
{
489+
int ret;
490+
491+
if (count < slave->bus->bra_r_threshold)
492+
goto fallback;
493+
494+
ret = sdw_ntransfer_no_pm_bpt(slave, addr, SDW_MSG_FLAG_READ, count, val);
495+
if (!ret)
496+
return 0;
497+
498+
dev_warn(&slave->dev,
499+
"BPT read failed for addr %x, count %zu, ret %d fallback to normal read\n",
500+
addr, count, ret);
501+
fallback:
462502
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_READ, count, val);
463503
}
464504
EXPORT_SYMBOL(sdw_nread_no_pm);
@@ -475,6 +515,19 @@ EXPORT_SYMBOL(sdw_nread_no_pm);
475515
*/
476516
int sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
477517
{
518+
int ret;
519+
520+
if (count < slave->bus->bra_w_threshold)
521+
goto fallback;
522+
523+
ret = sdw_ntransfer_no_pm_bpt(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
524+
if (!ret)
525+
return 0;
526+
527+
dev_warn(&slave->dev,
528+
"BPT write failed for addr %x, count %zu, ret %d fallback to normal write\n",
529+
addr, count, ret);
530+
fallback:
478531
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
479532
}
480533
EXPORT_SYMBOL(sdw_nwrite_no_pm);

0 commit comments

Comments
 (0)