Commit c94c0d20 authored by Linus Torvalds's avatar Linus Torvalds

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

parents 8ed693d2 53776eb4
...@@ -63,8 +63,8 @@ __beginning: mov r4, r0 @ save the entry to the firmware ...@@ -63,8 +63,8 @@ __beginning: mov r4, r0 @ save the entry to the firmware
mov pc, r2 mov pc, r2
__copy_target: .long 0x08508000 __copy_target: .long 0x08507FFC
__copy_end: .long 0x08608000 __copy_end: .long 0x08607FFC
.word _start .word _start
.word __bss_start .word __bss_start
...@@ -73,9 +73,10 @@ __copy_end: .long 0x08608000 ...@@ -73,9 +73,10 @@ __copy_end: .long 0x08608000
__temp_stack: .space 128 __temp_stack: .space 128
__mmu_off: __mmu_off:
adr r0, __ofw_data adr r0, __ofw_data @ read the 1. entry of the memory map
ldr r0, [r0, #4] ldr r0, [r0, #4]
orr r0, r0, #0x00600000 orr r0, r0, #0x00600000
sub r0, r0, #4
ldr r1, __copy_end ldr r1, __copy_end
ldr r3, __copy_target ldr r3, __copy_target
...@@ -89,20 +90,43 @@ __mmu_off: ...@@ -89,20 +90,43 @@ __mmu_off:
* from 0x08500000 to 0x08508000 if we have only 8MB * from 0x08500000 to 0x08508000 if we have only 8MB
*/ */
/* As we get more 2.6-kernels it gets more and more
* uncomfortable to be bound to kernel images of 1MB only.
* So we add a loop here, to be able to copy some more.
* Alexander Schulz 2005-07-17
*/
mov r4, #3 @ How many megabytes to copy
__MoveCode: sub r4, r4, #1
__Copy: ldr r2, [r0], #-4 __Copy: ldr r2, [r0], #-4
str r2, [r1], #-4 str r2, [r1], #-4
teq r1, r3 teq r1, r3
bne __Copy bne __Copy
/* The firmware maps us in blocks of 1 MB, the next block is
_below_ the last one. So our decrementing source pointer
ist right here, but the destination pointer must be increased
by 2 MB */
add r1, r1, #0x00200000
add r3, r3, #0x00100000
teq r4, #0
bne __MoveCode
/* and jump to it */ /* and jump to it */
adr r2, __go_on adr r2, __go_on @ where we want to jump
adr r0, __ofw_data adr r0, __ofw_data @ read the 1. entry of the memory map
ldr r0, [r0, #4] ldr r0, [r0, #4]
sub r2, r2, r0 sub r2, r2, r0 @ we are mapped add 0e50 now, sub that (-0e00)
sub r2, r2, #0x00500000 sub r2, r2, #0x00500000 @ -0050
ldr r0, __copy_target ldr r0, __copy_target @ and add 0850 8000 instead
add r0, r0, #4
add r2, r2, r0 add r2, r2, r0
mov pc, r2 mov pc, r2 @ and jump there
__go_on: __go_on:
adr sp, __temp_stack adr sp, __temp_stack
......
...@@ -78,7 +78,7 @@ struct smp_call_struct { ...@@ -78,7 +78,7 @@ struct smp_call_struct {
static struct smp_call_struct * volatile smp_call_function_data; static struct smp_call_struct * volatile smp_call_function_data;
static DEFINE_SPINLOCK(smp_call_function_lock); static DEFINE_SPINLOCK(smp_call_function_lock);
int __init __cpu_up(unsigned int cpu) int __cpuinit __cpu_up(unsigned int cpu)
{ {
struct task_struct *idle; struct task_struct *idle;
pgd_t *pgd; pgd_t *pgd;
...@@ -159,7 +159,7 @@ int __init __cpu_up(unsigned int cpu) ...@@ -159,7 +159,7 @@ int __init __cpu_up(unsigned int cpu)
* This is the secondary CPU boot entry. We're using this CPUs * This is the secondary CPU boot entry. We're using this CPUs
* idle thread stack, but a set of temporary page tables. * idle thread stack, but a set of temporary page tables.
*/ */
asmlinkage void __init secondary_start_kernel(void) asmlinkage void __cpuinit secondary_start_kernel(void)
{ {
struct mm_struct *mm = &init_mm; struct mm_struct *mm = &init_mm;
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
...@@ -209,7 +209,7 @@ asmlinkage void __init secondary_start_kernel(void) ...@@ -209,7 +209,7 @@ asmlinkage void __init secondary_start_kernel(void)
* Called by both boot and secondaries to move global data into * Called by both boot and secondaries to move global data into
* per-processor storage. * per-processor storage.
*/ */
void __init smp_store_cpu_info(unsigned int cpuid) void __cpuinit smp_store_cpu_info(unsigned int cpuid)
{ {
struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid); struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpuid);
......
...@@ -27,12 +27,12 @@ extern void integrator_secondary_startup(void); ...@@ -27,12 +27,12 @@ extern void integrator_secondary_startup(void);
* control for which core is the next to come out of the secondary * control for which core is the next to come out of the secondary
* boot "holding pen" * boot "holding pen"
*/ */
volatile int __initdata pen_release = -1; volatile int __cpuinitdata pen_release = -1;
unsigned long __initdata phys_pen_release = 0; unsigned long __cpuinitdata phys_pen_release = 0;
static DEFINE_SPINLOCK(boot_lock); static DEFINE_SPINLOCK(boot_lock);
void __init platform_secondary_init(unsigned int cpu) void __cpuinit platform_secondary_init(unsigned int cpu)
{ {
/* /*
* the primary core may have used a "cross call" soft interrupt * the primary core may have used a "cross call" soft interrupt
...@@ -61,7 +61,7 @@ void __init platform_secondary_init(unsigned int cpu) ...@@ -61,7 +61,7 @@ void __init platform_secondary_init(unsigned int cpu)
spin_unlock(&boot_lock); spin_unlock(&boot_lock);
} }
int __init boot_secondary(unsigned int cpu, struct task_struct *idle) int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
{ {
unsigned long timeout; unsigned long timeout;
......
...@@ -436,7 +436,7 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id, ...@@ -436,7 +436,7 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id,
buf = kmem_cache_alloc(dma_kmem, GFP_ATOMIC); buf = kmem_cache_alloc(dma_kmem, GFP_ATOMIC);
if (buf == NULL) { if (buf == NULL) {
pr_debug("%s: out of memory (%d alloc)\n", pr_debug("%s: out of memory (%ld alloc)\n",
__FUNCTION__, sizeof(*buf)); __FUNCTION__, sizeof(*buf));
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -29,9 +29,7 @@ ...@@ -29,9 +29,7 @@
* stack+task struct. Use the same method as 'current' uses to * stack+task struct. Use the same method as 'current' uses to
* reach them. * reach them.
*/ */
register unsigned long *user_registers asm("sl"); #define GET_USERREG() ((struct pt_regs *)(THREAD_START_SP + (unsigned long)current_thread_info()) - 1)
#define GET_USERREG() (user_registers)
#include <linux/config.h> #include <linux/config.h>
#include <linux/thread_info.h> #include <linux/thread_info.h>
......
...@@ -132,7 +132,7 @@ void float_raise(signed char flags) ...@@ -132,7 +132,7 @@ void float_raise(signed char flags)
printk(KERN_DEBUG printk(KERN_DEBUG
"NWFPE: %s[%d] takes exception %08x at %p from %08lx\n", "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n",
current->comm, current->pid, flags, current->comm, current->pid, flags,
__builtin_return_address(0), GET_USERREG()[15]); __builtin_return_address(0), GET_USERREG()->ARM_pc);
#endif #endif
/* Keep SoftFloat exception flags up to date. */ /* Keep SoftFloat exception flags up to date. */
......
...@@ -28,8 +28,8 @@ static inline unsigned long readRegister(const unsigned int nReg) ...@@ -28,8 +28,8 @@ static inline unsigned long readRegister(const unsigned int nReg)
for this in this routine. LDF/STF instructions with Rn = PC for this in this routine. LDF/STF instructions with Rn = PC
depend on the PC being correct, as they use PC+8 in their depend on the PC being correct, as they use PC+8 in their
address calculations. */ address calculations. */
unsigned long *userRegisters = GET_USERREG(); struct pt_regs *regs = GET_USERREG();
unsigned int val = userRegisters[nReg]; unsigned int val = regs->uregs[nReg];
if (REG_PC == nReg) if (REG_PC == nReg)
val -= 4; val -= 4;
return val; return val;
...@@ -38,8 +38,8 @@ static inline unsigned long readRegister(const unsigned int nReg) ...@@ -38,8 +38,8 @@ static inline unsigned long readRegister(const unsigned int nReg)
static inline void static inline void
writeRegister(const unsigned int nReg, const unsigned long val) writeRegister(const unsigned int nReg, const unsigned long val)
{ {
unsigned long *userRegisters = GET_USERREG(); struct pt_regs *regs = GET_USERREG();
userRegisters[nReg] = val; regs->uregs[nReg] = val;
} }
static inline unsigned long readCPSR(void) static inline unsigned long readCPSR(void)
...@@ -63,12 +63,12 @@ static inline unsigned long readConditionCodes(void) ...@@ -63,12 +63,12 @@ static inline unsigned long readConditionCodes(void)
static inline void writeConditionCodes(const unsigned long val) static inline void writeConditionCodes(const unsigned long val)
{ {
unsigned long *userRegisters = GET_USERREG(); struct pt_regs *regs = GET_USERREG();
unsigned long rval; unsigned long rval;
/* /*
* Operate directly on userRegisters since * Operate directly on userRegisters since
* the CPSR may be the PC register itself. * the CPSR may be the PC register itself.
*/ */
rval = userRegisters[REG_CPSR] & ~CC_MASK; rval = regs->ARM_cpsr & ~CC_MASK;
userRegisters[REG_CPSR] = rval | (val & CC_MASK); regs->ARM_cpsr = rval | (val & CC_MASK);
} }
...@@ -249,9 +249,6 @@ static void imxfb_enable_controller(struct imxfb_info *fbi) ...@@ -249,9 +249,6 @@ static void imxfb_enable_controller(struct imxfb_info *fbi)
/* disable hardware cursor */ /* disable hardware cursor */
LCDC_CPOS &= ~(CPOS_CC0 | CPOS_CC1); LCDC_CPOS &= ~(CPOS_CC0 | CPOS_CC1);
/* fixed burst length (see erratum 11) */
LCDC_DMACR = DMACR_BURST | DMACR_HM(8) | DMACR_TM(2);
LCDC_RMCR = RMCR_LCDC_EN; LCDC_RMCR = RMCR_LCDC_EN;
if(fbi->backlight_power) if(fbi->backlight_power)
...@@ -359,6 +356,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf ...@@ -359,6 +356,7 @@ static int imxfb_activate_var(struct fb_var_screeninfo *var, struct fb_info *inf
LCDC_PCR = fbi->pcr; LCDC_PCR = fbi->pcr;
LCDC_PWMR = fbi->pwmr; LCDC_PWMR = fbi->pwmr;
LCDC_LSCR1 = fbi->lscr1; LCDC_LSCR1 = fbi->lscr1;
LCDC_DMACR = fbi->dmacr;
return 0; return 0;
} }
...@@ -509,6 +507,7 @@ static int __init imxfb_init_fbinfo(struct device *dev) ...@@ -509,6 +507,7 @@ static int __init imxfb_init_fbinfo(struct device *dev)
fbi->cmap_inverse = inf->cmap_inverse; fbi->cmap_inverse = inf->cmap_inverse;
fbi->pcr = inf->pcr; fbi->pcr = inf->pcr;
fbi->lscr1 = inf->lscr1; fbi->lscr1 = inf->lscr1;
fbi->dmacr = inf->dmacr;
fbi->pwmr = inf->pwmr; fbi->pwmr = inf->pwmr;
fbi->lcd_power = inf->lcd_power; fbi->lcd_power = inf->lcd_power;
fbi->backlight_power = inf->backlight_power; fbi->backlight_power = inf->backlight_power;
...@@ -642,12 +641,12 @@ static int imxfb_remove(struct device *dev) ...@@ -642,12 +641,12 @@ static int imxfb_remove(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
struct fb_info *info = dev_get_drvdata(dev); struct fb_info *info = dev_get_drvdata(dev);
struct imxfb_info *fbi = info->par;
struct resource *res; struct resource *res;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
/* disable LCD controller */ imxfb_disable_controller(fbi);
LCDC_RMCR &= ~RMCR_LCDC_EN;
unregister_framebuffer(info); unregister_framebuffer(info);
...@@ -663,8 +662,9 @@ static int imxfb_remove(struct device *dev) ...@@ -663,8 +662,9 @@ static int imxfb_remove(struct device *dev)
void imxfb_shutdown(struct device * dev) void imxfb_shutdown(struct device * dev)
{ {
/* disable LCD Controller */ struct fb_info *info = dev_get_drvdata(dev);
LCDC_RMCR &= ~RMCR_LCDC_EN; struct imxfb_info *fbi = info->par;
imxfb_disable_controller(fbi);
} }
static struct device_driver imxfb_driver = { static struct device_driver imxfb_driver = {
......
...@@ -54,6 +54,7 @@ struct imxfb_info { ...@@ -54,6 +54,7 @@ struct imxfb_info {
u_int pcr; u_int pcr;
u_int pwmr; u_int pwmr;
u_int lscr1; u_int lscr1;
u_int dmacr;
u_int cmap_inverse:1, u_int cmap_inverse:1,
cmap_static:1, cmap_static:1,
unused:30; unused:30;
......
...@@ -25,6 +25,7 @@ struct imxfb_mach_info { ...@@ -25,6 +25,7 @@ struct imxfb_mach_info {
u_int pcr; u_int pcr;
u_int pwmr; u_int pwmr;
u_int lscr1; u_int lscr1;
u_int dmacr;
u_char * fixed_screen_cpu; u_char * fixed_screen_cpu;
dma_addr_t fixed_screen_dma; dma_addr_t fixed_screen_dma;
......
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