diff options
author | Hirokazu Takata <takata@linux-m32r.org> | 2005-11-28 16:44:00 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-28 17:42:24 -0500 |
commit | ad09d583106fadfdf751926107cfe35fba6bdbd4 (patch) | |
tree | 35df7418b229ed8b8eb42609924a383660705359 | |
parent | 0332db5aff3eec73eead6d991782b0dee1376dc0 (diff) |
[PATCH] m32r: M3A-2170(Mappi-III) IDE support
This patch is for supporting IDE interface for M3A-2170(Mappi-III) board.
Signed-off-by: Mamoru Sakugawa <sakugawa@linux-m32r.org>
Signed-off-by: Hirokazu Takata <takata@linux-m32r.org>
Cc: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | arch/m32r/kernel/io_mappi3.c | 54 | ||||
-rw-r--r-- | arch/m32r/kernel/setup_mappi3.c | 20 | ||||
-rw-r--r-- | drivers/pcmcia/m32r_cfc.c | 3 | ||||
-rw-r--r-- | include/asm-m32r/ide.h | 13 | ||||
-rw-r--r-- | include/asm-m32r/mappi3/mappi3_pld.h | 2 |
5 files changed, 59 insertions, 33 deletions
diff --git a/arch/m32r/kernel/io_mappi3.c b/arch/m32r/kernel/io_mappi3.c index 6716ffea769a..f80321a58764 100644 --- a/arch/m32r/kernel/io_mappi3.c +++ b/arch/m32r/kernel/io_mappi3.c | |||
@@ -36,12 +36,13 @@ static inline void *_port2addr(unsigned long port) | |||
36 | return (void *)(port + NONCACHE_OFFSET); | 36 | return (void *)(port + NONCACHE_OFFSET); |
37 | } | 37 | } |
38 | 38 | ||
39 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 39 | #if defined(CONFIG_IDE) |
40 | static inline void *__port2addr_ata(unsigned long port) | 40 | static inline void *__port2addr_ata(unsigned long port) |
41 | { | 41 | { |
42 | static int dummy_reg; | 42 | static int dummy_reg; |
43 | 43 | ||
44 | switch (port) { | 44 | switch (port) { |
45 | /* IDE0 CF */ | ||
45 | case 0x1f0: return (void *)0xb4002000; | 46 | case 0x1f0: return (void *)0xb4002000; |
46 | case 0x1f1: return (void *)0xb4012800; | 47 | case 0x1f1: return (void *)0xb4012800; |
47 | case 0x1f2: return (void *)0xb4012002; | 48 | case 0x1f2: return (void *)0xb4012002; |
@@ -51,6 +52,17 @@ static inline void *__port2addr_ata(unsigned long port) | |||
51 | case 0x1f6: return (void *)0xb4012006; | 52 | case 0x1f6: return (void *)0xb4012006; |
52 | case 0x1f7: return (void *)0xb4012806; | 53 | case 0x1f7: return (void *)0xb4012806; |
53 | case 0x3f6: return (void *)0xb401200e; | 54 | case 0x3f6: return (void *)0xb401200e; |
55 | /* IDE1 IDE */ | ||
56 | case 0x170: return (void *)0xb4810000; /* Data 16bit */ | ||
57 | case 0x171: return (void *)0xb4810002; /* Features / Error */ | ||
58 | case 0x172: return (void *)0xb4810004; /* Sector count */ | ||
59 | case 0x173: return (void *)0xb4810006; /* Sector number */ | ||
60 | case 0x174: return (void *)0xb4810008; /* Cylinder low */ | ||
61 | case 0x175: return (void *)0xb481000a; /* Cylinder high */ | ||
62 | case 0x176: return (void *)0xb481000c; /* Device head */ | ||
63 | case 0x177: return (void *)0xb481000e; /* Command */ | ||
64 | case 0x376: return (void *)0xb480800c; /* Device control / Alt status */ | ||
65 | |||
54 | default: return (void *)&dummy_reg; | 66 | default: return (void *)&dummy_reg; |
55 | } | 67 | } |
56 | } | 68 | } |
@@ -108,8 +120,9 @@ unsigned char _inb(unsigned long port) | |||
108 | { | 120 | { |
109 | if (port >= LAN_IOSTART && port < LAN_IOEND) | 121 | if (port >= LAN_IOSTART && port < LAN_IOEND) |
110 | return _ne_inb(PORT2ADDR_NE(port)); | 122 | return _ne_inb(PORT2ADDR_NE(port)); |
111 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 123 | #if defined(CONFIG_IDE) |
112 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 124 | else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
125 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
113 | return *(volatile unsigned char *)__port2addr_ata(port); | 126 | return *(volatile unsigned char *)__port2addr_ata(port); |
114 | } | 127 | } |
115 | #endif | 128 | #endif |
@@ -127,8 +140,9 @@ unsigned short _inw(unsigned long port) | |||
127 | { | 140 | { |
128 | if (port >= LAN_IOSTART && port < LAN_IOEND) | 141 | if (port >= LAN_IOSTART && port < LAN_IOEND) |
129 | return _ne_inw(PORT2ADDR_NE(port)); | 142 | return _ne_inw(PORT2ADDR_NE(port)); |
130 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 143 | #if defined(CONFIG_IDE) |
131 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 144 | else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
145 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
132 | return *(volatile unsigned short *)__port2addr_ata(port); | 146 | return *(volatile unsigned short *)__port2addr_ata(port); |
133 | } | 147 | } |
134 | #endif | 148 | #endif |
@@ -185,8 +199,9 @@ void _outb(unsigned char b, unsigned long port) | |||
185 | if (port >= LAN_IOSTART && port < LAN_IOEND) | 199 | if (port >= LAN_IOSTART && port < LAN_IOEND) |
186 | _ne_outb(b, PORT2ADDR_NE(port)); | 200 | _ne_outb(b, PORT2ADDR_NE(port)); |
187 | else | 201 | else |
188 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 202 | #if defined(CONFIG_IDE) |
189 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 203 | if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
204 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
190 | *(volatile unsigned char *)__port2addr_ata(port) = b; | 205 | *(volatile unsigned char *)__port2addr_ata(port) = b; |
191 | } else | 206 | } else |
192 | #endif | 207 | #endif |
@@ -203,8 +218,9 @@ void _outw(unsigned short w, unsigned long port) | |||
203 | if (port >= LAN_IOSTART && port < LAN_IOEND) | 218 | if (port >= LAN_IOSTART && port < LAN_IOEND) |
204 | _ne_outw(w, PORT2ADDR_NE(port)); | 219 | _ne_outw(w, PORT2ADDR_NE(port)); |
205 | else | 220 | else |
206 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 221 | #if defined(CONFIG_IDE) |
207 | if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 222 | if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
223 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
208 | *(volatile unsigned short *)__port2addr_ata(port) = w; | 224 | *(volatile unsigned short *)__port2addr_ata(port) = w; |
209 | } else | 225 | } else |
210 | #endif | 226 | #endif |
@@ -253,8 +269,9 @@ void _insb(unsigned int port, void * addr, unsigned long count) | |||
253 | { | 269 | { |
254 | if (port >= LAN_IOSTART && port < LAN_IOEND) | 270 | if (port >= LAN_IOSTART && port < LAN_IOEND) |
255 | _ne_insb(PORT2ADDR_NE(port), addr, count); | 271 | _ne_insb(PORT2ADDR_NE(port), addr, count); |
256 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 272 | #if defined(CONFIG_IDE) |
257 | else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 273 | else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
274 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
258 | unsigned char *buf = addr; | 275 | unsigned char *buf = addr; |
259 | unsigned char *portp = __port2addr_ata(port); | 276 | unsigned char *portp = __port2addr_ata(port); |
260 | while (count--) | 277 | while (count--) |
@@ -289,8 +306,9 @@ void _insw(unsigned int port, void * addr, unsigned long count) | |||
289 | pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short), | 306 | pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short), |
290 | count, 1); | 307 | count, 1); |
291 | #endif | 308 | #endif |
292 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 309 | #if defined(CONFIG_IDE) |
293 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 310 | } else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
311 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
294 | portp = __port2addr_ata(port); | 312 | portp = __port2addr_ata(port); |
295 | while (count--) | 313 | while (count--) |
296 | *buf++ = *(volatile unsigned short *)portp; | 314 | *buf++ = *(volatile unsigned short *)portp; |
@@ -321,8 +339,9 @@ void _outsb(unsigned int port, const void * addr, unsigned long count) | |||
321 | portp = PORT2ADDR_NE(port); | 339 | portp = PORT2ADDR_NE(port); |
322 | while (count--) | 340 | while (count--) |
323 | _ne_outb(*buf++, portp); | 341 | _ne_outb(*buf++, portp); |
324 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 342 | #if defined(CONFIG_IDE) |
325 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 343 | } else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
344 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
326 | portp = __port2addr_ata(port); | 345 | portp = __port2addr_ata(port); |
327 | while (count--) | 346 | while (count--) |
328 | *(volatile unsigned char *)portp = *buf++; | 347 | *(volatile unsigned char *)portp = *buf++; |
@@ -348,8 +367,9 @@ void _outsw(unsigned int port, const void * addr, unsigned long count) | |||
348 | portp = PORT2ADDR_NE(port); | 367 | portp = PORT2ADDR_NE(port); |
349 | while (count--) | 368 | while (count--) |
350 | *(volatile unsigned short *)portp = *buf++; | 369 | *(volatile unsigned short *)portp = *buf++; |
351 | #if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC) | 370 | #if defined(CONFIG_IDE) |
352 | } else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) { | 371 | } else if ( ((port >= 0x170 && port <=0x177) || port == 0x376) || |
372 | ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) ){ | ||
353 | portp = __port2addr_ata(port); | 373 | portp = __port2addr_ata(port); |
354 | while (count--) | 374 | while (count--) |
355 | *(volatile unsigned short *)portp = *buf++; | 375 | *(volatile unsigned short *)portp = *buf++; |
diff --git a/arch/m32r/kernel/setup_mappi3.c b/arch/m32r/kernel/setup_mappi3.c index 9c79341a7b45..f6ecdf7f555c 100644 --- a/arch/m32r/kernel/setup_mappi3.c +++ b/arch/m32r/kernel/setup_mappi3.c | |||
@@ -151,7 +151,7 @@ void __init init_IRQ(void) | |||
151 | disable_mappi3_irq(M32R_IRQ_INT1); | 151 | disable_mappi3_irq(M32R_IRQ_INT1); |
152 | #endif /* CONFIG_USB */ | 152 | #endif /* CONFIG_USB */ |
153 | 153 | ||
154 | /* ICUCR40: CFC IREQ */ | 154 | /* CFC IREQ */ |
155 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; | 155 | irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; |
156 | irq_desc[PLD_IRQ_CFIREQ].handler = &mappi3_irq_type; | 156 | irq_desc[PLD_IRQ_CFIREQ].handler = &mappi3_irq_type; |
157 | irq_desc[PLD_IRQ_CFIREQ].action = 0; | 157 | irq_desc[PLD_IRQ_CFIREQ].action = 0; |
@@ -160,7 +160,7 @@ void __init init_IRQ(void) | |||
160 | disable_mappi3_irq(PLD_IRQ_CFIREQ); | 160 | disable_mappi3_irq(PLD_IRQ_CFIREQ); |
161 | 161 | ||
162 | #if defined(CONFIG_M32R_CFC) | 162 | #if defined(CONFIG_M32R_CFC) |
163 | /* ICUCR41: CFC Insert */ | 163 | /* ICUCR41: CFC Insert & eject */ |
164 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; | 164 | irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; |
165 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi3_irq_type; | 165 | irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi3_irq_type; |
166 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; | 166 | irq_desc[PLD_IRQ_CFC_INSERT].action = 0; |
@@ -168,14 +168,16 @@ void __init init_IRQ(void) | |||
168 | icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; | 168 | icu_data[PLD_IRQ_CFC_INSERT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD00; |
169 | disable_mappi3_irq(PLD_IRQ_CFC_INSERT); | 169 | disable_mappi3_irq(PLD_IRQ_CFC_INSERT); |
170 | 170 | ||
171 | /* ICUCR42: CFC Eject */ | ||
172 | irq_desc[PLD_IRQ_CFC_EJECT].status = IRQ_DISABLED; | ||
173 | irq_desc[PLD_IRQ_CFC_EJECT].handler = &mappi3_irq_type; | ||
174 | irq_desc[PLD_IRQ_CFC_EJECT].action = 0; | ||
175 | irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ | ||
176 | icu_data[PLD_IRQ_CFC_EJECT].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
177 | disable_mappi3_irq(PLD_IRQ_CFC_EJECT); | ||
178 | #endif /* CONFIG_M32R_CFC */ | 171 | #endif /* CONFIG_M32R_CFC */ |
172 | |||
173 | /* IDE IREQ */ | ||
174 | irq_desc[PLD_IRQ_IDEIREQ].status = IRQ_DISABLED; | ||
175 | irq_desc[PLD_IRQ_IDEIREQ].handler = &mappi3_irq_type; | ||
176 | irq_desc[PLD_IRQ_IDEIREQ].action = 0; | ||
177 | irq_desc[PLD_IRQ_IDEIREQ].depth = 1; /* disable nested irq */ | ||
178 | icu_data[PLD_IRQ_IDEIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | ||
179 | disable_mappi3_irq(PLD_IRQ_IDEIREQ); | ||
180 | |||
179 | } | 181 | } |
180 | 182 | ||
181 | #if defined(CONFIG_SMC91X) | 183 | #if defined(CONFIG_SMC91X) |
diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c index 2c22b4b3619d..078579ae6359 100644 --- a/drivers/pcmcia/m32r_cfc.c +++ b/drivers/pcmcia/m32r_cfc.c | |||
@@ -355,9 +355,10 @@ static void add_pcc_socket(ulong base, int irq, ulong mapaddr, kio_addr_t ioaddr | |||
355 | #ifndef CONFIG_PLAT_USRV | 355 | #ifndef CONFIG_PLAT_USRV |
356 | /* insert interrupt */ | 356 | /* insert interrupt */ |
357 | request_irq(irq, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt); | 357 | request_irq(irq, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt); |
358 | #ifndef CONFIG_PLAT_MAPPI3 | ||
358 | /* eject interrupt */ | 359 | /* eject interrupt */ |
359 | request_irq(irq+1, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt); | 360 | request_irq(irq+1, pcc_interrupt, 0, "m32r_cfc", pcc_interrupt); |
360 | 361 | #endif | |
361 | debug(3, "m32r_cfc: enable CFMSK, RDYSEL\n"); | 362 | debug(3, "m32r_cfc: enable CFMSK, RDYSEL\n"); |
362 | pcc_set(pcc_sockets, (unsigned int)PLD_CFIMASK, 0x01); | 363 | pcc_set(pcc_sockets, (unsigned int)PLD_CFIMASK, 0x01); |
363 | #endif /* CONFIG_PLAT_USRV */ | 364 | #endif /* CONFIG_PLAT_USRV */ |
diff --git a/include/asm-m32r/ide.h b/include/asm-m32r/ide.h index 194393bd8beb..f7aa96970d18 100644 --- a/include/asm-m32r/ide.h +++ b/include/asm-m32r/ide.h | |||
@@ -25,18 +25,21 @@ | |||
25 | # endif | 25 | # endif |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | #if defined(CONFIG_PLAT_M32700UT) | 28 | #include <asm/m32r.h> |
29 | #include <asm/irq.h> | 29 | |
30 | #include <asm/m32700ut/m32700ut_pld.h> | ||
31 | #endif | ||
32 | 30 | ||
33 | #define IDE_ARCH_OBSOLETE_DEFAULTS | 31 | #define IDE_ARCH_OBSOLETE_DEFAULTS |
34 | 32 | ||
35 | static __inline__ int ide_default_irq(unsigned long base) | 33 | static __inline__ int ide_default_irq(unsigned long base) |
36 | { | 34 | { |
37 | switch (base) { | 35 | switch (base) { |
38 | #if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) || defined(CONFIG_PLAT_MAPPI3) | 36 | #if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) |
37 | case 0x1f0: return PLD_IRQ_CFIREQ; | ||
38 | default: | ||
39 | return 0; | ||
40 | #elif defined(CONFIG_PLAT_MAPPI3) | ||
39 | case 0x1f0: return PLD_IRQ_CFIREQ; | 41 | case 0x1f0: return PLD_IRQ_CFIREQ; |
42 | case 0x170: return PLD_IRQ_IDEIREQ; | ||
40 | default: | 43 | default: |
41 | return 0; | 44 | return 0; |
42 | #else | 45 | #else |
diff --git a/include/asm-m32r/mappi3/mappi3_pld.h b/include/asm-m32r/mappi3/mappi3_pld.h index 3f1551f7f01f..1d3c25d61bcb 100644 --- a/include/asm-m32r/mappi3/mappi3_pld.h +++ b/include/asm-m32r/mappi3/mappi3_pld.h | |||
@@ -59,7 +59,7 @@ | |||
59 | #define M32R_IRQ_I2C (28) /* I2C-BUS */ | 59 | #define M32R_IRQ_I2C (28) /* I2C-BUS */ |
60 | #define PLD_IRQ_CFIREQ (6) /* INT5 CFC Card Interrupt */ | 60 | #define PLD_IRQ_CFIREQ (6) /* INT5 CFC Card Interrupt */ |
61 | #define PLD_IRQ_CFC_INSERT (7) /* INT6 CFC Card Insert */ | 61 | #define PLD_IRQ_CFC_INSERT (7) /* INT6 CFC Card Insert */ |
62 | #define PLD_IRQ_CFC_EJECT (8) /* INT7 CFC Card Eject */ | 62 | #define PLD_IRQ_IDEIREQ (8) /* INT7 IDE Interrupt */ |
63 | #define PLD_IRQ_MMCCARD (43) /* MMC Card Insert */ | 63 | #define PLD_IRQ_MMCCARD (43) /* MMC Card Insert */ |
64 | #define PLD_IRQ_MMCIRQ (44) /* MMC Transfer Done */ | 64 | #define PLD_IRQ_MMCIRQ (44) /* MMC Transfer Done */ |
65 | 65 | ||