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

Commit 7625cb31 authored by Maria Yu's avatar Maria Yu Committed by Tengfei Fan
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>
Signed-off-by: default avatarTengfei Fan <tengfeif@codeaurora.org>
parent 76ec68dc
Loading
Loading
Loading
Loading
+49 −0
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>
@@ -1771,6 +1772,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;

	raw_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);
		}
	}
	raw_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)
{
{
@@ -1846,6 +1893,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;
@@ -1859,6 +1907,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
@@ -190,4 +190,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