@@ -37,7 +37,6 @@
#include <linux/qcom_scm.h>
-#define MBA_FIRMWARE_NAME "mba.b00"
#define MPSS_FIRMWARE_NAME "modem.mdt"
#define MPSS_CRASH_REASON_SMEM 421
@@ -117,7 +116,7 @@ struct q6v5 {
void __iomem *reg_base;
void __iomem *rmb_base;
-
+ void __iomem *restart_reg;
struct regmap *halt_map;
u32 halt_q6;
u32 halt_modem;
@@ -743,9 +742,12 @@ static int q6v5_init_clocks(struct q6v5 *qproc)
return 0;
}
-static int q6v5_init_reset(struct q6v5 *qproc)
+static int q6v5_init_reset(void *q, void *p)
{
- qproc->mss_restart = devm_reset_control_get(qproc->dev, NULL);
+ struct q6v5 *qproc = q;
+ struct platform_device *pdev = p;
+
+ qproc->mss_restart = devm_reset_control_get(&pdev->dev, NULL);
if (IS_ERR(qproc->mss_restart)) {
dev_err(qproc->dev, "failed to acquire mss restart\n");
return PTR_ERR(qproc->mss_restart);
@@ -754,6 +756,23 @@ static int q6v5_init_reset(struct q6v5 *qproc)
return 0;
}
+static int q6v56_init_reset(void *q, void *p)
+{
+ struct resource *res;
+ struct q6v5 *qproc = q;
+ struct platform_device *pdev = p;
+
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "restart_reg");
+ qproc->restart_reg = devm_ioremap(qproc->dev, res->start,
+ resource_size(res));
+ if (IS_ERR(qproc->restart_reg)) {
+ dev_err(qproc->dev, "failed to get restart_reg\n");
+ return PTR_ERR(qproc->restart_reg);
+ }
+
+ return 0;
+}
+
static int q6v5_request_irq(struct q6v5 *qproc,
struct platform_device *pdev,
const char *name,
@@ -825,10 +844,15 @@ static int q6v5_probe(struct platform_device *pdev)
{
struct q6v5 *qproc;
struct rproc *rproc;
+ const struct q6_rproc_res *desc;
int ret;
+ desc = of_device_get_match_data(&pdev->dev);
+ if (!desc)
+ return -EINVAL;
+
rproc = rproc_alloc(&pdev->dev, pdev->name, &q6v5_ops,
- MBA_FIRMWARE_NAME, sizeof(*qproc));
+ desc->q6_mba_image, sizeof(*qproc));
if (!rproc) {
dev_err(&pdev->dev, "failed to allocate rproc\n");
return -ENOMEM;
@@ -860,7 +884,7 @@ static int q6v5_probe(struct platform_device *pdev)
if (ret)
goto free_rproc;
- ret = q6v5_init_reset(qproc);
+ ret = desc->q6_reset_init(qproc, pdev);
if (ret)
goto free_rproc;
@@ -916,7 +940,7 @@ static int q6v5_remove(struct platform_device *pdev)
"gpll0_mss_clk", "snoc_axi_clk", "mnoc_axi_clk", NULL};
static const struct q6_rproc_res q6v56_res = {
- .q6_reset_init = NULL,
+ .q6_reset_init = q6v56_init_reset,
.q6_mba_image = "mba.mbn",
.proxy_reg_string = proxy_q6v56_regulator_namestr,
.active_reg_string = NULL,
@@ -927,7 +951,7 @@ static int q6v5_remove(struct platform_device *pdev)
};
static const struct q6_rproc_res q6v5_res = {
- .q6_reset_init = NULL,
+ .q6_reset_init = q6v5_init_reset,
.q6_mba_image = "mba.mbn",
.proxy_reg_string = proxy_q6v56_regulator_namestr,
.proxy_voltage_load = (int **)proxy_q6v56_voltage_load,
Reset assert of mss need to be done before mss clocks are enabled and hexagon starts ticking. On some platform handle to program restart register is via reset control framework while on some it is by direct ioremap. Signed-off-by: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org> --- drivers/remoteproc/qcom_q6v5_pil.c | 40 ++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-)