summaryrefslogtreecommitdiff
path: root/packages/linux/linux-omap2-git/beagleboard/02-gptimer_clear_tocr
diff options
context:
space:
mode:
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_tocr35
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