Skip to content

Commit 63fc9af

Browse files
superna9999wsakernel
authored andcommitted
soc: qcom: geni-se: add desc struct to specify clocks from device match data
The I2C Master Hub is a stripped down version of the GENI Serial Engine QUP Wrapper Controller but only supporting I2C serial engines without DMA support. Prepare support for the I2C Master Hub variant by moving the required clocks list to a new desc struct then passing it through the compatible match data. Signed-off-by: Neil Armstrong <[email protected]> Reviewed-by: Konrad Dybcio <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent cb29d4e commit 63fc9af

File tree

1 file changed

+55
-14
lines changed

1 file changed

+55
-14
lines changed

drivers/soc/qcom/qcom-geni-se.c

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -81,19 +81,31 @@
8181
*/
8282

8383
#define MAX_CLK_PERF_LEVEL 32
84-
#define NUM_AHB_CLKS 2
84+
#define MAX_CLKS 2
8585

8686
/**
8787
* struct geni_wrapper - Data structure to represent the QUP Wrapper Core
8888
* @dev: Device pointer of the QUP wrapper core
8989
* @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
9192
* @to_core: Core ICC path
9293
*/
9394
struct geni_wrapper {
9495
struct device *dev;
9596
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;
97109
};
98110

99111
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)
496508
struct geni_wrapper *wrapper = se->wrapper;
497509

498510
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);
501512
}
502513

503514
/**
@@ -528,15 +539,13 @@ static int geni_se_clks_on(struct geni_se *se)
528539
int ret;
529540
struct geni_wrapper *wrapper = se->wrapper;
530541

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);
533543
if (ret)
534544
return ret;
535545

536546
ret = clk_prepare_enable(se->clk);
537547
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);
540549
return ret;
541550
}
542551

@@ -887,11 +896,33 @@ static int geni_se_probe(struct platform_device *pdev)
887896
return PTR_ERR(wrapper->base);
888897

889898
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);
893924
if (ret) {
894-
dev_err(dev, "Err getting AHB clks %d\n", ret);
925+
dev_err(dev, "Err getting clks %d\n", ret);
895926
return ret;
896927
}
897928
}
@@ -901,8 +932,18 @@ static int geni_se_probe(struct platform_device *pdev)
901932
return devm_of_platform_populate(dev);
902933
}
903934

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+
904945
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 },
906947
{}
907948
};
908949
MODULE_DEVICE_TABLE(of, geni_se_dt_match);

0 commit comments

Comments
 (0)