remoteproc: qcom: Compatible string based resource initialization.
authorAvaneesh Kumar Dwivedi <akdwived@codeaurora.org>
Mon, 30 Jan 2017 15:03:06 +0000 (20:33 +0530)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Mon, 30 Jan 2017 21:29:39 +0000 (13:29 -0800)
This patch initialize certain driver related data based on compatible
string. This enable driver to handle more than one similar device in
by differentiating in probe their private data.

Signed-off-by: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/qcom_adsp_pil.c

index 43a4ed2f346cf6370eab882fcbe07d4b4deda39e..1a07d8e0561576414e121c4e589acb709b9d077f 100644 (file)
 #include "qcom_mdt_loader.h"
 #include "remoteproc_internal.h"
 
-#define ADSP_CRASH_REASON_SMEM         423
-#define ADSP_FIRMWARE_NAME             "adsp.mdt"
-#define ADSP_PAS_ID                    1
+struct adsp_data {
+       int crash_reason_smem;
+       const char *firmware_name;
+       int pas_id;
+};
 
 struct qcom_adsp {
        struct device *dev;
@@ -53,6 +55,9 @@ struct qcom_adsp {
 
        struct regulator *cx_supply;
 
+       int pas_id;
+       int crash_reason_smem;
+
        struct completion start_done;
        struct completion stop_done;
 
@@ -70,7 +75,7 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
        bool relocate;
        int ret;
 
-       ret = qcom_scm_pas_init_image(ADSP_PAS_ID, fw->data, fw->size);
+       ret = qcom_scm_pas_init_image(adsp->pas_id, fw->data, fw->size);
        if (ret) {
                dev_err(&rproc->dev, "invalid firmware metadata\n");
                return ret;
@@ -85,7 +90,8 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
        if (relocate) {
                adsp->mem_reloc = fw_addr;
 
-               ret = qcom_scm_pas_mem_setup(ADSP_PAS_ID, adsp->mem_phys, fw_size);
+               ret = qcom_scm_pas_mem_setup(adsp->pas_id,
+                                            adsp->mem_phys, fw_size);
                if (ret) {
                        dev_err(&rproc->dev, "unable to setup memory for image\n");
                        return ret;
@@ -113,7 +119,7 @@ static int adsp_start(struct rproc *rproc)
        if (ret)
                goto disable_clocks;
 
-       ret = qcom_scm_pas_auth_and_reset(ADSP_PAS_ID);
+       ret = qcom_scm_pas_auth_and_reset(adsp->pas_id);
        if (ret) {
                dev_err(adsp->dev,
                        "failed to authenticate image and release reset\n");
@@ -124,7 +130,7 @@ static int adsp_start(struct rproc *rproc)
                                          msecs_to_jiffies(5000));
        if (!ret) {
                dev_err(adsp->dev, "start timed out\n");
-               qcom_scm_pas_shutdown(ADSP_PAS_ID);
+               qcom_scm_pas_shutdown(adsp->pas_id);
                ret = -ETIMEDOUT;
                goto disable_regulators;
        }
@@ -157,7 +163,7 @@ static int adsp_stop(struct rproc *rproc)
                                    BIT(adsp->stop_bit),
                                    0);
 
-       ret = qcom_scm_pas_shutdown(ADSP_PAS_ID);
+       ret = qcom_scm_pas_shutdown(adsp->pas_id);
        if (ret)
                dev_err(adsp->dev, "failed to shutdown: %d\n", ret);
 
@@ -197,7 +203,7 @@ static irqreturn_t adsp_fatal_interrupt(int irq, void *dev)
        size_t len;
        char *msg;
 
-       msg = qcom_smem_get(QCOM_SMEM_HOST_ANY, ADSP_CRASH_REASON_SMEM, &len);
+       msg = qcom_smem_get(QCOM_SMEM_HOST_ANY, adsp->crash_reason_smem, &len);
        if (!IS_ERR(msg) && len > 0 && msg[0])
                dev_err(adsp->dev, "fatal error received: %s\n", msg);
 
@@ -311,20 +317,25 @@ static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
 
 static int adsp_probe(struct platform_device *pdev)
 {
+       const struct adsp_data *desc;
        struct qcom_adsp *adsp;
        struct rproc *rproc;
        int ret;
 
+       desc = of_device_get_match_data(&pdev->dev);
+       if (!desc)
+               return -EINVAL;
+
        if (!qcom_scm_is_available())
                return -EPROBE_DEFER;
 
-       if (!qcom_scm_pas_supported(ADSP_PAS_ID)) {
-               dev_err(&pdev->dev, "PAS is not available for ADSP\n");
+       if (!qcom_scm_pas_supported(desc->pas_id)) {
+               dev_err(&pdev->dev, "PAS is not available for subsystem\n");
                return -ENXIO;
        }
 
        rproc = rproc_alloc(&pdev->dev, pdev->name, &adsp_ops,
-                           ADSP_FIRMWARE_NAME, sizeof(*adsp));
+                           desc->firmware_name, sizeof(*adsp));
        if (!rproc) {
                dev_err(&pdev->dev, "unable to allocate remoteproc\n");
                return -ENOMEM;
@@ -335,6 +346,8 @@ static int adsp_probe(struct platform_device *pdev)
        adsp = (struct qcom_adsp *)rproc->priv;
        adsp->dev = &pdev->dev;
        adsp->rproc = rproc;
+       adsp->pas_id = desc->pas_id;
+       adsp->crash_reason_smem = desc->crash_reason_smem;
        platform_set_drvdata(pdev, adsp);
 
        init_completion(&adsp->start_done);
@@ -407,9 +420,15 @@ static int adsp_remove(struct platform_device *pdev)
        return 0;
 }
 
+static const struct adsp_data adsp_resource_init = {
+               .crash_reason_smem = 423,
+               .firmware_name = "adsp.mdt",
+               .pas_id = 1,
+};
+
 static const struct of_device_id adsp_of_match[] = {
-       { .compatible = "qcom,msm8974-adsp-pil" },
-       { .compatible = "qcom,msm8996-adsp-pil" },
+       { .compatible = "qcom,msm8974-adsp-pil", .data = &adsp_resource_init},
+       { .compatible = "qcom,msm8996-adsp-pil", .data = &adsp_resource_init},
        { },
 };
 MODULE_DEVICE_TABLE(of, adsp_of_match);