tty: serial: OMAP: Fix oops due to NULL pdata in DT boot
authorCousson, Benoit <b-cousson@ti.com>
Tue, 28 Feb 2012 17:22:12 +0000 (18:22 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 8 Mar 2012 18:56:44 +0000 (10:56 -0800)
The following commit: be4b0281956c5cae4f63f31f11d07625a6988766
(tty: serial: OMAP: block idle while the UART is transferring data in PIO mode),
is introducing an oops if OMAP is booted using device tree blob because
the pdata will not be initialized.

Check if pdata is set before de-referencing it.

Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Reviewed-by: Paul Walmsley <paul@pwsan.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/omap-serial.c

index f80904145fd4e3f5faeaa6a8440f7f5596115fde..0121486ac4fafbf3bf162ef3744772255e8380e5 100644 (file)
@@ -159,7 +159,7 @@ static void serial_omap_stop_tx(struct uart_port *port)
                serial_out(up, UART_IER, up->ier);
        }
 
-       if (!up->use_dma && pdata->set_forceidle)
+       if (!up->use_dma && pdata && pdata->set_forceidle)
                pdata->set_forceidle(up->pdev);
 
        pm_runtime_mark_last_busy(&up->pdev->dev);
@@ -298,7 +298,7 @@ static void serial_omap_start_tx(struct uart_port *port)
        if (!up->use_dma) {
                pm_runtime_get_sync(&up->pdev->dev);
                serial_omap_enable_ier_thri(up);
-               if (pdata->set_noidle)
+               if (pdata && pdata->set_noidle)
                        pdata->set_noidle(up->pdev);
                pm_runtime_mark_last_busy(&up->pdev->dev);
                pm_runtime_put_autosuspend(&up->pdev->dev);
@@ -1613,7 +1613,7 @@ static int serial_omap_runtime_resume(struct device *dev)
        struct uart_omap_port *up = dev_get_drvdata(dev);
        struct omap_uart_port_info *pdata = dev->platform_data;
 
-       if (up) {
+       if (up && pdata) {
                if (pdata->get_context_loss_count) {
                        u32 loss_cnt = pdata->get_context_loss_count(dev);