linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: Paul Mackerras <paulus@samba.org>
Cc: linuxppc-dev@ozlabs.org
Subject: [PATCH] powerpc: MPIC sys_device & suspend/resume
Date: Wed, 02 May 2007 08:33:41 +0200	[thread overview]
Message-ID: <1178087621.13233.31.camel@johannes.berg> (raw)
In-Reply-To: <17969.56735.644629.328360@cargo.ozlabs.ibm.com>

This adds mpic to the system devices and implements suspend
and resume for them. This is necessary to get interrupts for
modules back to where they were before a suspend to disk.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>

---
 arch/powerpc/sysdev/mpic.c |   96 ++++++++++++++++++++++++++++++++++++++++++++-
 include/asm-powerpc/mpic.h |   15 +++++++
 2 files changed, 110 insertions(+), 1 deletion(-)

--- wireless-dev.orig/arch/powerpc/sysdev/mpic.c	2007-05-02 08:20:02.339192713 +0200
+++ wireless-dev/arch/powerpc/sysdev/mpic.c	2007-05-02 08:24:15.669192713 +0200
@@ -354,6 +354,12 @@ static void mpic_startup_ht_interrupt(st
 		tmp |= 0x22;
 	writel(tmp, fixup->base + 4);
 	spin_unlock_irqrestore(&mpic->fixup_lock, flags);
+
+#ifdef CONFIG_PM
+	/* use the lowest bit inverted to the actual HW,
+	 * set if this fixup was enabled, clear otherwise */
+	mpic->save_data[source].fixup_data = tmp | 1;
+#endif
 }
 
 static void mpic_shutdown_ht_interrupt(struct mpic *mpic, unsigned int source,
@@ -375,6 +381,12 @@ static void mpic_shutdown_ht_interrupt(s
 	tmp |= 1;
 	writel(tmp, fixup->base + 4);
 	spin_unlock_irqrestore(&mpic->fixup_lock, flags);
+
+#ifdef CONFIG_PM
+	/* use the lowest bit inverted to the actual HW,
+	 * set if this fixup was enabled, clear otherwise */
+	mpic->save_data[source].fixup_data = tmp & ~1;
+#endif
 }
 
 static void __init mpic_scan_ht_pic(struct mpic *mpic, u8 __iomem *devbase,
@@ -1143,7 +1155,7 @@ void __init mpic_init(struct mpic *mpic)
 	/* Do the HT PIC fixups on U3 broken mpic */
 	DBG("MPIC flags: %x\n", mpic->flags);
 	if ((mpic->flags & MPIC_U3_HT_IRQS) && (mpic->flags & MPIC_PRIMARY))
- 		mpic_scan_ht_pics(mpic);
+		mpic_scan_ht_pics(mpic);
 
 	for (i = 0; i < mpic->num_sources; i++) {
 		/* start with vector = source number, and masked */
@@ -1167,6 +1179,12 @@ void __init mpic_init(struct mpic *mpic)
 
 	/* Set current processor priority to 0 */
 	mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0);
+
+#ifdef CONFIG_PM
+	/* allocate memory to save mpic state */
+	mpic->save_data = alloc_bootmem(mpic->num_sources * sizeof(struct mpic_irq_save));
+	BUG_ON(mpic->save_data == NULL);
+#endif
 }
 
 void __init mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio)
@@ -1417,3 +1435,79 @@ void __devinit smp_mpic_setup_cpu(int cp
 	mpic_setup_this_cpu();
 }
 #endif /* CONFIG_SMP */
