sh: rework ipr code
[linux-2.6.git] / arch / sh / kernel / cpu / sh3 / setup-sh7709.c
index c7d7c35..c0265a9 100644 (file)
@@ -52,32 +52,66 @@ static int __init sh7709_devices_setup(void)
 }
 __initcall(sh7709_devices_setup);
 
-#define IPRx(A,N)      .addr=A, .shift=N
-#define IPRA(N)        IPRx(0xfffffee2UL,N)
-#define IPRB(N)        IPRx(0xfffffee4UL,N)
-#define IPRC(N)        IPRx(0xa4000016UL,N)
-#define IPRD(N)        IPRx(0xa4000018UL,N)
-#define IPRE(N)        IPRx(0xa400001aUL,N)
-
-static struct ipr_data sh7709_ipr_map[] = {
-       [16]            = { IPRA(12), 2 }, /* TMU TUNI0 */
-       [17]            = { IPRA(8),  4 }, /* TMU TUNI1 */
-       [18 ... 19]     = { IPRA(4),  1 }, /* TMU TUNI1 */
-       [20 ... 22]     = { IPRA(0),  2 }, /* RTC CUI */
-       [23 ... 26]     = { IPRB(4),  3 }, /* SCI */
-       [27]            = { IPRB(12), 2 }, /* WDT ITI */
-       [32]            = { IPRC(0),  1 }, /* IRQ 0 */
-       [33]            = { IPRC(4),  1 }, /* IRQ 1 */
-       [34]            = { IPRC(8),  1 }, /* IRQ 2 APM */
-       [35]            = { IPRC(12), 1 }, /* IRQ 3 TOUCHSCREEN */
-       [36]            = { IPRD(0),  1 }, /* IRQ 4 */
-       [37]            = { IPRD(4),  1 }, /* IRQ 5 */
-       [48 ... 51]     = { IPRE(12), 7 }, /* DMA */
-       [52 ... 55]     = { IPRE(8),  3 }, /* IRDA */
-       [56 ... 59]     = { IPRE(4),  3 }, /* SCIF */
+static struct ipr_data ipr_irq_table[] = {
+       { 16, 0, 12, 2 }, /* TMU TUNI0 */
+       { 17, 0, 8,  4 }, /* TMU TUNI1 */
+       { 18, 0, 4,  1 }, /* TMU TUNI1 */
+       { 19, 0, 4,  1 }, /* TMU TUNI1 */
+       { 20, 0, 0,  2 }, /* RTC CUI */
+       { 21, 0, 0,  2 }, /* RTC CUI */
+       { 22, 0, 0,  2 }, /* RTC CUI */
+
+       { 23, 1, 4,  3 }, /* SCI */
+       { 24, 1, 4,  3 }, /* SCI */
+       { 25, 1, 4,  3 }, /* SCI */
+       { 26, 1, 4,  3 }, /* SCI */
+       { 27, 1, 12, 3 }, /* WDT ITI */
+
+       { 32, 2, 0,  1 }, /* IRQ 0 */
+       { 33, 2, 4,  1 }, /* IRQ 1 */
+       { 34, 2, 8,  1 }, /* IRQ 2 APM */
+       { 35, 2, 12, 1 }, /* IRQ 3 TOUCHSCREEN */
+
+       { 36, 3, 0,  1 }, /* IRQ 4 */
+       { 37, 3, 4,  1 }, /* IRQ 5 */
+
+       { 48, 4, 12, 7 }, /* DMA */
+       { 49, 4, 12, 7 }, /* DMA */
+       { 50, 4, 12, 7 }, /* DMA */
+       { 51, 4, 12, 7 }, /* DMA */
+
+       { 52, 4, 8,  3 }, /* IRDA */
+       { 53, 4, 8,  3 }, /* IRDA */
+       { 54, 4, 8,  3 }, /* IRDA */
+       { 55, 4, 8,  3 }, /* IRDA */
+
+       { 56, 4, 4,  3 }, /* SCIF */
+       { 57, 4, 4,  3 }, /* SCIF */
+       { 58, 4, 4,  3 }, /* SCIF */
+       { 59, 4, 4,  3 }, /* SCIF */
+};
+
+static unsigned long ipr_offsets[] = {
+       0xfffffee2,     /* 0: IPRA */
+       0xfffffee4,     /* 1: IPRB */
+       0xa4000016,     /* 2: IPRC */
+       0xa4000018,     /* 3: IPRD */
+       0xa400001a,     /* 4: IPRE */
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7709",
+       },
 };
 
-void __init init_IRQ_ipr()
+void __init init_IRQ_ipr(void)
 {
-       make_ipr_irq(sh7709_ipr_map, ARRAY_SIZE(sh7709_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }