Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.2 449 lines 12 kB view raw
1/* 2 * linux/arch/m32r/platforms/opsput/setup.c 3 * 4 * Setup routines for Renesas OPSPUT Board 5 * 6 * Copyright (c) 2002-2005 7 * Hiroyuki Kondo, Hirokazu Takata, 8 * Hitoshi Yamamoto, Takeo Takahashi, Mamoru Sakugawa 9 * 10 * This file is subject to the terms and conditions of the GNU General 11 * Public License. See the file "COPYING" in the main directory of this 12 * archive for more details. 13 */ 14 15#include <linux/irq.h> 16#include <linux/kernel.h> 17#include <linux/init.h> 18#include <linux/platform_device.h> 19 20#include <asm/system.h> 21#include <asm/m32r.h> 22#include <asm/io.h> 23 24/* 25 * OPSP Interrupt Control Unit (Level 1) 26 */ 27#define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long))) 28 29icu_data_t icu_data[OPSPUT_NUM_CPU_IRQ]; 30 31static void disable_opsput_irq(unsigned int irq) 32{ 33 unsigned long port, data; 34 35 port = irq2port(irq); 36 data = icu_data[irq].icucr|M32R_ICUCR_ILEVEL7; 37 outl(data, port); 38} 39 40static void enable_opsput_irq(unsigned int irq) 41{ 42 unsigned long port, data; 43 44 port = irq2port(irq); 45 data = icu_data[irq].icucr|M32R_ICUCR_IEN|M32R_ICUCR_ILEVEL6; 46 outl(data, port); 47} 48 49static void mask_opsput(struct irq_data *data) 50{ 51 disable_opsput_irq(data->irq); 52} 53 54static void unmask_opsput(struct irq_data *data) 55{ 56 enable_opsput_irq(data->irq); 57} 58 59static void shutdown_opsput(struct irq_data *data) 60{ 61 unsigned long port; 62 63 port = irq2port(data->irq); 64 outl(M32R_ICUCR_ILEVEL7, port); 65} 66 67static struct irq_chip opsput_irq_type = 68{ 69 .name = "OPSPUT-IRQ", 70 .irq_shutdown = shutdown_opsput, 71 .irq_mask = mask_opsput, 72 .irq_unmask = unmask_opsput, 73}; 74 75/* 76 * Interrupt Control Unit of PLD on OPSPUT (Level 2) 77 */ 78#define irq2pldirq(x) ((x) - OPSPUT_PLD_IRQ_BASE) 79#define pldirq2port(x) (unsigned long)((int)PLD_ICUCR1 + \ 80 (((x) - 1) * sizeof(unsigned short))) 81 82typedef struct { 83 unsigned short icucr; /* ICU Control Register */ 84} pld_icu_data_t; 85 86static pld_icu_data_t pld_icu_data[OPSPUT_NUM_PLD_IRQ]; 87 88static void disable_opsput_pld_irq(unsigned int irq) 89{ 90 unsigned long port, data; 91 unsigned int pldirq; 92 93 pldirq = irq2pldirq(irq); 94 port = pldirq2port(pldirq); 95 data = pld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; 96 outw(data, port); 97} 98 99static void enable_opsput_pld_irq(unsigned int irq) 100{ 101 unsigned long port, data; 102 unsigned int pldirq; 103 104 pldirq = irq2pldirq(irq); 105 port = pldirq2port(pldirq); 106 data = pld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; 107 outw(data, port); 108} 109 110static void mask_opsput_pld(struct irq_data *data) 111{ 112 disable_opsput_pld_irq(data->irq); 113} 114 115static void unmask_opsput_pld(struct irq_data *data) 116{ 117 enable_opsput_pld_irq(data->irq); 118 enable_opsput_irq(M32R_IRQ_INT1); 119} 120 121static void shutdown_opsput_pld(struct irq_data *data) 122{ 123 unsigned long port; 124 unsigned int pldirq; 125 126 pldirq = irq2pldirq(data->irq); 127 port = pldirq2port(pldirq); 128 outw(PLD_ICUCR_ILEVEL7, port); 129} 130 131static struct irq_chip opsput_pld_irq_type = 132{ 133 .name = "OPSPUT-PLD-IRQ", 134 .irq_shutdown = shutdown_opsput_pld, 135 .irq_mask = mask_opsput_pld, 136 .irq_unmask = unmask_opsput_pld, 137}; 138 139/* 140 * Interrupt Control Unit of PLD on OPSPUT-LAN (Level 2) 141 */ 142#define irq2lanpldirq(x) ((x) - OPSPUT_LAN_PLD_IRQ_BASE) 143#define lanpldirq2port(x) (unsigned long)((int)OPSPUT_LAN_ICUCR1 + \ 144 (((x) - 1) * sizeof(unsigned short))) 145 146static pld_icu_data_t lanpld_icu_data[OPSPUT_NUM_LAN_PLD_IRQ]; 147 148static void disable_opsput_lanpld_irq(unsigned int irq) 149{ 150 unsigned long port, data; 151 unsigned int pldirq; 152 153 pldirq = irq2lanpldirq(irq); 154 port = lanpldirq2port(pldirq); 155 data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; 156 outw(data, port); 157} 158 159static void enable_opsput_lanpld_irq(unsigned int irq) 160{ 161 unsigned long port, data; 162 unsigned int pldirq; 163 164 pldirq = irq2lanpldirq(irq); 165 port = lanpldirq2port(pldirq); 166 data = lanpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; 167 outw(data, port); 168} 169 170static void mask_opsput_lanpld(struct irq_data *data) 171{ 172 disable_opsput_lanpld_irq(data->irq); 173} 174 175static void unmask_opsput_lanpld(struct irq_data *data) 176{ 177 enable_opsput_lanpld_irq(data->irq); 178 enable_opsput_irq(M32R_IRQ_INT0); 179} 180 181static void shutdown_opsput_lanpld(struct irq_data *data) 182{ 183 unsigned long port; 184 unsigned int pldirq; 185 186 pldirq = irq2lanpldirq(data->irq); 187 port = lanpldirq2port(pldirq); 188 outw(PLD_ICUCR_ILEVEL7, port); 189} 190 191static struct irq_chip opsput_lanpld_irq_type = 192{ 193 .name = "OPSPUT-PLD-LAN-IRQ", 194 .irq_shutdown = shutdown_opsput_lanpld, 195 .irq_mask = mask_opsput_lanpld, 196 .irq_unmask = unmask_opsput_lanpld, 197}; 198 199/* 200 * Interrupt Control Unit of PLD on OPSPUT-LCD (Level 2) 201 */ 202#define irq2lcdpldirq(x) ((x) - OPSPUT_LCD_PLD_IRQ_BASE) 203#define lcdpldirq2port(x) (unsigned long)((int)OPSPUT_LCD_ICUCR1 + \ 204 (((x) - 1) * sizeof(unsigned short))) 205 206static pld_icu_data_t lcdpld_icu_data[OPSPUT_NUM_LCD_PLD_IRQ]; 207 208static void disable_opsput_lcdpld_irq(unsigned int irq) 209{ 210 unsigned long port, data; 211 unsigned int pldirq; 212 213 pldirq = irq2lcdpldirq(irq); 214 port = lcdpldirq2port(pldirq); 215 data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_ILEVEL7; 216 outw(data, port); 217} 218 219static void enable_opsput_lcdpld_irq(unsigned int irq) 220{ 221 unsigned long port, data; 222 unsigned int pldirq; 223 224 pldirq = irq2lcdpldirq(irq); 225 port = lcdpldirq2port(pldirq); 226 data = lcdpld_icu_data[pldirq].icucr|PLD_ICUCR_IEN|PLD_ICUCR_ILEVEL6; 227 outw(data, port); 228} 229 230static void mask_opsput_lcdpld(struct irq_data *data) 231{ 232 disable_opsput_lcdpld_irq(data->irq); 233} 234 235static void unmask_opsput_lcdpld(struct irq_data *data) 236{ 237 enable_opsput_lcdpld_irq(data->irq); 238 enable_opsput_irq(M32R_IRQ_INT2); 239} 240 241static void shutdown_opsput_lcdpld(struct irq_data *data) 242{ 243 unsigned long port; 244 unsigned int pldirq; 245 246 pldirq = irq2lcdpldirq(data->irq); 247 port = lcdpldirq2port(pldirq); 248 outw(PLD_ICUCR_ILEVEL7, port); 249} 250 251static struct irq_chip opsput_lcdpld_irq_type = { 252 .name = "OPSPUT-PLD-LCD-IRQ", 253 .irq_shutdown = shutdown_opsput_lcdpld, 254 .irq_mask = mask_opsput_lcdpld, 255 .irq_unmask = unmask_opsput_lcdpld, 256}; 257 258void __init init_IRQ(void) 259{ 260#if defined(CONFIG_SMC91X) 261 /* INT#0: LAN controller on OPSPUT-LAN (SMC91C111)*/ 262 irq_set_chip_and_handler(OPSPUT_LAN_IRQ_LAN, &opsput_lanpld_irq_type, 263 handle_level_irq); 264 lanpld_icu_data[irq2lanpldirq(OPSPUT_LAN_IRQ_LAN)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* "H" edge sense */ 265 disable_opsput_lanpld_irq(OPSPUT_LAN_IRQ_LAN); 266#endif /* CONFIG_SMC91X */ 267 268 /* MFT2 : system timer */ 269 irq_set_chip_and_handler(M32R_IRQ_MFT2, &opsput_irq_type, 270 handle_level_irq); 271 icu_data[M32R_IRQ_MFT2].icucr = M32R_ICUCR_IEN; 272 disable_opsput_irq(M32R_IRQ_MFT2); 273 274 /* SIO0 : receive */ 275 irq_set_chip_and_handler(M32R_IRQ_SIO0_R, &opsput_irq_type, 276 handle_level_irq); 277 icu_data[M32R_IRQ_SIO0_R].icucr = 0; 278 disable_opsput_irq(M32R_IRQ_SIO0_R); 279 280 /* SIO0 : send */ 281 irq_set_chip_and_handler(M32R_IRQ_SIO0_S, &opsput_irq_type, 282 handle_level_irq); 283 icu_data[M32R_IRQ_SIO0_S].icucr = 0; 284 disable_opsput_irq(M32R_IRQ_SIO0_S); 285 286 /* SIO1 : receive */ 287 irq_set_chip_and_handler(M32R_IRQ_SIO1_R, &opsput_irq_type, 288 handle_level_irq); 289 icu_data[M32R_IRQ_SIO1_R].icucr = 0; 290 disable_opsput_irq(M32R_IRQ_SIO1_R); 291 292 /* SIO1 : send */ 293 irq_set_chip_and_handler(M32R_IRQ_SIO1_S, &opsput_irq_type, 294 handle_level_irq); 295 icu_data[M32R_IRQ_SIO1_S].icucr = 0; 296 disable_opsput_irq(M32R_IRQ_SIO1_S); 297 298 /* DMA1 : */ 299 irq_set_chip_and_handler(M32R_IRQ_DMA1, &opsput_irq_type, 300 handle_level_irq); 301 icu_data[M32R_IRQ_DMA1].icucr = 0; 302 disable_opsput_irq(M32R_IRQ_DMA1); 303 304#ifdef CONFIG_SERIAL_M32R_PLDSIO 305 /* INT#1: SIO0 Receive on PLD */ 306 irq_set_chip_and_handler(PLD_IRQ_SIO0_RCV, &opsput_pld_irq_type, 307 handle_level_irq); 308 pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_RCV)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; 309 disable_opsput_pld_irq(PLD_IRQ_SIO0_RCV); 310 311 /* INT#1: SIO0 Send on PLD */ 312 irq_set_chip_and_handler(PLD_IRQ_SIO0_SND, &opsput_pld_irq_type, 313 handle_level_irq); 314 pld_icu_data[irq2pldirq(PLD_IRQ_SIO0_SND)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD03; 315 disable_opsput_pld_irq(PLD_IRQ_SIO0_SND); 316#endif /* CONFIG_SERIAL_M32R_PLDSIO */ 317 318 /* INT#1: CFC IREQ on PLD */ 319 irq_set_chip_and_handler(PLD_IRQ_CFIREQ, &opsput_pld_irq_type, 320 handle_level_irq); 321 pld_icu_data[irq2pldirq(PLD_IRQ_CFIREQ)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* 'L' level sense */ 322 disable_opsput_pld_irq(PLD_IRQ_CFIREQ); 323 324 /* INT#1: CFC Insert on PLD */ 325 irq_set_chip_and_handler(PLD_IRQ_CFC_INSERT, &opsput_pld_irq_type, 326 handle_level_irq); 327 pld_icu_data[irq2pldirq(PLD_IRQ_CFC_INSERT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD00; /* 'L' edge sense */ 328 disable_opsput_pld_irq(PLD_IRQ_CFC_INSERT); 329 330 /* INT#1: CFC Eject on PLD */ 331 irq_set_chip_and_handler(PLD_IRQ_CFC_EJECT, &opsput_pld_irq_type, 332 handle_level_irq); 333 pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ 334 disable_opsput_pld_irq(PLD_IRQ_CFC_EJECT); 335 336 /* 337 * INT0# is used for LAN, DIO 338 * We enable it here. 339 */ 340 icu_data[M32R_IRQ_INT0].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11; 341 enable_opsput_irq(M32R_IRQ_INT0); 342 343 /* 344 * INT1# is used for UART, MMC, CF Controller in FPGA. 345 * We enable it here. 346 */ 347 icu_data[M32R_IRQ_INT1].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD11; 348 enable_opsput_irq(M32R_IRQ_INT1); 349 350#if defined(CONFIG_USB) 351 outw(USBCR_OTGS, USBCR); /* USBCR: non-OTG */ 352 irq_set_chip_and_handler(OPSPUT_LCD_IRQ_USB_INT1, 353 &opsput_lcdpld_irq_type, handle_level_irq); 354 lcdpld_icu_data[irq2lcdpldirq(OPSPUT_LCD_IRQ_USB_INT1)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD01; /* "L" level sense */ 355 disable_opsput_lcdpld_irq(OPSPUT_LCD_IRQ_USB_INT1); 356#endif 357 /* 358 * INT2# is used for BAT, USB, AUDIO 359 * We enable it here. 360 */ 361 icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; 362 enable_opsput_irq(M32R_IRQ_INT2); 363 364#if defined(CONFIG_VIDEO_M32R_AR) 365 /* 366 * INT3# is used for AR 367 */ 368 irq_set_chip_and_handler(M32R_IRQ_INT3, &opsput_irq_type, 369 handle_level_irq); 370 icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; 371 disable_opsput_irq(M32R_IRQ_INT3); 372#endif /* CONFIG_VIDEO_M32R_AR */ 373} 374 375#if defined(CONFIG_SMC91X) 376 377#define LAN_IOSTART 0x300 378#define LAN_IOEND 0x320 379static struct resource smc91x_resources[] = { 380 [0] = { 381 .start = (LAN_IOSTART), 382 .end = (LAN_IOEND), 383 .flags = IORESOURCE_MEM, 384 }, 385 [1] = { 386 .start = OPSPUT_LAN_IRQ_LAN, 387 .end = OPSPUT_LAN_IRQ_LAN, 388 .flags = IORESOURCE_IRQ, 389 } 390}; 391 392static struct platform_device smc91x_device = { 393 .name = "smc91x", 394 .id = 0, 395 .num_resources = ARRAY_SIZE(smc91x_resources), 396 .resource = smc91x_resources, 397}; 398#endif 399 400#if defined(CONFIG_FB_S1D13XXX) 401 402#include <video/s1d13xxxfb.h> 403#include <asm/s1d13806.h> 404 405static struct s1d13xxxfb_pdata s1d13xxxfb_data = { 406 .initregs = s1d13xxxfb_initregs, 407 .initregssize = ARRAY_SIZE(s1d13xxxfb_initregs), 408 .platform_init_video = NULL, 409#ifdef CONFIG_PM 410 .platform_suspend_video = NULL, 411 .platform_resume_video = NULL, 412#endif 413}; 414 415static struct resource s1d13xxxfb_resources[] = { 416 [0] = { 417 .start = 0x10600000UL, 418 .end = 0x1073FFFFUL, 419 .flags = IORESOURCE_MEM, 420 }, 421 [1] = { 422 .start = 0x10400000UL, 423 .end = 0x104001FFUL, 424 .flags = IORESOURCE_MEM, 425 } 426}; 427 428static struct platform_device s1d13xxxfb_device = { 429 .name = S1D_DEVICENAME, 430 .id = 0, 431 .dev = { 432 .platform_data = &s1d13xxxfb_data, 433 }, 434 .num_resources = ARRAY_SIZE(s1d13xxxfb_resources), 435 .resource = s1d13xxxfb_resources, 436}; 437#endif 438 439static int __init platform_init(void) 440{ 441#if defined(CONFIG_SMC91X) 442 platform_device_register(&smc91x_device); 443#endif 444#if defined(CONFIG_FB_S1D13XXX) 445 platform_device_register(&s1d13xxxfb_device); 446#endif 447 return 0; 448} 449arch_initcall(platform_init);