81
81
*/
82
82
83
83
#define MAX_CLK_PERF_LEVEL 32
84
- #define NUM_AHB_CLKS 2
84
+ #define MAX_CLKS 2
85
85
86
86
/**
87
87
* struct geni_wrapper - Data structure to represent the QUP Wrapper Core
88
88
* @dev: Device pointer of the QUP wrapper core
89
89
* @base: Base address of this instance of QUP wrapper core
90
- * @ahb_clks: Handle to the primary & secondary AHB clocks
90
+ * @clks: Handle to the primary & optional secondary AHB clocks
91
+ * @num_clks: Count of clocks
91
92
* @to_core: Core ICC path
92
93
*/
93
94
struct geni_wrapper {
94
95
struct device * dev ;
95
96
void __iomem * base ;
96
- struct clk_bulk_data ahb_clks [NUM_AHB_CLKS ];
97
+ struct clk_bulk_data clks [MAX_CLKS ];
98
+ unsigned int num_clks ;
99
+ };
100
+
101
+ /**
102
+ * struct geni_se_desc - Data structure to represent the QUP Wrapper resources
103
+ * @clks: Name of the primary & optional secondary AHB clocks
104
+ * @num_clks: Count of clock names
105
+ */
106
+ struct geni_se_desc {
107
+ unsigned int num_clks ;
108
+ const char * const * clks ;
97
109
};
98
110
99
111
static const char * const icc_path_names [] = {"qup-core" , "qup-config" ,
@@ -496,8 +508,7 @@ static void geni_se_clks_off(struct geni_se *se)
496
508
struct geni_wrapper * wrapper = se -> wrapper ;
497
509
498
510
clk_disable_unprepare (se -> clk );
499
- clk_bulk_disable_unprepare (ARRAY_SIZE (wrapper -> ahb_clks ),
500
- wrapper -> ahb_clks );
511
+ clk_bulk_disable_unprepare (wrapper -> num_clks , wrapper -> clks );
501
512
}
502
513
503
514
/**
@@ -528,15 +539,13 @@ static int geni_se_clks_on(struct geni_se *se)
528
539
int ret ;
529
540
struct geni_wrapper * wrapper = se -> wrapper ;
530
541
531
- ret = clk_bulk_prepare_enable (ARRAY_SIZE (wrapper -> ahb_clks ),
532
- wrapper -> ahb_clks );
542
+ ret = clk_bulk_prepare_enable (wrapper -> num_clks , wrapper -> clks );
533
543
if (ret )
534
544
return ret ;
535
545
536
546
ret = clk_prepare_enable (se -> clk );
537
547
if (ret )
538
- clk_bulk_disable_unprepare (ARRAY_SIZE (wrapper -> ahb_clks ),
539
- wrapper -> ahb_clks );
548
+ clk_bulk_disable_unprepare (wrapper -> num_clks , wrapper -> clks );
540
549
return ret ;
541
550
}
542
551
@@ -887,11 +896,33 @@ static int geni_se_probe(struct platform_device *pdev)
887
896
return PTR_ERR (wrapper -> base );
888
897
889
898
if (!has_acpi_companion (& pdev -> dev )) {
890
- wrapper -> ahb_clks [0 ].id = "m-ahb" ;
891
- wrapper -> ahb_clks [1 ].id = "s-ahb" ;
892
- ret = devm_clk_bulk_get (dev , NUM_AHB_CLKS , wrapper -> ahb_clks );
899
+ const struct geni_se_desc * desc ;
900
+ int i ;
901
+
902
+ desc = device_get_match_data (& pdev -> dev );
903
+ if (!desc )
904
+ return - EINVAL ;
905
+
906
+ wrapper -> num_clks = min_t (unsigned int , desc -> num_clks , MAX_CLKS );
907
+
908
+ for (i = 0 ; i < wrapper -> num_clks ; ++ i )
909
+ wrapper -> clks [i ].id = desc -> clks [i ];
910
+
911
+ ret = of_count_phandle_with_args (dev -> of_node , "clocks" , "#clock-cells" );
912
+ if (ret < 0 ) {
913
+ dev_err (dev , "invalid clocks property at %pOF\n" , dev -> of_node );
914
+ return ret ;
915
+ }
916
+
917
+ if (ret < wrapper -> num_clks ) {
918
+ dev_err (dev , "invalid clocks count at %pOF, expected %d entries\n" ,
919
+ dev -> of_node , wrapper -> num_clks );
920
+ return - EINVAL ;
921
+ }
922
+
923
+ ret = devm_clk_bulk_get (dev , wrapper -> num_clks , wrapper -> clks );
893
924
if (ret ) {
894
- dev_err (dev , "Err getting AHB clks %d\n" , ret );
925
+ dev_err (dev , "Err getting clks %d\n" , ret );
895
926
return ret ;
896
927
}
897
928
}
@@ -901,8 +932,18 @@ static int geni_se_probe(struct platform_device *pdev)
901
932
return devm_of_platform_populate (dev );
902
933
}
903
934
935
+ static const char * const qup_clks [] = {
936
+ "m-ahb" ,
937
+ "s-ahb" ,
938
+ };
939
+
940
+ static const struct geni_se_desc qup_desc = {
941
+ .clks = qup_clks ,
942
+ .num_clks = ARRAY_SIZE (qup_clks ),
943
+ };
944
+
904
945
static const struct of_device_id geni_se_dt_match [] = {
905
- { .compatible = "qcom,geni-se-qup" , },
946
+ { .compatible = "qcom,geni-se-qup" , . data = & qup_desc },
906
947
{}
907
948
};
908
949
MODULE_DEVICE_TABLE (of , geni_se_dt_match );
0 commit comments