diff options
Diffstat (limited to 'packages/linux/linux-omap2-git/beagleboard/02-gptimer_clear_tocr')
| -rw-r--r-- | packages/linux/linux-omap2-git/beagleboard/02-gptimer_clear_tocr | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/packages/linux/linux-omap2-git/beagleboard/02-gptimer_clear_tocr b/packages/linux/linux-omap2-git/beagleboard/02-gptimer_clear_tocr index b92c5dd126..433608132e 100644 --- a/packages/linux/linux-omap2-git/beagleboard/02-gptimer_clear_tocr +++ b/packages/linux/linux-omap2-git/beagleboard/02-gptimer_clear_tocr @@ -23,19 +23,19 @@ OMAP3530ES2.2 lots. This patch fixes the "serial hangs" reported by some BeagleBoard users. During these hangs, characters are still received from the serial port, so magic SysRq will still work; but characters are never -delivered on to the underlying line discipline. This since -tty_flip_buffer_push() uses schedule_delayed_work() to defer passing -the input buffer to the line discipline, but the delayed work function -is never called since no timer tick ever arrives. +delivered on to the underlying line discipline. The 8250 serial code +calls tty_flip_buffer_push(), which calls schedule_delayed_work() to +defer passing the input buffer to the line discipline, but since no +timer tick ever arrives, the delayed work function is never called . The patch should also fix some other sporadic boot hangs reported by BeagleBoard users that are due to timer interrupt non-delivery. --- arch/arm/mach-omap2/timer-gp.c | 1 + - arch/arm/plat-omap/dmtimer.c | 8 ++++++++ + arch/arm/plat-omap/dmtimer.c | 9 ++++++++- include/asm-arm/arch-omap/dmtimer.h | 2 ++ - 3 files changed, 11 insertions(+), 0 deletions(-) + 3 files changed, 11 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c index edc0c9e..869fe14 100644 @@ -50,14 +50,14 @@ index edc0c9e..869fe14 100644 evt->event_handler(evt); diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c -index f22506a..2cbb4cc 100644 +index f22506a..18a1e68 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c @@ -543,6 +543,8 @@ void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, while (readl(timer->io_base + (OMAP_TIMER_WRITE_PEND_REG & 0xff))) cpu_relax(); -+ omap_dm_timer_write_reg(timer, OMAP_TIMER_TICK_INT_MASK_SET_REG, 0); ++ omap_dm_timer_clear_ovf_cnt(timer); + omap_dm_timer_write_reg(timer, OMAP_TIMER_TRIGGER_REG, 0); } @@ -66,22 +66,23 @@ index f22506a..2cbb4cc 100644 omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, load); omap_dm_timer_write_reg(timer, OMAP_TIMER_LOAD_REG, load); -+ omap_dm_timer_write_reg(timer, OMAP_TIMER_TICK_INT_MASK_SET_REG, 0); ++ omap_dm_timer_clear_ovf_cnt(timer); omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l); } -@@ -614,6 +617,11 @@ void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, - omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, value); - } - +@@ -611,7 +614,11 @@ void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer, + unsigned int value) + { + omap_dm_timer_write_reg(timer, OMAP_TIMER_INT_EN_REG, value); +- omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, value); ++} ++ +void omap_dm_timer_clear_ovf_cnt(struct omap_dm_timer *timer) +{ + omap_dm_timer_write_reg(timer, OMAP_TIMER_TICK_INT_MASK_SET_REG, 0); -+} -+ + } + unsigned int omap_dm_timer_read_status(struct omap_dm_timer *timer) - { - unsigned int l; diff --git a/include/asm-arm/arch-omap/dmtimer.h b/include/asm-arm/arch-omap/dmtimer.h index 02b29e8..7b1138b 100644 --- a/include/asm-arm/arch-omap/dmtimer.h |
