Commit 9ca0e547 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] 3914/1: [Jornada7xx] - Typo Fix in cpu-sa1110.c (b != B)
  [ARM] 3913/1: n2100: fix IRQ routing for second ethernet port
  [ARM] Add KBUILD_IMAGE target support
  [ARM] Fix suspend oops caused by PXA2xx PCMCIA driver
  [ARM] Fix i2c-pxa slave mode support
  [ARM] 3900/1: Fix VFP Division by Zero exception handling.
  [ARM] 3899/1: Fix the normalization of the denormal double precision number.
  [ARM] 3909/1: Disable UWIND_INFO for ARM (again)
  [ARM] Add __must_check to uaccess functions
  [ARM] Add realview SMP default configuration
  [ARM] Fix SMP irqflags support
parents c0f79c4c 9f0f9313
...@@ -174,11 +174,13 @@ libs-y := arch/arm/lib/ $(libs-y) ...@@ -174,11 +174,13 @@ libs-y := arch/arm/lib/ $(libs-y)
# Default target when executing plain make # Default target when executing plain make
ifeq ($(CONFIG_XIP_KERNEL),y) ifeq ($(CONFIG_XIP_KERNEL),y)
all: xipImage KBUILD_IMAGE := xipImage
else else
all: zImage KBUILD_IMAGE := zImage
endif endif
all: $(KBUILD_IMAGE)
boot := arch/arm/boot boot := arch/arm/boot
# Update machine arch and proc symlinks if something which affects # Update machine arch and proc symlinks if something which affects
......
This diff is collapsed.
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/module.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
...@@ -19,6 +20,7 @@ ...@@ -19,6 +20,7 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/irq.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
...@@ -474,25 +476,26 @@ void show_local_irqs(struct seq_file *p) ...@@ -474,25 +476,26 @@ void show_local_irqs(struct seq_file *p)
seq_putc(p, '\n'); seq_putc(p, '\n');
} }
static void ipi_timer(struct pt_regs *regs) static void ipi_timer(void)
{ {
int user = user_mode(regs);
irq_enter(); irq_enter();
profile_tick(CPU_PROFILING, regs); profile_tick(CPU_PROFILING);
update_process_times(user); update_process_times(user_mode(get_irq_regs()));
irq_exit(); irq_exit();
} }
#ifdef CONFIG_LOCAL_TIMERS #ifdef CONFIG_LOCAL_TIMERS
asmlinkage void do_local_timer(struct pt_regs *regs) asmlinkage void do_local_timer(struct pt_regs *regs)
{ {
struct pt_regs *old_regs = set_irq_regs(regs);
int cpu = smp_processor_id(); int cpu = smp_processor_id();
if (local_timer_ack()) { if (local_timer_ack()) {
irq_stat[cpu].local_timer_irqs++; irq_stat[cpu].local_timer_irqs++;
ipi_timer(regs); ipi_timer();
} }
set_irq_regs(old_regs);
} }
#endif #endif
...@@ -551,6 +554,7 @@ asmlinkage void do_IPI(struct pt_regs *regs) ...@@ -551,6 +554,7 @@ asmlinkage void do_IPI(struct pt_regs *regs)
{ {
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
struct ipi_data *ipi = &per_cpu(ipi_data, cpu); struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
struct pt_regs *old_regs = set_irq_regs(regs);
ipi->ipi_count++; ipi->ipi_count++;
...@@ -574,7 +578,7 @@ asmlinkage void do_IPI(struct pt_regs *regs) ...@@ -574,7 +578,7 @@ asmlinkage void do_IPI(struct pt_regs *regs)
switch (nextmsg) { switch (nextmsg) {
case IPI_TIMER: case IPI_TIMER:
ipi_timer(regs); ipi_timer();
break; break;
case IPI_RESCHEDULE: case IPI_RESCHEDULE:
...@@ -599,6 +603,8 @@ asmlinkage void do_IPI(struct pt_regs *regs) ...@@ -599,6 +603,8 @@ asmlinkage void do_IPI(struct pt_regs *regs)
} }
} while (msgs); } while (msgs);
} }
set_irq_regs(old_regs);
} }
void smp_send_reschedule(int cpu) void smp_send_reschedule(int cpu)
......
...@@ -327,13 +327,12 @@ EXPORT_SYMBOL(restore_time_delta); ...@@ -327,13 +327,12 @@ EXPORT_SYMBOL(restore_time_delta);
*/ */
void timer_tick(void) void timer_tick(void)
{ {
struct pt_regs *regs = get_irq_regs();
profile_tick(CPU_PROFILING); profile_tick(CPU_PROFILING);
do_leds(); do_leds();
do_set_rtc(); do_set_rtc();
do_timer(1); do_timer(1);
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
update_process_times(user_mode(regs)); update_process_times(user_mode(get_irq_regs()));
#endif #endif
} }
......
...@@ -85,7 +85,7 @@ n2100_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) ...@@ -85,7 +85,7 @@ n2100_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
irq = IRQ_IOP32X_XINT0; irq = IRQ_IOP32X_XINT0;
} else if (PCI_SLOT(dev->devfn) == 2) { } else if (PCI_SLOT(dev->devfn) == 2) {
/* RTL8110SB #2 */ /* RTL8110SB #2 */
irq = IRQ_IOP32X_XINT1; irq = IRQ_IOP32X_XINT3;
} else if (PCI_SLOT(dev->devfn) == 3) { } else if (PCI_SLOT(dev->devfn) == 3) {
/* Sil3512 */ /* Sil3512 */
irq = IRQ_IOP32X_XINT2; irq = IRQ_IOP32X_XINT2;
......
...@@ -83,7 +83,7 @@ static struct sdram_params sdram_tbl[] __initdata = { ...@@ -83,7 +83,7 @@ static struct sdram_params sdram_tbl[] __initdata = {
.refresh = 64000, .refresh = 64000,
.cas_latency = 3, .cas_latency = 3,
}, { /* Samsung K4S281632B-1H */ }, { /* Samsung K4S281632B-1H */
.name = "K4S281632b-1H", .name = "K4S281632B-1H",
.rows = 12, .rows = 12,
.tck = 10, .tck = 10,
.trp = 20, .trp = 20,
......
...@@ -56,7 +56,7 @@ static void vfp_double_normalise_denormal(struct vfp_double *vd) ...@@ -56,7 +56,7 @@ static void vfp_double_normalise_denormal(struct vfp_double *vd)
{ {
int bits = 31 - fls(vd->significand >> 32); int bits = 31 - fls(vd->significand >> 32);
if (bits == 31) if (bits == 31)
bits = 62 - fls(vd->significand); bits = 63 - fls(vd->significand);
vfp_double_dump("normalise_denormal: in", vd); vfp_double_dump("normalise_denormal: in", vd);
......
...@@ -148,6 +148,7 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_ ...@@ -148,6 +148,7 @@ static void vfp_raise_exceptions(u32 exceptions, u32 inst, u32 fpscr, struct pt_
/* /*
* These are arranged in priority order, least to highest. * These are arranged in priority order, least to highest.
*/ */
RAISE(FPSCR_DZC, FPSCR_DZE, FPE_FLTDIV);
RAISE(FPSCR_IXC, FPSCR_IXE, FPE_FLTRES); RAISE(FPSCR_IXC, FPSCR_IXE, FPE_FLTRES);
RAISE(FPSCR_UFC, FPSCR_UFE, FPE_FLTUND); RAISE(FPSCR_UFC, FPSCR_UFE, FPE_FLTUND);
RAISE(FPSCR_OFC, FPSCR_OFE, FPE_FLTOVF); RAISE(FPSCR_OFC, FPSCR_OFE, FPE_FLTOVF);
......
...@@ -272,7 +272,8 @@ static int i2c_pxa_wait_slave(struct pxa_i2c *i2c) ...@@ -272,7 +272,8 @@ static int i2c_pxa_wait_slave(struct pxa_i2c *i2c)
dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n",
__func__, (long)jiffies, ISR, ICR, IBMR); __func__, (long)jiffies, ISR, ICR, IBMR);
if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD || if ((ISR & (ISR_UB|ISR_IBB)) == 0 ||
(ISR & ISR_SAD) != 0 ||
(ICR & ICR_SCLE) == 0) { (ICR & ICR_SCLE) == 0) {
if (i2c_debug > 1) if (i2c_debug > 1)
dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); dev_dbg(&i2c->adap.dev, "%s: done\n", __func__);
...@@ -492,7 +493,10 @@ static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr) ...@@ -492,7 +493,10 @@ static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr)
if (isr & ISR_BED) { if (isr & ISR_BED) {
/* what should we do here? */ /* what should we do here? */
} else { } else {
int ret = i2c->slave->read(i2c->slave->data); int ret = 0;
if (i2c->slave != NULL)
ret = i2c->slave->read(i2c->slave->data);
IDBR = ret; IDBR = ret;
ICR |= ICR_TB; /* allow next byte */ ICR |= ICR_TB; /* allow next byte */
......
...@@ -166,7 +166,7 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt, ...@@ -166,7 +166,7 @@ pxa2xx_pcmcia_frequency_change(struct soc_pcmcia_socket *skt,
} }
#endif #endif
int pxa2xx_drv_pcmcia_probe(struct device *dev) int __pxa2xx_drv_pcmcia_probe(struct device *dev)
{ {
int ret; int ret;
struct pcmcia_low_level *ops; struct pcmcia_low_level *ops;
...@@ -203,35 +203,52 @@ int pxa2xx_drv_pcmcia_probe(struct device *dev) ...@@ -203,35 +203,52 @@ int pxa2xx_drv_pcmcia_probe(struct device *dev)
return ret; return ret;
} }
EXPORT_SYMBOL(pxa2xx_drv_pcmcia_probe); EXPORT_SYMBOL(__pxa2xx_drv_pcmcia_probe);
static int pxa2xx_drv_pcmcia_resume(struct device *dev)
static int pxa2xx_drv_pcmcia_probe(struct platform_device *dev)
{
return __pxa2xx_drv_pcmcia_probe(&dev->dev);
}
static int pxa2xx_drv_pcmcia_remove(struct platform_device *dev)
{
return soc_common_drv_pcmcia_remove(&dev->dev);
}
static int pxa2xx_drv_pcmcia_suspend(struct platform_device *dev, pm_message_t state)
{
return pcmcia_socket_dev_suspend(&dev->dev, state);
}
static int pxa2xx_drv_pcmcia_resume(struct platform_device *dev)
{ {
struct pcmcia_low_level *ops = dev->platform_data; struct pcmcia_low_level *ops = dev->dev.platform_data;
int nr = ops ? ops->nr : 0; int nr = ops ? ops->nr : 0;
MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0); MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0);
return pcmcia_socket_dev_resume(dev); return pcmcia_socket_dev_resume(&dev->dev);
} }
static struct device_driver pxa2xx_pcmcia_driver = { static struct platform_driver pxa2xx_pcmcia_driver = {
.probe = pxa2xx_drv_pcmcia_probe, .probe = pxa2xx_drv_pcmcia_probe,
.remove = soc_common_drv_pcmcia_remove, .remove = pxa2xx_drv_pcmcia_remove,
.suspend = pcmcia_socket_dev_suspend, .suspend = pxa2xx_drv_pcmcia_suspend,
.resume = pxa2xx_drv_pcmcia_resume, .resume = pxa2xx_drv_pcmcia_resume,
.name = "pxa2xx-pcmcia", .driver = {
.bus = &platform_bus_type, .name = "pxa2xx-pcmcia",
},
}; };
static int __init pxa2xx_pcmcia_init(void) static int __init pxa2xx_pcmcia_init(void)
{ {
return driver_register(&pxa2xx_pcmcia_driver); return platform_driver_register(&pxa2xx_pcmcia_driver);
} }
static void __exit pxa2xx_pcmcia_exit(void) static void __exit pxa2xx_pcmcia_exit(void)
{ {
driver_unregister(&pxa2xx_pcmcia_driver); platform_driver_unregister(&pxa2xx_pcmcia_driver);
} }
fs_initcall(pxa2xx_pcmcia_init); fs_initcall(pxa2xx_pcmcia_init);
......
/* temporary measure */ /* temporary measure */
extern int pxa2xx_drv_pcmcia_probe(struct device *); extern int __pxa2xx_drv_pcmcia_probe(struct device *);
...@@ -260,7 +260,7 @@ int __init pcmcia_lubbock_init(struct sa1111_dev *sadev) ...@@ -260,7 +260,7 @@ int __init pcmcia_lubbock_init(struct sa1111_dev *sadev)
lubbock_set_misc_wr((1 << 15) | (1 << 14), 0); lubbock_set_misc_wr((1 << 15) | (1 << 14), 0);
sadev->dev.platform_data = &lubbock_pcmcia_ops; sadev->dev.platform_data = &lubbock_pcmcia_ops;
ret = pxa2xx_drv_pcmcia_probe(&sadev->dev); ret = __pxa2xx_drv_pcmcia_probe(&sadev->dev);
} }
return ret; return ret;
......
...@@ -383,19 +383,19 @@ do { \ ...@@ -383,19 +383,19 @@ do { \
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
extern unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n); extern unsigned long __must_check __copy_from_user(void *to, const void __user *from, unsigned long n);
extern unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n); extern unsigned long __must_check __copy_to_user(void __user *to, const void *from, unsigned long n);
extern unsigned long __clear_user(void __user *addr, unsigned long n); extern unsigned long __must_check __clear_user(void __user *addr, unsigned long n);
#else #else
#define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0) #define __copy_from_user(to,from,n) (memcpy(to, (void __force *)from, n), 0)
#define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0) #define __copy_to_user(to,from,n) (memcpy((void __force *)to, from, n), 0)
#define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0) #define __clear_user(addr,n) (memset((void __force *)addr, 0, n), 0)
#endif #endif
extern unsigned long __strncpy_from_user(char *to, const char __user *from, unsigned long count); extern unsigned long __must_check __strncpy_from_user(char *to, const char __user *from, unsigned long count);
extern unsigned long __strnlen_user(const char __user *s, long n); extern unsigned long __must_check __strnlen_user(const char __user *s, long n);
static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n)
{ {
if (access_ok(VERIFY_READ, from, n)) if (access_ok(VERIFY_READ, from, n))
n = __copy_from_user(to, from, n); n = __copy_from_user(to, from, n);
...@@ -404,7 +404,7 @@ static inline unsigned long copy_from_user(void *to, const void __user *from, un ...@@ -404,7 +404,7 @@ static inline unsigned long copy_from_user(void *to, const void __user *from, un
return n; return n;
} }
static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n)
{ {
if (access_ok(VERIFY_WRITE, to, n)) if (access_ok(VERIFY_WRITE, to, n))
n = __copy_to_user(to, from, n); n = __copy_to_user(to, from, n);
...@@ -414,14 +414,14 @@ static inline unsigned long copy_to_user(void __user *to, const void *from, unsi ...@@ -414,14 +414,14 @@ static inline unsigned long copy_to_user(void __user *to, const void *from, unsi
#define __copy_to_user_inatomic __copy_to_user #define __copy_to_user_inatomic __copy_to_user
#define __copy_from_user_inatomic __copy_from_user #define __copy_from_user_inatomic __copy_from_user
static inline unsigned long clear_user(void __user *to, unsigned long n) static inline unsigned long __must_check clear_user(void __user *to, unsigned long n)
{ {
if (access_ok(VERIFY_WRITE, to, n)) if (access_ok(VERIFY_WRITE, to, n))
n = __clear_user(to, n); n = __clear_user(to, n);
return n; return n;
} }
static inline long strncpy_from_user(char *dst, const char __user *src, long count) static inline long __must_check strncpy_from_user(char *dst, const char __user *src, long count)
{ {
long res = -EFAULT; long res = -EFAULT;
if (access_ok(VERIFY_READ, src, 1)) if (access_ok(VERIFY_READ, src, 1))
...@@ -431,7 +431,7 @@ static inline long strncpy_from_user(char *dst, const char __user *src, long cou ...@@ -431,7 +431,7 @@ static inline long strncpy_from_user(char *dst, const char __user *src, long cou
#define strlen_user(s) strnlen_user(s, ~0UL >> 1) #define strlen_user(s) strnlen_user(s, ~0UL >> 1)
static inline long strnlen_user(const char __user *s, long n) static inline long __must_check strnlen_user(const char __user *s, long n)
{ {
unsigned long res = 0; unsigned long res = 0;
......
...@@ -341,7 +341,7 @@ config FRAME_POINTER ...@@ -341,7 +341,7 @@ config FRAME_POINTER
config UNWIND_INFO config UNWIND_INFO
bool "Compile the kernel with frame unwind information" bool "Compile the kernel with frame unwind information"
depends on !IA64 && !PARISC depends on !IA64 && !PARISC && !ARM
depends on !MODULES || !(MIPS || PPC || SUPERH || V850) depends on !MODULES || !(MIPS || PPC || SUPERH || V850)
help help
If you say Y here the resulting kernel image will be slightly larger If you say Y here the resulting kernel image will be slightly larger
......
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