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

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

DEFINITIONS

This source file includes following definitions.
  1. declare_of_platform_devices
  2. linkstation_add_bridge
  3. linkstation_setup_arch
  4. linkstation_init_IRQ
  5. linkstation_restart
  6. linkstation_power_off
  7. linkstation_halt
  8. linkstation_show_cpuinfo
  9. linkstation_probe
  10. define_machine

   1 /*
   2  * Board setup routines for the Buffalo Linkstation / Kurobox Platform.
   3  *
   4  * Copyright (C) 2006 G. Liakhovetski (g.liakhovetski@gmx.de)
   5  *
   6  * Based on sandpoint.c by Mark A. Greer
   7  *
   8  * This file is licensed under the terms of the GNU General Public License
   9  * version 2.  This program is licensed "as is" without any warranty of
  10  * any kind, whether express or implied.
  11  */
  12 
  13 #include <linux/kernel.h>
  14 #include <linux/initrd.h>
  15 #include <linux/of_platform.h>
  16 
  17 #include <asm/time.h>
  18 #include <asm/prom.h>
  19 #include <asm/mpic.h>
  20 #include <asm/pci-bridge.h>
  21 
  22 #include "mpc10x.h"
  23 
  24 static const struct of_device_id of_bus_ids[] __initconst = {
  25         { .type = "soc", },
  26         { .compatible = "simple-bus", },
  27         {},
  28 };
  29 
  30 static int __init declare_of_platform_devices(void)
  31 {
  32         of_platform_bus_probe(NULL, of_bus_ids, NULL);
  33         return 0;
  34 }
  35 machine_device_initcall(linkstation, declare_of_platform_devices);
  36 
  37 static int __init linkstation_add_bridge(struct device_node *dev)
  38 {
  39 #ifdef CONFIG_PCI
  40         int len;
  41         struct pci_controller *hose;
  42         const int *bus_range;
  43 
  44         printk("Adding PCI host bridge %pOF\n", dev);
  45 
  46         bus_range = of_get_property(dev, "bus-range", &len);
  47         if (bus_range == NULL || len < 2 * sizeof(int))
  48                 printk(KERN_WARNING "Can't get bus-range for %pOF, assume"
  49                                 " bus 0\n", dev);
  50 
  51         hose = pcibios_alloc_controller(dev);
  52         if (hose == NULL)
  53                 return -ENOMEM;
  54         hose->first_busno = bus_range ? bus_range[0] : 0;
  55         hose->last_busno = bus_range ? bus_range[1] : 0xff;
  56         setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
  57 
  58         /* Interpret the "ranges" property */
  59         /* This also maps the I/O region and sets isa_io/mem_base */
  60         pci_process_bridge_OF_ranges(hose, dev, 1);
  61 #endif
  62         return 0;
  63 }
  64 
  65 static void __init linkstation_setup_arch(void)
  66 {
  67         struct device_node *np;
  68 
  69         /* Lookup PCI host bridges */
  70         for_each_compatible_node(np, "pci", "mpc10x-pci")
  71                 linkstation_add_bridge(np);
  72 
  73         printk(KERN_INFO "BUFFALO Network Attached Storage Series\n");
  74         printk(KERN_INFO "(C) 2002-2005 BUFFALO INC.\n");
  75 }
  76 
  77 /*
  78  * Interrupt setup and service.  Interrupts on the linkstation come
  79  * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
  80  */
  81 static void __init linkstation_init_IRQ(void)
  82 {
  83         struct mpic *mpic;
  84 
  85         mpic = mpic_alloc(NULL, 0, 0, 4, 0, " EPIC     ");
  86         BUG_ON(mpic == NULL);
  87 
  88         /* PCI IRQs */
  89         mpic_assign_isu(mpic, 0, mpic->paddr + 0x10200);
  90 
  91         /* I2C */
  92         mpic_assign_isu(mpic, 1, mpic->paddr + 0x11000);
  93 
  94         /* ttyS0, ttyS1 */
  95         mpic_assign_isu(mpic, 2, mpic->paddr + 0x11100);
  96 
  97         mpic_init(mpic);
  98 }
  99 
 100 extern void avr_uart_configure(void);
 101 extern void avr_uart_send(const char);
 102 
 103 static void __noreturn linkstation_restart(char *cmd)
 104 {
 105         local_irq_disable();
 106 
 107         /* Reset system via AVR */
 108         avr_uart_configure();
 109         /* Send reboot command */
 110         avr_uart_send('C');
 111 
 112         for(;;)  /* Spin until reset happens */
 113                 avr_uart_send('G');     /* "kick" */
 114 }
 115 
 116 static void __noreturn linkstation_power_off(void)
 117 {
 118         local_irq_disable();
 119 
 120         /* Power down system via AVR */
 121         avr_uart_configure();
 122         /* send shutdown command */
 123         avr_uart_send('E');
 124 
 125         for(;;)  /* Spin until power-off happens */
 126                 avr_uart_send('G');     /* "kick" */
 127         /* NOTREACHED */
 128 }
 129 
 130 static void __noreturn linkstation_halt(void)
 131 {
 132         linkstation_power_off();
 133         /* NOTREACHED */
 134 }
 135 
 136 static void linkstation_show_cpuinfo(struct seq_file *m)
 137 {
 138         seq_printf(m, "vendor\t\t: Buffalo Technology\n");
 139         seq_printf(m, "machine\t\t: Linkstation I/Kurobox(HG)\n");
 140 }
 141 
 142 static int __init linkstation_probe(void)
 143 {
 144         if (!of_machine_is_compatible("linkstation"))
 145                 return 0;
 146 
 147         pm_power_off = linkstation_power_off;
 148 
 149         return 1;
 150 }
 151 
 152 define_machine(linkstation){
 153         .name                   = "Buffalo Linkstation",
 154         .probe                  = linkstation_probe,
 155         .setup_arch             = linkstation_setup_arch,
 156         .init_IRQ               = linkstation_init_IRQ,
 157         .show_cpuinfo           = linkstation_show_cpuinfo,
 158         .get_irq                = mpic_get_irq,
 159         .restart                = linkstation_restart,
 160         .halt                   = linkstation_halt,
 161         .calibrate_decr         = generic_calibrate_decr,
 162 };

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