Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e175a90 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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)
{
{
+4 −4
Original line number Original line Diff line number Diff line
@@ -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)
+25 −5
Original line number Original line Diff line number Diff line
@@ -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)
			}
			}
			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)


	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)
{
{
	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)


	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;
}
}


+0 −17
Original line number Original line Diff line number Diff line
@@ -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
+18 −16
Original line number Original line Diff line number Diff line
@@ -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;
#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;
#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");
Loading