@@ -82,6 +82,13 @@ static bool ufs_mtk_is_broken_vcc(struct ufs_hba *hba)
82
82
return !!(host -> caps & UFS_MTK_CAP_BROKEN_VCC );
83
83
}
84
84
85
+ static bool ufs_mtk_is_pmc_via_fastauto (struct ufs_hba * hba )
86
+ {
87
+ struct ufs_mtk_host * host = ufshcd_get_variant (hba );
88
+
89
+ return (host -> caps & UFS_MTK_CAP_PMC_VIA_FASTAUTO );
90
+ }
91
+
85
92
static void ufs_mtk_cfg_unipro_cg (struct ufs_hba * hba , bool enable )
86
93
{
87
94
u32 tmp ;
@@ -579,6 +586,9 @@ static void ufs_mtk_init_host_caps(struct ufs_hba *hba)
579
586
if (of_property_read_bool (np , "mediatek,ufs-broken-vcc" ))
580
587
host -> caps |= UFS_MTK_CAP_BROKEN_VCC ;
581
588
589
+ if (of_property_read_bool (np , "mediatek,ufs-pmc-via-fastauto" ))
590
+ host -> caps |= UFS_MTK_CAP_PMC_VIA_FASTAUTO ;
591
+
582
592
dev_info (hba -> dev , "caps: 0x%x" , host -> caps );
583
593
}
584
594
@@ -754,6 +764,26 @@ static int ufs_mtk_init(struct ufs_hba *hba)
754
764
return err ;
755
765
}
756
766
767
+ static bool ufs_mtk_pmc_via_fastauto (struct ufs_hba * hba ,
768
+ struct ufs_pa_layer_attr * dev_req_params )
769
+ {
770
+ if (!ufs_mtk_is_pmc_via_fastauto (hba ))
771
+ return false;
772
+
773
+ if (dev_req_params -> hs_rate == hba -> pwr_info .hs_rate )
774
+ return false;
775
+
776
+ if (dev_req_params -> pwr_tx != FAST_MODE &&
777
+ dev_req_params -> gear_tx < UFS_HS_G4 )
778
+ return false;
779
+
780
+ if (dev_req_params -> pwr_rx != FAST_MODE &&
781
+ dev_req_params -> gear_rx < UFS_HS_G4 )
782
+ return false;
783
+
784
+ return true;
785
+ }
786
+
757
787
static int ufs_mtk_pre_pwr_change (struct ufs_hba * hba ,
758
788
struct ufs_pa_layer_attr * dev_max_params ,
759
789
struct ufs_pa_layer_attr * dev_req_params )
@@ -763,8 +793,8 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,
763
793
int ret ;
764
794
765
795
ufshcd_init_pwr_dev_param (& host_cap );
766
- host_cap .hs_rx_gear = UFS_HS_G4 ;
767
- host_cap .hs_tx_gear = UFS_HS_G4 ;
796
+ host_cap .hs_rx_gear = UFS_HS_G5 ;
797
+ host_cap .hs_tx_gear = UFS_HS_G5 ;
768
798
769
799
ret = ufshcd_get_pwr_dev_param (& host_cap ,
770
800
dev_max_params ,
@@ -774,6 +804,32 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,
774
804
__func__ );
775
805
}
776
806
807
+ if (ufs_mtk_pmc_via_fastauto (hba , dev_req_params )) {
808
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_TXTERMINATION ), true);
809
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_TXGEAR ), UFS_HS_G1 );
810
+
811
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_RXTERMINATION ), true);
812
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_RXGEAR ), UFS_HS_G1 );
813
+
814
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_ACTIVETXDATALANES ),
815
+ dev_req_params -> lane_tx );
816
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_ACTIVERXDATALANES ),
817
+ dev_req_params -> lane_rx );
818
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_HSSERIES ),
819
+ dev_req_params -> hs_rate );
820
+
821
+ ufshcd_dme_set (hba , UIC_ARG_MIB (PA_TXHSADAPTTYPE ),
822
+ PA_NO_ADAPT );
823
+
824
+ ret = ufshcd_uic_change_pwr_mode (hba ,
825
+ FASTAUTO_MODE << 4 | FASTAUTO_MODE );
826
+
827
+ if (ret ) {
828
+ dev_err (hba -> dev , "%s: HSG1B FASTAUTO failed ret=%d\n" ,
829
+ __func__ , ret );
830
+ }
831
+ }
832
+
777
833
if (host -> hw_ver .major >= 3 ) {
778
834
ret = ufshcd_dme_configure_adapt (hba ,
779
835
dev_req_params -> gear_tx ,
0 commit comments