@@ -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 */
460487int 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}
464500EXPORT_SYMBOL (sdw_nread_no_pm );
@@ -475,6 +511,15 @@ EXPORT_SYMBOL(sdw_nread_no_pm);
475511 */
476512int 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}
480525EXPORT_SYMBOL (sdw_nwrite_no_pm );
0 commit comments