Hi,
I've solved with:
#include<linux/sched.h>
static void sc_wq_handler(struct work_struct *work)
{
u8 dummy;
tda8023_readStatus(&dummy); //this access clears the interrupt
}
DECLARE_WORK(sc_wq, sc_wq_handler);
static irqreturn_t sc_irq_handler(int irq, void *dev_id)
{
schedule_work(&sc_wq);
return IRQ_HANDLED;
}
Regards,
Gabriele
_____________________________________________
Da: Gabriele Filosofi
Inviato: giovedì 9 ottobre 2008 12.37
A: '[email protected]'
Oggetto: DM644x - Fatal exception in interrupt for I2C access
Hi,
I've a device attached to I2C bus and to an IO line (GPIO37).
Please, look at the code
static int tda8023_rd(int addr, u8 *pval)
{
davinci_i2c_read (1, (char *)pval, addr);
return 0;
}
static int tda8023_readStatus(u8 *pval)
{
tda8023_rd(I2C_ADDR, pval);
...
return 0;
}
static int sc_irq_handler(int sound_curr_lch, void *ch_status)
{
u8 dummy;
tda8023_readStatus(&dummy); //this access clears the interrupt
return IRQ_HANDLED;
}
The IO port 37 was programmed as an interrupt source:
void davinci_init_sc(u8 mode)
{
gpio_request(37, "my_gpio");
gpio_direction_input(37);
request_irq(gpio_to_irq(37), &sc_irq_handler, IRQF_TRIGGER_FALLING,
"SC", NULL);
}
I've an interrupt exception when the interrupt occours:
BUG: scheduling while atomic: swapper/0/0x00010003
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 0 [#1] PREEMPT
Modules linked in:
CPU: 0 Not tainted (2.6.25-rc1-davinci1 #515)
PC is at 0x0
LR is at enqueue_task+0x1c/0x28
pc : [<00000000>] lr : [<c0036248>] psr: 40000093
sp : c0309b30 ip : c0309b44 fp : c0309b40
r10: 00000000 r9 : 00000003 r8 : c7449a00
r7 : 00000000 r6 : c030ae98 r5 : c03229b4 r4 : c030ae98
r3 : c0263f3c r2 : 00000001 r1 : c030ae98 r0 : c03229b4
Flags: nZcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 0005317f Table: 86e64000 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc0308260)
Stack: (0xc0309b30 to 0xc030a000)
9b20: c03229b4 c0309b54 c0309b44 c00362e8
9b40: c003623c 00000003 c0309b78 c0309b58 c0036d54 c00362d0 80000093 c0309dc0
9b60: 00000001 c7449a0c 00000001 c0309b88 c0309b7c c00375b0 c0036d10 c0309bb4
9b80: c0309b8c c0037604 c00375ac c0308000 80000013 00000000 00000027 00010004
9ba0: c0308000 00000000 c0309bd0 c0309bb8 c0037794 c00375c4 00000000 c7449a00
9bc0: 00000002 c0309be8 c0309bd4 c01a466c c0037750 c744a6c0 00000000 c0309c08
9be0: c0309bec c0064e0c c01a4458 c030fc00 c0308000 00000027 c744a6c0 c0309c28
9c00: c0309c0c c0066894 c0064dd8 c030fc00 00000027 c032b338 c0309f54 c0309c48
9c20: c0309c2c c0027044 c006676c ffffffff fec48000 c02c66c0 00010005 c0309d0c
9c40: c0309c4c c002763c c0027010 c030d8c8 00000001 60000013 00000000 00000001
9c60: c0308000 c02c66c0 c03232a2 c0308000 00000036 00000000 c0309d0c c030d8c8
9c80: c0309c94 c030d8c8 c003cdb8 60000013 ffffffff c77b47c0 60000013 00000000
9ca0: 00000000 c77dd054 f300a8c0 c0309cd4 c0309cbc c01db2b0 c024c964 c77a0b20
9cc0: c77b47c0 00000000 c0309cf4 c0309cd8 c0223edc c01db1c8 c77e1360 00000000
9ce0: c77e15e8 c0309f54 c0308000 c030ae98 c0309d70 c03229b4 c0261688 c030affc
9d00: c0309d1c c0309d10 c003ce38 c003cacc c0309d40 c0309d30 c00367bc c003ce30
9d20: c02c66c0 c030b08c 00000000 00010003 c0308000 c0309d6c c0309d44 c0260cc8
9d40: c003679c ffff9980 c0308000 00000064 c0309d70 c030e5c0 c030f378 00000001
9d60: c0309da8 c0309d70 c0261688 c0260c60 c0327d88 c0327d88 ffff9980 c004660c
9d80: c030ae98 c0327980 c0308000 c0309dcc c7449a0c 00000064 c7449a08 c0309df8
9da0: c0309dac c02611ec c026160c 00000000 c030ae98 c003759c 00000000 00000000
9dc0: 00000001 c030ae98 c003759c c7449a0c c7449a0c c7449a00 00000001 c0309e58
9de0: 00000000 00000001 c7449a70 c0309e08 c0309dfc c026132c c02610ac c0309e34
9e00: c0309e0c c01a4318 c0261328 c0309e3c 00000001 c7449a30 c0309e58 00000001
9e20: 0000003a 0000ffff c0309e54 c0309e38 c01a23a8 c01a415c ffffffed c0309ea7
9e40: 00000000 00000065 c0309e74 c0309e58 c0034c10 c01a2330 00010022 00000001
9e60: c0309ea7 00000000 c0309e84 c0309e78 c0033e74 c0034bcc c0309ea0 c0309e88
9e80: c0033eec c0033e68 c6a63220 00000000 00000000 c0309eb4 c0309ea4 c0034310
9ea0: c0033edc 02021e80 c0309ed4 c0309eb8 c0064e0c c0034304 c0308000 c0310990
9ec0: 00000065 c6a63220 c0309ef4 c0309ed8 c0066470 c0064dd8 00000006 00000020
9ee0: 00000066 c03109c8 c0309f30 c0309ef8 c00314d0 c00663e4 00000000 000001d0
9f00: fec67038 c0310028 c0310028 0000003a c032b338 00000000 00000001 c0308000
9f20: 80021e80 c0309f50 c0309f34 c0027044 c0031420 ffffffff fec48000 c0023f1c
9f40: 00000002 c0309fa8 c0309f54 c002763c c0027010 00000000 0005317f 0005217f
9f60: 60000013 c0308000 c0028554 c0023f1c c030bcf0 80021eb4 41069265 80021e80
9f80: c0309fa8 600000d3 c0309f9c c0028598 c00285a4 60000013 ffffffff c0309fc0
9fa0: c0309fac c00285f4 c0028564 c0308000 c0320b88 c0309fd4 c0309fc4 c02601dc
9fc0: c00285bc c032a1d8 c0309ff4 c0309fd8 c0008944 c0260180 c00082d8 c0023f20
9fe0: 00053175 c032102c 00000000 c0309ff8 80008034 c00086b4 00000000 00000000
Backtrace:
[<c003622c>] (enqueue_task+0x0/0x28) from [<c00362e8>] (activate_task+0x28/0x34)
r4:c03229b4
[<c00362c0>] (activate_task+0x0/0x34) from [<c0036d54>]
(try_to_wake_up+0x54/0xac)
r4:00000003
[<c0036d00>] (try_to_wake_up+0x0/0xac) from [<c00375b0>]
(default_wake_function+0x14/0x18)
r7:00000001 r6:c7449a0c r5:00000001 r4:c0309dc0
[<c003759c>] (default_wake_function+0x0/0x18) from [<c0037604>]
(__wake_up_common+0x50/0x84)
[<c00375b4>] (__wake_up_common+0x0/0x84) from [<c0037794>] (complete+0x54/0x78)
[<c0037740>] (complete+0x0/0x78) from [<c01a466c>] (i2c_davinci_isr+0x224/0x274)
r5:00000002 r4:c7449a00
[<c01a4448>] (i2c_davinci_isr+0x0/0x274) from [<c0064e0c>]
(handle_IRQ_event+0x44/0x84)
r5:00000000 r4:c744a6c0
[<c0064dc8>] (handle_IRQ_event+0x0/0x84) from [<c0066894>]
(handle_edge_irq+0x138/0x1ac)
r7:c744a6c0 r6:00000027 r5:c0308000 r4:c030fc00
[<c006675c>] (handle_edge_irq+0x0/0x1ac) from [<c0027044>]
(asm_do_IRQ+0x44/0x5c)
r7:c0309f54 r6:c032b338 r5:00000027 r4:c030fc00
[<c0027000>] (asm_do_IRQ+0x0/0x5c) from [<c002763c>] (__irq_svc+0x3c/0x7c)
Exception stack(0xc0309c4c to 0xc0309c94)
9c40: c030d8c8 00000001 60000013 00000000 00000001
9c60: c0308000 c02c66c0 c03232a2 c0308000 00000036 00000000 c0309d0c c030d8c8
9c80: c0309c94 c030d8c8 c003cdb8 60000013 ffffffff
r7:00010005 r6:c02c66c0 r5:fec48000 r4:ffffffff
[<c003cabc>] (vprintk+0x0/0x360) from [<c003ce38>] (printk+0x1c/0x24)
[<c003ce1c>] (printk+0x0/0x24) from [<c00367bc>] (__schedule_bug+0x30/0x58)
r3:00010003 r2:00000000 r1:c030b08c r0:c02c66c0
[<c003678c>] (__schedule_bug+0x0/0x58) from [<c0260cc8>]
(__sched_text_start+0x78/0x354)
r4:c0308000
[<c0260c50>] (__sched_text_start+0x0/0x354) from [<c0261688>]
(schedule_timeout+0x8c/0xbc)
[<c02615fc>] (schedule_timeout+0x0/0xbc) from [<c02611ec>]
(wait_for_common+0x150/0x224)
r8:c7449a08 r7:00000064 r6:c7449a0c r5:c0309dcc r4:c0308000
[<c026109c>] (wait_for_common+0x0/0x224) from [<c026132c>]
(wait_for_completion_interruptible_timeout+0x14/0x18)
[<c0261318>] (wait_for_completion_interruptible_timeout+0x0/0x18) from
[<c01a4318>] (i2c_davinci_xfer+0x1cc/0x2e4)
[<c01a414c>] (i2c_davinci_xfer+0x0/0x2e4) from [<c01a23a8>]
(i2c_transfer+0x88/0x9c)
[<c01a2320>] (i2c_transfer+0x0/0x9c) from [<c0034c10>]
(davinci_i2c_read+0x54/0x70)
r7:00000065 r6:00000000 r5:c0309ea7 r4:ffffffed
[<c0034bbc>] (davinci_i2c_read+0x0/0x70) from [<c0033e74>]
(tda8023_rd+0x1c/0x24)
r4:00000000
[<c0033e58>] (tda8023_rd+0x0/0x24) from [<c0033eec>]
(tda8023_readStatus+0x20/0x114)
[<c0033ecc>] (tda8023_readStatus+0x0/0x114) from [<c0034310>]
(sc_irq_handler+0x1c/0x30)
r6:00000000 r5:00000000 r4:c6a63220
[<c00342f4>] (sc_irq_handler+0x0/0x30) from [<c0064e0c>]
(handle_IRQ_event+0x44/0x84)
[<c0064dc8>] (handle_IRQ_event+0x0/0x84) from [<c0066470>]
(handle_simple_irq+0x9c/0xfc)
r7:c6a63220 r6:00000065 r5:c0310990 r4:c0308000
[<c00663d4>] (handle_simple_irq+0x0/0xfc) from [<c00314d0>]
(gpio_irq_handler+0xc0/0xf4)
r7:c03109c8 r6:00000066 r5:00000020 r4:00000006
[<c0031410>] (gpio_irq_handler+0x0/0xf4) from [<c0027044>]
(asm_do_IRQ+0x44/0x5c)
[<c0027000>] (asm_do_IRQ+0x0/0x5c) from [<c002763c>] (__irq_svc+0x3c/0x7c)
Exception stack(0xc0309f54 to 0xc0309f9c)
9f40: 00000000 0005317f 0005217f
9f60: 60000013 c0308000 c0028554 c0023f1c c030bcf0 80021eb4 41069265 80021e80
9f80: c0309fa8 600000d3 c0309f9c c0028598 c00285a4 60000013 ffffffff
r7:00000002 r6:c0023f1c r5:fec48000 r4:ffffffff
[<c0028554>] (default_idle+0x0/0x58) from [<c00285f4>] (cpu_idle+0x48/0x80)
[<c00285ac>] (cpu_idle+0x0/0x80) from [<c02601dc>] (rest_init+0x6c/0x7c)
r5:c0320b88 r4:c0308000
[<c0260170>] (rest_init+0x0/0x7c) from [<c0008944>] (start_kernel+0x2a0/0x308)
r4:c032a1d8
[<c00086a4>] (start_kernel+0x0/0x308) from [<80008034>] (0x80008034)
Code: bad PC value.
Kernel panic - not syncing: Fatal exception in interrupt
Why I cannot access the I2C bus from within the interrupt handler?
Regards,
Gabriele
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source