+
+#ifdef CONFIG_PM
+static int mpic_suspend(struct sys_device *dev, pm_message_t state)
+{
+	struct mpic *mpic = container_of(dev, struct mpic, sysdev);
+	int i;
+
+	for (i = 0; i < mpic->num_sources; i++) {
+		mpic->save_data[i].vecprio =
+			mpic_irq_read(i, MPIC_INFO(IRQ_VECTOR_PRI));
+		mpic->save_data[i].dest =
+			mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION));
+	}
+
+	return 0;
+}
+
+static int mpic_resume(struct sys_device *dev)
+{
+	struct mpic *mpic = container_of(dev, struct mpic, sysdev);
+	int i;
+
+	for (i = 0; i < mpic->num_sources; i++) {
+		mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI),
+			       mpic->save_data[i].vecprio);
+		mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION),
+			       mpic->save_data[i].dest);
+
+#ifdef CONFIG_MPIC_U3_HT_IRQS
+	{
+		struct mpic_irq_fixup *fixup = &mpic->fixups[i];
+
+		if (fixup->base) {
+			/* we use the lowest bit in an inverted meaning */
+			if ((mpic->save_data[i].fixup_data & 1) == 0)
+				continue;
+
+			/* Enable and configure */
+			writeb(0x10 + 2 * fixup->index, fixup->base + 2);
+
+			writel(mpic->save_data[i].fixup_data & ~1,
+			       fixup->base + 4);
+		}
+	}
+#endif
+	} /* end for loop */
+
+	return 0;
+}
+#endif
+
+static struct sysdev_class mpic_sysclass = {
+#ifdef CONFIG_PM
+	.resume = mpic_resume,
+	.suspend = mpic_suspend,
+#endif
+	set_kset_name("mpic"),
+};
+
+static int mpic_init_sys(void)
+{
+	struct mpic *mpic = mpics;
+	int error, id = 0;
+
+	error = sysdev_class_register(&mpic_sysclass);
+
+	while (mpic && !error) {
+		mpic->sysdev.cls = &mpic_sysclass;
+		mpic->sysdev.id = id++;
+		error = sysdev_register(&mpic->sysdev);
+		mpic = mpic->next;
+	}
+	return error;
+}
+
+device_initcall(mpic_init_sys);
--- wireless-dev.orig/include/asm-powerpc/mpic.h	2007-05-02 08:20:02.369192713 +0200
+++ wireless-dev/include/asm-powerpc/mpic.h	2007-05-02 08:24:28.479192713 +0200
@@ -3,6 +3,7 @@
 #ifdef __KERNEL__
 
 #include <linux/irq.h>
+#include <linux/sysdev.h>
 #include <asm/dcr.h>
 
 /*
@@ -228,6 +229,14 @@ struct mpic_reg_bank {
 #endif /* CONFIG_PPC_DCR */
 };
 
