root/arch/powerpc/platforms/embedded6xx/storcenter.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. storcenter_device_probe
  2. storcenter_add_bridge
  3. storcenter_setup_arch
  4. storcenter_init_IRQ
  5. storcenter_restart
  6. storcenter_probe
  7. define_machine

   1 /*
   2  * Board setup routines for the storcenter
   3  *
   4  * Copyright 2007 (C) Oyvind Repvik (nail@nslu2-linux.org)
   5  * Copyright 2007 Andy Wilcox, Jon Loeliger
   6  *
   7  * Based on linkstation.c by G. Liakhovetski
   8  *
   9  * This file is licensed under the terms of the GNU General Public License
  10  * version 2.  This program is licensed "as is" without any warranty of
  11  * any kind, whether express or implied.
  12  */
  13 
  14 #include <linux/kernel.h>
  15 #include <linux/pci.h>
  16 #include <linux/initrd.h>
  17 #include <linux/of_platform.h>
  18 
  19 #include <asm/time.h>
  20 #include <asm/prom.h>
  21 #include <asm/mpic.h>
  22 #include <asm/pci-bridge.h>
  23 
  24 #include "mpc10x.h"
  25 
  26 
  27 static const struct of_device_id storcenter_of_bus[] __initconst = {
  28         { .name = "soc", },
  29         {},
  30 };
  31 
  32 static int __init storcenter_device_probe(void)
  33 {
  34         of_platform_bus_probe(NULL, storcenter_of_bus, NULL);
  35         return 0;
  36 }
  37 machine_device_initcall(storcenter, storcenter_device_probe);
  38 
  39 
  40 static int __init storcenter_add_bridge(struct device_node *dev)
  41 {
  42 #ifdef CONFIG_PCI
  43         int len;
  44         struct pci_controller *hose;
  45         const int *bus_range;
  46 
  47         printk("Adding PCI host bridge %pOF\n", dev);
  48 
  49         hose = pcibios_alloc_controller(dev);
  50         if (hose == NULL)
  51                 return -ENOMEM;
  52 
  53         bus_range = of_get_property(dev, "bus-range", &len);
  54         hose->first_busno = bus_range ? bus_range[0] : 0;
  55         hose->last_busno = bus_range ? bus_range[1] : 0xff;
  56 
  57         setup_indirect_pci(hose, MPC10X_MAPB_CNFG_ADDR, MPC10X_MAPB_CNFG_DATA, 0);
  58 
  59         /* Interpret the "ranges" property */
  60         /* This also maps the I/O region and sets isa_io/mem_base */
  61         pci_process_bridge_OF_ranges(hose, dev, 1);
  62 #endif
  63 
  64         return 0;
  65 }
  66 
  67 static void __init storcenter_setup_arch(void)
  68 {
  69         struct device_node *np;
  70 
  71         /* Lookup PCI host bridges */
  72         for_each_compatible_node(np, "pci", "mpc10x-pci")
  73                 storcenter_add_bridge(np);
  74 
  75         printk(KERN_INFO "IOMEGA StorCenter\n");
  76 }
  77 
  78 /*
  79  * Interrupt setup and service.  Interrupts on the turbostation come
  80  * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
  81  */
  82 static void __init storcenter_init_IRQ(void)
  83 {
  84         struct mpic *mpic;
  85 
  86         mpic = mpic_alloc(NULL, 0, 0, 16, 0, " OpenPIC  ");
  87         BUG_ON(mpic == NULL);
  88 
  89         /*
  90          * 16 Serial Interrupts followed by 16 Internal Interrupts.
  91          * I2C is the second internal, so it is at 17, 0x11020.
  92          */
  93         mpic_assign_isu(mpic, 0, mpic->paddr + 0x10200);
  94         mpic_assign_isu(mpic, 1, mpic->paddr + 0x11000);
  95 
  96         mpic_init(mpic);
  97 }
  98 
  99 static void __noreturn storcenter_restart(char *cmd)
 100 {
 101         local_irq_disable();
 102 
 103         /* Set exception prefix high - to the firmware */
 104         _nmask_and_or_msr(0, MSR_IP);
 105 
 106         /* Wait for reset to happen */
 107         for (;;) ;
 108 }
 109 
 110 static int __init storcenter_probe(void)
 111 {
 112         return of_machine_is_compatible("iomega,storcenter");
 113 }
 114 
 115 define_machine(storcenter){
 116         .name                   = "IOMEGA StorCenter",
 117         .probe                  = storcenter_probe,
 118         .setup_arch             = storcenter_setup_arch,
 119         .init_IRQ               = storcenter_init_IRQ,
 120         .get_irq                = mpic_get_irq,
 121         .restart                = storcenter_restart,
 122         .calibrate_decr         = generic_calibrate_decr,
 123 };

/* [<][>][^][v][top][bottom][index][help] */