Commit 2e175a90 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] 4298/1: fix memory barriers for DMA coherent and SMP platforms
  [ARM] 4295/2: Fix error-handling in pxaficp_ir.c (version 2)
  [ARM] Fix __NR_kexec_load
  [ARM] Export dma_channel_active()
  [ARM] 4296/1: ixp4xx: compile fix
  [ARM] 4289/1: AT91: SAM9260 NAND flash timing
parents c21b1e4d 398e692f
...@@ -228,6 +228,7 @@ int dma_channel_active(dmach_t channel) ...@@ -228,6 +228,7 @@ int dma_channel_active(dmach_t channel)
{ {
return dma_chan[channel].active; return dma_chan[channel].active;
} }
EXPORT_SYMBOL(dma_channel_active);
void set_dma_page(dmach_t channel, char pagenr) void set_dma_page(dmach_t channel, char pagenr)
{ {
......
...@@ -320,16 +320,16 @@ void __init at91_add_device_nand(struct at91_nand_data *data) ...@@ -320,16 +320,16 @@ void __init at91_add_device_nand(struct at91_nand_data *data)
at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0)
| AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0)); | AT91_SMC_NRDSETUP_(0) | AT91_SMC_NCS_RDSETUP_(0));
at91_sys_write(AT91_SMC_PULSE(3), AT91_SMC_NWEPULSE_(2) | AT91_SMC_NCS_WRPULSE_(5) at91_sys_write(AT91_SMC_PULSE(3), AT91_SMC_NWEPULSE_(3) | AT91_SMC_NCS_WRPULSE_(3)
| AT91_SMC_NRDPULSE_(2) | AT91_SMC_NCS_RDPULSE_(5)); | AT91_SMC_NRDPULSE_(3) | AT91_SMC_NCS_RDPULSE_(3));
at91_sys_write(AT91_SMC_CYCLE(3), AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7)); at91_sys_write(AT91_SMC_CYCLE(3), AT91_SMC_NWECYCLE_(5) | AT91_SMC_NRDCYCLE_(5));
if (data->bus_width_16) if (data->bus_width_16)
mode = AT91_SMC_DBW_16; mode = AT91_SMC_DBW_16;
else else
mode = AT91_SMC_DBW_8; mode = AT91_SMC_DBW_8;
at91_sys_write(AT91_SMC_MODE(3), mode | AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_TDF_(1)); at91_sys_write(AT91_SMC_MODE(3), mode | AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_TDF_(2));
/* enable pin */ /* enable pin */
if (data->enable_pin) if (data->enable_pin)
......
...@@ -321,15 +321,22 @@ static void pxa_irda_fir_dma_tx_irq(int channel, void *data) ...@@ -321,15 +321,22 @@ static void pxa_irda_fir_dma_tx_irq(int channel, void *data)
pxa_irda_set_speed(si, si->newspeed); pxa_irda_set_speed(si, si->newspeed);
si->newspeed = 0; si->newspeed = 0;
} else { } else {
int i = 64;
ICCR0 = 0; ICCR0 = 0;
pxa_irda_fir_dma_rx_start(si); pxa_irda_fir_dma_rx_start(si);
while ((ICSR1 & ICSR1_RNE) && i--)
(void)ICDR;
ICCR0 = ICCR0_ITR | ICCR0_RXE; ICCR0 = ICCR0_ITR | ICCR0_RXE;
if (i < 0)
printk(KERN_ERR "pxa_ir: cannot clear Rx FIFO!\n");
} }
netif_wake_queue(dev); netif_wake_queue(dev);
} }
/* EIF(Error in FIFO/End in Frame) handler for FIR */ /* EIF(Error in FIFO/End in Frame) handler for FIR */
static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev) static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev, int icsr0)
{ {
unsigned int len, stat, data; unsigned int len, stat, data;
...@@ -350,7 +357,7 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev) ...@@ -350,7 +357,7 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev)
} }
if (stat & ICSR1_ROR) { if (stat & ICSR1_ROR) {
printk(KERN_DEBUG "pxa_ir: fir receive overrun\n"); printk(KERN_DEBUG "pxa_ir: fir receive overrun\n");
si->stats.rx_frame_errors++; si->stats.rx_over_errors++;
} }
} else { } else {
si->dma_rx_buff[len++] = data; si->dma_rx_buff[len++] = data;
...@@ -362,7 +369,15 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev) ...@@ -362,7 +369,15 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev)
if (stat & ICSR1_EOF) { if (stat & ICSR1_EOF) {
/* end of frame. */ /* end of frame. */
struct sk_buff *skb = alloc_skb(len+1,GFP_ATOMIC); struct sk_buff *skb;
if (icsr0 & ICSR0_FRE) {
printk(KERN_ERR "pxa_ir: dropping erroneous frame\n");
si->stats.rx_dropped++;
return;
}
skb = alloc_skb(len+1,GFP_ATOMIC);
if (!skb) { if (!skb) {
printk(KERN_ERR "pxa_ir: fir out of memory for receive skb\n"); printk(KERN_ERR "pxa_ir: fir out of memory for receive skb\n");
si->stats.rx_dropped++; si->stats.rx_dropped++;
...@@ -392,7 +407,7 @@ static irqreturn_t pxa_irda_fir_irq(int irq, void *dev_id) ...@@ -392,7 +407,7 @@ static irqreturn_t pxa_irda_fir_irq(int irq, void *dev_id)
{ {
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
struct pxa_irda *si = netdev_priv(dev); struct pxa_irda *si = netdev_priv(dev);
int icsr0; int icsr0, i = 64;
/* stop RX DMA */ /* stop RX DMA */
DCSR(si->rxdma) &= ~DCSR_RUN; DCSR(si->rxdma) &= ~DCSR_RUN;
...@@ -412,13 +427,18 @@ static irqreturn_t pxa_irda_fir_irq(int irq, void *dev_id) ...@@ -412,13 +427,18 @@ static irqreturn_t pxa_irda_fir_irq(int irq, void *dev_id)
if (icsr0 & ICSR0_EIF) { if (icsr0 & ICSR0_EIF) {
/* An error in FIFO occured, or there is a end of frame */ /* An error in FIFO occured, or there is a end of frame */
pxa_irda_fir_irq_eif(si, dev); pxa_irda_fir_irq_eif(si, dev, icsr0);
} }
ICCR0 = 0; ICCR0 = 0;
pxa_irda_fir_dma_rx_start(si); pxa_irda_fir_dma_rx_start(si);
while ((ICSR1 & ICSR1_RNE) && i--)
(void)ICDR;
ICCR0 = ICCR0_ITR | ICCR0_RXE; ICCR0 = ICCR0_ITR | ICCR0_RXE;
if (i < 0)
printk(KERN_ERR "pxa_ir: cannot clear Rx FIFO!\n");
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -238,23 +238,6 @@ __ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count) ...@@ -238,23 +238,6 @@ __ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count)
#define memcpy_fromio(a,c,l) _memcpy_fromio((a),(c),(l)) #define memcpy_fromio(a,c,l) _memcpy_fromio((a),(c),(l))
#define memcpy_toio(c,a,l) _memcpy_toio((c),(a),(l)) #define memcpy_toio(c,a,l) _memcpy_toio((c),(a),(l))
static inline int
check_signature(const unsigned char __iomem *bus_addr, const unsigned char *signature,
int length)
{
int retval = 0;
do {
if (readb(bus_addr) != *signature)
goto out;
bus_addr++;
signature++;
length--;
} while (length);
retval = 1;
out:
return retval;
}
#endif #endif
#ifndef CONFIG_PCI #ifndef CONFIG_PCI
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm/memory.h>
#define CPU_ARCH_UNKNOWN 0 #define CPU_ARCH_UNKNOWN 0
#define CPU_ARCH_ARMv3 1 #define CPU_ARCH_ARMv3 1
...@@ -154,7 +155,7 @@ extern unsigned int user_debug; ...@@ -154,7 +155,7 @@ extern unsigned int user_debug;
#define vectors_high() (0) #define vectors_high() (0)
#endif #endif
#if __LINUX_ARM_ARCH__ >= 6 #if defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ >= 6
#define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ #define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \
: : "r" (0) : "memory") : : "r" (0) : "memory")
#define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ #define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
...@@ -168,22 +169,23 @@ extern unsigned int user_debug; ...@@ -168,22 +169,23 @@ extern unsigned int user_debug;
#define dmb() __asm__ __volatile__ ("" : : : "memory") #define dmb() __asm__ __volatile__ ("" : : : "memory")
#endif #endif
#define mb() barrier() #ifndef CONFIG_SMP
#define rmb() barrier() #define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
#define wmb() barrier() #define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
#define read_barrier_depends() do { } while(0) #define wmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
#ifdef CONFIG_SMP
#define smp_mb() dmb()
#define smp_rmb() dmb()
#define smp_wmb() dmb()
#define smp_read_barrier_depends() read_barrier_depends()
#else
#define smp_mb() barrier() #define smp_mb() barrier()
#define smp_rmb() barrier() #define smp_rmb() barrier()
#define smp_wmb() barrier() #define smp_wmb() barrier()
#define smp_read_barrier_depends() read_barrier_depends() #else
#endif /* CONFIG_SMP */ #define mb() dmb()
#define rmb() dmb()
#define wmb() dmb()
#define smp_mb() dmb()
#define smp_rmb() dmb()
#define smp_wmb() dmb()
#endif
#define read_barrier_depends() do { } while(0)
#define smp_read_barrier_depends() do { } while(0)
#define set_mb(var, value) do { var = value; smp_mb(); } while (0) #define set_mb(var, value) do { var = value; smp_mb(); } while (0)
#define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
......
...@@ -372,7 +372,7 @@ ...@@ -372,7 +372,7 @@
#define __NR_move_pages (__NR_SYSCALL_BASE+344) #define __NR_move_pages (__NR_SYSCALL_BASE+344)
#define __NR_getcpu (__NR_SYSCALL_BASE+345) #define __NR_getcpu (__NR_SYSCALL_BASE+345)
/* 346 for epoll_pwait */ /* 346 for epoll_pwait */
#define __NR_sys_kexec_load (__NR_SYSCALL_BASE+347) #define __NR_kexec_load (__NR_SYSCALL_BASE+347)
/* /*
* The following SWIs are ARM private. * The following SWIs are ARM private.
......
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