From d4d2dbcaedb9334d0c462129099346d617f61768 Mon Sep 17 00:00:00 2001 From: Fengguang Wu Date: Sun, 9 Sep 2012 16:23:46 +0800 Subject: [PATCH] Staging: panel: fix spinlock trylock failure on UP Use spin_lock_irq() to quiet warning: [ 8.232324] BUG: spinlock trylock failure on UP on CPU#0, reboot/85 [ 8.234138] lock: c161c760, .magic: dead4ead, .owner: reboot/85, .owner_cpu: 0 [ 8.236132] Pid: 85, comm: reboot Not tainted 3.4.0-rc7-00656-g82163ed #5 [ 8.237965] Call Trace: [ 8.238648] [] ? printk+0x18/0x1a [ 8.239827] [] spin_dump+0x80/0xd0 [ 8.241016] [] spin_bug+0x22/0x30 [ 8.242181] [] do_raw_spin_trylock+0x5b/0x70 [ 8.243611] [] _raw_spin_trylock+0xe/0x60 [ 8.244975] [] ? keypad_send_key.constprop.9+0xe0/0xe0 ==> [ 8.246638] [] panel_scan_timer+0xba/0x570 [ 8.248019] [] ? keypad_send_key.constprop.9+0xe0/0xe0 [ 8.249689] [] run_timer_softirq+0x1e5/0x370 [ 8.251191] [] ? run_timer_softirq+0x135/0x370 [ 8.252718] [] ? keypad_send_key.constprop.9+0xe0/0xe0 [ 8.254462] [] __do_softirq+0xc2/0x1c0 [ 8.255758] [] ? local_bh_enable_ip+0x130/0x130 [ 8.257228] [] ? irq_exit+0x65/0x70 [ 8.258647] [] ? smp_apic_timer_interrupt+0x49/0x80 [ 8.260226] [] ? apic_timer_interrupt+0x31/0x38 [ 8.261737] [] ? drm_vm_open_locked+0x70/0xb0 [ 8.263166] [] ? delay_tsc+0x1a/0x30 [ 8.264452] [] ? __delay+0x9/0x10 [ 8.265621] [] ? __const_udelay+0x1c/0x20 ==> [ 8.266967] [] ? lcd_clear_fast_p8+0x9c/0xe0 [ 8.268386] [] ? lcd_write+0x226/0x810 [ 8.269653] [] ? md_set_readonly+0xc0/0xc0 [ 8.271013] [] ? do_raw_spin_unlock+0x9d/0xe0 [ 8.272470] [] ? panel_lcd_print+0x38/0x40 [ 8.273837] [] ? panel_notify_sys+0x2e/0x60 [ 8.275224] [] ? notifier_call_chain+0x84/0xb0 [ 8.276754] [] ? __blocking_notifier_call_chain+0x3e/0x60 [ 8.278576] [] ? blocking_notifier_call_chain+0x1a/0x20 [ 8.280267] [] ? kernel_restart_prepare+0x14/0x40 [ 8.281901] [] ? kernel_restart+0xe/0x50 [ 8.283216] [] ? sys_reboot+0x149/0x1e0 [ 8.284532] [] ? handle_pte_fault+0x93/0xd70 [ 8.285956] [] ? do_page_fault+0x215/0x5e0 [ 8.287330] [] ? do_page_fault+0x4f3/0x5e0 [ 8.288704] [] ? up_read+0x16/0x30 [ 8.289890] [] ? do_page_fault+0x4f3/0x5e0 [ 8.291252] [] ? iterate_supers+0x86/0xd0 [ 8.292615] [] ? do_raw_spin_unlock+0x9d/0xe0 [ 8.294049] [] ? _raw_spin_unlock+0x1d/0x20 [ 8.295449] [] ? iterate_supers+0xab/0xd0 [ 8.296795] [] ? __sync_filesystem+0xa0/0xa0 [ 8.298199] [] ? sysenter_do_call+0x12/0x37 [ 8.306899] Restarting system. [ 8.307747] machine restart Signed-off-by: Fengguang Wu Signed-off-by: Greg Kroah-Hartman --- drivers/staging/panel/panel.c | 44 +++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c index d9fec5b3faac..f7426b44ee08 100644 --- a/drivers/staging/panel/panel.c +++ b/drivers/staging/panel/panel.c @@ -757,38 +757,38 @@ static void lcd_backlight(int on) return; /* The backlight is activated by setting the AUTOFEED line to +5V */ - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); bits.bl = on; panel_set_bits(); - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } /* send a command to the LCD panel in serial mode */ static void lcd_write_cmd_s(int cmd) { - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); lcd_send_serial(0x1F); /* R/W=W, RS=0 */ lcd_send_serial(cmd & 0x0F); lcd_send_serial((cmd >> 4) & 0x0F); udelay(40); /* the shortest command takes at least 40 us */ - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } /* send data to the LCD panel in serial mode */ static void lcd_write_data_s(int data) { - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); lcd_send_serial(0x5F); /* R/W=W, RS=1 */ lcd_send_serial(data & 0x0F); lcd_send_serial((data >> 4) & 0x0F); udelay(40); /* the shortest data takes at least 40 us */ - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } /* send a command to the LCD panel in 8 bits parallel mode */ static void lcd_write_cmd_p8(int cmd) { - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); /* present the data to the data port */ w_dtr(pprt, cmd); udelay(20); /* maintain the data during 20 us before the strobe */ @@ -804,13 +804,13 @@ static void lcd_write_cmd_p8(int cmd) set_ctrl_bits(); udelay(120); /* the shortest command takes at least 120 us */ - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } /* send data to the LCD panel in 8 bits parallel mode */ static void lcd_write_data_p8(int data) { - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); /* present the data to the data port */ w_dtr(pprt, data); udelay(20); /* maintain the data during 20 us before the strobe */ @@ -826,27 +826,27 @@ static void lcd_write_data_p8(int data) set_ctrl_bits(); udelay(45); /* the shortest data takes at least 45 us */ - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } /* send a command to the TI LCD panel */ static void lcd_write_cmd_tilcd(int cmd) { - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); /* present the data to the control port */ w_ctr(pprt, cmd); udelay(60); - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } /* send data to the TI LCD panel */ static void lcd_write_data_tilcd(int data) { - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); /* present the data to the data port */ w_dtr(pprt, data); udelay(60); - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } static void lcd_gotoxy(void) @@ -879,14 +879,14 @@ static void lcd_clear_fast_s(void) lcd_addr_x = lcd_addr_y = 0; lcd_gotoxy(); - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); for (pos = 0; pos < lcd_height * lcd_hwidth; pos++) { lcd_send_serial(0x5F); /* R/W=W, RS=1 */ lcd_send_serial(' ' & 0x0F); lcd_send_serial((' ' >> 4) & 0x0F); udelay(40); /* the shortest data takes at least 40 us */ } - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); lcd_addr_x = lcd_addr_y = 0; lcd_gotoxy(); @@ -899,7 +899,7 @@ static void lcd_clear_fast_p8(void) lcd_addr_x = lcd_addr_y = 0; lcd_gotoxy(); - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); for (pos = 0; pos < lcd_height * lcd_hwidth; pos++) { /* present the data to the data port */ w_dtr(pprt, ' '); @@ -921,7 +921,7 @@ static void lcd_clear_fast_p8(void) /* the shortest data takes at least 45 us */ udelay(45); } - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); lcd_addr_x = lcd_addr_y = 0; lcd_gotoxy(); @@ -934,14 +934,14 @@ static void lcd_clear_fast_tilcd(void) lcd_addr_x = lcd_addr_y = 0; lcd_gotoxy(); - spin_lock(&pprt_lock); + spin_lock_irq(&pprt_lock); for (pos = 0; pos < lcd_height * lcd_hwidth; pos++) { /* present the data to the data port */ w_dtr(pprt, ' '); udelay(60); } - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); lcd_addr_x = lcd_addr_y = 0; lcd_gotoxy(); @@ -1886,11 +1886,11 @@ static void panel_process_inputs(void) static void panel_scan_timer(void) { if (keypad_enabled && keypad_initialized) { - if (spin_trylock(&pprt_lock)) { + if (spin_trylock_irq(&pprt_lock)) { phys_scan_contacts(); /* no need for the parport anymore */ - spin_unlock(&pprt_lock); + spin_unlock_irq(&pprt_lock); } if (!inputs_stable || phys_curr != phys_prev)