All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dirk Behme <dirk.behme@googlemail.com>
To: linux-omap-open-source@linux.omap.com
Subject: Re: OMAP1 realtime patch
Date: Thu, 08 Feb 2007 19:09:57 +0100	[thread overview]
Message-ID: <45CB6775.7020500@googlemail.com> (raw)
In-Reply-To: <1170882015.11368.25.camel@vence.hilman.org>

[-- Attachment #1: Type: text/plain, Size: 4663 bytes --]

Kevin Hilman wrote:
> Here is a patch which leaves out the raw_spinlock conversions.  It goes
> on the OMAP git tree on top of -rt5 (ignoring conflicts.)  I've left out
> all the raw_spinlock conversions.  This has been tested on an
> OMAP1623/H2 platform.

Update of Kevins update. Tested on OSK.

Changes:

- Remove kernel/printk.c "+    zap_rt_locks();". It's 
already in -rt5.

- Re-add HRTIMER conversion to ads7846.c

With this patch I get Oops below after playing mp3 via NFS. 
Add raw_spinlock_t to sound/arm/omap/omap-alsa-dma.c like in 
my original patch doesn't seem to help.

Dirk


10337 frames decoded (0:04:30.0), +1.3 dB peak amplitude, 
295 clipped samples
kernel BUG at kernel/rtmutex.c:650!
Unable to handle kernel NULL pointer dereference at virtual 
address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 817 [#1]
Modules linked in: ppp_async ppp_generic slhc crc_ccitt 
rfcomm l2cap hci_usb blueti
CPU: 0
PC is at __bug+0x20/0x2c
LR is at 0xc02350f0
pc : [<c0028aa8>]    lr : [<c02350f0>]    Not tainted
sp : c032fe04  ip : 60000093  fp : c032fe10
r10: 00000000  r9 : 00000013  r8 : 00000000
r7 : 00000000  r6 : c1979d14  r5 : c032e000  r4 : a0000013
r3 : 00000000  r2 : 00000001  r1 : c032e000  r0 : 00000027
Flags: nzcv  IRQs off  FIQs on  Mode SVC_32  Segment kernel
Control: 5317F
Table: 11F90000  DAC: 00000017
Process IRQ-19 (pid: 30, stack limit = 0xc032e250)
Stack: (0xc032fe04 to 0xc0330000)
fe00:          c032fe68 c032fe14 c01bcc58 c0028a98 c035d160 
c032fe4c c032fe28
fe20: c00467f0 c0045fac 00000007 c02482a4 c035d160 00000000 
00000001 00000000
fe40: c032fe74 c1979cec 00000000 c1979d14 00000000 00000000 
00000000 c032fe78
fe60: c032fe6c c01bd04c c01bcbc8 c032fe94 c032fe7c bf0b92b0 
c01bd01c bf0b6e6c
fe80: c1e20e00 00000001 c032fea4 c032fe98 bf0a7978 bf0b9250 
c032fec4 c032fea8
fea0: bf0a77c8 bf0a7934 c1c13c00 00b5bffe c1e20e00 c1c13c00 
c032fed4 c032fec8
fec0: bf0a799c bf0a7798 c032fef4 c032fed8 bf0ade9c bf0a7990 
c1979cec c1979d14
fee0: 00000000 00000013 c032ff0c c032fef8 bf0b94ac bf0adcdc 
0000ff7f c024677c
ff00: c032ff20 c032ff10 bf0b9bc0 bf0b9494 00000020 c032ff3c 
c032ff24 c0036b8c
ff20: bf0b9b68 00000000 00000000 c032e000 c032ff54 c032ff40 
c0036bc4 c0036ae4
ff40: c02c2d20 00000000 c032ff80 c032ff58 c006fef8 c0036bb8 
c0224740 c032e000
ff60: c0224740 00000013 c02c2d20 00000000 00000000 c032ffa4 
c032ff84 c0070590
ff80: c006fe9c c0224740 c032e000 c007099c 00000013 60000013 
c032ffcc c032ffa8
ffa0: c0070a90 c0070534 00000032 c0224740 c032e000 c007099c 
c02cbe88 00000000
ffc0: c032fff4 c032ffd0 c0060e24 c00709ac ffffffff ffffffff 
00000000 00000000
ffe0: 00000000 00000000 00000000 c032fff8 c004e1f4 c0060d4c 
00000000 00000000
Backtrace:
[<c0028a88>] (__bug+0x0/0x2c) from [<c01bcc58>] 
(rt_spin_lock_slowlock+0xa0/0x204)
[<c01bcbb8>] (rt_spin_lock_slowlock+0x0/0x204) from 
[<c01bd04c>] (rt_spin_lock+0x4)
[<c01bd00c>] (rt_spin_lock+0x0/0x44) from [<bf0b92b0>] 
(snd_omap_alsa_trigger+0x70)
[<bf0b9240>] (snd_omap_alsa_trigger+0x0/0xac 
[snd_omap_alsa_aic23]) from [<bf0a797)
  r6 = 00000001  r5 = C1E20E00  r4 = BF0B6E6C
[<bf0a7924>] (snd_pcm_do_stop+0x0/0x5c [snd_pcm]) from 
[<bf0a77c8>] (snd_pcm_actio)
[<bf0a7788>] (snd_pcm_action_single+0x0/0x7c [snd_pcm]) from 
[<bf0a799c>] (snd_pcm)
  r7 = C1C13C00  r6 = C1E20E00  r5 = 00B5BFFE  r4 = C1C13C00
[<bf0a7980>] (snd_pcm_drain_done+0x0/0x24 [snd_pcm]) from 
[<bf0ade9c>] (snd_pcm_pe)
[<bf0adccc>] (snd_pcm_period_elapsed+0x0/0x278 [snd_pcm]) 
from [<bf0b94ac>] (callb)
  r7 = 00000013  r6 = 00000000  r5 = C1979D14  r4 = C1979CEC
[<bf0b9484>] (callback_omap_alsa_sound_dma+0x0/0x54 
[snd_omap_alsa_aic23]) from [<)
  r5 = C024677C  r4 = 0000FF7F
[<bf0b9b58>] (sound_dma_irq_handler+0x0/0x80 
[snd_omap_alsa_aic23]) from [<c0036b8)
  r4 = 00000020
[<c0036ad4>] (omap1_dma_handle_ch+0x0/0xd4) from 
[<c0036bc4>] (omap1_dma_irq_handl)
  r6 = C032E000  r5 = 00000000  r4 = 00000000
[<c0036ba8>] (omap1_dma_irq_handler+0x0/0x34) from 
[<c006fef8>] (handle_IRQ_event+)
  r5 = 00000000  r4 = C02C2D20
[<c006fe8c>] (handle_IRQ_event+0x0/0xf8) from [<c0070590>] 
(thread_simple_irq+0x6c)
[<c0070524>] (thread_simple_irq+0x0/0xf4) from [<c0070a90>] 
(do_irqd+0xf4/0x398)
  r8 = 60000013  r7 = 00000013  r6 = C007099C  r5 = C032E000
  r4 = C0224740
[<c007099c>] (do_irqd+0x0/0x398) from [<c0060e24>] 
(kthread+0xe8/0x128)
  r8 = 00000000  r7 = C02CBE88  r6 = C007099C  r5 = C032E000
  r4 = C0224740
[<c0060d3c>] (kthread+0x0/0x128) from [<c004e1f4>] 
(do_exit+0x0/0x860)
  r7 = 00000000  r6 = 00000000  r5 = 00000000  r4 = 00000000
Code: e1a01000 e59f000c eb008bf1 e3a03000 (e5833000)
  <6>note: IRQ-19[30] exited with preempt_count 1

[-- Attachment #2: patch-2.6.20-rt5-omap1 --]
[-- Type: text/plain, Size: 8104 bytes --]

Index: linux-osk/arch/arm/mach-omap1/time.c
===================================================================
--- linux-osk.orig/arch/arm/mach-omap1/time.c
+++ linux-osk/arch/arm/mach-omap1/time.c
@@ -42,6 +42,7 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/clocksource.h>
+#include <linux/clockchips.h>
 
 #include <asm/system.h>
 #include <asm/hardware.h>
@@ -102,15 +103,33 @@ static inline unsigned long omap_mpu_tim
 	return timer->read_tim;
 }
 
-static inline void omap_mpu_timer_start(int nr, unsigned long load_val)
+static inline void omap_mpu_set_autoreset(int nr)
 {
 	volatile omap_mpu_timer_regs_t* timer = omap_mpu_timer_base(nr);
 
+	timer->cntl = timer->cntl | MPU_TIMER_AR;
+}
+
+static inline void omap_mpu_remove_autoreset(int nr)
+{
+	volatile omap_mpu_timer_regs_t* timer = omap_mpu_timer_base(nr);
+
+	timer->cntl = timer->cntl & ~MPU_TIMER_AR;
+}
+
+static inline void omap_mpu_timer_start(int nr, unsigned long load_val,
+					int autoreset)
+{
+	volatile omap_mpu_timer_regs_t* timer = omap_mpu_timer_base(nr);
+	unsigned int timerflags = (MPU_TIMER_CLOCK_ENABLE | MPU_TIMER_ST);
+
+	if (autoreset) timerflags |= MPU_TIMER_AR;
+
 	timer->cntl = MPU_TIMER_CLOCK_ENABLE;
 	udelay(1);
 	timer->load_tim = load_val;
         udelay(1);
-	timer->cntl = (MPU_TIMER_CLOCK_ENABLE | MPU_TIMER_AR | MPU_TIMER_ST);
+	timer->cntl = timerflags;
 }
 
 /*
@@ -118,12 +137,42 @@ static inline void omap_mpu_timer_start(
  * MPU timer 1 ... count down to zero, interrupt, reload
  * ---------------------------------------------------------------------------
  */
+static int omap_mpu_set_next_event(unsigned long cycles,
+				    struct clock_event_device *evt)
+{
+	omap_mpu_timer_start(0, cycles, 0);
+	return 0;
+}
+
+static void omap_mpu_set_mode(enum clock_event_mode mode,
+			      struct clock_event_device *evt)
+{
+	switch (mode) {
+	case CLOCK_EVT_MODE_PERIODIC:
+		omap_mpu_set_autoreset(0);
+		break;
+	case CLOCK_EVT_MODE_ONESHOT:
+		omap_mpu_remove_autoreset(0);
+		break;
+	case CLOCK_EVT_MODE_UNUSED:
+	case CLOCK_EVT_MODE_SHUTDOWN:
+		break;
+	}
+}
+
+static struct clock_event_device clockevent_mpu_timer1 = {
+	.name		= "mpu_timer1",
+	.features	= CLOCK_EVT_FEAT_PERIODIC, CLOCK_EVT_FEAT_ONESHOT,
+	.shift		= 32,
+	.set_next_event	= omap_mpu_set_next_event,
+	.set_mode	= omap_mpu_set_mode,
+};
+
 static irqreturn_t omap_mpu_timer1_interrupt(int irq, void *dev_id)
 {
-	write_seqlock(&xtime_lock);
-	/* NOTE:  no lost-tick detection/handling! */
-	timer_tick();
-	write_sequnlock(&xtime_lock);
+	struct clock_event_device *evt = &clockevent_mpu_timer1;
+
+	evt->event_handler(evt);
 
 	return IRQ_HANDLED;
 }
@@ -139,7 +188,17 @@ static __init void omap_init_mpu_timer(u
 	set_cyc2ns_scale(rate / 1000);
 
 	setup_irq(INT_TIMER1, &omap_mpu_timer1_irq);
-	omap_mpu_timer_start(0, (rate / HZ) - 1);
+	omap_mpu_timer_start(0, (rate / HZ) - 1, 1);
+
+	clockevent_mpu_timer1.mult = div_sc(rate, NSEC_PER_SEC,
+					    clockevent_mpu_timer1.shift);
+	clockevent_mpu_timer1.max_delta_ns =
+		clockevent_delta2ns(-1, &clockevent_mpu_timer1);
+	clockevent_mpu_timer1.min_delta_ns =
+		clockevent_delta2ns(1, &clockevent_mpu_timer1);
+
+	clockevent_mpu_timer1.cpumask = cpumask_of_cpu(0);
+	clockevents_register_device(&clockevent_mpu_timer1);
 }
 
 /*
@@ -173,7 +232,7 @@ static struct clocksource clocksource_mp
 	.read		= mpu_read,
 	.mask		= CLOCKSOURCE_MASK(32),
 	.shift		= 24,
-	.is_continuous	= 1,
+	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 static void __init omap_init_clocksource(unsigned long rate)
@@ -185,7 +244,7 @@ static void __init omap_init_clocksource
 		= clocksource_khz2mult(rate/1000, clocksource_mpu.shift);
 
 	setup_irq(INT_TIMER2, &omap_mpu_timer2_irq);
-	omap_mpu_timer_start(1, ~0);
+	omap_mpu_timer_start(1, ~0, 1);
 
 	if (clocksource_register(&clocksource_mpu))
 		printk(err, clocksource_mpu.name);
Index: linux-osk/arch/arm/plat-omap/timer32k.c
===================================================================
--- linux-osk.orig/arch/arm/plat-omap/timer32k.c
+++ linux-osk/arch/arm/plat-omap/timer32k.c
@@ -43,6 +43,7 @@
 #include <linux/err.h>
 #include <linux/clk.h>
 #include <linux/clocksource.h>
+#include <linux/clockchips.h>
 
 #include <asm/system.h>
 #include <asm/hardware.h>
@@ -210,23 +211,10 @@ unsigned long long sched_clock(void)
  */
 static inline irqreturn_t _omap_32k_timer_interrupt(int irq, void *dev_id)
 {
-	unsigned long now;
-
+	struct clock_event_device *evt = &clockevent_32k_timer;
 	omap_32k_timer_ack_irq();
-	now = omap_32k_sync_timer_read();
 
-	while ((signed long)(now - omap_32k_last_tick)
-						>= OMAP_32K_TICKS_PER_HZ) {
-		omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ;
-		timer_tick();
-	}
-
-	/* Restart timer so we don't drift off due to modulo or dynamic tick.
-	 * By default we program the next timer to be continuous to avoid
-	 * latencies during high system load. During dynamic tick operation the
-	 * continuous timer can be overridden from pm_idle to be longer.
-	 */
-	omap_32k_timer_start(omap_32k_last_tick + OMAP_32K_TICKS_PER_HZ - now);
+	evt->event_handler(evt);
 
 	return IRQ_HANDLED;
 }
Index: linux-osk/arch/arm/plat-omap/common.c
===================================================================
--- linux-osk.orig/arch/arm/plat-omap/common.c
+++ linux-osk/arch/arm/plat-omap/common.c
@@ -212,7 +212,7 @@ static struct clocksource clocksource_32
 	.read		= omap_32k_read,
 	.mask		= CLOCKSOURCE_MASK(32),
 	.shift		= 10,
-	.is_continuous	= 1,
+	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 static int __init omap_init_clocksource_32k(void)
Index: linux-osk/kernel/irq/manage.c
===================================================================
--- linux-osk.orig/kernel/irq/manage.c
+++ linux-osk/kernel/irq/manage.c
@@ -593,6 +593,7 @@ static void thread_simple_irq(irq_desc_t
 	unsigned int irq = desc - irq_desc;
 	irqreturn_t action_ret;
 
+	restart:
 	if (action && !desc->depth) {
 		spin_unlock(&desc->lock);
 		action_ret = handle_IRQ_event(irq, action);
@@ -601,6 +602,19 @@ static void thread_simple_irq(irq_desc_t
 		if (!noirqdebug)
 			note_interrupt(irq, desc, action_ret);
 	}
+
+	/*
+	 * Some boards will disable an interrupt when it
+	 * sets IRQ_PENDING . So we have to remove the flag
+	 * and re-enable to handle it.
+	 */
+	if (desc->status & IRQ_PENDING) {
+		desc->status &= ~IRQ_PENDING;
+		if (desc->chip)
+			desc->chip->enable(irq);
+		goto restart;
+	}
+
 	desc->status &= ~IRQ_INPROGRESS;
 }
 
Index: linux-osk/drivers/input/touchscreen/ads7846.c
===================================================================
--- linux-osk.orig/drivers/input/touchscreen/ads7846.c
+++ linux-osk/drivers/input/touchscreen/ads7846.c
@@ -454,7 +454,7 @@ static void ads7846_rx(void *ads)
 			ts->spi->dev.bus_id, ts->tc.ignore, Rt);
 #endif
 		hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),
-			      HRTIMER_REL);
+			      HRTIMER_MODE_REL);
 		return;
 	}
 
