Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0106d828 authored by Prasanna Kumar Thoorvas Samyrao Muralidharan's avatar Prasanna Kumar Thoorvas Samyrao Muralidharan Committed by Karthick Shanmugham
Browse files

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: default avatarPrasanna Kumar Thoorvas Samyrao Muralidharan <ptsm@codeaurora.org>
parent a72d52e9
Loading
Loading
Loading
Loading
+48 −7
Original line number Diff line number Diff line
@@ -14,6 +14,12 @@
#include <linux/suspend.h>
#include <soc/qcom/sb_notification.h>

#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);

	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 (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;
}