From 43b829b3c1aa8d4f748a8e68724df476d242365a Mon Sep 17 00:00:00 2001 From: Jingoo Han Date: Tue, 25 Jun 2013 10:08:49 +0900 Subject: serial: remove unnecessary platform_set_drvdata() The driver core clears the driver data to NULL after device_release or on probe failure, since commit 0998d0631001288a5974afc0b2a5f568bcdecb4d (device-core: Ensure drvdata = NULL when no driver is bound). Thus, it is not needed to manually clear the device driver data to NULL. Signed-off-by: Jingoo Han Acked-by: Barry Song Acked-by: Tony Prisk Acked-by: Shawn Guo Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/efm32-uart.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'drivers/tty/serial/efm32-uart.c') diff --git a/drivers/tty/serial/efm32-uart.c b/drivers/tty/serial/efm32-uart.c index 7d199c8e1a7..e029907cf43 100644 --- a/drivers/tty/serial/efm32-uart.c +++ b/drivers/tty/serial/efm32-uart.c @@ -778,8 +778,6 @@ static int efm32_uart_remove(struct platform_device *pdev) { struct efm32_uart_port *efm_port = platform_get_drvdata(pdev); - platform_set_drvdata(pdev, NULL); - uart_remove_one_port(&efm32_uart_reg, &efm_port->port); if (pdev->id >= 0 && pdev->id < ARRAY_SIZE(efm32_uart_ports)) -- cgit v1.2.3-70-g09d2 From 75e66aa65ed2224e3bb21b6c44555ff938c9046c Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Thu, 18 Jul 2013 14:51:04 +0200 Subject: serial/efm32-uart: make of_device_id array const MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/efm32-uart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/tty/serial/efm32-uart.c') diff --git a/drivers/tty/serial/efm32-uart.c b/drivers/tty/serial/efm32-uart.c index e029907cf43..868dbfb9f89 100644 --- a/drivers/tty/serial/efm32-uart.c +++ b/drivers/tty/serial/efm32-uart.c @@ -788,7 +788,7 @@ static int efm32_uart_remove(struct platform_device *pdev) return 0; } -static struct of_device_id efm32_uart_dt_ids[] = { +static const struct of_device_id efm32_uart_dt_ids[] = { { .compatible = "efm32,uart", }, { -- cgit v1.2.3-70-g09d2 From 11f1ad3ab4c2b2f208f7ef5b0360903bdf00df61 Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Tue, 30 Jul 2013 16:35:20 +0200 Subject: serial/efm32-uart: don't use pdev->id to determine the port's line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pdev->id is not a valid choice for device-tree probed devices. So use the (properly determined) line from efm32_uart_probe consistenly Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/efm32-uart.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'drivers/tty/serial/efm32-uart.c') diff --git a/drivers/tty/serial/efm32-uart.c b/drivers/tty/serial/efm32-uart.c index 868dbfb9f89..ce1ebbb0fe0 100644 --- a/drivers/tty/serial/efm32-uart.c +++ b/drivers/tty/serial/efm32-uart.c @@ -698,6 +698,7 @@ static int efm32_uart_probe(struct platform_device *pdev) { struct efm32_uart_port *efm_port; struct resource *res; + unsigned int line; int ret; efm_port = kzalloc(sizeof(*efm_port), GFP_KERNEL); @@ -752,16 +753,17 @@ static int efm32_uart_probe(struct platform_device *pdev) efm_port->pdata = *pdata; } - if (efm_port->port.line >= 0 && - efm_port->port.line < ARRAY_SIZE(efm32_uart_ports)) - efm32_uart_ports[efm_port->port.line] = efm_port; + line = efm_port->port.line; + + if (line >= 0 && line < ARRAY_SIZE(efm32_uart_ports)) + efm32_uart_ports[line] = efm_port; ret = uart_add_one_port(&efm32_uart_reg, &efm_port->port); if (ret) { dev_dbg(&pdev->dev, "failed to add port: %d\n", ret); - if (pdev->id >= 0 && pdev->id < ARRAY_SIZE(efm32_uart_ports)) - efm32_uart_ports[pdev->id] = NULL; + if (line >= 0 && line < ARRAY_SIZE(efm32_uart_ports)) + efm32_uart_ports[line] = NULL; err_get_rxirq: err_too_small: err_get_base: @@ -777,11 +779,12 @@ err_get_base: static int efm32_uart_remove(struct platform_device *pdev) { struct efm32_uart_port *efm_port = platform_get_drvdata(pdev); + unsigned int line = efm_port->port.line; uart_remove_one_port(&efm32_uart_reg, &efm_port->port); - if (pdev->id >= 0 && pdev->id < ARRAY_SIZE(efm32_uart_ports)) - efm32_uart_ports[pdev->id] = NULL; + if (line >= 0 && line < ARRAY_SIZE(efm32_uart_ports)) + efm32_uart_ports[line] = NULL; kfree(efm_port); -- cgit v1.2.3-70-g09d2 From 3fc1eb5fe5318d3eff9938240c29cc6ce2d6ce4e Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Tue, 30 Jul 2013 16:35:21 +0200 Subject: serial/efm32-uart: don't slur over failure in probe_dt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/efm32-uart.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'drivers/tty/serial/efm32-uart.c') diff --git a/drivers/tty/serial/efm32-uart.c b/drivers/tty/serial/efm32-uart.c index ce1ebbb0fe0..98adaa1c054 100644 --- a/drivers/tty/serial/efm32-uart.c +++ b/drivers/tty/serial/efm32-uart.c @@ -751,7 +751,8 @@ static int efm32_uart_probe(struct platform_device *pdev) if (pdata) efm_port->pdata = *pdata; - } + } else if (ret < 0) + goto err_probe_dt; line = efm_port->port.line; @@ -764,6 +765,7 @@ static int efm32_uart_probe(struct platform_device *pdev) if (line >= 0 && line < ARRAY_SIZE(efm32_uart_ports)) efm32_uart_ports[line] = NULL; +err_probe_dt: err_get_rxirq: err_too_small: err_get_base: -- cgit v1.2.3-70-g09d2 From 9dc99e10f068fb2175bf15cbaf4744aebc6fbd9a Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Mon, 19 Aug 2013 20:14:12 +0530 Subject: tty: serial: efm32: drop uart_port->lock before calling tty_flip_buffer_push() The current driver triggers a lockdep warning for if tty_flip_buffer_push() is called with uart_port->lock locked. This never shows up on UP kernels and comes up only on SMP kernels. Crash looks like this (produced with samsung.c driver): ----- [] (unwind_backtrace+0x0/0xf8) from [] (show_stack+0x10/0x14) [] (show_stack+0x10/0x14) from [] (dump_stack+0x6c/0xac) [] (dump_stack+0x6c/0xac) from [] (do_raw_spin_unlock+0xc4/0xd8) [] (do_raw_spin_unlock+0xc4/0xd8) from [] (_raw_spin_unlock_irqrestore+0xc/0) [] (_raw_spin_unlock_irqrestore+0xc/0x38) from [] (s3c24xx_serial_rx_chars+0) [] (s3c24xx_serial_rx_chars+0x12c/0x260) from [] (s3c64xx_serial_handle_irq+) [] (s3c64xx_serial_handle_irq+0x48/0x60) from [] (handle_irq_event_percpu+0x) [] (handle_irq_event_percpu+0x50/0x194) from [] (handle_irq_event+0x3c/0x5c) [] (handle_irq_event+0x3c/0x5c) from [] (handle_fasteoi_irq+0x80/0x13c) [] (handle_fasteoi_irq+0x80/0x13c) from [] (generic_handle_irq+0x20/0x30) [] (generic_handle_irq+0x20/0x30) from [] (handle_IRQ+0x38/0x94) [] (handle_IRQ+0x38/0x94) from [] (gic_handle_irq+0x34/0x68) [] (gic_handle_irq+0x34/0x68) from [] (__irq_svc+0x40/0x70) Exception stack(0xc04cdf70 to 0xc04cdfb8) df60: 00000000 00000000 0000166e 00000000 df80: c04cc000 c050278f c050278f 00000001 c04d444c 410fc0f4 c03649b0 00000000 dfa0: 00000001 c04cdfb8 c000f758 c000f75c 60070013 ffffffff [] (__irq_svc+0x40/0x70) from [] (arch_cpu_idle+0x28/0x30) [] (arch_cpu_idle+0x28/0x30) from [] (cpu_startup_entry+0x5c/0x148) [] (cpu_startup_entry+0x5c/0x148) from [] (start_kernel+0x334/0x38c) BUG: spinlock lockup suspected on CPU#0, kworker/0:1/360 lock: s3c24xx_serial_ports+0x1d8/0x370, .magic: dead4ead, .owner: /-1, .owner_cpu: -1 CPU: 0 PID: 360 Comm: kworker/0:1 Not tainted 3.11.0-rc6-next-20130819-00003-g75485f1 #2 Workqueue: events flush_to_ldisc [] (unwind_backtrace+0x0/0xf8) from [] (show_stack+0x10/0x14) [] (show_stack+0x10/0x14) from [] (dump_stack+0x6c/0xac) [] (dump_stack+0x6c/0xac) from [] (do_raw_spin_lock+0x100/0x17c) [] (do_raw_spin_lock+0x100/0x17c) from [] (_raw_spin_lock_irqsave+0x20/0x28) [] (_raw_spin_lock_irqsave+0x20/0x28) from [] (uart_start+0x18/0x34) [] (uart_start+0x18/0x34) from [] (__receive_buf+0x4b4/0x738) [] (__receive_buf+0x4b4/0x738) from [] (n_tty_receive_buf2+0x30/0x98) [] (n_tty_receive_buf2+0x30/0x98) from [] (flush_to_ldisc+0xec/0x138) [] (flush_to_ldisc+0xec/0x138) from [] (process_one_work+0xfc/0x348) [] (process_one_work+0xfc/0x348) from [] (worker_thread+0x138/0x37c) [] (worker_thread+0x138/0x37c) from [] (kthread+0xa4/0xb0) [] (kthread+0xa4/0xb0) from [] (ret_from_fork+0x14/0x3c) ----- Release the port lock before calling tty_flip_buffer_push() and reacquire it after the call. Similar stuff was already done for few other drivers in the past, like: commit 2389b272168ceec056ca1d8a870a97fa9c26e11a Author: Thomas Gleixner Date: Tue May 29 21:53:50 2007 +0100 [ARM] 4417/1: Serial: Fix AMBA drivers locking Signed-off-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/efm32-uart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/tty/serial/efm32-uart.c') diff --git a/drivers/tty/serial/efm32-uart.c b/drivers/tty/serial/efm32-uart.c index 98adaa1c054..0eb5b5673ed 100644 --- a/drivers/tty/serial/efm32-uart.c +++ b/drivers/tty/serial/efm32-uart.c @@ -268,10 +268,10 @@ static irqreturn_t efm32_uart_rxirq(int irq, void *data) handled = IRQ_HANDLED; } - tty_flip_buffer_push(tport); - spin_unlock(&port->lock); + tty_flip_buffer_push(tport); + return handled; } -- cgit v1.2.3-70-g09d2