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

Commit 2af63b21 authored by Maria Yu's avatar Maria Yu
Browse files

pinctrl: qcom: Add syscore system suspend/resume



Add syscore system suspend and resume handlers,
to print gpio interrupts status during device resume.

Change-Id: I7c574d2e44a7e318ac9ef89063d2081bf63c09b6
Signed-off-by: default avatarPrasad Sodagudi <psodagud@codeaurora.org>
Signed-off-by: default avatarMaria Yu <aiquny@codeaurora.org>
parent ddbece73
Loading
Loading
Loading
Loading
+53 −1
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@
#include <linux/gpio.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/spinlock.h>
#include <linux/syscore_ops.h>
#include <linux/reboot.h>
#include <linux/reboot.h>
#include <linux/pm.h>
#include <linux/pm.h>
#include <linux/log2.h>
#include <linux/log2.h>
@@ -74,6 +75,8 @@ struct msm_pinctrl {
	void __iomem *pdc_regs;
	void __iomem *pdc_regs;
};
};


static struct msm_pinctrl *msm_pinctrl_data;

static int msm_get_groups_count(struct pinctrl_dev *pctldev)
static int msm_get_groups_count(struct pinctrl_dev *pctldev)
{
{
	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
	struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
@@ -1520,6 +1523,52 @@ static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
		}
		}
}
}


#ifdef CONFIG_PM
static int msm_pinctrl_suspend(void)
{
	return 0;
}

static void msm_pinctrl_resume(void)
{
	int i, irq;
	u32 val;
	unsigned long flags;
	struct irq_desc *desc;
	const struct msm_pingroup *g;
	const char *name = "null";
	struct msm_pinctrl *pctrl = msm_pinctrl_data;

	if (!msm_show_resume_irq_mask)
		return;

	spin_lock_irqsave(&pctrl->lock, flags);
	for_each_set_bit(i, pctrl->enabled_irqs, pctrl->chip.ngpio) {
		g = &pctrl->soc->groups[i];
		val = readl_relaxed(pctrl->regs + g->intr_status_reg);
		if (val & BIT(g->intr_status_bit)) {
			irq = irq_find_mapping(pctrl->chip.irqdomain, i);
			desc = irq_to_desc(irq);
			if (desc == NULL)
				name = "stray irq";
			else if (desc->action && desc->action->name)
				name = desc->action->name;

			pr_warn("%s: %d triggered %s\n", __func__, irq, name);
		}
	}
	spin_unlock_irqrestore(&pctrl->lock, flags);
}
#else
#define msm_pinctrl_suspend NULL
#define msm_pinctrl_resume NULL
#endif

static struct syscore_ops msm_pinctrl_pm_ops = {
	.suspend = msm_pinctrl_suspend,
	.resume = msm_pinctrl_resume,
};

int msm_pinctrl_probe(struct platform_device *pdev,
int msm_pinctrl_probe(struct platform_device *pdev,
		      const struct msm_pinctrl_soc_data *soc_data)
		      const struct msm_pinctrl_soc_data *soc_data)
{
{
@@ -1527,7 +1576,8 @@ int msm_pinctrl_probe(struct platform_device *pdev,
	struct resource *res;
	struct resource *res;
	int ret;
	int ret;


	pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
	msm_pinctrl_data = pctrl = devm_kzalloc(&pdev->dev,
				sizeof(*pctrl), GFP_KERNEL);
	if (!pctrl) {
	if (!pctrl) {
		dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n");
		dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n");
		return -ENOMEM;
		return -ENOMEM;
@@ -1570,6 +1620,7 @@ int msm_pinctrl_probe(struct platform_device *pdev,


	platform_set_drvdata(pdev, pctrl);
	platform_set_drvdata(pdev, pctrl);


	register_syscore_ops(&msm_pinctrl_pm_ops);
	dev_dbg(&pdev->dev, "Probed Qualcomm pinctrl driver\n");
	dev_dbg(&pdev->dev, "Probed Qualcomm pinctrl driver\n");


	return 0;
	return 0;
@@ -1583,6 +1634,7 @@ int msm_pinctrl_remove(struct platform_device *pdev)
	gpiochip_remove(&pctrl->chip);
	gpiochip_remove(&pctrl->chip);


	unregister_restart_handler(&pctrl->restart_nb);
	unregister_restart_handler(&pctrl->restart_nb);
	unregister_syscore_ops(&msm_pinctrl_pm_ops);


	return 0;
	return 0;
}
}
+6 −0
Original line number Original line Diff line number Diff line
@@ -174,4 +174,10 @@ int msm_pinctrl_probe(struct platform_device *pdev,
		      const struct msm_pinctrl_soc_data *soc_data);
		      const struct msm_pinctrl_soc_data *soc_data);
int msm_pinctrl_remove(struct platform_device *pdev);
int msm_pinctrl_remove(struct platform_device *pdev);


#ifdef CONFIG_QCOM_SHOW_RESUME_IRQ
extern int msm_show_resume_irq_mask;
#else
#define msm_show_resume_irq_mask 0
#endif

#endif
#endif