diff mbox

[1/2,v2] ARM: OMAP4: Fix NULL pointer dereference crash.

Message ID 1250928012-5233-1-git-send-email-santosh.shilimkar@ti.com (mailing list archive)
State Superseded, archived
Delegated to: Tony Lindgren
Headers show

Commit Message

Santosh Shilimkar Aug. 22, 2009, 8 a.m. UTC
After the patch series "[PATCH 00/14] OMAP PM fixes for .31-rc"
merge in 2.6.31-rc5, the kernel crashed during boot on OMAP4430.
This patch fixes it by adding UART4 support and related code.
Without this patch omap_serial_init() would produce " NULL pointer
dereference" and kernel crashes in the bootup on OMAP4430 platform.

Some more info on the merge issue can be found here.
More info- http://lkml.org/lkml/2009/8/20/192

Note: While merging this patch,"IO_ADDRESS" needs to be changed
to "OMAP2_IO_ADDRESS" if the Tony's below series is already merged in.
http://www.mail-archive.com/linux-omap@vger.kernel.org/msg15072.html

Signed-off-by: Syed Rafiuddin <rafiuddin.syed@ti.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Acked-by: Kevin Hilman <khilman@deeprootsystems.com>
---
 arch/arm/mach-omap2/board-4430sdp.c |    2 +-
 arch/arm/mach-omap2/serial.c        |   27 ++++++++++++++++++++++++++-
 2 files changed, 27 insertions(+), 2 deletions(-)

Comments

Kevin Hilman Aug. 23, 2009, 7:56 p.m. UTC | #1
Santosh Shilimkar <santosh.shilimkar@ti.com> writes:

> After the patch series "[PATCH 00/14] OMAP PM fixes for .31-rc"
> merge in 2.6.31-rc5, the kernel crashed during boot on OMAP4430.
> This patch fixes it by adding UART4 support and related code.
> Without this patch omap_serial_init() would produce " NULL pointer
> dereference" and kernel crashes in the bootup on OMAP4430 platform.
>
> Some more info on the merge issue can be found here.
> More info- http://lkml.org/lkml/2009/8/20/192
>
> Note: While merging this patch,"IO_ADDRESS" needs to be changed
> to "OMAP2_IO_ADDRESS" if the Tony's below series is already merged in.
> http://www.mail-archive.com/linux-omap@vger.kernel.org/msg15072.html
>
> Signed-off-by: Syed Rafiuddin <rafiuddin.syed@ti.com>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Acked-by: Tony Lindgren <tony@atomide.com>
> Acked-by: Kevin Hilman <khilman@deeprootsystems.com>

One other problem, after looking at the Zoom2 UART stuff...

> ---
>  arch/arm/mach-omap2/board-4430sdp.c |    2 +-
>  arch/arm/mach-omap2/serial.c        |   27 ++++++++++++++++++++++++++-
>  2 files changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
> index b0c7402..1b22307 100644
> --- a/arch/arm/mach-omap2/board-4430sdp.c
> +++ b/arch/arm/mach-omap2/board-4430sdp.c
> @@ -39,7 +39,7 @@ static struct platform_device *sdp4430_devices[] __initdata = {
>  };
>  
>  static struct omap_uart_config sdp4430_uart_config __initdata = {
> -	.enabled_uarts	= (1 << 0) | (1 << 1) | (1 << 2),
> +	.enabled_uarts	= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3),
>  };
>  
>  static struct omap_lcd_config sdp4430_lcd_config __initdata = {
> diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
> index a7421a5..e1be77b 100644
> --- a/arch/arm/mach-omap2/serial.c
> +++ b/arch/arm/mach-omap2/serial.c
> @@ -112,7 +112,21 @@ static struct plat_serial8250_port serial_platform_data2[] = {
>  		.flags		= 0
>  	}
>  };
> -
> +#ifdef CONFIG_ARCH_OMAP4
> +static struct plat_serial8250_port serial_platform_data3[] = {
> +	{
> +		.membase	= IO_ADDRESS(OMAP_UART4_BASE),
> +		.mapbase	= OMAP_UART4_BASE,
> +		.irq		= 70,
> +		.flags		= UPF_BOOT_AUTOCONF,
> +		.iotype		= UPIO_MEM,
> +		.regshift	= 2,
> +		.uartclk	= OMAP24XX_BASE_BAUD * 16,
> +	}, {
> +		.flags		= 0
> +	}
> +};
> +#endif
>  static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
>  					   int offset)
>  {
> @@ -550,6 +564,17 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
>  			},
>  		},
>  	},
> +#ifdef CONFIG_ARCH_OMAP4
> +	{
> +		.pdev = {
> +			.name			= "serial8250",
> +			.id			= PLAT8250_DEV_FOURPORT,

This should not be FOURPORT, it should just be a number.  In this case,
it should be 3 (the others start from zero.)

The Zoom2 one should then be changed to something >= 4.

Kevin

> +			.dev			= {
> +				.platform_data	= serial_platform_data3,
> +			},
> +		},
> +	},
> +#endif
>  };
>  
>  void __init omap_serial_init(void)
> -- 
> 1.5.4.7

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kevin Hilman Aug. 24, 2009, 11:49 a.m. UTC | #2
Kevin Hilman <khilman@deeprootsystems.com> writes:

