Skip to content

Commit 5cdd510

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 2f2a0b2 commit 5cdd510

1 file changed

Lines changed: 44 additions & 0 deletions

File tree

drivers/soundwire/bus.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,32 @@ 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+
msleep(10);
470+
retry--;
471+
} while (ret == -EAGAIN && retry > 0);
472+
473+
return ret;
474+
}
475+
450476
/**
451477
* sdw_nread_no_pm() - Read "n" contiguous SDW Slave registers with no PM
452478
* @slave: SDW Slave
@@ -459,6 +485,15 @@ static int sdw_ntransfer_no_pm(struct sdw_slave *slave, u32 addr, u8 flags,
459485
*/
460486
int sdw_nread_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
461487
{
488+
int ret;
489+
490+
if (count < slave->bus->bra_r_threshold)
491+
goto fallback;
492+
493+
ret = sdw_ntransfer_no_pm_bpt(slave, addr, SDW_MSG_FLAG_READ, count, val);
494+
if (!ret)
495+
return 0;
496+
fallback:
462497
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_READ, count, val);
463498
}
464499
EXPORT_SYMBOL(sdw_nread_no_pm);
@@ -475,6 +510,15 @@ EXPORT_SYMBOL(sdw_nread_no_pm);
475510
*/
476511
int sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
477512
{
513+
int ret;
514+
515+
if (count < slave->bus->bra_w_threshold)
516+
goto fallback;
517+
518+
ret = sdw_ntransfer_no_pm_bpt(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
519+
if (!ret)
520+
return 0;
521+
fallback:
478522
return sdw_ntransfer_no_pm(slave, addr, SDW_MSG_FLAG_WRITE, count, (u8 *)val);
479523
}
480524
EXPORT_SYMBOL(sdw_nwrite_no_pm);

0 commit comments

Comments
 (0)