Эх сурвалжийг харах

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

Linus Torvalds 20 жил өмнө
parent
commit
c94c0d201f

+ 33 - 9
arch/arm/boot/compressed/head-shark.S

@@ -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_end:	.long	0x08608000
+__copy_target:	.long	0x08507FFC
+__copy_end:	.long	0x08607FFC
 		
 		
 		.word	_start
 		.word	_start
 		.word	__bss_start
 		.word	__bss_start
@@ -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:
  * 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	r0, __ofw_data
+		adr	r2, __go_on			@ where we want to jump
+		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, #0x00500000
-		ldr	r0, __copy_target
+		sub	r2, r2, r0			@ we are mapped add 0e50 now, sub that (-0e00)
+		sub	r2, r2, #0x00500000		@ -0050
+		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

+ 3 - 3
arch/arm/kernel/smp.c

@@ -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)
  * 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)
  * 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);
 
 

+ 4 - 4
arch/arm/mach-integrator/platsmp.c

@@ -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;
-unsigned long __initdata phys_pen_release = 0;
+volatile int __cpuinitdata pen_release = -1;
+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)
 	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;
 
 

+ 1 - 1
arch/arm/mach-s3c2410/dma.c

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

+ 1 - 3
arch/arm/nwfpe/fpa11.h

@@ -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() (user_registers)
+#define GET_USERREG() ((struct pt_regs *)(THREAD_START_SP + (unsigned long)current_thread_info()) - 1)
 
 
 #include <linux/config.h>
 #include <linux/config.h>
 #include <linux/thread_info.h>
 #include <linux/thread_info.h>

+ 1 - 1
arch/arm/nwfpe/fpmodule.c

@@ -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.  */

+ 7 - 7
arch/arm/nwfpe/fpmodule.inl

@@ -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();
-	unsigned int val = userRegisters[nReg];
+	struct pt_regs *regs = GET_USERREG();
+	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)
 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();
-	userRegisters[nReg] = val;
+	struct pt_regs *regs = GET_USERREG();
+	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)
 
 
 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;
-	userRegisters[REG_CPSR] = rval | (val & CC_MASK);
+	rval = regs->ARM_cpsr & ~CC_MASK;
+	regs->ARM_cpsr = rval | (val & CC_MASK);
 }
 }

+ 7 - 7
drivers/video/imxfb.c

@@ -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
 	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)
 	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)
 {
 {
 	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 */
-	LCDC_RMCR &= ~RMCR_LCDC_EN;
+	imxfb_disable_controller(fbi);
 
 
 	unregister_framebuffer(info);
 	unregister_framebuffer(info);
 
 
@@ -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 */
-	LCDC_RMCR &= ~RMCR_LCDC_EN;
+	struct fb_info *info = dev_get_drvdata(dev);
+	struct imxfb_info *fbi = info->par;
+	imxfb_disable_controller(fbi);
 }
 }
 
 
 static struct device_driver imxfb_driver = {
 static struct device_driver imxfb_driver = {

+ 1 - 0
drivers/video/imxfb.h

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

+ 1 - 0
include/asm-arm/arch-imx/imxfb.h

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