@@ -88,6 +88,7 @@ struct geni_i2c_dev {
8888 int cur_wr ;
8989 int cur_rd ;
9090 spinlock_t lock ;
91+ struct clk * core_clk ;
9192 u32 clk_freq_out ;
9293 const struct geni_i2c_clk_fld * clk_fld ;
9394 int suspended ;
@@ -100,6 +101,13 @@ struct geni_i2c_dev {
100101 bool abort_done ;
101102};
102103
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+
103111struct geni_i2c_err_log {
104112 int err ;
105113 const char * msg ;
@@ -626,7 +634,6 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c, struct i2c_msg msgs[], i
626634 dev_err (gi2c -> se .dev , "I2C timeout gpi flags:%d addr:0x%x\n" ,
627635 gi2c -> cur -> flags , gi2c -> cur -> addr );
628636 gi2c -> err = - ETIMEDOUT ;
629- goto err ;
630637 }
631638
632639 if (gi2c -> err ) {
@@ -764,6 +771,7 @@ static int geni_i2c_probe(struct platform_device *pdev)
764771 u32 proto , tx_depth , fifo_disable ;
765772 int ret ;
766773 struct device * dev = & pdev -> dev ;
774+ const struct geni_i2c_desc * desc = NULL ;
767775
768776 gi2c = devm_kzalloc (dev , sizeof (* gi2c ), GFP_KERNEL );
769777 if (!gi2c )
@@ -776,6 +784,14 @@ static int geni_i2c_probe(struct platform_device *pdev)
776784 if (IS_ERR (gi2c -> se .base ))
777785 return PTR_ERR (gi2c -> se .base );
778786
787+ desc = device_get_match_data (& pdev -> dev );
788+
789+ if (desc && desc -> has_core_clk ) {
790+ gi2c -> core_clk = devm_clk_get (dev , "core" );
791+ if (IS_ERR (gi2c -> core_clk ))
792+ return PTR_ERR (gi2c -> core_clk );
793+ }
794+
779795 gi2c -> se .clk = devm_clk_get (dev , "se" );
780796 if (IS_ERR (gi2c -> se .clk ) && !has_acpi_companion (dev ))
781797 return PTR_ERR (gi2c -> se .clk );
@@ -819,7 +835,7 @@ static int geni_i2c_probe(struct platform_device *pdev)
819835 gi2c -> adap .dev .of_node = dev -> of_node ;
820836 strlcpy (gi2c -> adap .name , "Geni-I2C" , sizeof (gi2c -> adap .name ));
821837
822- ret = geni_icc_get (& gi2c -> se , "qup-memory" );
838+ ret = geni_icc_get (& gi2c -> se , desc ? desc -> icc_ddr : "qup-memory" );
823839 if (ret )
824840 return ret ;
825841 /*
@@ -829,12 +845,17 @@ static int geni_i2c_probe(struct platform_device *pdev)
829845 */
830846 gi2c -> se .icc_paths [GENI_TO_CORE ].avg_bw = GENI_DEFAULT_BW ;
831847 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 );
848+ if (!desc || desc -> icc_ddr )
849+ gi2c -> se .icc_paths [GENI_TO_DDR ].avg_bw = Bps_to_icc (gi2c -> clk_freq_out );
833850
834851 ret = geni_icc_set_bw (& gi2c -> se );
835852 if (ret )
836853 return ret ;
837854
855+ ret = clk_prepare_enable (gi2c -> core_clk );
856+ if (ret )
857+ return ret ;
858+
838859 ret = geni_se_resources_on (& gi2c -> se );
839860 if (ret ) {
840861 dev_err (dev , "Error turning on resources %d\n" , ret );
@@ -844,10 +865,15 @@ static int geni_i2c_probe(struct platform_device *pdev)
844865 if (proto != GENI_SE_I2C ) {
845866 dev_err (dev , "Invalid proto %d\n" , proto );
846867 geni_se_resources_off (& gi2c -> se );
868+ clk_disable_unprepare (gi2c -> core_clk );
847869 return - ENXIO ;
848870 }
849871
850- fifo_disable = readl_relaxed (gi2c -> se .base + GENI_IF_DISABLE_RO ) & FIFO_IF_DISABLE ;
872+ if (desc && desc -> no_dma_support )
873+ fifo_disable = false;
874+ else
875+ fifo_disable = readl_relaxed (gi2c -> se .base + GENI_IF_DISABLE_RO ) & FIFO_IF_DISABLE ;
876+
851877 if (fifo_disable ) {
852878 /* FIFO is disabled, so we can only use GPI DMA */
853879 gi2c -> gpi_mode = true;
@@ -859,6 +885,16 @@ static int geni_i2c_probe(struct platform_device *pdev)
859885 } else {
860886 gi2c -> gpi_mode = false;
861887 tx_depth = geni_se_get_tx_fifo_depth (& gi2c -> se );
888+
889+ /* I2C Master Hub Serial Elements doesn't have the HW_PARAM_0 register */
890+ if (!tx_depth && desc )
891+ tx_depth = desc -> tx_fifo_depth ;
892+
893+ if (!tx_depth ) {
894+ dev_err (dev , "Invalid TX FIFO depth\n" );
895+ return - EINVAL ;
896+ }
897+
862898 gi2c -> tx_wm = tx_depth - 1 ;
863899 geni_se_init (& gi2c -> se , gi2c -> tx_wm , tx_depth );
864900 geni_se_config_packing (& gi2c -> se , BITS_PER_BYTE ,
@@ -867,6 +903,7 @@ static int geni_i2c_probe(struct platform_device *pdev)
867903 dev_dbg (dev , "i2c fifo/se-dma mode. fifo depth:%d\n" , tx_depth );
868904 }
869905
906+ clk_disable_unprepare (gi2c -> core_clk );
870907 ret = geni_se_resources_off (& gi2c -> se );
871908 if (ret ) {
872909 dev_err (dev , "Error turning off resources %d\n" , ret );
@@ -932,6 +969,8 @@ static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev)
932969 gi2c -> suspended = 1 ;
933970 }
934971
972+ clk_disable_unprepare (gi2c -> core_clk );
973+
935974 return geni_icc_disable (& gi2c -> se );
936975}
937976
@@ -944,6 +983,10 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev)
944983 if (ret )
945984 return ret ;
946985
986+ ret = clk_prepare_enable (gi2c -> core_clk );
987+ if (ret )
988+ return ret ;
989+
947990 ret = geni_se_resources_on (& gi2c -> se );
948991 if (ret )
949992 return ret ;
@@ -982,8 +1025,16 @@ static const struct dev_pm_ops geni_i2c_pm_ops = {
9821025 NULL )
9831026};
9841027
1028+ const struct geni_i2c_desc i2c_master_hub = {
1029+ .has_core_clk = true,
1030+ .icc_ddr = NULL ,
1031+ .no_dma_support = true,
1032+ .tx_fifo_depth = 16 ,
1033+ };
1034+
9851035static const struct of_device_id geni_i2c_dt_match [] = {
9861036 { .compatible = "qcom,geni-i2c" },
1037+ { .compatible = "qcom,geni-i2c-master-hub" , .data = & i2c_master_hub },
9871038 {}
9881039};
9891040MODULE_DEVICE_TABLE (of , geni_i2c_dt_match );
0 commit comments