@@ -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 */
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+
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}
464504EXPORT_SYMBOL (sdw_nread_no_pm );
@@ -475,6 +515,19 @@ EXPORT_SYMBOL(sdw_nread_no_pm);
475515 */
476516int 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}
480533EXPORT_SYMBOL (sdw_nwrite_no_pm );
0 commit comments