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 ---