prom.c (033ef338b6e007dc081c6282a4f2a9dd761f8cd2) | prom.c (6d0124fc06be40deafca043c73a8203c78bbfe45) |
---|---|
1/* 2 * Procedures for creating, accessing and interpreting the device tree. 3 * 4 * Paul Mackerras August 1996. 5 * Copyright (C) 1996-2005 Paul Mackerras. 6 * 7 * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. 8 * {engebret|bergner}@us.ibm.com --- 282 unchanged lines hidden (view full) --- 291#endif 292 return 0; 293 } 294 *irq = ints; 295 *ictrler = p; 296 return nintrc; 297} 298 | 1/* 2 * Procedures for creating, accessing and interpreting the device tree. 3 * 4 * Paul Mackerras August 1996. 5 * Copyright (C) 1996-2005 Paul Mackerras. 6 * 7 * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. 8 * {engebret|bergner}@us.ibm.com --- 282 unchanged lines hidden (view full) --- 291#endif 292 return 0; 293 } 294 *irq = ints; 295 *ictrler = p; 296 return nintrc; 297} 298 |
299static unsigned char map_isa_senses[4] = { 300 IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE, 301 IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE, 302 IRQ_SENSE_EDGE | IRQ_POLARITY_NEGATIVE, 303 IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE 304}; 305 306static unsigned char map_mpic_senses[4] = { 307 IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE, 308 IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE, 309 /* 2 seems to be used for the 8259 cascade... */ 310 IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE, 311 IRQ_SENSE_EDGE | IRQ_POLARITY_NEGATIVE, 312}; 313 |
|
299static int __devinit finish_node_interrupts(struct device_node *np, 300 unsigned long *mem_start, 301 int measure_only) 302{ 303 unsigned int *ints; 304 int intlen, intrcells, intrcount; | 314static int __devinit finish_node_interrupts(struct device_node *np, 315 unsigned long *mem_start, 316 int measure_only) 317{ 318 unsigned int *ints; 319 int intlen, intrcells, intrcount; |
305 int i, j, n; | 320 int i, j, n, sense; |
306 unsigned int *irq, virq; 307 struct device_node *ic; 308 309 if (num_interrupt_controllers == 0) { 310 /* 311 * Old machines just have a list of interrupt numbers 312 * and no interrupt-controller nodes. 313 */ --- 13 unchanged lines hidden (view full) --- 327 mem_start); 328 if (!np->intrs) 329 return -ENOMEM; 330 if (measure_only) 331 return 0; 332 333 for (i = 0; i < np->n_intrs; ++i) { 334 np->intrs[i].line = *ints++; | 321 unsigned int *irq, virq; 322 struct device_node *ic; 323 324 if (num_interrupt_controllers == 0) { 325 /* 326 * Old machines just have a list of interrupt numbers 327 * and no interrupt-controller nodes. 328 */ --- 13 unchanged lines hidden (view full) --- 342 mem_start); 343 if (!np->intrs) 344 return -ENOMEM; 345 if (measure_only) 346 return 0; 347 348 for (i = 0; i < np->n_intrs; ++i) { 349 np->intrs[i].line = *ints++; |
335 np->intrs[i].sense = 1; | 350 np->intrs[i].sense = IRQ_SENSE_LEVEL 351 | IRQ_POLARITY_NEGATIVE; |
336 } 337 return 0; 338 } 339 340 ints = (unsigned int *) get_property(np, "interrupts", &intlen); 341 if (ints == NULL) 342 return 0; 343 intrcells = prom_n_intr_cells(np); --- 10 unchanged lines hidden (view full) --- 354 for (i = 0; i < intlen; ++i, ints += intrcells) { 355 n = map_interrupt(&irq, &ic, np, ints, intrcells); 356 if (n <= 0) 357 continue; 358 359 /* don't map IRQ numbers under a cascaded 8259 controller */ 360 if (ic && device_is_compatible(ic, "chrp,iic")) { 361 np->intrs[intrcount].line = irq[0]; | 352 } 353 return 0; 354 } 355 356 ints = (unsigned int *) get_property(np, "interrupts", &intlen); 357 if (ints == NULL) 358 return 0; 359 intrcells = prom_n_intr_cells(np); --- 10 unchanged lines hidden (view full) --- 370 for (i = 0; i < intlen; ++i, ints += intrcells) { 371 n = map_interrupt(&irq, &ic, np, ints, intrcells); 372 if (n <= 0) 373 continue; 374 375 /* don't map IRQ numbers under a cascaded 8259 controller */ 376 if (ic && device_is_compatible(ic, "chrp,iic")) { 377 np->intrs[intrcount].line = irq[0]; |
378 sense = (n > 1)? (irq[1] & 3): 3; 379 np->intrs[intrcount].sense = map_isa_senses[sense]; |
|
362 } else { | 380 } else { |
363#ifdef CONFIG_PPC64 | |
364 virq = virt_irq_create_mapping(irq[0]); | 381 virq = virt_irq_create_mapping(irq[0]); |
382#ifdef CONFIG_PPC64 |
|
365 if (virq == NO_IRQ) { 366 printk(KERN_CRIT "Could not allocate interrupt" 367 " number for %s\n", np->full_name); 368 continue; 369 } | 383 if (virq == NO_IRQ) { 384 printk(KERN_CRIT "Could not allocate interrupt" 385 " number for %s\n", np->full_name); 386 continue; 387 } |
370 virq = irq_offset_up(virq); 371#else 372 virq = irq[0]; | |
373#endif | 388#endif |
374 np->intrs[intrcount].line = virq; | 389 np->intrs[intrcount].line = irq_offset_up(virq); 390 sense = (n > 1)? (irq[1] & 3): 1; 391 np->intrs[intrcount].sense = map_mpic_senses[sense]; |
375 } 376 377#ifdef CONFIG_PPC64 378 /* We offset irq numbers for the u3 MPIC by 128 in PowerMac */ 379 if (systemcfg->platform == PLATFORM_POWERMAC && ic && ic->parent) { 380 char *name = get_property(ic->parent, "name", NULL); 381 if (name && !strcmp(name, "u3")) 382 np->intrs[intrcount].line += 128; 383 else if (!(name && !strcmp(name, "mac-io"))) 384 /* ignore other cascaded controllers, such as 385 the k2-sata-root */ 386 break; 387 } 388#endif | 392 } 393 394#ifdef CONFIG_PPC64 395 /* We offset irq numbers for the u3 MPIC by 128 in PowerMac */ 396 if (systemcfg->platform == PLATFORM_POWERMAC && ic && ic->parent) { 397 char *name = get_property(ic->parent, "name", NULL); 398 if (name && !strcmp(name, "u3")) 399 np->intrs[intrcount].line += 128; 400 else if (!(name && !strcmp(name, "mac-io"))) 401 /* ignore other cascaded controllers, such as 402 the k2-sata-root */ 403 break; 404 } 405#endif |
389 np->intrs[intrcount].sense = 1; 390 if (n > 1) 391 np->intrs[intrcount].sense = irq[1]; | |
392 if (n > 2) { 393 printk("hmmm, got %d intr cells for %s:", n, 394 np->full_name); 395 for (j = 0; j < n; ++j) 396 printk(" %d", irq[j]); 397 printk("\n"); 398 } 399 ++intrcount; --- 996 unchanged lines hidden (view full) --- 1396 * of each interrupt from the device tree. 1397 */ 1398void __init prom_get_irq_senses(unsigned char *senses, int off, int max) 1399{ 1400 struct device_node *np; 1401 int i, j; 1402 1403 /* default to level-triggered */ | 406 if (n > 2) { 407 printk("hmmm, got %d intr cells for %s:", n, 408 np->full_name); 409 for (j = 0; j < n; ++j) 410 printk(" %d", irq[j]); 411 printk("\n"); 412 } 413 ++intrcount; --- 996 unchanged lines hidden (view full) --- 1410 * of each interrupt from the device tree. 1411 */ 1412void __init prom_get_irq_senses(unsigned char *senses, int off, int max) 1413{ 1414 struct device_node *np; 1415 int i, j; 1416 1417 /* default to level-triggered */ |
1404 memset(senses, 1, max - off); | 1418 memset(senses, IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE, max - off); |
1405 1406 for (np = allnodes; np != 0; np = np->allnext) { 1407 for (j = 0; j < np->n_intrs; j++) { 1408 i = np->intrs[j].line; 1409 if (i >= off && i < max) | 1419 1420 for (np = allnodes; np != 0; np = np->allnext) { 1421 for (j = 0; j < np->n_intrs; j++) { 1422 i = np->intrs[j].line; 1423 if (i >= off && i < max) |
1410 senses[i-off] = np->intrs[j].sense ? 1411 IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE : 1412 IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE; | 1424 senses[i-off] = np->intrs[j].sense; |
1413 } 1414 } 1415} 1416 1417/** 1418 * Construct and return a list of the device_nodes with a given name. 1419 */ 1420struct device_node *find_devices(const char *name) --- 740 unchanged lines hidden --- | 1425 } 1426 } 1427} 1428 1429/** 1430 * Construct and return a list of the device_nodes with a given name. 1431 */ 1432struct device_node *find_devices(const char *name) --- 740 unchanged lines hidden --- |