diff options
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/boards/mach-landisk/irq.c | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/arch/sh/boards/mach-landisk/irq.c b/arch/sh/boards/mach-landisk/irq.c index e79412a40490..c00ace38db3f 100644 --- a/arch/sh/boards/mach-landisk/irq.c +++ b/arch/sh/boards/mach-landisk/irq.c | |||
@@ -1,9 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * arch/sh/boards/landisk/irq.c | 2 | * arch/sh/boards/mach-landisk/irq.c |
3 | * | 3 | * |
4 | * I-O DATA Device, Inc. LANDISK Support | 4 | * I-O DATA Device, Inc. LANDISK Support |
5 | * | 5 | * |
6 | * Copyright (C) 2005-2007 kogiidena | 6 | * Copyright (C) 2005-2007 kogiidena |
7 | * Copyright (C) 2011 Nobuhiro Iwamatsu | ||
7 | * | 8 | * |
8 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel | 9 | * Copyright (C) 2001 Ian da Silva, Jeremy Siegel |
9 | * Based largely on io_se.c. | 10 | * Based largely on io_se.c. |
@@ -12,44 +13,54 @@ | |||
12 | * License. See the file "COPYING" in the main directory of this archive | 13 | * License. See the file "COPYING" in the main directory of this archive |
13 | * for more details. | 14 | * for more details. |
14 | */ | 15 | */ |
16 | |||
15 | #include <linux/init.h> | 17 | #include <linux/init.h> |
16 | #include <linux/irq.h> | 18 | #include <linux/irq.h> |
17 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
18 | #include <linux/io.h> | 20 | #include <linux/io.h> |
19 | #include <mach-landisk/mach/iodata_landisk.h> | 21 | #include <mach-landisk/mach/iodata_landisk.h> |
20 | 22 | ||
21 | static void disable_landisk_irq(struct irq_data *data) | 23 | enum { |
22 | { | 24 | UNUSED = 0, |
23 | unsigned char mask = 0xff ^ (0x01 << (data->irq - 5)); | ||
24 | 25 | ||
25 | __raw_writeb(__raw_readb(PA_IMASK) & mask, PA_IMASK); | 26 | PCI_INTA, /* PCI int A */ |
26 | } | 27 | PCI_INTB, /* PCI int B */ |
27 | 28 | PCI_INTC, /* PCI int C */ | |
28 | static void enable_landisk_irq(struct irq_data *data) | 29 | PCI_INTD, /* PCI int D */ |
29 | { | 30 | ATA, /* ATA */ |
30 | unsigned char value = (0x01 << (data->irq - 5)); | 31 | FATA, /* CF */ |
32 | POWER, /* Power swtich */ | ||
33 | BUTTON, /* Button swtich */ | ||
34 | }; | ||
31 | 35 | ||
32 | __raw_writeb(__raw_readb(PA_IMASK) | value, PA_IMASK); | 36 | /* Vectors for LANDISK */ |
33 | } | 37 | static struct intc_vect vectors_landisk[] __initdata = { |
38 | INTC_IRQ(PCI_INTA, IRQ_PCIINTA), | ||
39 | INTC_IRQ(PCI_INTB, IRQ_PCIINTB), | ||
40 | INTC_IRQ(PCI_INTC, IRQ_PCIINTC), | ||
41 | INTC_IRQ(PCI_INTD, IRQ_PCIINTD), | ||
42 | INTC_IRQ(ATA, IRQ_ATA), | ||
43 | INTC_IRQ(FATA, IRQ_FATA), | ||
44 | INTC_IRQ(POWER, IRQ_POWER), | ||
45 | INTC_IRQ(BUTTON, IRQ_BUTTON), | ||
46 | }; | ||
34 | 47 | ||
35 | static struct irq_chip landisk_irq_chip __read_mostly = { | 48 | /* IRLMSK mask register layout for LANDISK */ |
36 | .name = "LANDISK", | 49 | static struct intc_mask_reg mask_registers_landisk[] __initdata = { |
37 | .irq_mask = disable_landisk_irq, | 50 | { PA_IMASK, 0, 8, /* IRLMSK */ |
38 | .irq_unmask = enable_landisk_irq, | 51 | { BUTTON, POWER, FATA, ATA, |
52 | PCI_INTD, PCI_INTC, PCI_INTB, PCI_INTA, | ||
53 | } | ||
54 | }, | ||
39 | }; | 55 | }; |
40 | 56 | ||
57 | static DECLARE_INTC_DESC(intc_desc_landisk, "landisk", vectors_landisk, NULL, | ||
58 | mask_registers_landisk, NULL, NULL); | ||
41 | /* | 59 | /* |
42 | * Initialize IRQ setting | 60 | * Initialize IRQ setting |
43 | */ | 61 | */ |
44 | void __init init_landisk_IRQ(void) | 62 | void __init init_landisk_IRQ(void) |
45 | { | 63 | { |
46 | int i; | 64 | register_intc_controller(&intc_desc_landisk); |
47 | |||
48 | for (i = 5; i < 14; i++) { | ||
49 | disable_irq_nosync(i); | ||
50 | set_irq_chip_and_handler_name(i, &landisk_irq_chip, | ||
51 | handle_level_irq, "level"); | ||
52 | enable_landisk_irq(irq_get_irq_data(i)); | ||
53 | } | ||
54 | __raw_writeb(0x00, PA_PWRINT_CLR); | 65 | __raw_writeb(0x00, PA_PWRINT_CLR); |
55 | } | 66 | } |