Commit 22a2eeda authored by Holger Freyther's avatar Holger Freyther Committed by Russell King

[ARM PATCH] 1656/1: Simpad board update to make it work

Patch from Holger Freyther

Make it work ;)
parent 967b09fc
...@@ -34,6 +34,10 @@ __SA1100_start: ...@@ -34,6 +34,10 @@ __SA1100_start:
@ REVISIT_PFS168: Temporary until firmware updated to use assigned machine number @ REVISIT_PFS168: Temporary until firmware updated to use assigned machine number
mov r7, #MACH_TYPE_PFS168 mov r7, #MACH_TYPE_PFS168
#endif #endif
#ifdef CONFIG_SA1100_SIMPAD /
@ UNTIL we've something like an open bootldr
mov r7, #MACH_TYPE_SIMPAD @should be 87
#endif
#ifdef CONFIG_SA1100_VICTOR #ifdef CONFIG_SA1100_VICTOR
teq r7, #MACH_TYPE_VICTOR teq r7, #MACH_TYPE_VICTOR
......
...@@ -9,24 +9,37 @@ ...@@ -9,24 +9,37 @@
#include <linux/tty.h> #include <linux/tty.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/pm.h>
#include <asm/irq.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/mach/serial_sa1100.h> #include <asm/mach/serial_sa1100.h>
#include <asm/arch/simpad.h>
#include <asm/arch/registry.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/ioport.h>
#include <asm/io.h>
#include "generic.h" #include "generic.h"
long cs3_shadow; long cs3_shadow;
long get_cs3_shadow() long get_cs3_shadow(void)
{ {
return cs3_shadow; return cs3_shadow;
} }
void set_cs3(long value)
{
*(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow = value;
}
void set_cs3_bit(int value) void set_cs3_bit(int value)
{ {
cs3_shadow |= value; cs3_shadow |= value;
...@@ -39,10 +52,15 @@ void clear_cs3_bit(int value) ...@@ -39,10 +52,15 @@ void clear_cs3_bit(int value)
*(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow; *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
} }
EXPORT_SYMBOL(set_cs3_bit);
EXPORT_SYMBOL(clear_cs3_bit);
static struct map_desc simpad_io_desc[] __initdata = { static struct map_desc simpad_io_desc[] __initdata = {
/* virtual physical length type */ /* virtual physical length type */
{ 0xf2800000, 0x4b800000, 0x00800000, MT_DEVICE }, /* MQ200 */ /* MQ200 */
{ 0xf1000000, 0x18000000, 0x00100000, MT_DEVICE } /* Paules CS3, write only */ { 0xf2800000, 0x4b800000, 0x00800000, MT_DEVICE },
/* Paules CS3, write only */
{ 0xf1000000, 0x18000000, 0x00100000, MT_DEVICE },
}; };
...@@ -50,32 +68,52 @@ static void simpad_uart_pm(struct uart_port *port, u_int state, u_int oldstate) ...@@ -50,32 +68,52 @@ static void simpad_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
{ {
if (port->mapbase == (u_int)&Ser1UTCR0) { if (port->mapbase == (u_int)&Ser1UTCR0) {
if (state) if (state)
{
clear_cs3_bit(RS232_ON); clear_cs3_bit(RS232_ON);
else clear_cs3_bit(DECT_POWER_ON);
}else
{
set_cs3_bit(RS232_ON); set_cs3_bit(RS232_ON);
set_cs3_bit(DECT_POWER_ON);
}
} }
} }
static struct sa1100_port_fns simpad_port_fns __initdata = { static struct sa1100_port_fns simpad_port_fns __initdata = {
.pm = simpad_uart_pm, .pm = simpad_uart_pm,
}; };
static void __init simpad_map_io(void) static void __init simpad_map_io(void)
{ {
sa1100_map_io(); sa1100_map_io();
iotable_init(simpad_io_desc, ARRAY_SIZE(simpad_io_desc)); iotable_init(simpad_io_desc, ARRAY_SIZE(simpad_io_desc));
PSPR = 0xc0008000; set_cs3_bit (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON |
GPDR &= ~GPIO_GPIO0; ENABLE_5V | RESET_SIMCARD | DECT_POWER_ON);
cs3_shadow = (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON |
ENABLE_5V | RESET_SIMCARD);
*(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow; sa1100_register_uart_fns(&simpad_port_fns);
sa1100_register_uart(0, 3); /* serial interface */
sa1100_register_uart(1, 1); /* DECT */
// Reassign UART 1 pins
GAFR |= GPIO_UART_TXD | GPIO_UART_RXD;
GPDR |= GPIO_UART_TXD | GPIO_LDD13 | GPIO_LDD15;
GPDR &= ~GPIO_UART_RXD;
PPAR |= PPAR_UPR;
/*
* Set up registers for sleep mode.
*/
PWER = PWER_GPIO0| PWER_RTC;
PGSR = 0x818;
PCFR = 0;
PSDR = 0;
//It is only possible to register 3 UART in serial_sa1100.c
sa1100_register_uart(0, 3);
sa1100_register_uart(1, 1);
set_irq_type(IRQ_GPIO_UCB1300_IRQ, IRQT_RISING);
} }
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
...@@ -105,7 +143,7 @@ static int proc_cs3_read(char *page, char **start, off_t off, ...@@ -105,7 +143,7 @@ static int proc_cs3_read(char *page, char **start, off_t off,
char *p = page; char *p = page;
int len, i; int len, i;
p += sprintf(p, "Chipselect3 : %x\n", cs3_shadow); p += sprintf(p, "Chipselect3 : %x\n", (uint)cs3_shadow);
for (i = 0; i <= 15; i++) { for (i = 0; i <= 15; i++) {
if(cs3_shadow & (1<<i)) { if(cs3_shadow & (1<<i)) {
p += sprintf(p, "%s\t: TRUE \n",name[i]); p += sprintf(p, "%s\t: TRUE \n",name[i]);
...@@ -121,23 +159,76 @@ static int proc_cs3_read(char *page, char **start, off_t off, ...@@ -121,23 +159,76 @@ static int proc_cs3_read(char *page, char **start, off_t off,
return len; return len;
} }
static int proc_cs3_write(struct file * file, const char * buffer,
size_t count, loff_t *ppos)
{
unsigned long newRegValue;
char *endp;
newRegValue = simple_strtoul(buffer,&endp,0);
set_cs3( newRegValue );
return (count+endp-buffer);
}
#endif
static int __init cs3_init(void) static int __init cs3_init(void)
{ {
struct proc_dir_entry *proc_cs3 = create_proc_entry("cs3", 0, 0);
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *proc_cs3 = create_proc_entry("CS3", 0, 0);
if (proc_cs3) if (proc_cs3)
{
proc_cs3->read_proc = proc_cs3_read; proc_cs3->read_proc = proc_cs3_read;
proc_cs3->write_proc = (void*)proc_cs3_write;
}
#endif
return 0; return 0;
} }
arch_initcall(cs3_init); arch_initcall(cs3_init);
#endif // CONFIG_PROC_FS static void simpad_power_off(void)
{
local_irq_disable(); // was cli
set_cs3(0x800); /* only SD_MEDIAQ */
/* disable internal oscillator, float CS lines */
PCFR = (PCFR_OPDE | PCFR_FP | PCFR_FS);
/* enable wake-up on GPIO0 (Assabet...) */
PWER = GFER = GRER = 1;
/*
* set scratchpad to zero, just in case it is used as a
* restart address by the bootloader.
*/
PSPR = 0;
PGSR = 0;
/* enter sleep mode */
PMCR = PMCR_SF;
while(1);
local_irq_enable(); /* we won't ever call it */
}
static int __init simpad_init(void)
{
set_power_off_handler( simpad_power_off );
return 0;
}
arch_initcall(simpad_init);
MACHINE_START(SIMPAD, "Simpad") MACHINE_START(SIMPAD, "Simpad")
MAINTAINER("Juergen Messerer") MAINTAINER("Juergen Messerer")
BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
BOOT_PARAMS(0xc0000100)
MAPIO(simpad_map_io) MAPIO(simpad_map_io)
INITIRQ(sa1100_init_irq) INITIRQ(sa1100_init_irq)
MACHINE_END MACHINE_END
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment