Skip to content

Commit 1bad5a1

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 1bad5a1

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

drivers/soundwire/bus.c

Lines changed: 45 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,15 @@ 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+
fallback:
462498
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_READ, count, val);
463499
}
464500
EXPORT_SYMBOL(sdw_nread_no_pm);
@@ -475,6 +511,15 @@ EXPORT_SYMBOL(sdw_nread_no_pm);
475511
*/
476512
int sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
477513
{
514+
int ret;
515+
516+
if (count < slave->bus->bra_w_threshold)
517+
goto fallback;
518+
519+
ret = sdw_ntransfer_no_pm_bpt(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
520+
if (!ret)
521+
return 0;
522+
fallback:
478523
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
479524
}
480525
EXPORT_SYMBOL(sdw_nwrite_no_pm);

0 commit comments

Comments
 (0)