Commit 5bb7ff79 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/home/rmk/linux-2.6-arm

* master.kernel.org:/home/rmk/linux-2.6-arm:
  [ARM] 5033/1: Unbreak corgi_ssp by registering ssp drivers earlier.
  [ARM] Orion: clean up addr-map.c after window setting code purge
  [ARM] Orion: pass proper t_clk into mv643xx_eth
  [ARM] Orion: use mv643xx_eth driver mbus window handling
  [ARM] pxa: Fix RCSR handling
  [ARM] lubbock: fix compilation
  [ARM] 5032/1: Added cpufreq support for pxa27x CPU
  [ARM] 5031/1: Indentation correction in cpu-pxa.c.
  [ARM] 5028/1: pxafb: fix broken "backward compatibility way" in framebuffer
  [ARM] 4882/2: Correction for S3C2410 clkout generation
  [ARM] 5027/1: Fixed random memory corruption on pxa suspend cycle.
  [ARM] 5024/1: Fix some minor clk issues in the MMCI PL18x driver
  [ARM] 5023/1: Fix broken gpio interrupts on ep93xx
  ns9xxx: fix sparse warning
  ns9xxx: check for irq lockups
  ns9xxx: fix handle_prio_irq to unmask irqs with lower priority
parents 3e1b83ab 1f2ee649
...@@ -280,7 +280,7 @@ static int ep93xx_gpio_irq_type(unsigned int irq, unsigned int type) ...@@ -280,7 +280,7 @@ static int ep93xx_gpio_irq_type(unsigned int irq, unsigned int type)
const int port = gpio >> 3; const int port = gpio >> 3;
const int port_mask = 1 << (gpio & 7); const int port_mask = 1 << (gpio & 7);
gpio_direction_output(gpio, gpio_get_value(gpio)); gpio_direction_input(gpio);
switch (type) { switch (type) {
case IRQT_RISING: case IRQT_RISING:
......
...@@ -62,7 +62,7 @@ static struct irq_chip ns9xxx_chip = { ...@@ -62,7 +62,7 @@ static struct irq_chip ns9xxx_chip = {
#if 0 #if 0
#define handle_irq handle_level_irq #define handle_irq handle_level_irq
#else #else
void handle_prio_irq(unsigned int irq, struct irq_desc *desc) static void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
{ {
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
struct irqaction *action; struct irqaction *action;
...@@ -70,27 +70,35 @@ void handle_prio_irq(unsigned int irq, struct irq_desc *desc) ...@@ -70,27 +70,35 @@ void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
spin_lock(&desc->lock); spin_lock(&desc->lock);
if (unlikely(desc->status & IRQ_INPROGRESS)) BUG_ON(desc->status & IRQ_INPROGRESS);
goto out_unlock;
desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
kstat_cpu(cpu).irqs[irq]++; kstat_cpu(cpu).irqs[irq]++;
action = desc->action; action = desc->action;
if (unlikely(!action || (desc->status & IRQ_DISABLED))) if (unlikely(!action || (desc->status & IRQ_DISABLED)))
goto out_unlock; goto out_mask;
desc->status |= IRQ_INPROGRESS; desc->status |= IRQ_INPROGRESS;
spin_unlock(&desc->lock); spin_unlock(&desc->lock);
action_ret = handle_IRQ_event(irq, action); action_ret = handle_IRQ_event(irq, action);
/* XXX: There is no direct way to access noirqdebug, so check
* unconditionally for spurious irqs...
* Maybe this function should go to kernel/irq/chip.c? */
note_interrupt(irq, desc, action_ret);
spin_lock(&desc->lock); spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS; desc->status &= ~IRQ_INPROGRESS;
if (!(desc->status & IRQ_DISABLED) && desc->chip->ack)
if (desc->status & IRQ_DISABLED)
out_mask:
desc->chip->mask(irq);
/* ack unconditionally to unmask lower prio irqs */
desc->chip->ack(irq); desc->chip->ack(irq);
out_unlock:
spin_unlock(&desc->lock); spin_unlock(&desc->lock);
} }
#define handle_irq handle_prio_irq #define handle_irq handle_prio_irq
......
...@@ -34,11 +34,7 @@ ...@@ -34,11 +34,7 @@
* Non-CPU Masters address decoding -- * Non-CPU Masters address decoding --
* Unlike the CPU, we setup the access from Orion's master interfaces to DDR * Unlike the CPU, we setup the access from Orion's master interfaces to DDR
* banks only (the typical use case). * banks only (the typical use case).
* Setup access for each master to DDR is issued by common.c. * Setup access for each master to DDR is issued by platform device setup.
*
* Note: although orion_setbits() and orion_clrbits() are not atomic
* no locking is necessary here since code in this file is only called
* at boot time when there is no concurrency issues.
*/ */
/* /*
...@@ -48,10 +44,6 @@ ...@@ -48,10 +44,6 @@
#define TARGET_DEV_BUS 1 #define TARGET_DEV_BUS 1
#define TARGET_PCI 3 #define TARGET_PCI 3
#define TARGET_PCIE 4 #define TARGET_PCIE 4
#define ATTR_DDR_CS(n) (((n) ==0) ? 0xe : \
((n) == 1) ? 0xd : \
((n) == 2) ? 0xb : \
((n) == 3) ? 0x7 : 0xf)
#define ATTR_PCIE_MEM 0x59 #define ATTR_PCIE_MEM 0x59
#define ATTR_PCIE_IO 0x51 #define ATTR_PCIE_IO 0x51
#define ATTR_PCIE_WA 0x79 #define ATTR_PCIE_WA 0x79
...@@ -61,17 +53,12 @@ ...@@ -61,17 +53,12 @@
#define ATTR_DEV_CS1 0x1d #define ATTR_DEV_CS1 0x1d
#define ATTR_DEV_CS2 0x1b #define ATTR_DEV_CS2 0x1b
#define ATTR_DEV_BOOT 0xf #define ATTR_DEV_BOOT 0xf
#define WIN_EN 1
/* /*
* Helpers to get DDR bank info * Helpers to get DDR bank info
*/ */
#define DDR_BASE_CS(n) ORION5X_DDR_REG(0x1500 + ((n) * 8)) #define DDR_BASE_CS(n) ORION5X_DDR_REG(0x1500 + ((n) << 3))
#define DDR_SIZE_CS(n) ORION5X_DDR_REG(0x1504 + ((n) * 8)) #define DDR_SIZE_CS(n) ORION5X_DDR_REG(0x1504 + ((n) << 3))
#define DDR_MAX_CS 4
#define DDR_REG_TO_SIZE(reg) (((reg) | 0xffffff) + 1)
#define DDR_REG_TO_BASE(reg) ((reg) & 0xff000000)
#define DDR_BANK_EN 1
/* /*
* CPU Address Decode Windows registers * CPU Address Decode Windows registers
...@@ -81,17 +68,6 @@ ...@@ -81,17 +68,6 @@
#define CPU_WIN_REMAP_LO(n) ORION5X_BRIDGE_REG(0x008 | ((n) << 4)) #define CPU_WIN_REMAP_LO(n) ORION5X_BRIDGE_REG(0x008 | ((n) << 4))
#define CPU_WIN_REMAP_HI(n) ORION5X_BRIDGE_REG(0x00c | ((n) << 4)) #define CPU_WIN_REMAP_HI(n) ORION5X_BRIDGE_REG(0x00c | ((n) << 4))
/*
* Gigabit Ethernet Address Decode Windows registers
*/
#define ETH_WIN_BASE(win) ORION5X_ETH_REG(0x200 + ((win) * 8))
#define ETH_WIN_SIZE(win) ORION5X_ETH_REG(0x204 + ((win) * 8))
#define ETH_WIN_REMAP(win) ORION5X_ETH_REG(0x280 + ((win) * 4))
#define ETH_WIN_EN ORION5X_ETH_REG(0x290)
#define ETH_WIN_PROT ORION5X_ETH_REG(0x294)
#define ETH_MAX_WIN 6
#define ETH_MAX_REMAP_WIN 4
struct mbus_dram_target_info orion5x_mbus_dram_info; struct mbus_dram_target_info orion5x_mbus_dram_info;
...@@ -202,39 +178,3 @@ void __init orion5x_setup_pcie_wa_win(u32 base, u32 size) ...@@ -202,39 +178,3 @@ void __init orion5x_setup_pcie_wa_win(u32 base, u32 size)
{ {
setup_cpu_win(7, base, size, TARGET_PCIE, ATTR_PCIE_WA, -1); setup_cpu_win(7, base, size, TARGET_PCIE, ATTR_PCIE_WA, -1);
} }
void __init orion5x_setup_eth_wins(void)
{
int i;
/*
* First, disable and clear windows
*/
for (i = 0; i < ETH_MAX_WIN; i++) {
orion5x_write(ETH_WIN_BASE(i), 0);
orion5x_write(ETH_WIN_SIZE(i), 0);
orion5x_setbits(ETH_WIN_EN, 1 << i);
orion5x_clrbits(ETH_WIN_PROT, 0x3 << (i * 2));
if (i < ETH_MAX_REMAP_WIN)
orion5x_write(ETH_WIN_REMAP(i), 0);
}
/*
* Setup windows for DDR banks.
*/
for (i = 0; i < DDR_MAX_CS; i++) {
u32 base, size;
size = orion5x_read(DDR_SIZE_CS(i));
base = orion5x_read(DDR_BASE_CS(i));
if (size & DDR_BANK_EN) {
base = DDR_REG_TO_BASE(base);
size = DDR_REG_TO_SIZE(size);
orion5x_write(ETH_WIN_SIZE(i), (size-1) & 0xffff0000);
orion5x_write(ETH_WIN_BASE(i), (base & 0xffff0000) |
(ATTR_DDR_CS(i) << 8) |
TARGET_DDR);
orion5x_clrbits(ETH_WIN_EN, 1 << i);
orion5x_setbits(ETH_WIN_PROT, 0x3 << (i * 2));
}
}
}
...@@ -190,6 +190,11 @@ static struct platform_device orion5x_ehci1 = { ...@@ -190,6 +190,11 @@ static struct platform_device orion5x_ehci1 = {
* (The Orion and Discovery (MV643xx) families use the same Ethernet driver) * (The Orion and Discovery (MV643xx) families use the same Ethernet driver)
****************************************************************************/ ****************************************************************************/
struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = {
.dram = &orion5x_mbus_dram_info,
.t_clk = ORION5X_TCLK,
};
static struct resource orion5x_eth_shared_resources[] = { static struct resource orion5x_eth_shared_resources[] = {
{ {
.start = ORION5X_ETH_PHYS_BASE + 0x2000, .start = ORION5X_ETH_PHYS_BASE + 0x2000,
...@@ -201,6 +206,9 @@ static struct resource orion5x_eth_shared_resources[] = { ...@@ -201,6 +206,9 @@ static struct resource orion5x_eth_shared_resources[] = {
static struct platform_device orion5x_eth_shared = { static struct platform_device orion5x_eth_shared = {
.name = MV643XX_ETH_SHARED_NAME, .name = MV643XX_ETH_SHARED_NAME,
.id = 0, .id = 0,
.dev = {
.platform_data = &orion5x_eth_shared_data,
},
.num_resources = 1, .num_resources = 1,
.resource = orion5x_eth_shared_resources, .resource = orion5x_eth_shared_resources,
}; };
...@@ -362,7 +370,6 @@ void __init orion5x_init(void) ...@@ -362,7 +370,6 @@ void __init orion5x_init(void)
* Setup Orion address map * Setup Orion address map
*/ */
orion5x_setup_cpu_mbus_bridge(); orion5x_setup_cpu_mbus_bridge();
orion5x_setup_eth_wins();
/* /*
* Register devices. * Register devices.
......
...@@ -22,7 +22,6 @@ void orion5x_setup_dev0_win(u32 base, u32 size); ...@@ -22,7 +22,6 @@ void orion5x_setup_dev0_win(u32 base, u32 size);
void orion5x_setup_dev1_win(u32 base, u32 size); void orion5x_setup_dev1_win(u32 base, u32 size);
void orion5x_setup_dev2_win(u32 base, u32 size); void orion5x_setup_dev2_win(u32 base, u32 size);
void orion5x_setup_pcie_wa_win(u32 base, u32 size); void orion5x_setup_pcie_wa_win(u32 base, u32 size);
void orion5x_setup_eth_wins(void);
/* /*
* Shared code used internally by other Orion core functions. * Shared code used internally by other Orion core functions.
......
...@@ -5,6 +5,13 @@ ...@@ -5,6 +5,13 @@
# Common support (must be linked before board specific support) # Common support (must be linked before board specific support)
obj-y += clock.o devices.o generic.o irq.o dma.o \ obj-y += clock.o devices.o generic.o irq.o dma.o \
time.o gpio.o time.o gpio.o
obj-$(CONFIG_PM) += pm.o sleep.o standby.o
obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o
# Generic drivers that other drivers may depend upon
obj-$(CONFIG_PXA_SSP) += ssp.o
# SoC-specific code
obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa25x.o obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa25x.o
obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa27x.o obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa27x.o
obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o
...@@ -48,11 +55,6 @@ led-$(CONFIG_MACH_TRIZEPS4) += leds-trizeps4.o ...@@ -48,11 +55,6 @@ led-$(CONFIG_MACH_TRIZEPS4) += leds-trizeps4.o
obj-$(CONFIG_LEDS) += $(led-y) obj-$(CONFIG_LEDS) += $(led-y)
# Misc features
obj-$(CONFIG_PM) += pm.o sleep.o standby.o
obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o
obj-$(CONFIG_PXA_SSP) += ssp.o
ifeq ($(CONFIG_PCI),y) ifeq ($(CONFIG_PCI),y)
obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o
endif endif
...@@ -493,8 +493,6 @@ static struct platform_device *devices[] __initdata = { ...@@ -493,8 +493,6 @@ static struct platform_device *devices[] __initdata = {
static void corgi_poweroff(void) static void corgi_poweroff(void)
{ {
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
if (!machine_is_corgi()) if (!machine_is_corgi())
/* Green LED off tells the bootloader to halt */ /* Green LED off tells the bootloader to halt */
reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN);
...@@ -503,8 +501,6 @@ static void corgi_poweroff(void) ...@@ -503,8 +501,6 @@ static void corgi_poweroff(void)
static void corgi_restart(char mode) static void corgi_restart(char mode)
{ {
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
if (!machine_is_corgi()) if (!machine_is_corgi())
/* Green LED on tells the bootloader to reboot */ /* Green LED on tells the bootloader to reboot */
set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN); set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN);
......
This diff is collapsed.
...@@ -396,7 +396,7 @@ static struct pxafb_mach_info sharp_lm8v31 = { ...@@ -396,7 +396,7 @@ static struct pxafb_mach_info sharp_lm8v31 = {
.cmap_inverse = 0, .cmap_inverse = 0,
.cmap_static = 0, .cmap_static = 0,
.lcd_conn = LCD_COLOR_DSTN_16BPP | LCD_PCLK_EDGE_FALL | .lcd_conn = LCD_COLOR_DSTN_16BPP | LCD_PCLK_EDGE_FALL |
LCD_AC_BIAS_FREQ(255); LCD_AC_BIAS_FREQ(255),
}; };
#define MMC_POLL_RATE msecs_to_jiffies(1000) #define MMC_POLL_RATE msecs_to_jiffies(1000)
......
...@@ -42,20 +42,17 @@ int pxa_pm_enter(suspend_state_t state) ...@@ -42,20 +42,17 @@ int pxa_pm_enter(suspend_state_t state)
if (state != PM_SUSPEND_STANDBY) { if (state != PM_SUSPEND_STANDBY) {
pxa_cpu_pm_fns->save(sleep_save); pxa_cpu_pm_fns->save(sleep_save);
/* before sleeping, calculate and save a checksum */ /* before sleeping, calculate and save a checksum */
for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++) for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++)
sleep_save_checksum += sleep_save[i]; sleep_save_checksum += sleep_save[i];
} }
/* Clear reset status */
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
/* *** go zzz *** */ /* *** go zzz *** */
pxa_cpu_pm_fns->enter(state); pxa_cpu_pm_fns->enter(state);
cpu_init(); cpu_init();
if (state != PM_SUSPEND_STANDBY) { if (state != PM_SUSPEND_STANDBY) {
/* after sleeping, validate the checksum */ /* after sleeping, validate the checksum */
for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++) for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++)
checksum += sleep_save[i]; checksum += sleep_save[i];
/* if invalid, display message and wait for a hardware reset */ /* if invalid, display message and wait for a hardware reset */
...@@ -101,7 +98,8 @@ static int __init pxa_pm_init(void) ...@@ -101,7 +98,8 @@ static int __init pxa_pm_init(void)
return -EINVAL; return -EINVAL;
} }
sleep_save = kmalloc(pxa_cpu_pm_fns->save_size, GFP_KERNEL); sleep_save = kmalloc(pxa_cpu_pm_fns->save_count * sizeof(unsigned long),
GFP_KERNEL);
if (!sleep_save) { if (!sleep_save) {
printk(KERN_ERR "failed to alloc memory for pm save\n"); printk(KERN_ERR "failed to alloc memory for pm save\n");
return -ENOMEM; return -ENOMEM;
......
...@@ -326,13 +326,11 @@ static struct platform_device *devices[] __initdata = { ...@@ -326,13 +326,11 @@ static struct platform_device *devices[] __initdata = {
static void poodle_poweroff(void) static void poodle_poweroff(void)
{ {
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
arm_machine_restart('h'); arm_machine_restart('h');
} }
static void poodle_restart(char mode) static void poodle_restart(char mode)
{ {
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
arm_machine_restart('h'); arm_machine_restart('h');
} }
......
...@@ -150,9 +150,7 @@ static struct clk pxa25x_clks[] = { ...@@ -150,9 +150,7 @@ static struct clk pxa25x_clks[] = {
* More ones like CP and general purpose register values are preserved * More ones like CP and general purpose register values are preserved
* with the stack pointer in sleep.S. * with the stack pointer in sleep.S.
*/ */
enum { SLEEP_SAVE_START = 0, enum { SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2,
SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2,
SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U, SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U,
SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR1_U, SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR1_U,
...@@ -162,7 +160,7 @@ enum { SLEEP_SAVE_START = 0, ...@@ -162,7 +160,7 @@ enum { SLEEP_SAVE_START = 0,
SLEEP_SAVE_CKEN, SLEEP_SAVE_CKEN,
SLEEP_SAVE_SIZE SLEEP_SAVE_COUNT
}; };
...@@ -200,6 +198,9 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save) ...@@ -200,6 +198,9 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
static void pxa25x_cpu_pm_enter(suspend_state_t state) static void pxa25x_cpu_pm_enter(suspend_state_t state)
{ {
/* Clear reset status */
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
switch (state) { switch (state) {
case PM_SUSPEND_MEM: case PM_SUSPEND_MEM:
/* set resume return address */ /* set resume return address */
...@@ -210,7 +211,7 @@ static void pxa25x_cpu_pm_enter(suspend_state_t state) ...@@ -210,7 +211,7 @@ static void pxa25x_cpu_pm_enter(suspend_state_t state)
} }
static struct pxa_cpu_pm_fns pxa25x_cpu_pm_fns = { static struct pxa_cpu_pm_fns pxa25x_cpu_pm_fns = {
.save_size = SLEEP_SAVE_SIZE, .save_count = SLEEP_SAVE_COUNT,
.valid = suspend_valid_only_mem, .valid = suspend_valid_only_mem,
.save = pxa25x_cpu_pm_save, .save = pxa25x_cpu_pm_save,
.restore = pxa25x_cpu_pm_restore, .restore = pxa25x_cpu_pm_restore,
......
...@@ -181,9 +181,7 @@ static struct clk pxa27x_clks[] = { ...@@ -181,9 +181,7 @@ static struct clk pxa27x_clks[] = {
* More ones like CP and general purpose register values are preserved * More ones like CP and general purpose register values are preserved
* with the stack pointer in sleep.S. * with the stack pointer in sleep.S.
*/ */
enum { SLEEP_SAVE_START = 0, enum { SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2, SLEEP_SAVE_PGSR3,
SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2, SLEEP_SAVE_PGSR3,
SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U, SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U,
SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR1_U, SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR1_U,
...@@ -198,7 +196,7 @@ enum { SLEEP_SAVE_START = 0, ...@@ -198,7 +196,7 @@ enum { SLEEP_SAVE_START = 0,
SLEEP_SAVE_PWER, SLEEP_SAVE_PCFR, SLEEP_SAVE_PRER, SLEEP_SAVE_PWER, SLEEP_SAVE_PCFR, SLEEP_SAVE_PRER,
SLEEP_SAVE_PFER, SLEEP_SAVE_PKWR, SLEEP_SAVE_PFER, SLEEP_SAVE_PKWR,
SLEEP_SAVE_SIZE SLEEP_SAVE_COUNT
}; };
void pxa27x_cpu_pm_save(unsigned long *sleep_save) void pxa27x_cpu_pm_save(unsigned long *sleep_save)
...@@ -251,6 +249,9 @@ void pxa27x_cpu_pm_enter(suspend_state_t state) ...@@ -251,6 +249,9 @@ void pxa27x_cpu_pm_enter(suspend_state_t state)
/* Clear edge-detect status register. */ /* Clear edge-detect status register. */
PEDR = 0xDF12FE1B; PEDR = 0xDF12FE1B;
/* Clear reset status */
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
switch (state) { switch (state) {
case PM_SUSPEND_STANDBY: case PM_SUSPEND_STANDBY:
pxa_cpu_standby(); pxa_cpu_standby();
...@@ -269,7 +270,7 @@ static int pxa27x_cpu_pm_valid(suspend_state_t state) ...@@ -269,7 +270,7 @@ static int pxa27x_cpu_pm_valid(suspend_state_t state)
} }
static struct pxa_cpu_pm_fns pxa27x_cpu_pm_fns = { static struct pxa_cpu_pm_fns pxa27x_cpu_pm_fns = {
.save_size = SLEEP_SAVE_SIZE, .save_count = SLEEP_SAVE_COUNT,
.save = pxa27x_cpu_pm_save, .save = pxa27x_cpu_pm_save,
.restore = pxa27x_cpu_pm_restore, .restore = pxa27x_cpu_pm_restore,
.valid = pxa27x_cpu_pm_valid, .valid = pxa27x_cpu_pm_valid,
......
...@@ -256,12 +256,11 @@ static unsigned long wakeup_src; ...@@ -256,12 +256,11 @@ static unsigned long wakeup_src;
#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x
#define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] #define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x]
enum { SLEEP_SAVE_START = 0, enum { SLEEP_SAVE_CKENA,
SLEEP_SAVE_CKENA,
SLEEP_SAVE_CKENB, SLEEP_SAVE_CKENB,
SLEEP_SAVE_ACCR, SLEEP_SAVE_ACCR,
SLEEP_SAVE_SIZE, SLEEP_SAVE_COUNT,
}; };
static void pxa3xx_cpu_pm_save(unsigned long *sleep_save) static void pxa3xx_cpu_pm_save(unsigned long *sleep_save)
...@@ -376,7 +375,7 @@ static int pxa3xx_cpu_pm_valid(suspend_state_t state) ...@@ -376,7 +375,7 @@ static int pxa3xx_cpu_pm_valid(suspend_state_t state)
} }
static struct pxa_cpu_pm_fns pxa3xx_cpu_pm_fns = { static struct pxa_cpu_pm_fns pxa3xx_cpu_pm_fns = {
.save_size = SLEEP_SAVE_SIZE, .save_count = SLEEP_SAVE_COUNT,
.save = pxa3xx_cpu_pm_save, .save = pxa3xx_cpu_pm_save,
.restore = pxa3xx_cpu_pm_restore, .restore = pxa3xx_cpu_pm_restore,
.valid = pxa3xx_cpu_pm_valid, .valid = pxa3xx_cpu_pm_valid,
......
...@@ -529,8 +529,6 @@ static struct platform_device *devices[] __initdata = { ...@@ -529,8 +529,6 @@ static struct platform_device *devices[] __initdata = {
static void spitz_poweroff(void) static void spitz_poweroff(void)
{ {
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
pxa_gpio_mode(SPITZ_GPIO_ON_RESET | GPIO_OUT); pxa_gpio_mode(SPITZ_GPIO_ON_RESET | GPIO_OUT);
GPSR(SPITZ_GPIO_ON_RESET) = GPIO_bit(SPITZ_GPIO_ON_RESET); GPSR(SPITZ_GPIO_ON_RESET) = GPIO_bit(SPITZ_GPIO_ON_RESET);
......
...@@ -119,9 +119,6 @@ static void spitz_presuspend(void) ...@@ -119,9 +119,6 @@ static void spitz_presuspend(void)
/* nRESET_OUT Disable */ /* nRESET_OUT Disable */
PSLR |= PSLR_SL_ROD; PSLR |= PSLR_SL_ROD;
/* Clear reset status */
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */ /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
PCFR = PCFR_GPR_EN | PCFR_OPDE; PCFR = PCFR_GPR_EN | PCFR_OPDE;
} }
......
...@@ -467,8 +467,6 @@ static struct platform_device *devices[] __initdata = { ...@@ -467,8 +467,6 @@ static struct platform_device *devices[] __initdata = {
static void tosa_poweroff(void) static void tosa_poweroff(void)
{ {
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_OUT); pxa_gpio_mode(TOSA_GPIO_ON_RESET | GPIO_OUT);
GPSR(TOSA_GPIO_ON_RESET) = GPIO_bit(TOSA_GPIO_ON_RESET); GPSR(TOSA_GPIO_ON_RESET) = GPIO_bit(TOSA_GPIO_ON_RESET);
......
...@@ -43,20 +43,18 @@ extern void sa1100_cpu_resume(void); ...@@ -43,20 +43,18 @@ extern void sa1100_cpu_resume(void);
* More ones like CP and general purpose register values are preserved * More ones like CP and general purpose register values are preserved
* on the stack and then the stack pointer is stored last in sleep.S. * on the stack and then the stack pointer is stored last in sleep.S.
*/ */
enum { SLEEP_SAVE_SP = 0, enum { SLEEP_SAVE_GPDR, SLEEP_SAVE_GAFR,
SLEEP_SAVE_GPDR, SLEEP_SAVE_GAFR,
SLEEP_SAVE_PPDR, SLEEP_SAVE_PPSR, SLEEP_SAVE_PPAR, SLEEP_SAVE_PSDR, SLEEP_SAVE_PPDR, SLEEP_SAVE_PPSR, SLEEP_SAVE_PPAR, SLEEP_SAVE_PSDR,
SLEEP_SAVE_Ser1SDCR0, SLEEP_SAVE_Ser1SDCR0,
SLEEP_SAVE_SIZE SLEEP_SAVE_COUNT
}; };
static int sa11x0_pm_enter(suspend_state_t state) static int sa11x0_pm_enter(suspend_state_t state)
{ {
unsigned long gpio, sleep_save[SLEEP_SAVE_SIZE]; unsigned long gpio, sleep_save[SLEEP_SAVE_COUNT];
gpio = GPLR; gpio = GPLR;
......
...@@ -411,7 +411,7 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent) ...@@ -411,7 +411,7 @@ static int s3c24xx_clkout_setparent(struct clk *clk, struct clk *parent)
clk->parent = parent; clk->parent = parent;
if (clk == &s3c24xx_dclk0) if (clk == &s3c24xx_clkout0)
mask = S3C2410_MISCCR_CLK0_MASK; mask = S3C2410_MISCCR_CLK0_MASK;
else { else {
source <<= 4; source <<= 4;
...@@ -437,7 +437,7 @@ struct clk s3c24xx_dclk0 = { ...@@ -437,7 +437,7 @@ struct clk s3c24xx_dclk0 = {
struct clk s3c24xx_dclk1 = { struct clk s3c24xx_dclk1 = {
.name = "dclk1", .name = "dclk1",
.id = -1, .id = -1,
.ctrlbit = S3C2410_DCLKCON_DCLK0EN, .ctrlbit = S3C2410_DCLKCON_DCLK1EN,
.enable = s3c24xx_dclk_enable, .enable = s3c24xx_dclk_enable,
.set_parent = s3c24xx_dclk_setparent, .set_parent = s3c24xx_dclk_setparent,
.set_rate = s3c24xx_set_dclk_rate, .set_rate = s3c24xx_set_dclk_rate,
......
...@@ -425,7 +425,7 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) ...@@ -425,7 +425,7 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
host->cclk = host->mclk; host->cclk = host->mclk;
} else { } else {
clk = host->mclk / (2 * ios->clock) - 1; clk = host->mclk / (2 * ios->clock) - 1;
if (clk > 256) if (clk >= 256)
clk = 255; clk = 255;
host->cclk = host->mclk / (2 * (clk + 1)); host->cclk = host->mclk / (2 * (clk + 1));
} }
...@@ -512,6 +512,18 @@ static int mmci_probe(struct amba_device *dev, void *id) ...@@ -512,6 +512,18 @@ static int mmci_probe(struct amba_device *dev, void *id)
host->plat = plat; host->plat = plat;
host->mclk = clk_get_rate(host->clk); host->mclk = clk_get_rate(host->clk);
/*
* According to the spec, mclk is max 100 MHz,
* so we try to adjust the clock down to this,
* (if possible).
*/
if (host->mclk > 100000000) {
ret = clk_set_rate(host->clk, 100000000);
if (ret < 0)
goto clk_disable;
host->mclk = clk_get_rate(host->clk);
DBG(host, "eventual mclk rate: %u Hz\n", host->mclk);
}
host->mmc = mmc; host->mmc = mmc;
host->base = ioremap(dev->res.start, SZ_4K); host->base = ioremap(dev->res.start, SZ_4K);
if (!host->base) { if (!host->base) {
......
...@@ -1301,7 +1301,7 @@ static void pxafb_decode_mode_info(struct pxafb_info *fbi, ...@@ -1301,7 +1301,7 @@ static void pxafb_decode_mode_info(struct pxafb_info *fbi,
} }
} }
static int pxafb_decode_mach_info(struct pxafb_info *fbi, static void pxafb_decode_mach_info(struct pxafb_info *fbi,
struct pxafb_mach_info *inf) struct pxafb_mach_info *inf)
{ {
unsigned int lcd_conn = inf->lcd_conn; unsigned int lcd_conn = inf->lcd_conn;
...@@ -1333,7 +1333,7 @@ static int pxafb_decode_mach_info(struct pxafb_info *fbi, ...@@ -1333,7 +1333,7 @@ static int pxafb_decode_mach_info(struct pxafb_info *fbi,
fbi->lccr0 = inf->lccr0; fbi->lccr0 = inf->lccr0;
fbi->lccr3 = inf->lccr3; fbi->lccr3 = inf->lccr3;
fbi->lccr4 = inf->lccr4; fbi->lccr4 = inf->lccr4;
return -EINVAL; goto decode_mode;
} }
if (lcd_conn == LCD_MONO_STN_8BPP) if (lcd_conn == LCD_MONO_STN_8BPP)
...@@ -1343,8 +1343,8 @@ static int pxafb_decode_mach_info(struct pxafb_info *fbi, ...@@ -1343,8 +1343,8 @@ static int pxafb_decode_mach_info(struct pxafb_info *fbi,
fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0;
fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0;
decode_mode:
pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes); pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes);
return 0;
} }
static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev)
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include <linux/suspend.h> #include <linux/suspend.h>
struct pxa_cpu_pm_fns { struct pxa_cpu_pm_fns {
int save_size; int save_count;
void (*save)(unsigned long *); void (*save)(unsigned long *);
void (*restore)(unsigned long *); void (*restore)(unsigned long *);
int (*valid)(suspend_state_t state); int (*valid)(suspend_state_t state);
......
...@@ -22,6 +22,7 @@ static inline void arch_idle(void) ...@@ -22,6 +22,7 @@ static inline void arch_idle(void)
static inline void arch_reset(char mode) static inline void arch_reset(char mode)
{ {
if (cpu_is_pxa2xx())
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
if (mode == 's') { if (mode == 's') {
......
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