+struct mpic_irq_save {
+	u32		vecprio,
+			dest;
+#ifdef CONFIG_MPIC_U3_HT_IRQS
+	u32		fixup_data;
+#endif
+};
+
 /* The instance data of a given MPIC */
 struct mpic
 {
@@ -294,6 +303,12 @@ struct mpic
 
 	/* link */
 	struct mpic		*next;
+
+	struct sys_device	sysdev;
+
+#ifdef CONFIG_PM
+	struct mpic_irq_save	*save_data;
+#endif
 };
 
 /*

  parent reply	other threads:[~2007-05-02  8:16 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-27 11:25 patches for 2.6.22 Paul Mackerras
2007-04-27 12:00 ` Johannes Berg
2007-04-27 21:41 ` [PATCH] powerpc: fix suspend states again Johannes Berg
2007-04-27 21:53   ` Olof Johansson
2007-04-27 21:54     ` Johannes Berg
2007-04-27 21:57       ` Olof Johansson
2007-04-27 22:00       ` [PATCH] powerpc: put enable_kernel_spe into a header Johannes Berg
2007-04-27 22:02       ` [PATCH v2] powerpc: fix suspend states again Johannes Berg
2007-04-27 23:13         ` Olof Johansson
2007-04-30  0:14         ` Paul Mackerras
2007-04-30 11:35           ` Johannes Berg
2007-04-30 11:37           ` [PATCH v3] " Johannes Berg
2007-05-01 14:16             ` Johannes Berg
2007-04-27 23:42 ` patches for 2.6.22 Arnd Bergmann
2007-04-28  2:49 ` [PATCH] cell: cbe_cpufreq cleanup and crash fix Arnd Bergmann
2007-04-28  7:49 ` [PATCH] powermac: proper sleep management Johannes Berg
2007-04-28  8:08   ` Paul Mackerras
2007-04-28 12:52     ` Johannes Berg
2007-04-28  8:38   ` Benjamin Herrenschmidt
2007-04-28 12:51     ` Johannes Berg
2007-04-28 12:01   ` Paul Mackerras
2007-04-28 13:46     ` Johannes Berg
2007-04-30  5:31       ` Paul Mackerras
2007-04-30 12:08         ` Johannes Berg
2007-05-01 12:14           ` Paul Mackerras
2007-05-01 12:24             ` Johannes Berg
2007-04-30 11:44   ` [PATCH v3] " Johannes Berg
2007-05-01  8:55     ` Johannes Berg
2007-04-30 19:51 ` patches for 2.6.22 Kim Phillips
2007-05-01  3:38   ` Paul Mackerras
2007-05-02 14:12   ` Kumar Gala
2007-05-02 14:19     ` Kim Phillips
2007-05-01  9:06 ` Johannes Berg
2007-05-02  5:33 ` [PATCH] adb: replace sleep notifier with platform driver suspend/resume hooks Johannes Berg
2007-05-02  5:34 ` [PATCH] apm_emu: use generic apm-emulation Johannes Berg
2007-05-02  5:36 ` [PATCH] via-pmu: remove LED sleep notifier Johannes Berg
2007-05-02 10:57   ` Stephen Rothwell
2007-05-02 14:32     ` [PATCH v2] " Johannes Berg
2007-05-07  8:47       ` Paul Mackerras
2007-05-07  8:58         ` Johannes Berg
2007-05-07 15:08         ` [PATCH v3] " Johannes Berg
2007-05-02  5:39 ` [PATCH] remove awacs dmasound Johannes Berg
2007-05-02  6:18 ` [PATCH] via-pmu: kill sleep notifiers completely Johannes Berg
2007-05-02  6:21 ` [PATCH] powermac: support G5 CPU hotplug Johannes Berg
2007-05-02 10:55   ` Paul Mackerras
2007-05-02 14:33     ` Johannes Berg
2007-05-02 17:57       ` Segher Boessenkool
2007-05-02 22:03       ` Benjamin Herrenschmidt
2007-05-02 23:47         ` Segher Boessenkool
2007-05-02 23:59           ` Benjamin Herrenschmidt
2007-05-03  0:05             ` Segher Boessenkool
2007-05-03  0:18               ` Benjamin Herrenschmidt
2007-05-03  0:01         ` Paul Mackerras
2007-05-03  0:08           ` Benjamin Herrenschmidt
2007-05-03  0:10             ` Benjamin Herrenschmidt
2007-05-03  0:19             ` Segher Boessenkool
2007-05-03  0:17           ` Segher Boessenkool
2007-05-03  0:21             ` Benjamin Herrenschmidt
2007-05-03  0:24               ` Benjamin Herrenschmidt
2007-05-03  1:01               ` Segher Boessenkool
2007-05-03  2:11                 ` Benjamin Herrenschmidt
2007-05-03 16:49                   ` Segher Boessenkool
2007-05-02 20:33     ` [PATCH v2] " Johannes Berg
2007-05-02  6:33 ` Johannes Berg [this message]
2007-05-02  6:35 ` [PATCH] powermac: fix G5-cpufreq for cpu on/offline Johannes Berg
2007-05-03 12:25 ` patches for 2.6.22 Johannes Berg
2007-05-03 12:28   ` [PATCH] powerpc: dart iommu suspend Johannes Berg
2007-05-03 12:30     ` Benjamin Herrenschmidt
2007-05-03 12:34       ` Johannes Berg
2007-05-03 12:34         ` Benjamin Herrenschmidt
2007-05-03 12:48       ` Johannes Berg
2007-05-03 14:24         ` Olof Johansson
2007-05-04 10:51           ` Johannes Berg
2007-05-03 12:29   ` [PATCH] powerpc: mark pages that don't exist as nosave Johannes Berg
2007-05-03 12:31   ` [PATCH] powermac: suspend to disk on G5 Johannes Berg
2007-07-17 13:28 ` [PATCH] remove awacs dmasound Johannes Berg
2007-07-17 13:37   ` Adrian Bunk
2007-07-17 13:43     ` Johannes Berg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1178087621.13233.31.camel@johannes.berg \
    --to=johannes@sipsolutions.net \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=paulus@samba.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).