linux-old/arch/arm/mach-sa1100/simpad.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-sa1100/simpad.c
   3 *
   4 */
   5
   6#include <linux/config.h>
   7#include <linux/module.h>
   8#include <linux/init.h>
   9#include <linux/kernel.h>
  10#include <linux/tty.h>
  11#include <linux/proc_fs.h>
  12#include <linux/string.h> 
  13
  14#include <asm/hardware.h>
  15#include <asm/setup.h>
  16
  17#include <asm/mach/arch.h>
  18#include <asm/mach/map.h>
  19#include <asm/mach/serial_sa1100.h>
  20#include <linux/serial_core.h>
  21
  22#include "generic.h"
  23
  24long cs3_shadow;
  25
  26long get_cs3_shadow()
  27{
  28        return cs3_shadow;
  29}
  30
  31void set_cs3_bit(int value)
  32{
  33        cs3_shadow |= value;
  34        *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
  35}
  36
  37void clear_cs3_bit(int value)
  38{
  39        cs3_shadow &= ~value;
  40        *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
  41}
  42
  43static void __init
  44fixup_simpad(struct machine_desc *desc, struct param_struct *params,
  45                   char **cmdline, struct meminfo *mi)
  46{
  47#ifdef CONFIG_SA1100_SIMPAD_DRAM_64MB /* DRAM */
  48        SET_BANK( 0, 0xc0000000, 64*1024*1024 );
  49#else
  50        SET_BANK( 0, 0xc0000000, 32*1024*1024 );
  51#endif
  52        mi->nr_banks = 1;
  53        ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
  54        setup_ramdisk( 1, 0, 0, 8192 );
  55        setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 );
  56}
  57
  58
  59static struct map_desc simpad_io_desc[] __initdata = {
  60  /* virtual    physical    length      domain     r  w  c  b */
  61  { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 0, 1, 0, 0 }, 
  62  { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 0, 1, 0, 0 }, /* MQ200 */  
  63  { 0xf1000000, 0x18000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* Paules CS3, write only */
  64  LAST_DESC
  65};
  66
  67
  68static void simpad_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
  69{
  70        if (port->mapbase == (u_int)&Ser1UTCR0) {
  71                if (state)
  72                        clear_cs3_bit(RS232_ON);
  73                else
  74                        set_cs3_bit(RS232_ON);
  75        }
  76}
  77
  78static struct sa1100_port_fns simpad_port_fns __initdata = {
  79        .pm     = simpad_uart_pm,
  80};
  81
  82static void __init simpad_map_io(void)
  83{
  84        sa1100_map_io();
  85        iotable_init(simpad_io_desc);
  86
  87        PSPR = 0xc0008000;
  88        GPDR &= ~GPIO_GPIO0;
  89        cs3_shadow = (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON | 
  90                      ENABLE_5V | RESET_SIMCARD);
  91        *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
  92
  93        //It is only possible to register 3 UART in serial_sa1100.c
  94        sa1100_register_uart(0, 3);
  95        sa1100_register_uart(1, 1);
  96
  97        set_GPIO_IRQ_edge(GPIO_UCB1300_IRQ, GPIO_RISING_EDGE);
  98}
  99
 100#ifdef CONFIG_PROC_FS
 101
 102static char* name[]={
 103  "VCC_5V_EN",
 104  "VCC_3V_EN",
 105  "EN1",
 106  "EN0",
 107  "DISPLAY_ON",
 108  "PCMCIA_BUFF_DIS",
 109  "MQ_RESET",
 110  "PCMCIA_RESET",
 111  "DECT_POWER_ON",
 112  "IRDA_SD",
 113  "RS232_ON",
 114  "SD_MEDIAQ",
 115  "LED2_ON",
 116  "IRDA_MODE",
 117  "ENABLE_5V",
 118  "RESET_SIMCARD"
 119};
 120
 121static int proc_cs3_read(char *page, char **start, off_t off,
 122                          int count, int *eof, void *data)
 123{
 124        char *p = page;
 125        int len, i;
 126        
 127        p += sprintf(p, "Chipselect3 : %x\n", cs3_shadow);
 128        for (i = 0; i <= 15; i++) {
 129                if(cs3_shadow & (1<<i)) {
 130                        p += sprintf(p, "%s\t: TRUE \n",name[i]);
 131                } else
 132                        p += sprintf(p, "%s\t: FALSE \n",name[i]);
 133        }
 134        len = (p - page) - off;
 135        if (len < 0)
 136                len = 0;
 137 
 138        *eof = (len <= count) ? 1 : 0;
 139        *start = page + off;
 140 
 141        return len;
 142}
 143 
 144 
 145static struct proc_dir_entry *proc_cs3;
 146 
 147static int __init cs3_init(void)
 148{
 149        proc_cs3 = create_proc_entry("cs3", 0, 0);
 150        if (proc_cs3)
 151                proc_cs3->read_proc = proc_cs3_read;
 152        return 0;
 153}
 154 
 155static int __exit cs3_exit(void)
 156{
 157        if (proc_cs3)
 158                remove_proc_entry( "cs3", 0);
 159        return 0;
 160}                  
 161__initcall(cs3_init);
 162
 163#endif // CONFIG_PROC_FS
 164
 165MACHINE_START(SIMPAD, "Simpad")
 166        MAINTAINER("Juergen Messerer")
 167        BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
 168        FIXUP(fixup_simpad)
 169        MAPIO(simpad_map_io)
 170        INITIRQ(sa1100_init_irq)
 171MACHINE_END
 172
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.