@@ -88,6 +88,7 @@ struct geni_i2c_dev {
88
88
int cur_wr ;
89
89
int cur_rd ;
90
90
spinlock_t lock ;
91
+ struct clk * core_clk ;
91
92
u32 clk_freq_out ;
92
93
const struct geni_i2c_clk_fld * clk_fld ;
93
94
int suspended ;
@@ -100,6 +101,13 @@ struct geni_i2c_dev {
100
101
bool abort_done ;
101
102
};
102
103
104
+ struct geni_i2c_desc {
105
+ bool has_core_clk ;
106
+ char * icc_ddr ;
107
+ bool no_dma_support ;
108
+ unsigned int tx_fifo_depth ;
109
+ };
110
+
103
111
struct geni_i2c_err_log {
104
112
int err ;
105
113
const char * msg ;
@@ -764,6 +772,7 @@ static int geni_i2c_probe(struct platform_device *pdev)
764
772
u32 proto , tx_depth , fifo_disable ;
765
773
int ret ;
766
774
struct device * dev = & pdev -> dev ;
775
+ const struct geni_i2c_desc * desc = NULL ;
767
776
768
777
gi2c = devm_kzalloc (dev , sizeof (* gi2c ), GFP_KERNEL );
769
778
if (!gi2c )
@@ -776,6 +785,14 @@ static int geni_i2c_probe(struct platform_device *pdev)
776
785
if (IS_ERR (gi2c -> se .base ))
777
786
return PTR_ERR (gi2c -> se .base );
778
787
788
+ desc = device_get_match_data (& pdev -> dev );
789
+
790
+ if (desc && desc -> has_core_clk ) {
791
+ gi2c -> core_clk = devm_clk_get (dev , "core" );
792
+ if (IS_ERR (gi2c -> core_clk ))
793
+ return PTR_ERR (gi2c -> core_clk );
794
+ }
795
+
779
796
gi2c -> se .clk = devm_clk_get (dev , "se" );
780
797
if (IS_ERR (gi2c -> se .clk ) && !has_acpi_companion (dev ))
781
798
return PTR_ERR (gi2c -> se .clk );
@@ -819,7 +836,7 @@ static int geni_i2c_probe(struct platform_device *pdev)
819
836
gi2c -> adap .dev .of_node = dev -> of_node ;
820
837
strscpy (gi2c -> adap .name , "Geni-I2C" , sizeof (gi2c -> adap .name ));
821
838
822
- ret = geni_icc_get (& gi2c -> se , "qup-memory" );
839
+ ret = geni_icc_get (& gi2c -> se , desc ? desc -> icc_ddr : "qup-memory" );
823
840
if (ret )
824
841
return ret ;
825
842
/*
@@ -829,12 +846,17 @@ static int geni_i2c_probe(struct platform_device *pdev)
829
846
*/
830
847
gi2c -> se .icc_paths [GENI_TO_CORE ].avg_bw = GENI_DEFAULT_BW ;
831
848
gi2c -> se .icc_paths [CPU_TO_GENI ].avg_bw = GENI_DEFAULT_BW ;
832
- gi2c -> se .icc_paths [GENI_TO_DDR ].avg_bw = Bps_to_icc (gi2c -> clk_freq_out );
849
+ if (!desc || desc -> icc_ddr )
850
+ gi2c -> se .icc_paths [GENI_TO_DDR ].avg_bw = Bps_to_icc (gi2c -> clk_freq_out );
833
851
834
852
ret = geni_icc_set_bw (& gi2c -> se );
835
853
if (ret )
836
854
return ret ;
837
855
856
+ ret = clk_prepare_enable (gi2c -> core_clk );
857
+ if (ret )
858
+ return ret ;
859
+
838
860
ret = geni_se_resources_on (& gi2c -> se );
839
861
if (ret ) {
840
862
dev_err (dev , "Error turning on resources %d\n" , ret );
@@ -844,10 +866,15 @@ static int geni_i2c_probe(struct platform_device *pdev)
844
866
if (proto != GENI_SE_I2C ) {
845
867
dev_err (dev , "Invalid proto %d\n" , proto );
846
868
geni_se_resources_off (& gi2c -> se );
869
+ clk_disable_unprepare (gi2c -> core_clk );
847
870
return - ENXIO ;
848
871
}
849
872
850
- fifo_disable = readl_relaxed (gi2c -> se .base + GENI_IF_DISABLE_RO ) & FIFO_IF_DISABLE ;
873
+ if (desc && desc -> no_dma_support )
874
+ fifo_disable = false;
875
+ else
876
+ fifo_disable = readl_relaxed (gi2c -> se .base + GENI_IF_DISABLE_RO ) & FIFO_IF_DISABLE ;
877
+
851
878
if (fifo_disable ) {
852
879
/* FIFO is disabled, so we can only use GPI DMA */
853
880
gi2c -> gpi_mode = true;
@@ -859,6 +886,16 @@ static int geni_i2c_probe(struct platform_device *pdev)
859
886
} else {
860
887
gi2c -> gpi_mode = false;
861
888
tx_depth = geni_se_get_tx_fifo_depth (& gi2c -> se );
889
+
890
+ /* I2C Master Hub Serial Elements doesn't have the HW_PARAM_0 register */
891
+ if (!tx_depth && desc )
892
+ tx_depth = desc -> tx_fifo_depth ;
893
+
894
+ if (!tx_depth ) {
895
+ dev_err (dev , "Invalid TX FIFO depth\n" );
896
+ return - EINVAL ;
897
+ }
898
+
862
899
gi2c -> tx_wm = tx_depth - 1 ;
863
900
geni_se_init (& gi2c -> se , gi2c -> tx_wm , tx_depth );
864
901
geni_se_config_packing (& gi2c -> se , BITS_PER_BYTE ,
@@ -867,6 +904,7 @@ static int geni_i2c_probe(struct platform_device *pdev)
867
904
dev_dbg (dev , "i2c fifo/se-dma mode. fifo depth:%d\n" , tx_depth );
868
905
}
869
906
907
+ clk_disable_unprepare (gi2c -> core_clk );
870
908
ret = geni_se_resources_off (& gi2c -> se );
871
909
if (ret ) {
872
910
dev_err (dev , "Error turning off resources %d\n" , ret );
@@ -932,6 +970,8 @@ static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev)
932
970
gi2c -> suspended = 1 ;
933
971
}
934
972
973
+ clk_disable_unprepare (gi2c -> core_clk );
974
+
935
975
return geni_icc_disable (& gi2c -> se );
936
976
}
937
977
@@ -944,6 +984,10 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev)
944
984
if (ret )
945
985
return ret ;
946
986
987
+ ret = clk_prepare_enable (gi2c -> core_clk );
988
+ if (ret )
989
+ return ret ;
990
+
947
991
ret = geni_se_resources_on (& gi2c -> se );
948
992
if (ret )
949
993
return ret ;
0 commit comments