--- /dev/null
+From 601e1cc5df940b59e71c947726640811897d30df Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 2 Jun 2009 11:37:01 +0200
+Subject: ALSA: ca0106 - Add missing registrations of vmaster controls
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 601e1cc5df940b59e71c947726640811897d30df upstream.
+
+Although the vmaster controls are created, they aren't registered thus
+they don't appear in the real world. Added the missing snd_ctl_add()
+calls.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/ca0106/ca0106_mixer.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/sound/pci/ca0106/ca0106_mixer.c
++++ b/sound/pci/ca0106/ca0106_mixer.c
+@@ -841,6 +841,9 @@ int __devinit snd_ca0106_mixer(struct sn
+ snd_ca0106_master_db_scale);
+ if (!vmaster)
+ return -ENOMEM;
++ err = snd_ctl_add(card, vmaster);
++ if (err < 0)
++ return err;
+ add_slaves(card, vmaster, slave_vols);
+
+ if (emu->details->spi_dac == 1) {
+@@ -848,6 +851,9 @@ int __devinit snd_ca0106_mixer(struct sn
+ NULL);
+ if (!vmaster)
+ return -ENOMEM;
++ err = snd_ctl_add(card, vmaster);
++ if (err < 0)
++ return err;
+ add_slaves(card, vmaster, slave_sws);
+ }
+ return 0;
--- /dev/null
+From c2a30d711852e4f39c8a79135b3caa701f7a8e02 Mon Sep 17 00:00:00 2001
+From: Ondrej Zary <linux@rainbow-software.org>
+Date: Sat, 27 Jun 2009 16:17:08 +0200
+Subject: ALSA: cmi8330: fix MPU-401 PnP init copy&paste bug
+
+From: Ondrej Zary <linux@rainbow-software.org>
+
+commit c2a30d711852e4f39c8a79135b3caa701f7a8e02 upstream.
+
+Fix copy&paste bug in PnP MPU-401 initialization.
+
+Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/isa/cmi8330.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/sound/isa/cmi8330.c
++++ b/sound/isa/cmi8330.c
+@@ -338,7 +338,7 @@ static int __devinit snd_cmi8330_pnp(int
+ return -EBUSY;
+
+ acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
+- if (acard->play == NULL)
++ if (acard->mpu == NULL)
+ return -EBUSY;
+
+ pdev = acard->cap;
--- /dev/null
+From 376b508ffde3b17e105265f89b83bdb044b1c1ae Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 22 Jun 2009 11:03:13 +0200
+Subject: ALSA: hda - Add quirk for Sony VAIO Z21MN
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 376b508ffde3b17e105265f89b83bdb044b1c1ae upstream.
+
+It needs model=toshiba-s06 to work with the digital-mic.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/hda/patch_realtek.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -10915,6 +10915,7 @@ static struct snd_pci_quirk alc262_cfg_t
+ SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
+ SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
+ SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
++ SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
+ SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
+ ALC262_SONY_ASSAMD),
+ SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
--- /dev/null
+From ae14ef68e8e67ca5b8b29f0eb640f7c106617f4e Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 22 Jun 2009 08:16:56 +0200
+Subject: ALSA: hda - Get back Input Source for ALC262 toshiba-s06 model
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit ae14ef68e8e67ca5b8b29f0eb640f7c106617f4e upstream.
+
+The commit f9e336f65b666b8f1764d17e9b7c21c90748a37e
+ ALSA: hda - Unify capture mixer creation in realtek codes
+removed the "Input Source" mixer element creation for toshiba-s06 model
+because it contains a digital-mic input.
+
+This patch take the control back.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/hda/patch_realtek.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -11122,6 +11122,7 @@ static struct alc_config_preset alc262_p
+ .capsrc_nids = alc262_dmic_capsrc_nids,
+ .dac_nids = alc262_dac_nids,
+ .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
++ .num_adc_nids = 1, /* single ADC */
+ .dig_out_nid = ALC262_DIGOUT_NID,
+ .num_channel_mode = ARRAY_SIZE(alc262_modes),
+ .channel_mode = alc262_modes,
--- /dev/null
+From f708eb1d71dc8ffb184da9f0bc53461c6dc10653 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 15 Jun 2009 12:31:38 +0200
+Subject: ALSA: intel8x0 - Fix PCM position craziness
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit f708eb1d71dc8ffb184da9f0bc53461c6dc10653 upstream.
+
+The PCM pointer callback sometimes returns invalid positions and this
+screws up the hw_ptr updater in PCM core. Especially since now the
+jiffies check is optional with xrun_debug, the invalid position is
+handled as is, and causes serious sound skips, etc.
+
+This patch simplifies the position-fix strategy in intel8x0 to be more
+robust:
+- just falls back to the last position if bogus position is detected
+- another sanity check for the backward move of the position due to
+ a race of register update and the base-index update
+
+This patch is applicable also for 2.6.30.
+
+Tested-by: David Miller <davem@davemloft.net>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/intel8x0.c | 24 ++++++++++++------------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+--- a/sound/pci/intel8x0.c
++++ b/sound/pci/intel8x0.c
+@@ -356,8 +356,6 @@ struct ichdev {
+ unsigned int position;
+ unsigned int pos_shift;
+ unsigned int last_pos;
+- unsigned long last_pos_jiffies;
+- unsigned int jiffy_to_bytes;
+ int frags;
+ int lvi;
+ int lvi_frag;
+@@ -844,7 +842,6 @@ static int snd_intel8x0_pcm_trigger(stru
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ val = ICH_IOCE | ICH_STARTBM;
+ ichdev->last_pos = ichdev->position;
+- ichdev->last_pos_jiffies = jiffies;
+ break;
+ case SNDRV_PCM_TRIGGER_SUSPEND:
+ ichdev->suspended = 1;
+@@ -1048,7 +1045,6 @@ static int snd_intel8x0_pcm_prepare(stru
+ ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1;
+ }
+ snd_intel8x0_setup_periods(chip, ichdev);
+- ichdev->jiffy_to_bytes = (runtime->rate * 4 * ichdev->pos_shift) / HZ;
+ return 0;
+ }
+
+@@ -1073,19 +1069,23 @@ static snd_pcm_uframes_t snd_intel8x0_pc
+ ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb))
+ break;
+ } while (timeout--);
++ ptr = ichdev->last_pos;
+ if (ptr1 != 0) {
+ ptr1 <<= ichdev->pos_shift;
+ ptr = ichdev->fragsize1 - ptr1;
+ ptr += position;
+- ichdev->last_pos = ptr;
+- ichdev->last_pos_jiffies = jiffies;
+- } else {
+- ptr1 = jiffies - ichdev->last_pos_jiffies;
+- if (ptr1)
+- ptr1 -= 1;
+- ptr = ichdev->last_pos + ptr1 * ichdev->jiffy_to_bytes;
+- ptr %= ichdev->size;
++ if (ptr < ichdev->last_pos) {
++ unsigned int pos_base, last_base;
++ pos_base = position / ichdev->fragsize1;
++ last_base = ichdev->last_pos / ichdev->fragsize1;
++ /* another sanity check; ptr1 can go back to full
++ * before the base position is updated
++ */
++ if (pos_base == last_base)
++ ptr = ichdev->last_pos;
++ }
+ }
++ ichdev->last_pos = ptr;
+ spin_unlock(&chip->reg_lock);
+ if (ptr >= ichdev->size)
+ return 0;
--- /dev/null
+From 73be1591579084a8103a7005dd3172f3e9dd7362 Mon Sep 17 00:00:00 2001
+From: Nicolas Pitre <nico@cam.org>
+Date: Fri, 12 Jun 2009 03:09:29 +0100
+Subject: ARM: 5545/2: add flush_kernel_dcache_page() for ARM
+
+From: Nicolas Pitre <nico@cam.org>
+
+commit 73be1591579084a8103a7005dd3172f3e9dd7362 upstream.
+
+Without this, the default implementation is a no op which is completely
+wrong with a VIVT cache, and usage of sg_copy_buffer() produces
+unpredictable results.
+
+Tested-by: Sebastian Andrzej Siewior <bigeasy@breakpoint.cc>
+
+Signed-off-by: Nicolas Pitre <nico@marvell.com>
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/arm/include/asm/cacheflush.h | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/arch/arm/include/asm/cacheflush.h
++++ b/arch/arm/include/asm/cacheflush.h
+@@ -429,6 +429,14 @@ static inline void flush_anon_page(struc
+ __flush_anon_page(vma, page, vmaddr);
+ }
+
++#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
++static inline void flush_kernel_dcache_page(struct page *page)
++{
++ /* highmem pages are always flushed upon kunmap already */
++ if ((cache_is_vivt() || cache_is_vipt_aliasing()) && !PageHighMem(page))
++ __cpuc_flush_dcache_page(page_address(page));
++}
++
+ #define flush_dcache_mmap_lock(mapping) \
+ spin_lock_irq(&(mapping)->tree_lock)
+ #define flush_dcache_mmap_unlock(mapping) \
--- /dev/null
+From 3fe4a975d662f11037cb710f8b4b158a3e38f9c0 Mon Sep 17 00:00:00 2001
+From: Davide Libenzi <davidel@xmailserver.org>
+Date: Wed, 17 Jun 2009 16:25:58 -0700
+Subject: epoll: fix nested calls support
+
+From: Davide Libenzi <davidel@xmailserver.org>
+
+commit 3fe4a975d662f11037cb710f8b4b158a3e38f9c0 upstream.
+
+This fixes a regression in 2.6.30.
+
+I unfortunately accepted a patch time ago, to drop the "current" usage
+from possible IRQ context, w/out proper thought over it. The patch
+switched to using the CPU id by bounding the nested call callback with a
+get_cpu()/put_cpu().
+
+Unfortunately the ep_call_nested() function can be called with a callback
+that grabs sleepy locks (from own f_op->poll()), that results in epic
+fails. The following patch uses the proper "context" depending on the
+path where it is called, and on the kind of callback.
+
+This has been reported by Stefan Richter, that has also verified the patch
+is his previously failing environment.
+
+Signed-off-by: Davide Libenzi <davidel@xmailserver.org>
+Reported-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/eventpoll.c | 21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -98,7 +98,7 @@ struct epoll_filefd {
+ struct nested_call_node {
+ struct list_head llink;
+ void *cookie;
+- int cpu;
++ void *ctx;
+ };
+
+ /*
+@@ -317,17 +317,17 @@ static void ep_nested_calls_init(struct
+ * @nproc: Nested call core function pointer.
+ * @priv: Opaque data to be passed to the @nproc callback.
+ * @cookie: Cookie to be used to identify this nested call.
++ * @ctx: This instance context.
+ *
+ * Returns: Returns the code returned by the @nproc callback, or -1 if
+ * the maximum recursion limit has been exceeded.
+ */
+ static int ep_call_nested(struct nested_calls *ncalls, int max_nests,
+ int (*nproc)(void *, void *, int), void *priv,
+- void *cookie)
++ void *cookie, void *ctx)
+ {
+ int error, call_nests = 0;
+ unsigned long flags;
+- int this_cpu = get_cpu();
+ struct list_head *lsthead = &ncalls->tasks_call_list;
+ struct nested_call_node *tncur;
+ struct nested_call_node tnode;
+@@ -340,7 +340,7 @@ static int ep_call_nested(struct nested_
+ * very much limited.
+ */
+ list_for_each_entry(tncur, lsthead, llink) {
+- if (tncur->cpu == this_cpu &&
++ if (tncur->ctx == ctx &&
+ (tncur->cookie == cookie || ++call_nests > max_nests)) {
+ /*
+ * Ops ... loop detected or maximum nest level reached.
+@@ -352,7 +352,7 @@ static int ep_call_nested(struct nested_
+ }
+
+ /* Add the current task and cookie to the list */
+- tnode.cpu = this_cpu;
++ tnode.ctx = ctx;
+ tnode.cookie = cookie;
+ list_add(&tnode.llink, lsthead);
+
+@@ -364,10 +364,9 @@ static int ep_call_nested(struct nested_
+ /* Remove the current task from the list */
+ spin_lock_irqsave(&ncalls->lock, flags);
+ list_del(&tnode.llink);
+- out_unlock:
++out_unlock:
+ spin_unlock_irqrestore(&ncalls->lock, flags);
+
+- put_cpu();
+ return error;
+ }
+
+@@ -408,8 +407,12 @@ static int ep_poll_wakeup_proc(void *pri
+ */
+ static void ep_poll_safewake(wait_queue_head_t *wq)
+ {
++ int this_cpu = get_cpu();
++
+ ep_call_nested(&poll_safewake_ncalls, EP_MAX_NESTS,
+- ep_poll_wakeup_proc, NULL, wq);
++ ep_poll_wakeup_proc, NULL, wq, (void *) (long) this_cpu);
++
++ put_cpu();
+ }
+
+ /*
+@@ -663,7 +666,7 @@ static unsigned int ep_eventpoll_poll(st
+ * could re-enter here.
+ */
+ pollflags = ep_call_nested(&poll_readywalk_ncalls, EP_MAX_NESTS,
+- ep_poll_readyevents_proc, ep, ep);
++ ep_poll_readyevents_proc, ep, ep, current);
+
+ return pollflags != -1 ? pollflags : 0;
+ }
--- /dev/null
+From 2ac6bf4ddc87c3b6b609f8fa82f6ebbffeac12f4 Mon Sep 17 00:00:00 2001
+From: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Date: Fri, 5 Jun 2009 10:36:24 -0700
+Subject: IB/mlx4: Add strong ordering to local inval and fast reg work requests
+
+From: Jack Morgenstein <jackm@dev.mellanox.co.il>
+
+commit 2ac6bf4ddc87c3b6b609f8fa82f6ebbffeac12f4 upstream.
+
+The ConnectX Programmer's Reference Manual states that the "SO" bit
+must be set when posting Fast Register and Local Invalidate send work
+requests. When this bit is set, the work request will be executed
+only after all previous work requests on the send queue have been
+executed. (If the bit is not set, Fast Register and Local Invalidate
+WQEs may begin execution too early, which violates the defined
+semantics for these operations)
+
+This fixes the issue with NFS/RDMA reported in
+<http://lists.openfabrics.org/pipermail/general/2009-April/059253.html>
+
+Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
+Signed-off-by: Roland Dreier <rolandd@cisco.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/infiniband/hw/mlx4/qp.c | 4 ++++
+ include/linux/mlx4/qp.h | 1 +
+ 2 files changed, 5 insertions(+)
+
+--- a/drivers/infiniband/hw/mlx4/qp.c
++++ b/drivers/infiniband/hw/mlx4/qp.c
+@@ -1585,12 +1585,16 @@ int mlx4_ib_post_send(struct ib_qp *ibqp
+ break;
+
+ case IB_WR_LOCAL_INV:
++ ctrl->srcrb_flags |=
++ cpu_to_be32(MLX4_WQE_CTRL_STRONG_ORDER);
+ set_local_inv_seg(wqe, wr->ex.invalidate_rkey);
+ wqe += sizeof (struct mlx4_wqe_local_inval_seg);
+ size += sizeof (struct mlx4_wqe_local_inval_seg) / 16;
+ break;
+
+ case IB_WR_FAST_REG_MR:
++ ctrl->srcrb_flags |=
++ cpu_to_be32(MLX4_WQE_CTRL_STRONG_ORDER);
+ set_fmr_seg(wqe, wr);
+ wqe += sizeof (struct mlx4_wqe_fmr_seg);
+ size += sizeof (struct mlx4_wqe_fmr_seg) / 16;
+--- a/include/linux/mlx4/qp.h
++++ b/include/linux/mlx4/qp.h
+@@ -165,6 +165,7 @@ enum {
+ MLX4_WQE_CTRL_IP_CSUM = 1 << 4,
+ MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5,
+ MLX4_WQE_CTRL_INS_VLAN = 1 << 6,
++ MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7,
+ };
+
+ struct mlx4_wqe_ctrl_seg {
x86-move-rdtsc_barrier-into-the-tsc-vread-method.patch
x86-fix-uv-bau-sending-buffer-initialization.patch
x86-add-quirk-for-reboot-stalls-on-a-dell-optiplex-360.patch
+x86-handle-initrd-that-extends-into-unusable-memory.patch
+alsa-ca0106-add-missing-registrations-of-vmaster-controls.patch
+alsa-intel8x0-fix-pcm-position-craziness.patch
+alsa-hda-get-back-input-source-for-alc262-toshiba-s06-model.patch
+alsa-hda-add-quirk-for-sony-vaio-z21mn.patch
+alsa-cmi8330-fix-mpu-401-pnp-init-copy-paste-bug.patch
+x86-hpet-mark-per-cpu-interrupts-irqf_timer-to-prevent-resume-failure.patch
+arm-5545-2-add-flush_kernel_dcache_page-for-arm.patch
+ib-mlx4-add-strong-ordering-to-local-inval-and-fast-reg-work-requests.patch
+epoll-fix-nested-calls-support.patch
--- /dev/null
+From 8c5dd8f43367f4f266dd616f11658005bc2d20ef Mon Sep 17 00:00:00 2001
+From: Yinghai Lu <yinghai@kernel.org>
+Date: Thu, 4 Jun 2009 19:14:22 -0700
+Subject: x86: handle initrd that extends into unusable memory
+
+From: Yinghai Lu <yinghai@kernel.org>
+
+commit 8c5dd8f43367f4f266dd616f11658005bc2d20ef upstream.
+
+On a system where system memory (according e820) is not covered by
+mtrr, mtrr_trim_memory converts a portion of memory to reserved, but
+bootloader has already put the initrd in that range.
+
+Thus, we need to have 64bit to use relocate_initrd too.
+
+[ Impact: fix using initrd when mtrr_trim_memory happen ]
+
+Signed-off-by: Yinghai Lu <yinghai@kernel.org>
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kernel/setup.c | 15 +++------------
+ 1 file changed, 3 insertions(+), 12 deletions(-)
+
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -293,15 +293,13 @@ static void __init reserve_brk(void)
+
+ #ifdef CONFIG_BLK_DEV_INITRD
+
+-#ifdef CONFIG_X86_32
+-
+ #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT)
+ static void __init relocate_initrd(void)
+ {
+
+ u64 ramdisk_image = boot_params.hdr.ramdisk_image;
+ u64 ramdisk_size = boot_params.hdr.ramdisk_size;
+- u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
++ u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;
+ u64 ramdisk_here;
+ unsigned long slop, clen, mapaddr;
+ char *p, *q;
+@@ -357,14 +355,13 @@ static void __init relocate_initrd(void)
+ ramdisk_image, ramdisk_image + ramdisk_size - 1,
+ ramdisk_here, ramdisk_here + ramdisk_size - 1);
+ }
+-#endif
+
+ static void __init reserve_initrd(void)
+ {
+ u64 ramdisk_image = boot_params.hdr.ramdisk_image;
+ u64 ramdisk_size = boot_params.hdr.ramdisk_size;
+ u64 ramdisk_end = ramdisk_image + ramdisk_size;
+- u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
++ u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;
+
+ if (!boot_params.hdr.type_of_loader ||
+ !ramdisk_image || !ramdisk_size)
+@@ -394,14 +391,8 @@ static void __init reserve_initrd(void)
+ return;
+ }
+
+-#ifdef CONFIG_X86_32
+ relocate_initrd();
+-#else
+- printk(KERN_ERR "initrd extends beyond end of memory "
+- "(0x%08llx > 0x%08llx)\ndisabling initrd\n",
+- ramdisk_end, end_of_lowmem);
+- initrd_start = 0;
+-#endif
++
+ free_early(ramdisk_image, ramdisk_end);
+ }
+ #else
--- /dev/null
+From 507fa3a3d80365c595113a5ac3232309e3dbf5d8 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Sun, 14 Jun 2009 17:46:01 +0200
+Subject: x86: hpet: Mark per cpu interrupts IRQF_TIMER to prevent resume failure
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 507fa3a3d80365c595113a5ac3232309e3dbf5d8 upstream.
+
+timer interrupts are excluded from being disabled during suspend. The
+clock events code manages the disabling of clock events on its own
+because the timer interrupt needs to be functional before the resume
+code reenables the device interrupts.
+
+The hpet per cpu timers request their interrupt without setting the
+IRQF_TIMER flag so suspend_device_irqs() disables them as well which
+results in a fatal resume failure on the boot CPU.
+
+Adding IRQF_TIMER to the interupt flags when requesting the hpet per
+cpu timer interrupts solves the problem.
+
+Reported-by: Benjamin S. <sbenni@gmx.de>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Benjamin S. <sbenni@gmx.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kernel/hpet.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/arch/x86/kernel/hpet.c
++++ b/arch/x86/kernel/hpet.c
+@@ -510,7 +510,8 @@ static int hpet_setup_irq(struct hpet_de
+ {
+
+ if (request_irq(dev->irq, hpet_interrupt_handler,
+- IRQF_DISABLED|IRQF_NOBALANCING, dev->name, dev))
++ IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING,
++ dev->name, dev))
+ return -1;
+
+ disable_irq(dev->irq);