From 0106d8287c37f30d8095228bbb44c778468de74c Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Thoorvas Samyrao Muralidharan Date: Thu, 19 Aug 2021 23:22:40 +0530 Subject: [PATCH] soc: qcom: sdx_ext_ipc: Change GPIO configuration Changing GPIO output value is not reflecting. Change GPIO pull up configuration from pull up to no pull to reflect state change. Change-Id: Iac636b9b601b9819ee7aac2118c1af3b0f864e86 Signed-off-by: Prasanna Kumar Thoorvas Samyrao Muralidharan --- drivers/soc/qcom/sdx_ext_ipc.c | 55 +++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/drivers/soc/qcom/sdx_ext_ipc.c b/drivers/soc/qcom/sdx_ext_ipc.c index 9ea708c2838d..85575a2de29a 100644 --- a/drivers/soc/qcom/sdx_ext_ipc.c +++ b/drivers/soc/qcom/sdx_ext_ipc.c @@ -14,6 +14,12 @@ #include #include +#define GPIO_BASE 0xf100000 +#define GPIO_REG_OFFSET 0x1000 +#define GPIO_REG_SIZE 0x300000 + +#define E911_GPIO_NUMBER 45 + #define STATUS_UP 1 #define STATUS_DOWN 0 @@ -49,6 +55,8 @@ struct gpio_cntrl { int status_irq; int wakeup_irq; int policy; + unsigned int ipq807x_attach; + void __iomem *gpio_base; struct device *dev; struct mutex policy_lock; struct mutex e911_lock; @@ -114,15 +122,27 @@ static DEVICE_ATTR_RW(policy); static ssize_t e911_show(struct device *dev, struct device_attribute *attr, char *buf) { - int ret, state; + int ret; + u32 state; struct gpio_cntrl *mdm = dev_get_drvdata(dev); + void __iomem *addr = NULL; if (mdm->gpios[STATUS_OUT2] < 0) return -ENXIO; mutex_lock(&mdm->e911_lock); - state = gpio_get_value(mdm->gpios[STATUS_OUT2]); - ret = scnprintf(buf, 2, "%d\n", state); + + if (mdm->ipq807x_attach) { + addr = mdm->gpio_base + GPIO_REG_OFFSET * E911_GPIO_NUMBER; + state = readl_relaxed(addr); + if (state == 0x3c7) + ret = scnprintf(buf, 2, "1\n"); + else + ret = scnprintf(buf, 2, "0\n"); + } else { + state = gpio_get_value(mdm->gpios[STATUS_OUT2]); + ret = scnprintf(buf, 2, "%d\n", state); + } mutex_unlock(&mdm->e911_lock); return ret; @@ -132,6 +152,7 @@ static ssize_t e911_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct gpio_cntrl *mdm = dev_get_drvdata(dev); + void __iomem *addr = NULL; int e911; if (kstrtoint(buf, 0, &e911)) @@ -141,10 +162,19 @@ static ssize_t e911_store(struct device *dev, struct device_attribute *attr, return -ENXIO; mutex_lock(&mdm->e911_lock); - if (e911) - gpio_set_value(mdm->gpios[STATUS_OUT2], 1); - else - gpio_set_value(mdm->gpios[STATUS_OUT2], 0); + + if (mdm->ipq807x_attach) { + addr = mdm->gpio_base + GPIO_REG_OFFSET * E911_GPIO_NUMBER; + if (e911) + writel_relaxed(0x3c7, addr); + else + writel_relaxed(0x4, addr); + } else { + if (e911) + gpio_set_value(mdm->gpios[STATUS_OUT2], 1); + else + gpio_set_value(mdm->gpios[STATUS_OUT2], 0); + } mutex_unlock(&mdm->e911_lock); return count; @@ -297,6 +327,7 @@ static int setup_ipc(struct gpio_cntrl *mdm) static int sdx_ext_ipc_panic(struct notifier_block *this, unsigned long event, void *ptr) { + void __iomem *addr = NULL; struct gpio_cntrl *mdm = container_of(this, struct gpio_cntrl, panic_blk); @@ -323,6 +354,13 @@ static int sdx_ext_ipc_probe(struct platform_device *pdev) return -ENOMEM; mdm->dev = &pdev->dev; + + of_property_read_u32(node, "ipq807x_attach", &mdm->ipq807x_attach); + if (mdm->ipq807x_attach) { + dev_info(mdm->dev, "IPQ807x attach detected\n"); + mdm->gpio_base = ioremap(GPIO_BASE, GPIO_REG_SIZE); + } + ret = setup_ipc(mdm); if (ret) { dev_err(mdm->dev, "Error setting up gpios\n"); @@ -426,6 +464,9 @@ static int sdx_ext_ipc_remove(struct platform_device *pdev) &mdm->panic_blk); remove_ipc(mdm); device_remove_file(mdm->dev, &dev_attr_policy); + if (mdm->ipq807x_attach) + iounmap(mdm->gpio_base); + return 0; }