@@ -473,7 +473,8 @@ static void ads7846_rx(void *ads)
 		ads7846_sync_events(ts);
 	}
 
-	hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD), HRTIMER_REL);
+	hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),
+		      HRTIMER_MODE_REL);
 }
 
 static int ads7846_debounce(void *ads, int data_idx, int *val)
@@ -558,7 +559,7 @@ static void ads7846_rx_val(void *ads)
 				status);
 }
 
-static int ads7846_timer(struct hrtimer *handle)
+static enum hrtimer_restart ads7846_timer(struct hrtimer *handle)
 {
 	struct ads7846	*ts = container_of(handle, struct ads7846, timer);
 	int		status = 0;
@@ -609,7 +610,7 @@ static irqreturn_t ads7846_irq(int irq, 
 			disable_irq(ts->spi->irq);
 			ts->pending = 1;
 			hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),
-					HRTIMER_REL);
+					HRTIMER_MODE_REL);
 		}
 	}
 	spin_unlock_irqrestore(&ts->lock, flags);
@@ -747,7 +748,7 @@ static int __devinit ads7846_probe(struc
 	ts->input = input_dev;
 	ts->hwmon = hwmon;
 
-	hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_REL);
+	hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
 	ts->timer.function = ads7846_timer;
 
 	spin_lock_init(&ts->lock);

[-- Attachment #3: Type: text/plain, Size: 0 bytes --]



  parent reply	other threads:[~2007-02-08 18:09 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-05 19:29 OMAP1 realtime patch Dirk Behme
2007-02-07 21:00 ` Kevin Hilman
2007-02-08 15:01   ` Dirk Behme
2007-02-08 18:09   ` Dirk Behme [this message]
2007-02-11 17:01     ` Dirk Behme
2007-02-12 19:24       ` Kevin Hilman
2007-02-12 19:32         ` Kevin Hilman
2007-02-12 20:34         ` Dirk Behme

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=45CB6775.7020500@googlemail.com \
    --to=dirk.behme@googlemail.com \
    --cc=linux-omap-open-source@linux.omap.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.