summaryrefslogtreecommitdiff
path: root/drivers/staging/fsl_pme2/pme2_ctrl.c
diff options
context:
space:
mode:
authorJeffrey Ladouceur <Jeffrey.Ladouceur@freescale.com>2014-02-28 00:15:48 (GMT)
committerJose Rivera <German.Rivera@freescale.com>2014-04-09 01:01:09 (GMT)
commit563e96070a46ad41e172992dd408d2279facac6f (patch)
tree52ba11ce50de9e451c2b2ab3822d196c893b6834 /drivers/staging/fsl_pme2/pme2_ctrl.c
parenta1a36c47104a2c104368bcb90f808579809e6720 (diff)
downloadlinux-fsl-qoriq-563e96070a46ad41e172992dd408d2279facac6f.tar.xz
fsl_pme: Support for power management
Change the pme error interrupt handler to be per-CPU to avoid a warning ("Cannot set affinity for irq") when entering suspend-to-ram state. Added IRQF_PERCPU flag. While sending frames to the PME device, this device can return a serious error. Added logic to properly handle this scenario. If this happens while reading the pme database, upon resume the resulting database will not be restored. The size of the confidence table was incorrect for a specific version of pme. Signed-off-by: Jeffrey Ladouceur <Jeffrey.Ladouceur@freescale.com> Change-Id: Ic8cbc048c7a0e4cd8389298267ec9b4876055568 Reviewed-on: http://git.am.freescale.net:8181/9267 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Geoff Thorpe <Geoff.Thorpe@freescale.com> Reviewed-by: Jose Rivera <German.Rivera@freescale.com> (cherry picked from commit f13d881f9e464079b62dba71f96dd73be4ad83a0) Reviewed-on: http://git.am.freescale.net:8181/10777
Diffstat (limited to 'drivers/staging/fsl_pme2/pme2_ctrl.c')
-rw-r--r--drivers/staging/fsl_pme2/pme2_ctrl.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/staging/fsl_pme2/pme2_ctrl.c b/drivers/staging/fsl_pme2/pme2_ctrl.c
index 9901fe6..016648c 100644
--- a/drivers/staging/fsl_pme2/pme2_ctrl.c
+++ b/drivers/staging/fsl_pme2/pme2_ctrl.c
@@ -340,8 +340,8 @@ static int of_fsl_pme_probe(struct platform_device *ofdev)
if (likely(pme_err_irq != NO_IRQ)) {
/* Register the pme ISR handler */
- err = request_irq(pme_err_irq, pme_isr, IRQF_SHARED, "pme-err",
- dev);
+ err = request_irq(pme_err_irq, pme_isr,
+ IRQF_SHARED | IRQF_PERCPU, "pme-err", dev);
if (err) {
dev_err(dev, "request_irq() failed\n");
goto out_unmap_ctrl_region;
@@ -473,14 +473,31 @@ void restore_all_ccsr(struct ccsr_backup_info *save_ccsr,
{
int i;
int num_regs = sizeof(save_ccsr->regdb)/sizeof(uint32_t);
-
uint32_t *pme_reg = &save_ccsr->regdb.pmfa.isr;
+#ifdef CONFIG_PM_DEBUG
+ int diff_count = 0;
+#endif
for (i = 0; i < num_regs; i++) {
+#ifdef CONFIG_PM_DEBUG
+ /* skip enable register */
+ if ((pme_reg + i) != (&save_ccsr->regdb.pmfa.faconf)) {
+ uint32_t pme_reg_val;
+ pme_reg_val = in_be32(regs + i);
+ if (pme_reg_val != *(pme_reg + i))
+ diff_count++;
+ out_be32(regs + i, *(pme_reg + i));
+ }
+#else
/* skip enable register */
if ((pme_reg + i) != (&save_ccsr->regdb.pmfa.faconf))
out_be32(regs + i, *(pme_reg + i));
+#endif
}
+
+#ifdef CONFIG_PM_DEBUG
+ pr_info("pme ccsr restore: %d registers were different\n", diff_count);
+#endif
}
void save_all_ccsr(struct ccsr_backup_info *save_ccsr, uint32_t __iomem *regs)