diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 14:11:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 14:11:23 -0400 |
commit | 928a726b0e12184729900c076e13dbf1c511c96c (patch) | |
tree | f31a7f23c1b511ebb486598cc746786e1821d48c /arch/sh/cchips/hd6446x/hd64461.c | |
parent | 8ff64b539bfd998792614481ccb67139b97075ef (diff) | |
parent | eaeed5d31d8ded02fa0a4b608f57418cc0e65b07 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: (96 commits)
sh: add support for SMSC Polaris platform
sh: fix the HD64461 level-triggered interrupts handling
sh: sh-rtc wakeup support
sh: sh-rtc invalid time rework
sh: sh-rtc carry interrupt rework
sh: disallow kexec virtual entry
sh: kexec jump: fix for ftrace.
sh: kexec: Drop SR.BL bit toggling.
sh: add kexec jump support
sh: rework kexec segment code
sh: simplify kexec vbr code
sh: Flush only the needed range when unmapping a VMA.
sh: Update debugfs ASID dumping for 16-bit ASID support.
sh: tlb-pteaex: Kill off legacy PTEA updates.
sh: Support for extended ASIDs on PTEAEX-capable SH-X3 cores.
sh: sh7763rdp: Change IRQ number for sh_eth of sh7763rdp
sh: espt-giga board support
sh: dma: Make G2 DMA configurable.
sh: dma: Make PVR2 DMA configurable.
sh: Move IRQ multi definition of DMAC to defconfig
...
Diffstat (limited to 'arch/sh/cchips/hd6446x/hd64461.c')
-rw-r--r-- | arch/sh/cchips/hd6446x/hd64461.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/arch/sh/cchips/hd6446x/hd64461.c b/arch/sh/cchips/hd6446x/hd64461.c index 27ceeb948bb1..25ef91061521 100644 --- a/arch/sh/cchips/hd6446x/hd64461.c +++ b/arch/sh/cchips/hd6446x/hd64461.c | |||
@@ -53,21 +53,22 @@ static struct irq_chip hd64461_irq_chip = { | |||
53 | .unmask = hd64461_unmask_irq, | 53 | .unmask = hd64461_unmask_irq, |
54 | }; | 54 | }; |
55 | 55 | ||
56 | int hd64461_irq_demux(int irq) | 56 | static void hd64461_irq_demux(unsigned int irq, struct irq_desc *desc) |
57 | { | 57 | { |
58 | if (irq == CONFIG_HD64461_IRQ) { | 58 | unsigned short intv = ctrl_inw(HD64461_NIRR); |
59 | unsigned short bit; | 59 | struct irq_desc *ext_desc; |
60 | unsigned short nirr = inw(HD64461_NIRR); | 60 | unsigned int ext_irq = HD64461_IRQBASE; |
61 | unsigned short nimr = inw(HD64461_NIMR); | 61 | |
62 | int i; | 62 | intv &= (1 << HD64461_IRQ_NUM) - 1; |
63 | 63 | ||
64 | nirr &= ~nimr; | 64 | while (intv) { |
65 | for (bit = 1, i = 0; i < 16; bit <<= 1, i++) | 65 | if (intv & 1) { |
66 | if (nirr & bit) | 66 | ext_desc = irq_desc + ext_irq; |
67 | break; | 67 | handle_level_irq(ext_irq, ext_desc); |
68 | irq = HD64461_IRQBASE + i; | 68 | } |
69 | intv >>= 1; | ||
70 | ext_irq++; | ||
69 | } | 71 | } |
70 | return irq; | ||
71 | } | 72 | } |
72 | 73 | ||
73 | int __init setup_hd64461(void) | 74 | int __init setup_hd64461(void) |
@@ -93,6 +94,9 @@ int __init setup_hd64461(void) | |||
93 | set_irq_chip_and_handler(i, &hd64461_irq_chip, | 94 | set_irq_chip_and_handler(i, &hd64461_irq_chip, |
94 | handle_level_irq); | 95 | handle_level_irq); |
95 | 96 | ||
97 | set_irq_chained_handler(CONFIG_HD64461_IRQ, hd64461_irq_demux); | ||
98 | set_irq_type(CONFIG_HD64461_IRQ, IRQ_TYPE_LEVEL_LOW); | ||
99 | |||
96 | #ifdef CONFIG_HD64461_ENABLER | 100 | #ifdef CONFIG_HD64461_ENABLER |
97 | printk(KERN_INFO "HD64461: enabling PCMCIA devices\n"); | 101 | printk(KERN_INFO "HD64461: enabling PCMCIA devices\n"); |
98 | __raw_writeb(0x4c, HD64461_PCC1CSCIER); | 102 | __raw_writeb(0x4c, HD64461_PCC1CSCIER); |