aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-yocto/generic-drivers/mpm/0002-irqchip-irq-qcom-mpm-Support-passing-a-slice-of-SRAM.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-yocto/generic-drivers/mpm/0002-irqchip-irq-qcom-mpm-Support-passing-a-slice-of-SRAM.patch')
-rw-r--r--recipes-kernel/linux/linux-yocto/generic-drivers/mpm/0002-irqchip-irq-qcom-mpm-Support-passing-a-slice-of-SRAM.patch78
1 files changed, 78 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-yocto/generic-drivers/mpm/0002-irqchip-irq-qcom-mpm-Support-passing-a-slice-of-SRAM.patch b/recipes-kernel/linux/linux-yocto/generic-drivers/mpm/0002-irqchip-irq-qcom-mpm-Support-passing-a-slice-of-SRAM.patch
new file mode 100644
index 0000000..bb9a7c3
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto/generic-drivers/mpm/0002-irqchip-irq-qcom-mpm-Support-passing-a-slice-of-SRAM.patch
@@ -0,0 +1,78 @@
+From 24ac56bf8085adf448b6db9574d9b16ed5cd6c0b Mon Sep 17 00:00:00 2001
+From: Konrad Dybcio <konrad.dybcio@linaro.org>
+Date: Wed, 5 Apr 2023 12:48:35 +0200
+Subject: [PATCH 2/2] irqchip: irq-qcom-mpm: Support passing a slice of SRAM as
+ reg space
+
+The MPM hardware is accessible to us from the ARM CPUs through a shared
+memory region (RPM MSG RAM) that's also concurrently accessed by other
+kinds of cores on the system (like modem, ADSP etc.). Modeling this
+relation in a (somewhat) sane manner in the device tree basically
+requires us to either present the MPM as a child of said memory region
+(which makes little sense, as a mapped memory carveout is not a bus),
+define nodes which bleed their register spaces into one another, or
+passing their slice of the MSG RAM through some kind of a property.
+
+Go with the third option and add a way to map a region passed through
+the "qcom,rpm-msg-ram" property as our register space.
+
+The current way of using 'reg' is preserved for ABI reasons.
+
+Acked-by: Shawn Guo <shawn.guo@linaro.org>
+Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Upstream-Status: Backport [https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git 24ac56bf8085]
+---
+ drivers/irqchip/irq-qcom-mpm.c | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/irqchip/irq-qcom-mpm.c b/drivers/irqchip/irq-qcom-mpm.c
+index 7124565234a5..7115e3056aa5 100644
+--- a/drivers/irqchip/irq-qcom-mpm.c
++++ b/drivers/irqchip/irq-qcom-mpm.c
+@@ -14,6 +14,7 @@
+ #include <linux/mailbox_client.h>
+ #include <linux/module.h>
+ #include <linux/of.h>
++#include <linux/of_address.h>
+ #include <linux/of_platform.h>
+ #include <linux/platform_device.h>
+ #include <linux/pm_domain.h>
+@@ -322,8 +323,10 @@ static int qcom_mpm_init(struct device_node *np, struct device_node *parent)
+ struct device *dev = &pdev->dev;
+ struct irq_domain *parent_domain;
+ struct generic_pm_domain *genpd;
++ struct device_node *msgram_np;
+ struct qcom_mpm_priv *priv;
+ unsigned int pin_cnt;
++ struct resource res;
+ int i, irq;
+ int ret;
+
+@@ -374,9 +377,21 @@ static int qcom_mpm_init(struct device_node *np, struct device_node *parent)
+
+ raw_spin_lock_init(&priv->lock);
+
+- priv->base = devm_platform_ioremap_resource(pdev, 0);
+- if (IS_ERR(priv->base))
+- return PTR_ERR(priv->base);
++ /* If we have a handle to an RPM message ram partition, use it. */
++ msgram_np = of_parse_phandle(np, "qcom,rpm-msg-ram", 0);
++ if (msgram_np) {
++ ret = of_address_to_resource(msgram_np, 0, &res);
++ /* Don't use devm_ioremap_resource, as we're accessing a shared region. */
++ priv->base = devm_ioremap(dev, res.start, resource_size(&res));
++ of_node_put(msgram_np);
++ if (IS_ERR(priv->base))
++ return PTR_ERR(priv->base);
++ } else {
++ /* Otherwise, fall back to simple MMIO. */
++ priv->base = devm_platform_ioremap_resource(pdev, 0);
++ if (IS_ERR(priv->base))
++ return PTR_ERR(priv->base);
++ }
+
+ for (i = 0; i < priv->reg_stride; i++) {
+ qcom_mpm_write(priv, MPM_REG_ENABLE, i, 0);
+--
+2.39.2
+