@@ -790,7 +790,20 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
790
790
int ret , i ;
791
791
792
792
while (true) {
793
- /* Enter/proceed with DAA */
793
+ /* SVC_I3C_MCTRL_REQUEST_PROC_DAA have two mode, ENTER DAA or PROCESS DAA.
794
+ *
795
+ * ENTER DAA:
796
+ * 1 will issue START, 7E, ENTDAA, and then emits 7E/R to process first target.
797
+ * 2 Stops just before the new Dynamic Address (DA) is to be emitted.
798
+ *
799
+ * PROCESS DAA:
800
+ * 1 The DA is written using MWDATAB or ADDR bits 6:0.
801
+ * 2 ProcessDAA is requested again to write the new address, and then starts the
802
+ * next (START, 7E, ENTDAA) unless marked to STOP; an MSTATUS indicating NACK
803
+ * means DA was not accepted (e.g. parity error). If PROCESSDAA is NACKed on the
804
+ * 7E/R, which means no more Slaves need a DA, then a COMPLETE will be signaled
805
+ * (along with DONE), and a STOP issued automatically.
806
+ */
794
807
writel (SVC_I3C_MCTRL_REQUEST_PROC_DAA |
795
808
SVC_I3C_MCTRL_TYPE_I3C |
796
809
SVC_I3C_MCTRL_IBIRESP_NACK |
@@ -807,7 +820,7 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
807
820
SVC_I3C_MSTATUS_MCTRLDONE (reg ),
808
821
1 , 1000 );
809
822
if (ret )
810
- return ret ;
823
+ break ;
811
824
812
825
if (SVC_I3C_MSTATUS_RXPEND (reg )) {
813
826
u8 data [6 ];
@@ -819,28 +832,39 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
819
832
*/
820
833
ret = svc_i3c_master_readb (master , data , 6 );
821
834
if (ret )
822
- return ret ;
835
+ break ;
823
836
824
837
for (i = 0 ; i < 6 ; i ++ )
825
838
prov_id [dev_nb ] |= (u64 )(data [i ]) << (8 * (5 - i ));
826
839
827
840
/* We do not care about the BCR and DCR yet */
828
841
ret = svc_i3c_master_readb (master , data , 2 );
829
842
if (ret )
830
- return ret ;
843
+ break ;
831
844
} else if (SVC_I3C_MSTATUS_MCTRLDONE (reg )) {
832
845
if (SVC_I3C_MSTATUS_STATE_IDLE (reg ) &&
833
846
SVC_I3C_MSTATUS_COMPLETE (reg )) {
834
847
/*
835
848
* All devices received and acked they dynamic
836
849
* address, this is the natural end of the DAA
837
850
* procedure.
851
+ *
852
+ * Hardware will auto emit STOP at this case.
838
853
*/
839
- break ;
854
+ * count = dev_nb ;
855
+ return 0 ;
856
+
840
857
} else if (SVC_I3C_MSTATUS_NACKED (reg )) {
841
858
/* No I3C devices attached */
842
- if (dev_nb == 0 )
859
+ if (dev_nb == 0 ) {
860
+ /*
861
+ * Hardware can't treat first NACK for ENTAA as normal
862
+ * COMPLETE. So need manual emit STOP.
863
+ */
864
+ ret = 0 ;
865
+ * count = 0 ;
843
866
break ;
867
+ }
844
868
845
869
/*
846
870
* A slave device nacked the address, this is
@@ -849,16 +873,18 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
849
873
* answer again immediately and shall ack the
850
874
* address this time.
851
875
*/
852
- if (prov_id [dev_nb ] == nacking_prov_id )
853
- return - EIO ;
876
+ if (prov_id [dev_nb ] == nacking_prov_id ) {
877
+ ret = EIO ;
878
+ break ;
879
+ }
854
880
855
881
dev_nb -- ;
856
882
nacking_prov_id = prov_id [dev_nb ];
857
883
svc_i3c_master_emit_stop (master );
858
884
859
885
continue ;
860
886
} else {
861
- return - EIO ;
887
+ break ;
862
888
}
863
889
}
864
890
@@ -870,12 +896,12 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
870
896
SVC_I3C_MSTATUS_BETWEEN (reg ),
871
897
0 , 1000 );
872
898
if (ret )
873
- return ret ;
899
+ break ;
874
900
875
901
/* Give the slave device a suitable dynamic address */
876
902
ret = i3c_master_get_free_addr (& master -> base , last_addr + 1 );
877
903
if (ret < 0 )
878
- return ret ;
904
+ break ;
879
905
880
906
addrs [dev_nb ] = ret ;
881
907
dev_dbg (master -> dev , "DAA: device %d assigned to 0x%02x\n" ,
@@ -885,9 +911,9 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
885
911
last_addr = addrs [dev_nb ++ ];
886
912
}
887
913
888
- * count = dev_nb ;
889
-
890
- return 0 ;
914
+ /* Need manual issue STOP except for Complete condition */
915
+ svc_i3c_master_emit_stop ( master );
916
+ return ret ;
891
917
}
892
918
893
919
static int svc_i3c_update_ibirules (struct svc_i3c_master * master )
@@ -961,11 +987,10 @@ static int svc_i3c_master_do_daa(struct i3c_master_controller *m)
961
987
spin_lock_irqsave (& master -> xferqueue .lock , flags );
962
988
ret = svc_i3c_master_do_daa_locked (master , addrs , & dev_nb );
963
989
spin_unlock_irqrestore (& master -> xferqueue .lock , flags );
964
- if ( ret ) {
965
- svc_i3c_master_emit_stop (master );
966
- svc_i3c_master_clear_merrwarn ( master );
990
+
991
+ svc_i3c_master_clear_merrwarn (master );
992
+ if ( ret )
967
993
goto rpm_out ;
968
- }
969
994
970
995
/* Register all devices who participated to the core */
971
996
for (i = 0 ; i < dev_nb ; i ++ ) {
0 commit comments