123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- From 125681433c8e526356947acf572fe8ca8ad32291 Mon Sep 17 00:00:00 2001
- From: Gokul Sriram Palanisamy <[email protected]>
- Date: Sat, 30 Jan 2021 10:50:05 +0530
- Subject: [PATCH] remoteproc: qcom: Add PRNG proxy clock
- PRNG clock is needed by the secure PIL, support for the same
- is added in subsequent patches.
- Signed-off-by: Gokul Sriram Palanisamy <[email protected]>
- Signed-off-by: Sricharan R <[email protected]>
- Signed-off-by: Nikhil Prakash V <[email protected]>
- ---
- drivers/remoteproc/qcom_q6v5_wcss.c | 65 +++++++++++++++++++++--------
- 1 file changed, 47 insertions(+), 18 deletions(-)
- --- a/drivers/remoteproc/qcom_q6v5_wcss.c
- +++ b/drivers/remoteproc/qcom_q6v5_wcss.c
- @@ -91,19 +91,6 @@ enum {
- WCSS_QCS404,
- };
-
- -struct wcss_data {
- - const char *firmware_name;
- - unsigned int crash_reason_smem;
- - u32 version;
- - bool aon_reset_required;
- - bool wcss_q6_reset_required;
- - const char *ssr_name;
- - const char *sysmon_name;
- - int ssctl_id;
- - const struct rproc_ops *ops;
- - bool requires_force_stop;
- -};
- -
- struct q6v5_wcss {
- struct device *dev;
-
- @@ -128,6 +115,7 @@ struct q6v5_wcss {
- struct clk *qdsp6ss_xo_cbcr;
- struct clk *qdsp6ss_core_gfmux;
- struct clk *lcc_bcr_sleep;
- + struct clk *prng_clk;
- struct regulator *cx_supply;
- struct qcom_sysmon *sysmon;
-
- @@ -151,6 +139,21 @@ struct q6v5_wcss {
- struct qcom_rproc_ssr ssr_subdev;
- };
-
- +struct wcss_data {
- + int (*init_clock)(struct q6v5_wcss *wcss);
- + int (*init_regulator)(struct q6v5_wcss *wcss);
- + const char *firmware_name;
- + unsigned int crash_reason_smem;
- + u32 version;
- + bool aon_reset_required;
- + bool wcss_q6_reset_required;
- + const char *ssr_name;
- + const char *sysmon_name;
- + int ssctl_id;
- + const struct rproc_ops *ops;
- + bool requires_force_stop;
- +};
- +
- static int q6v5_wcss_reset(struct q6v5_wcss *wcss)
- {
- int ret;
- @@ -240,6 +243,12 @@ static int q6v5_wcss_start(struct rproc
- struct q6v5_wcss *wcss = rproc->priv;
- int ret;
-
- + ret = clk_prepare_enable(wcss->prng_clk);
- + if (ret) {
- + dev_err(wcss->dev, "prng clock enable failed\n");
- + return ret;
- + }
- +
- qcom_q6v5_prepare(&wcss->q6v5);
-
- /* Release Q6 and WCSS reset */
- @@ -733,6 +742,7 @@ static int q6v5_wcss_stop(struct rproc *
- return ret;
- }
-
- + clk_disable_unprepare(wcss->prng_clk);
- qcom_q6v5_unprepare(&wcss->q6v5);
-
- return 0;
- @@ -899,7 +909,21 @@ static int q6v5_alloc_memory_region(stru
- return 0;
- }
-
- -static int q6v5_wcss_init_clock(struct q6v5_wcss *wcss)
- +static int ipq8074_init_clock(struct q6v5_wcss *wcss)
- +{
- + int ret;
- +
- + wcss->prng_clk = devm_clk_get(wcss->dev, "prng");
- + if (IS_ERR(wcss->prng_clk)) {
- + ret = PTR_ERR(wcss->prng_clk);
- + if (ret != -EPROBE_DEFER)
- + dev_err(wcss->dev, "Failed to get prng clock\n");
- + return ret;
- + }
- + return 0;
- +}
- +
- +static int qcs404_init_clock(struct q6v5_wcss *wcss)
- {
- int ret;
-
- @@ -989,7 +1013,7 @@ static int q6v5_wcss_init_clock(struct q
- return 0;
- }
-
- -static int q6v5_wcss_init_regulator(struct q6v5_wcss *wcss)
- +static int qcs404_init_regulator(struct q6v5_wcss *wcss)
- {
- wcss->cx_supply = devm_regulator_get(wcss->dev, "cx");
- if (IS_ERR(wcss->cx_supply))
- @@ -1033,12 +1057,14 @@ static int q6v5_wcss_probe(struct platfo
- if (ret)
- goto free_rproc;
-
- - if (wcss->version == WCSS_QCS404) {
- - ret = q6v5_wcss_init_clock(wcss);
- + if (desc->init_clock) {
- + ret = desc->init_clock(wcss);
- if (ret)
- goto free_rproc;
- + }
-
- - ret = q6v5_wcss_init_regulator(wcss);
- + if (desc->init_regulator) {
- + ret = desc->init_regulator(wcss);
- if (ret)
- goto free_rproc;
- }
- @@ -1084,6 +1110,7 @@ static void q6v5_wcss_remove(struct plat
- }
-
- static const struct wcss_data wcss_ipq8074_res_init = {
- + .init_clock = ipq8074_init_clock,
- .firmware_name = "IPQ8074/q6_fw.mdt",
- .crash_reason_smem = WCSS_CRASH_REASON,
- .aon_reset_required = true,
- @@ -1093,6 +1120,8 @@ static const struct wcss_data wcss_ipq80
- };
-
- static const struct wcss_data wcss_qcs404_res_init = {
- + .init_clock = qcs404_init_clock,
- + .init_regulator = qcs404_init_regulator,
- .crash_reason_smem = WCSS_CRASH_REASON,
- .firmware_name = "wcnss.mdt",
- .version = WCSS_QCS404,
|