Commit 71d1c9ff authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://bk.arm.linux.org.uk/linux-2.6-rmk

into home.osdl.org:/home/torvalds/v2.5/linux
parents 0d918abe ccac8ee2
......@@ -34,6 +34,10 @@ __SA1100_start:
@ REVISIT_PFS168: Temporary until firmware updated to use assigned machine number
mov r7, #MACH_TYPE_PFS168
#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
teq r7, #MACH_TYPE_VICTOR
......
......@@ -957,17 +957,6 @@ static struct device_driver sa1111_device_driver = {
.resume = sa1111_resume,
};
/*
* Register the SA1111 driver with LDM.
*/
static int sa1111_driver_init(void)
{
driver_register(&sa1111_device_driver);
return 0;
}
arch_initcall(sa1111_driver_init);
/*
* Get the parent device driver (us) structure
* from a child function device
......@@ -1180,13 +1169,6 @@ struct bus_type sa1111_bus_type = {
.resume = sa1111_bus_resume,
};
static int sa1111_rab_bus_init(void)
{
return bus_register(&sa1111_bus_type);
}
postcore_initcall(sa1111_rab_bus_init);
int sa1111_driver_register(struct sa1111_driver *driver)
{
driver->drv.probe = sa1111_bus_probe;
......@@ -1200,6 +1182,26 @@ void sa1111_driver_unregister(struct sa1111_driver *driver)
driver_unregister(&driver->drv);
}
static int __init sa1111_init(void)
{
int ret = bus_register(&sa1111_bus_type);
if (ret == 0)
driver_register(&sa1111_device_driver);
return ret;
}
static void __exit sa1111_exit(void)
{
driver_unregister(&sa1111_device_driver);
bus_unregister(&sa1111_bus_type);
}
module_init(sa1111_init);
module_exit(sa1111_exit);
MODULE_DESCRIPTION("Intel Corporation SA1111 core driver");
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(sa1111_check_dma_bug);
EXPORT_SYMBOL(sa1111_select_audio_mode);
EXPORT_SYMBOL(sa1111_set_audio_rate);
......
......@@ -9,24 +9,37 @@
#include <linux/tty.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/pm.h>
#include <asm/irq.h>
#include <asm/hardware.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/serial_sa1100.h>
#include <asm/arch/simpad.h>
#include <asm/arch/registry.h>
#include <linux/serial_core.h>
#include <linux/ioport.h>
#include <asm/io.h>
#include "generic.h"
long cs3_shadow;
long get_cs3_shadow()
long get_cs3_shadow(void)
{
return cs3_shadow;
}
void set_cs3(long value)
{
*(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow = value;
}
void set_cs3_bit(int value)
{
cs3_shadow |= value;
......@@ -39,10 +52,15 @@ void clear_cs3_bit(int value)
*(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
}
EXPORT_SYMBOL(set_cs3_bit);
EXPORT_SYMBOL(clear_cs3_bit);
static struct map_desc simpad_io_desc[] __initdata = {
/* virtual physical length type */
{ 0xf2800000, 0x4b800000, 0x00800000, MT_DEVICE }, /* MQ200 */
{ 0xf1000000, 0x18000000, 0x00100000, MT_DEVICE } /* Paules CS3, write only */
/* virtual physical length type */
/* MQ200 */
{ 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)
{
if (port->mapbase == (u_int)&Ser1UTCR0) {
if (state)
{
clear_cs3_bit(RS232_ON);
else
clear_cs3_bit(DECT_POWER_ON);
}else
{
set_cs3_bit(RS232_ON);
set_cs3_bit(DECT_POWER_ON);
}
}
}
static struct sa1100_port_fns simpad_port_fns __initdata = {
.pm = simpad_uart_pm,
.pm = simpad_uart_pm,
};
static void __init simpad_map_io(void)
{
sa1100_map_io();
iotable_init(simpad_io_desc, ARRAY_SIZE(simpad_io_desc));
PSPR = 0xc0008000;
GPDR &= ~GPIO_GPIO0;
cs3_shadow = (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON |
ENABLE_5V | RESET_SIMCARD);
*(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow;
set_cs3_bit (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON |
ENABLE_5V | RESET_SIMCARD | DECT_POWER_ON);
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
......@@ -105,7 +143,7 @@ static int proc_cs3_read(char *page, char **start, off_t off,
char *p = page;
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++) {
if(cs3_shadow & (1<<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,
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)
{
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)
{
proc_cs3->read_proc = proc_cs3_read;
proc_cs3->write_proc = (void*)proc_cs3_write;
}
#endif
return 0;
}
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")
MAINTAINER("Juergen Messerer")
BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000)
BOOT_PARAMS(0xc0000100)
MAPIO(simpad_map_io)
INITIRQ(sa1100_init_irq)
MACHINE_END
......@@ -654,28 +654,21 @@ static struct mtd_partition simpad_partitions[] = {
}, {
.name = "SIMpad kernel",
.size = 0x00100000,
.offset = 0x00080000,
}, {
#ifdef CONFIG_JFFS2_FS
.name = "SIMpad root jffs2",
.size = MTDPART_SIZ_FULL,
.offset = 0x00180000,
#else
.name = "SIMpad initrd",
.size = 0x00300000,
.offset = 0x00180000,
.offset = MTDPART_OFS_APPEND,
}, {
#ifdef CONFIG_ROOT_CRAMFS
.name = "SIMpad root cramfs",
.size = 0x00300000,
.offset = 0x00480000,
}, {
.name = "SIMpad usr cramfs",
.size = 0x005c0000,
.offset = 0x00780000,
.size =0x00D80000,
.offset = MTDPART_OFS_APPEND
}, {
.name = "SIMpad usr local",
.name = "SIMpad local jffs2",
.size = MTDPART_SIZ_FULL,
.offset = MTDPART_OFS_APPEND
#else
.name = "SIMpad root jffs2",
.size = MTDPART_SIZ_FULL,
.offset = 0x00d40000,
.offset = MTDPART_OFS_APPEND
#endif
}
};
......@@ -1244,8 +1237,10 @@ static int __init sa1100_locate_flash(void)
}
if (machine_is_simpad()) {
info[0].base = SA1100_CS0_PHYS;
info[0].size = SZ_32M;
nr = 1;
info[0].size = SZ_16M;
info[1].base = SA1100_CS1_PHYS;
info[1].size = SZ_16M;
nr = 2;
}
if (machine_is_stork()) {
info[0].base = SA1100_CS0_PHYS;
......
......@@ -13,6 +13,7 @@
#include <asm/hardware.h>
#include <asm/mach-types.h>
#include <asm/irq.h>
#include <asm/arch/simpad.h>
#include "sa1100_generic.h"
extern long get_cs3_shadow(void);
......@@ -25,9 +26,6 @@ static struct pcmcia_irqs irqs[] = {
static int simpad_pcmcia_hw_init(struct sa1100_pcmcia_socket *skt)
{
set_cs3_bit(PCMCIA_RESET);
clear_cs3_bit(PCMCIA_BUFF_DIS);
clear_cs3_bit(PCMCIA_RESET);
clear_cs3_bit(VCC_3V_EN|VCC_5V_EN|EN0|EN1);
......@@ -71,7 +69,7 @@ static int
simpad_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt,
const socket_state_t *state)
{
unsigned long value, flags;
unsigned long flags;
local_irq_save(flags);
......@@ -82,8 +80,8 @@ simpad_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt,
break;
case 33:
clear_cs3_bit(VCC_3V_EN|EN0);
set_cs3_bit(VCC_5V_EN|EN1);
clear_cs3_bit(VCC_3V_EN|EN1);
set_cs3_bit(VCC_5V_EN|EN0);
break;
case 50:
......@@ -99,7 +97,7 @@ simpad_pcmcia_configure_socket(struct sa1100_pcmcia_socket *skt,
return -1;
}
/* Silently ignore Vpp, output enable, speaker enable. */
local_irq_restore(flags);
return 0;
......@@ -113,6 +111,7 @@ static void simpad_pcmcia_socket_init(struct sa1100_pcmcia_socket *skt)
static void simpad_pcmcia_socket_suspend(struct sa1100_pcmcia_socket *skt)
{
sa11xx_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
set_cs3_bit(PCMCIA_RESET);
}
static struct pcmcia_low_level simpad_pcmcia_ops = {
......
......@@ -543,7 +543,7 @@ struct sa1111_dev {
#define SA1111_DEV(_d) container_of((_d), struct sa1111_dev, dev)
#define sa1111_get_drvdata(d) dev_get_drvdata(&(d)->dev)
#define sa1111_set_drvdata(d,p) dev_get_drvdata(&(d)->dev, p)
#define sa1111_set_drvdata(d,p) dev_set_drvdata(&(d)->dev, p)
struct sa1111_driver {
struct device_driver drv;
......@@ -558,11 +558,6 @@ struct sa1111_driver {
#define SA1111_DRIVER_NAME(_sadev) ((_sadev)->dev.driver->name)
/*
* Probe for a SA1111 chip.
*/
extern int sa1111_init(unsigned long phys, unsigned int irq);
/*
* These frob the SKPCR register.
*/
......
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