@@ -447,6 +447,46 @@ 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+ size_t size ;
456+ int retry = 5 ;
457+ int ret ;
458+
459+ msg .sections = 1 ;
460+ msg .dev_num = slave -> dev_num ;
461+ msg .flags = flags ;
462+ msg .sec = & sec ;
463+
464+ while (count ) {
465+ size = min_t (size_t , count , SDW_BPT_MSG_MAX_BYTES );
466+
467+ sec .addr = addr ;
468+ sec .len = size ;
469+ sec .buf = val ;
470+
471+ do {
472+ ret = sdw_bpt_send_sync (slave -> bus , slave , & msg );
473+ if (ret == - EAGAIN )
474+ msleep (10 );
475+ retry -- ;
476+ } while (ret == - EAGAIN && retry > 0 );
477+
478+ if (ret < 0 )
479+ return ret ;
480+
481+ addr += size ;
482+ val += size ;
483+ count -= size ;
484+ retry = 5 ;
485+ }
486+
487+ return 0 ;
488+ }
489+
450490/**
451491 * sdw_nread_no_pm() - Read "n" contiguous SDW Slave registers with no PM
452492 * @slave: SDW Slave
@@ -459,6 +499,21 @@ static int sdw_ntransfer_no_pm(struct sdw_slave *slave, u32 addr, u8 flags,
459499 */
460500int sdw_nread_no_pm (struct sdw_slave * slave , u32 addr , size_t count , u8 * val )
461501{
502+ struct sdw_bus * bus = slave -> bus ;
503+ int ret ;
504+
505+ if (!bus -> ops -> bpt_send_async || !bus -> ops -> bpt_wait ||
506+ count < bus -> bra_r_threshold )
507+ goto fallback ;
508+
509+ ret = sdw_ntransfer_no_pm_bpt (slave , addr , SDW_MSG_FLAG_READ , count , val );
510+ if (!ret )
511+ return 0 ;
512+
513+ dev_dbg (& slave -> dev ,
514+ "BPT read failed for addr %x, count %zu, ret %d fallback to normal read\n" ,
515+ addr , count , ret );
516+ fallback :
462517 return sdw_ntransfer_no_pm (slave , addr , SDW_MSG_FLAG_READ , count , val );
463518}
464519EXPORT_SYMBOL (sdw_nread_no_pm );
@@ -475,6 +530,21 @@ EXPORT_SYMBOL(sdw_nread_no_pm);
475530 */
476531int sdw_nwrite_no_pm (struct sdw_slave * slave , u32 addr , size_t count , const u8 * val )
477532{
533+ struct sdw_bus * bus = slave -> bus ;
534+ int ret ;
535+
536+ if (!bus -> ops -> bpt_send_async || !bus -> ops -> bpt_wait ||
537+ count < bus -> bra_w_threshold )
538+ goto fallback ;
539+
540+ ret = sdw_ntransfer_no_pm_bpt (slave , addr , SDW_MSG_FLAG_WRITE , count , (u8 * )val );
541+ if (!ret )
542+ return 0 ;
543+
544+ dev_dbg (& slave -> dev ,
545+ "BPT write failed for addr %x, count %zu, ret %d fallback to normal write\n" ,
546+ addr , count , ret );
547+ fallback :
478548 return sdw_ntransfer_no_pm (slave , addr , SDW_MSG_FLAG_WRITE , count , (u8 * )val );
479549}
480550EXPORT_SYMBOL (sdw_nwrite_no_pm );
0 commit comments