Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
authorLinus Torvalds <torvalds@g5.osdl.org>
Tue, 4 Jul 2006 04:26:12 +0000 (21:26 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 4 Jul 2006 04:26:12 +0000 (21:26 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild:
  kbuild: introduce utsrelease.h
  kbuild: explicit turn off gcc stack-protector

1  2 
arch/powerpc/platforms/chrp/setup.c
arch/powerpc/platforms/powermac/bootx_init.c

@@@ -24,7 -24,7 +24,7 @@@
  #include <linux/reboot.h>
  #include <linux/init.h>
  #include <linux/pci.h>
- #include <linux/version.h>
+ #include <linux/utsrelease.h>
  #include <linux/adb.h>
  #include <linux/module.h>
  #include <linux/delay.h>
@@@ -59,7 -59,7 +59,7 @@@ void rtas_indicator_progress(char *, un
  int _chrp_type;
  EXPORT_SYMBOL(_chrp_type);
  
 -struct mpic *chrp_mpic;
 +static struct mpic *chrp_mpic;
  
  /* Used for doing CHRP event-scans */
  DEFINE_PER_CPU(struct timer_list, heartbeat_timer);
@@@ -315,32 -315,24 +315,32 @@@ chrp_event_scan(unsigned long unused
                  jiffies + event_scan_interval);
  }
  
 +static void chrp_8259_cascade(unsigned int irq, struct irq_desc *desc,
 +                            struct pt_regs *regs)
 +{
 +      unsigned int cascade_irq = i8259_irq(regs);
 +      if (cascade_irq != NO_IRQ)
 +              generic_handle_irq(cascade_irq, regs);
 +      desc->chip->eoi(irq);
 +}
 +
  /*
   * Finds the open-pic node and sets up the mpic driver.
   */
  static void __init chrp_find_openpic(void)
  {
        struct device_node *np, *root;
 -      int len, i, j, irq_count;
 +      int len, i, j;
        int isu_size, idu_size;
        unsigned int *iranges, *opprop = NULL;
        int oplen = 0;
        unsigned long opaddr;
        int na = 1;
 -      unsigned char init_senses[NR_IRQS - NUM_8259_INTERRUPTS];
  
 -      np = find_type_devices("open-pic");
 +      np = of_find_node_by_type(NULL, "open-pic");
        if (np == NULL)
                return;
 -      root = find_path_device("/");
 +      root = of_find_node_by_path("/");
        if (root) {
                opprop = (unsigned int *) get_property
                        (root, "platform-open-pic", &oplen);
                oplen /= na * sizeof(unsigned int);
        } else {
                struct resource r;
 -              if (of_address_to_resource(np, 0, &r))
 -                      return;
 +              if (of_address_to_resource(np, 0, &r)) {
 +                      goto bail;
 +              }
                opaddr = r.start;
                oplen = 0;
        }
  
        printk(KERN_INFO "OpenPIC at %lx\n", opaddr);
  
 -      irq_count = NR_IRQS - NUM_ISA_INTERRUPTS - 4; /* leave room for IPIs */
 -      prom_get_irq_senses(init_senses, NUM_ISA_INTERRUPTS, NR_IRQS - 4);
 -      /* i8259 cascade is always positive level */
 -      init_senses[0] = IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE;
 -
        iranges = (unsigned int *) get_property(np, "interrupt-ranges", &len);
        if (iranges == NULL)
                len = 0;        /* non-distributed mpic */
        if (len > 1)
                isu_size = iranges[3];
  
 -      chrp_mpic = mpic_alloc(opaddr, MPIC_PRIMARY,
 -                             isu_size, NUM_ISA_INTERRUPTS, irq_count,
 -                             NR_IRQS - 4, init_senses, irq_count,
 -                             " MPIC    ");
 +      chrp_mpic = mpic_alloc(np, opaddr, MPIC_PRIMARY,
 +                             isu_size, 0, " MPIC    ");
        if (chrp_mpic == NULL) {
                printk(KERN_ERR "Failed to allocate MPIC structure\n");
 -              return;
 +              goto bail;
        }
 -
        j = na - 1;
        for (i = 1; i < len; ++i) {
                iranges += 2;
        }
  
        mpic_init(chrp_mpic);
 -      mpic_setup_cascade(NUM_ISA_INTERRUPTS, i8259_irq_cascade, NULL);
 +      ppc_md.get_irq = mpic_get_irq;
 + bail:
 +      of_node_put(root);
 +      of_node_put(np);
  }
  
  #if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON)
@@@ -417,34 -413,14 +417,34 @@@ static struct irqaction xmon_irqaction 
  };
  #endif
  
 -void __init chrp_init_IRQ(void)
 +static void __init chrp_find_8259(void)
  {
 -      struct device_node *np;
 +      struct device_node *np, *pic = NULL;
        unsigned long chrp_int_ack = 0;
 -#if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON)
 -      struct device_node *kbd;
 -#endif
 +      unsigned int cascade_irq;
 +
 +      /* Look for cascade */
 +      for_each_node_by_type(np, "interrupt-controller")
 +              if (device_is_compatible(np, "chrp,iic")) {
 +                      pic = np;
 +                      break;
 +              }
 +      /* Ok, 8259 wasn't found. We need to handle the case where
 +       * we have a pegasos that claims to be chrp but doesn't have
 +       * a proper interrupt tree
 +       */
 +      if (pic == NULL && chrp_mpic != NULL) {
 +              printk(KERN_ERR "i8259: Not found in device-tree"
 +                     " assuming no legacy interrupts\n");
 +              return;
 +      }
  
 +      /* Look for intack. In a perfect world, we would look for it on
 +       * the ISA bus that holds the 8259 but heh... Works that way. If
 +       * we ever see a problem, we can try to re-use the pSeries code here.
 +       * Also, Pegasos-type platforms don't have a proper node to start
 +       * from anyway
 +       */
        for (np = find_devices("pci"); np != NULL; np = np->next) {
                unsigned int *addrp = (unsigned int *)
                        get_property(np, "8259-interrupt-acknowledge", NULL);
                break;
        }
        if (np == NULL)
 -              printk(KERN_ERR "Cannot find PCI interrupt acknowledge address\n");
 +              printk(KERN_WARNING "Cannot find PCI interrupt acknowledge"
 +                     " address, polling\n");
 +
 +      i8259_init(pic, chrp_int_ack);
 +      if (ppc_md.get_irq == NULL)
 +              ppc_md.get_irq = i8259_irq;
 +      if (chrp_mpic != NULL) {
 +              cascade_irq = irq_of_parse_and_map(pic, 0);
 +              if (cascade_irq == NO_IRQ)
 +                      printk(KERN_ERR "i8259: failed to map cascade irq\n");
 +              else
 +                      set_irq_chained_handler(cascade_irq,
 +                                              chrp_8259_cascade);
 +      }
 +}
  
 +void __init chrp_init_IRQ(void)
 +{
 +#if defined(CONFIG_VT) && defined(CONFIG_INPUT_ADBHID) && defined(XMON)
 +      struct device_node *kbd;
 +#endif
        chrp_find_openpic();
 -
 -      i8259_init(chrp_int_ack, 0);
 +      chrp_find_8259();
  
        if (_chrp_type == _CHRP_Pegasos)
                ppc_md.get_irq        = i8259_irq;
@@@ -562,6 -520,10 +562,6 @@@ static int __init chrp_probe(void
        DMA_MODE_READ = 0x44;
        DMA_MODE_WRITE = 0x48;
        isa_io_base = CHRP_ISA_IO_BASE;         /* default value */
 -      ppc_do_canonicalize_irqs = 1;
 -
 -      /* Assume we have an 8259... */
 -      __irq_offset_value = NUM_ISA_INTERRUPTS;
  
        return 1;
  }
@@@ -573,6 -535,7 +573,6 @@@ define_machine(chrp) 
        .init                   = chrp_init2,
        .show_cpuinfo           = chrp_show_cpuinfo,
        .init_IRQ               = chrp_init_IRQ,
 -      .get_irq                = mpic_get_irq,
        .pcibios_fixup          = chrp_pcibios_fixup,
        .restart                = rtas_restart,
        .power_off              = rtas_power_off,
@@@ -12,7 -12,7 +12,7 @@@
  #include <linux/kernel.h>
  #include <linux/string.h>
  #include <linux/init.h>
- #include <linux/version.h>
+ #include <linux/utsrelease.h>
  #include <asm/sections.h>
  #include <asm/prom.h>
  #include <asm/page.h>
@@@ -162,8 -162,6 +162,8 @@@ static void __init bootx_add_chosen_pro
  {
        u32 val;
  
 +      bootx_dt_add_prop("linux,bootx", NULL, 0, mem_end);
 +
        if (bootx_info->kernelParamsOffset) {
                char *args = (char *)((unsigned long)bootx_info) +
                        bootx_info->kernelParamsOffset;
  static void __init bootx_add_display_props(unsigned long base,
                                           unsigned long *mem_end)
  {
 +      boot_infos_t *bi = bootx_info;
 +      u32 tmp;
 +
        bootx_dt_add_prop("linux,boot-display", NULL, 0, mem_end);
        bootx_dt_add_prop("linux,opened", NULL, 0, mem_end);
 +      tmp = bi->dispDeviceDepth;
 +      bootx_dt_add_prop("linux,bootx-depth", &tmp, 4, mem_end);
 +      tmp = bi->dispDeviceRect[2] - bi->dispDeviceRect[0];
 +      bootx_dt_add_prop("linux,bootx-width", &tmp, 4, mem_end);
 +      tmp = bi->dispDeviceRect[3] - bi->dispDeviceRect[1];
 +      bootx_dt_add_prop("linux,bootx-height", &tmp, 4, mem_end);
 +      tmp = bi->dispDeviceRowBytes;
 +      bootx_dt_add_prop("linux,bootx-linebytes", &tmp, 4, mem_end);
 +      tmp = (u32)bi->dispDeviceBase;
 +      if (tmp == 0)
 +              tmp = (u32)bi->logicalDisplayBase;
 +      tmp += bi->dispDeviceRect[1] * bi->dispDeviceRowBytes;
 +      tmp += bi->dispDeviceRect[0] * ((bi->dispDeviceDepth + 7) / 8);
 +      bootx_dt_add_prop("linux,bootx-addr", &tmp, 4, mem_end);
  }
  
  static void __init bootx_dt_add_string(char *s, unsigned long *mem_end)
@@@ -230,7 -211,7 +230,7 @@@ static void __init bootx_scan_dt_build_
  
        if (!strcmp(namep, "/chosen")) {
                DBG(" detected /chosen ! adding properties names !\n");
 -              bootx_dt_add_string("linux,platform", mem_end);
 +              bootx_dt_add_string("linux,bootx", mem_end);
                bootx_dt_add_string("linux,stdout-path", mem_end);
                bootx_dt_add_string("linux,initrd-start", mem_end);
                bootx_dt_add_string("linux,initrd-end", mem_end);
                DBG(" detected display ! adding properties names !\n");
                bootx_dt_add_string("linux,boot-display", mem_end);
                bootx_dt_add_string("linux,opened", mem_end);
 +              bootx_dt_add_string("linux,bootx-depth", mem_end);
 +              bootx_dt_add_string("linux,bootx-width", mem_end);
 +              bootx_dt_add_string("linux,bootx-height", mem_end);
 +              bootx_dt_add_string("linux,bootx-linebytes", mem_end);
 +              bootx_dt_add_string("linux,bootx-addr", mem_end);
                strncpy(bootx_disp_path, namep, 255);
        }
  
@@@ -467,14 -443,7 +467,14 @@@ void __init bootx_init(unsigned long r3
        if (!BOOT_INFO_IS_V2_COMPATIBLE(bi))
                bi->logicalDisplayBase = bi->dispDeviceBase;
  
 +      /* Fixup depth 16 -> 15 as that's what MacOS calls 16bpp */
 +      if (bi->dispDeviceDepth == 16)
 +              bi->dispDeviceDepth = 15;
 +
  #ifdef CONFIG_BOOTX_TEXT
 +      ptr = (unsigned long)bi->logicalDisplayBase;
 +      ptr += bi->dispDeviceRect[1] * bi->dispDeviceRowBytes;
 +      ptr += bi->dispDeviceRect[0] * ((bi->dispDeviceDepth + 7) / 8);
        btext_setup_display(bi->dispDeviceRect[2] - bi->dispDeviceRect[0],
                            bi->dispDeviceRect[3] - bi->dispDeviceRect[1],
                            bi->dispDeviceDepth, bi->dispDeviceRowBytes,