]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
mailbox: qcom: Convert APCS IPC driver to use regmap
authorGeorgi Djakov <georgi.djakov@linaro.org>
Tue, 5 Dec 2017 15:46:56 +0000 (17:46 +0200)
committerThadeu Lima de Souza Cascardo <cascardo@canonical.com>
Wed, 11 Apr 2018 16:43:43 +0000 (13:43 -0300)
BugLink: http://bugs.launchpad.net/bugs/1763040
This hardware block provides more functionalities that just IPC. Convert
it to regmap to allow other child platform devices to use the same regmap.

Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
(cherry picked from commit c6a8b171ca8e338a3012420041346f0e50f7f649)
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
Acked-by: Seth Forshee <seth.forshee@canonical.com>
Acked-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
drivers/mailbox/qcom-apcs-ipc-mailbox.c

index 9924c6d7f05d999c9b7600a9ca5eed61c8b16136..ab344bc6fa63445090e9e424ba26346f1ae06bc4 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
+#include <linux/regmap.h>
 #include <linux/mailbox_controller.h>
 
 #define QCOM_APCS_IPC_BITS     32
@@ -26,19 +27,25 @@ struct qcom_apcs_ipc {
        struct mbox_controller mbox;
        struct mbox_chan mbox_chans[QCOM_APCS_IPC_BITS];
 
-       void __iomem *reg;
+       struct regmap *regmap;
        unsigned long offset;
 };
 
+static const struct regmap_config apcs_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+       .max_register = 0x1000,
+       .fast_io = true,
+};
+
 static int qcom_apcs_ipc_send_data(struct mbox_chan *chan, void *data)
 {
        struct qcom_apcs_ipc *apcs = container_of(chan->mbox,
                                                  struct qcom_apcs_ipc, mbox);
        unsigned long idx = (unsigned long)chan->con_priv;
 
-       writel(BIT(idx), apcs->reg);
-
-       return 0;
+       return regmap_write(apcs->regmap, apcs->offset, BIT(idx));
 }
 
 static const struct mbox_chan_ops qcom_apcs_ipc_ops = {
@@ -47,7 +54,9 @@ static const struct mbox_chan_ops qcom_apcs_ipc_ops = {
 
 static int qcom_apcs_ipc_probe(struct platform_device *pdev)
 {
+       struct device_node *np = pdev->dev.of_node;
        struct qcom_apcs_ipc *apcs;
+       struct regmap *regmap;
        struct resource *res;
        unsigned long offset;
        void __iomem *base;
@@ -63,9 +72,14 @@ static int qcom_apcs_ipc_probe(struct platform_device *pdev)
        if (IS_ERR(base))
                return PTR_ERR(base);
 
+       regmap = devm_regmap_init_mmio(&pdev->dev, base, &apcs_regmap_config);
+       if (IS_ERR(regmap))
+               return PTR_ERR(regmap);
+
        offset = (unsigned long)of_device_get_match_data(&pdev->dev);
 
-       apcs->reg = base + offset;
+       apcs->regmap = regmap;
+       apcs->offset = offset;
 
        /* Initialize channel identifiers */
        for (i = 0; i < ARRAY_SIZE(apcs->mbox_chans); i++)