> Santosh Shilimkar <santosh.shilimkar@ti.com> writes:
>
>> After the patch series "[PATCH 00/14] OMAP PM fixes for .31-rc"
>> merge in 2.6.31-rc5, the kernel crashed during boot on OMAP4430.
>> This patch fixes it by adding UART4 support and related code.
>> Without this patch omap_serial_init() would produce " NULL pointer
>> dereference" and kernel crashes in the bootup on OMAP4430 platform.
>>
>> Some more info on the merge issue can be found here.
>> More info- http://lkml.org/lkml/2009/8/20/192
>>
>> Note: While merging this patch,"IO_ADDRESS" needs to be changed
>> to "OMAP2_IO_ADDRESS" if the Tony's below series is already merged in.
>> http://www.mail-archive.com/linux-omap@vger.kernel.org/msg15072.html
>>
>> Signed-off-by: Syed Rafiuddin <rafiuddin.syed@ti.com>
>> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
>> Acked-by: Tony Lindgren <tony@atomide.com>
>> Acked-by: Kevin Hilman <khilman@deeprootsystems.com>
>
> One other problem, after looking at the Zoom2 UART stuff...
>
>> ---
>>  arch/arm/mach-omap2/board-4430sdp.c |    2 +-
>>  arch/arm/mach-omap2/serial.c        |   27 ++++++++++++++++++++++++++-
>>  2 files changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
>> index b0c7402..1b22307 100644
>> --- a/arch/arm/mach-omap2/board-4430sdp.c
>> +++ b/arch/arm/mach-omap2/board-4430sdp.c
>> @@ -39,7 +39,7 @@ static struct platform_device *sdp4430_devices[] __initdata = {
>>  };
>>  
>>  static struct omap_uart_config sdp4430_uart_config __initdata = {
>> -	.enabled_uarts	= (1 << 0) | (1 << 1) | (1 << 2),
>> +	.enabled_uarts	= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3),
>>  };
>>  
>>  static struct omap_lcd_config sdp4430_lcd_config __initdata = {
>> diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
>> index a7421a5..e1be77b 100644
>> --- a/arch/arm/mach-omap2/serial.c
>> +++ b/arch/arm/mach-omap2/serial.c
>> @@ -112,7 +112,21 @@ static struct plat_serial8250_port serial_platform_data2[] = {
>>  		.flags		= 0
>>  	}
>>  };
>> -
>> +#ifdef CONFIG_ARCH_OMAP4
>> +static struct plat_serial8250_port serial_platform_data3[] = {
>> +	{
>> +		.membase	= IO_ADDRESS(OMAP_UART4_BASE),
>> +		.mapbase	= OMAP_UART4_BASE,
>> +		.irq		= 70,
>> +		.flags		= UPF_BOOT_AUTOCONF,
>> +		.iotype		= UPIO_MEM,
>> +		.regshift	= 2,
>> +		.uartclk	= OMAP24XX_BASE_BAUD * 16,
>> +	}, {
>> +		.flags		= 0
>> +	}
>> +};
>> +#endif
>>  static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
>>  					   int offset)
>>  {
>> @@ -550,6 +564,17 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
>>  			},
>>  		},
>>  	},
>> +#ifdef CONFIG_ARCH_OMAP4
>> +	{
>> +		.pdev = {
>> +			.name			= "serial8250",
>> +			.id			= PLAT8250_DEV_FOURPORT,
>
> This should not be FOURPORT, it should just be a number.  In this case,
> it should be 3 (the others start from zero.)

Santosh,

I've changed the .id field to '3' and will queue up this fix for the
next merge window along with my fixes queue[1].  Please let me know if you
want to do otherwise.

Kevin

[1] My fixes queue for the next window is the pm-upstream/fixes-32 branch
    which is based on Tony's for-next branch.
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Santosh Shilimkar Aug. 24, 2009, 12:26 p.m. UTC | #3
> >>  static inline unsigned int serial_read_reg(struct plat_serial8250_port
> *up,
> >>  					   int offset)
> >>  {
> >> @@ -550,6 +564,17 @@ static struct omap_uart_state
> omap_uart[OMAP_MAX_NR_PORTS] = {
> >>  			},
> >>  		},
> >>  	},
> >> +#ifdef CONFIG_ARCH_OMAP4
> >> +	{
> >> +		.pdev = {
> >> +			.name			= "serial8250",
> >> +			.id			= PLAT8250_DEV_FOURPORT,
> >
> > This should not be FOURPORT, it should just be a number.  In this case,
> > it should be 3 (the others start from zero.)
> 
> Santosh,
> 
> I've changed the .id field to '3' and will queue up this fix for the
> next merge window along with my fixes queue[1].  Please let me know if you
> want to do otherwise.

This is fine Kevin. Thanks !!

Bye the way I have also posted v3 version in which I changed the .id field to 3.

Regards,
Santosh
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kevin Hilman Aug. 24, 2009, 12:39 p.m. UTC | #4
"Shilimkar, Santosh" <santosh.shilimkar@ti.com> writes:

>> >>  static inline unsigned int serial_read_reg(struct plat_serial8250_port
>> *up,
>> >>  					   int offset)
>> >>  {
>> >> @@ -550,6 +564,17 @@ static struct omap_uart_state
>> omap_uart[OMAP_MAX_NR_PORTS] = {
>> >>  			},
>> >>  		},
>> >>  	},
>> >> +#ifdef CONFIG_ARCH_OMAP4
>> >> +	{
>> >> +		.pdev = {
>> >> +			.name			= "serial8250",
>> >> +			.id			= PLAT8250_DEV_FOURPORT,
>> >
>> > This should not be FOURPORT, it should just be a number.  In this case,
>> > it should be 3 (the others start from zero.)
>> 
>> Santosh,
>> 
>> I've changed the .id field to '3' and will queue up this fix for the
>> next merge window along with my fixes queue[1].  Please let me know if you
>> want to do otherwise.
>
> This is fine Kevin. Thanks !!
>
> Bye the way I have also posted v3 version in which I changed the .id field to 3.

Yeah, saw that after I replied.  Thanks!

Kevin


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Russell King Sept. 18, 2009, 11:51 a.m. UTC | #5
On Sun, Aug 23, 2009 at 10:56:14PM +0300, Kevin Hilman wrote:
> This should not be FOURPORT, it should just be a number.  In this case,
> it should be 3 (the others start from zero.)
> 
> The Zoom2 one should then be changed to something >= 4.

No it should not.  There's an enum to control the numbering of these.
Use that.
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index b0c7402..1b22307 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -39,7 +39,7 @@  static struct platform_device *sdp4430_devices[] __initdata = {
 };
 
 static struct omap_uart_config sdp4430_uart_config __initdata = {
-	.enabled_uarts	= (1 << 0) | (1 << 1) | (1 << 2),
+	.enabled_uarts	= (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3),
 };
 
 static struct omap_lcd_config sdp4430_lcd_config __initdata = {
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
index a7421a5..e1be77b 100644
--- a/arch/arm/mach-omap2/serial.c
+++ b/arch/arm/mach-omap2/serial.c
@@ -112,7 +112,21 @@  static struct plat_serial8250_port serial_platform_data2[] = {
 		.flags		= 0
 	}
 };
-
+#ifdef CONFIG_ARCH_OMAP4
+static struct plat_serial8250_port serial_platform_data3[] = {
+	{
+		.membase	= IO_ADDRESS(OMAP_UART4_BASE),
+		.mapbase	= OMAP_UART4_BASE,
+		.irq		= 70,
+		.flags		= UPF_BOOT_AUTOCONF,
+		.iotype		= UPIO_MEM,
+		.regshift	= 2,
+		.uartclk	= OMAP24XX_BASE_BAUD * 16,
+	}, {
+		.flags		= 0
+	}
+};
+#endif
 static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
 					   int offset)
 {
@@ -550,6 +564,17 @@  static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
 			},
 		},
 	},
+#ifdef CONFIG_ARCH_OMAP4
+	{
+		.pdev = {
+			.name			= "serial8250",
+			.id			= PLAT8250_DEV_FOURPORT,
+			.dev			= {
+				.platform_data	= serial_platform_data3,
+			},
+		},
+	},
+#endif
 };
 
 void __init omap_serial_init(void)