Commit 3a895e95 authored by Linus Torvalds's avatar Linus Torvalds

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

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 66c9a93b 5e108b76
...@@ -349,11 +349,13 @@ LC0: .word LC0 @ r1 ...@@ -349,11 +349,13 @@ LC0: .word LC0 @ r1
LC1: .word reloc_end - reloc_start LC1: .word reloc_end - reloc_start
.size LC0, . - LC0 .size LC0, . - LC0
#ifdef CONFIG_ARCH_RPC
.globl params .globl params
params: ldr r0, =params_phys params: ldr r0, =params_phys
mov pc, lr mov pc, lr
.ltorg .ltorg
.align .align
#endif
/* /*
* Turn on the cache. We need to setup some page tables so that we * Turn on the cache. We need to setup some page tables so that we
......
...@@ -66,6 +66,37 @@ ENTRY(pxa_cpu_suspend) ...@@ -66,6 +66,37 @@ ENTRY(pxa_cpu_suspend)
@ prepare pointer to physical address 0 (virtual mapping in generic.c) @ prepare pointer to physical address 0 (virtual mapping in generic.c)
mov r2, #UNCACHED_PHYS_0 mov r2, #UNCACHED_PHYS_0
@ Intel PXA255 Specification Update notes problems
@ about suspending with PXBus operating above 133MHz
@ (see Errata 31, GPIO output signals, ... unpredictable in sleep
@
@ We keep the change-down close to the actual suspend on SDRAM
@ as possible to eliminate messing about with the refresh clock
@ as the system will restore with the original speed settings
@
@ Ben Dooks, 13-Sep-2004
ldr r6, =CCCR
ldr r8, [r6] @ keep original value for resume
@ ensure x1 for run and turbo mode with memory clock
bic r7, r8, #CCCR_M_MASK | CCCR_N_MASK
orr r7, r7, #(1<<5) | (2<<7)
@ check that the memory frequency is within limits
and r14, r7, #CCCR_L_MASK
teq r14, #1
bicne r7, r7, #CCCR_L_MASK
orrne r7, r7, #1 @@ 99.53MHz
@ get ready for the change
@ note, since we are making turbo=run, do not remove the turbo
@ as this may cause non-turbo mode on resume
mrc p14, 0, r0, c6, c0, 0
bic r0, r0, #2 @ clear change bit
mcr p14, 0, r0, c6, c0, 0
orr r0, r0, #2 @ initiate change bit
@ align execution to a cache line @ align execution to a cache line
b 1f b 1f
...@@ -76,6 +107,13 @@ ENTRY(pxa_cpu_suspend) ...@@ -76,6 +107,13 @@ ENTRY(pxa_cpu_suspend)
@ All needed values are now in registers. @ All needed values are now in registers.
@ These last instructions should be in cache @ These last instructions should be in cache
@ initiate the frequency change...
str r7, [r6]
mcr p14, 0, r0, c6, c0, 0
@ restore the original cpu speed value for resume
str r8, [r6]
@ put SDRAM into self-refresh @ put SDRAM into self-refresh
str r5, [r4] str r5, [r4]
...@@ -85,8 +123,7 @@ ENTRY(pxa_cpu_suspend) ...@@ -85,8 +123,7 @@ ENTRY(pxa_cpu_suspend)
@ enter sleep mode @ enter sleep mode
mcr p14, 0, r1, c7, c0, 0 mcr p14, 0, r1, c7, c0, 0
20: nop 20: b 20b @ loop waiting for sleep
b 20b @ loop waiting for sleep
/* /*
* cpu_pxa_resume() * cpu_pxa_resume()
......
...@@ -27,7 +27,13 @@ ...@@ -27,7 +27,13 @@
* *
* 21-Jul-2004 Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org> * 21-Jul-2004 Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org>
* Addition of ADC/TC demux * Addition of ADC/TC demux
*/ *
* 04-Oct-2004 Klaus Fetscher <k.fetscher@fetron.de>
* Fix for set_irq_type() on low EINT numbers
*
* 05-Oct-2004 Ben Dooks <ben@simtec.co.uk>
* Tidy up KF's patch and sort out new release
*/
#include <linux/init.h> #include <linux/init.h>
...@@ -46,9 +52,6 @@ ...@@ -46,9 +52,6 @@
#include <asm/arch/regs-irq.h> #include <asm/arch/regs-irq.h>
#include <asm/arch/regs-gpio.h> #include <asm/arch/regs-gpio.h>
#if 0
#include <asm/debug-ll.h>
#endif
#define irqdbf(x...) #define irqdbf(x...)
#define irqdbf2(x...) #define irqdbf2(x...)
...@@ -195,13 +198,20 @@ s3c_irqext_type(unsigned int irq, unsigned int type) ...@@ -195,13 +198,20 @@ s3c_irqext_type(unsigned int irq, unsigned int type)
unsigned long gpcon_offset, extint_offset; unsigned long gpcon_offset, extint_offset;
unsigned long newvalue = 0, value; unsigned long newvalue = 0, value;
if ((irq >= IRQ_EINT0) && (irq <= IRQ_EINT7)) if ((irq >= IRQ_EINT0) && (irq <= IRQ_EINT3))
{ {
gpcon_reg = S3C2410_GPFCON; gpcon_reg = S3C2410_GPFCON;
extint_reg = S3C2410_EXTINT0; extint_reg = S3C2410_EXTINT0;
gpcon_offset = (irq - IRQ_EINT0) * 2; gpcon_offset = (irq - IRQ_EINT0) * 2;
extint_offset = (irq - IRQ_EINT0) * 4; extint_offset = (irq - IRQ_EINT0) * 4;
} }
else if ((irq >= IRQ_EINT4) && (irq <= IRQ_EINT7))
{
gpcon_reg = S3C2410_GPFCON;
extint_reg = S3C2410_EXTINT0;
gpcon_offset = (irq - (EXTINT_OFF)) * 2;
extint_offset = (irq - (EXTINT_OFF)) * 4;
}
else if ((irq >= IRQ_EINT8) && (irq <= IRQ_EINT15)) else if ((irq >= IRQ_EINT8) && (irq <= IRQ_EINT15))
{ {
gpcon_reg = S3C2410_GPGCON; gpcon_reg = S3C2410_GPGCON;
...@@ -269,6 +279,13 @@ static struct irqchip s3c_irqext_chip = { ...@@ -269,6 +279,13 @@ static struct irqchip s3c_irqext_chip = {
.type = s3c_irqext_type .type = s3c_irqext_type
}; };
static struct irqchip s3c_irq_eint0t4 = {
.ack = s3c_irq_ack,
.mask = s3c_irq_mask,
.unmask = s3c_irq_unmask,
.type = s3c_irqext_type
};
/* mask values for the parent registers for each of the interrupt types */ /* mask values for the parent registers for each of the interrupt types */
#define INTMSK_UART0 (1UL << (IRQ_UART0 - IRQ_EINT0)) #define INTMSK_UART0 (1UL << (IRQ_UART0 - IRQ_EINT0))
...@@ -549,6 +566,7 @@ s3c_irq_demux_uart2(unsigned int irq, ...@@ -549,6 +566,7 @@ s3c_irq_demux_uart2(unsigned int irq,
void __init s3c2410_init_irq(void) void __init s3c2410_init_irq(void)
{ {
unsigned long pend; unsigned long pend;
unsigned long last;
int irqno; int irqno;
int i; int i;
...@@ -556,48 +574,51 @@ void __init s3c2410_init_irq(void) ...@@ -556,48 +574,51 @@ void __init s3c2410_init_irq(void)
/* first, clear all interrupts pending... */ /* first, clear all interrupts pending... */
last = 0;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
pend = __raw_readl(S3C2410_EINTPEND); pend = __raw_readl(S3C2410_EINTPEND);
if (pend == 0)
if (pend == 0 || pend == last)
break; break;
__raw_writel(pend, S3C2410_EINTPEND); __raw_writel(pend, S3C2410_EINTPEND);
printk("irq: clearing pending ext status %08x\n", (int)pend); printk("irq: clearing pending ext status %08x\n", (int)pend);
last = pend;
} }
last = 0;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
pend = __raw_readl(S3C2410_INTPND); pend = __raw_readl(S3C2410_INTPND);
if (pend == 0)
if (pend == 0 || pend == last)
break; break;
__raw_writel(pend, S3C2410_SRCPND); __raw_writel(pend, S3C2410_SRCPND);
__raw_writel(pend, S3C2410_INTPND); __raw_writel(pend, S3C2410_INTPND);
printk("irq: clearing pending status %08x\n", (int)pend); printk("irq: clearing pending status %08x\n", (int)pend);
last = pend;
} }
last = 0;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
pend = __raw_readl(S3C2410_SUBSRCPND); pend = __raw_readl(S3C2410_SUBSRCPND);
if (pend == 0) if (pend == 0 || pend == last)
break; break;
printk("irq: clearing subpending status %08x\n", (int)pend); printk("irq: clearing subpending status %08x\n", (int)pend);
__raw_writel(pend, S3C2410_SUBSRCPND); __raw_writel(pend, S3C2410_SUBSRCPND);
last = pend;
} }
/* register the main interrupts */ /* register the main interrupts */
irqdbf("s3c2410_init_irq: registering s3c2410 interrupt handlers\n"); irqdbf("s3c2410_init_irq: registering s3c2410 interrupt handlers\n");
for (irqno = IRQ_EINT0; irqno <= IRQ_ADCPARENT; irqno++) { for (irqno = IRQ_BATT_FLT; irqno <= IRQ_ADCPARENT; irqno++) {
/* set all the s3c2410 internal irqs */ /* set all the s3c2410 internal irqs */
switch (irqno) { switch (irqno) {
case IRQ_EINT4t7:
case IRQ_EINT8t23:
/* these are already dealt with, so should never
* appear */
break;
/* deal with the special IRQs (cascaded) */ /* deal with the special IRQs (cascaded) */
case IRQ_UART0: case IRQ_UART0:
...@@ -632,6 +653,13 @@ void __init s3c2410_init_irq(void) ...@@ -632,6 +653,13 @@ void __init s3c2410_init_irq(void)
/* external interrupts */ /* external interrupts */
for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
irqdbf("registering irq %d (ext int)\n", irqno);
set_irq_chip(irqno, &s3c_irq_eint0t4);
set_irq_handler(irqno, do_edge_IRQ);
set_irq_flags(irqno, IRQF_VALID);
}
for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) { for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {
irqdbf("registering irq %d (extended s3c irq)\n", irqno); irqdbf("registering irq %d (extended s3c irq)\n", irqno);
set_irq_chip(irqno, &s3c_irqext_chip); set_irq_chip(irqno, &s3c_irqext_chip);
......
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