Commit:     3269bb63eb076318ce4fb554851d047e1c9aa1a5
Parent:     b119dc3f992183a04e508fc0a09f550eb19bf30e
Author:     Maxime Bizon <[EMAIL PROTECTED]>
AuthorDate: Fri Jan 5 17:54:05 2007 +0100
Committer:  Jean Delvare <[EMAIL PROTECTED]>
CommitDate: Fri Jan 5 17:54:05 2007 +0100

    i2c-mv64xxx: Fix random oops at boot
    I have a Marvell board which has the same i2c hw block than mv64xxx, so
    I'm trying to use i2c-mv64xxx driver.
    But I get the following random oops at boot:
    Unable to handle kernel NULL pointer dereference at virtual address 00000002
    [<c0397e4c>] (mv64xxx_i2c_intr+0x0/0x2b8) from [<c02879c4>] 
    [<c0287978>] (__do_irq+0x0/0x8c) from [<c0287c0c>] (do_level_IRQ+0x68/0xc0)
     r8 = C0501E08  r7 = 00000005  r6 = C0501E08  r5 = 00000005
     r4 = C048BB78
    [<c0287ba4>] (do_level_IRQ+0x0/0xc0) from [<c02885f8>] 
     r6 = C0449C78  r5 = F1020000  r4 = FFFFFFFF
    [<c02885a8>] (asm_do_IRQ+0x0/0x134) from [<c02869c4>] (__irq_svc+0x24/0x100)
     r8 = C1CAC400  r7 = 00000005  r6 = 00000002  r5 = F1020000
     r4 = FFFFFFFF
    [<c0287efc>] (setup_irq+0x0/0x124) from [<c02880d0>] (request_irq+0xb0/0xd0)
     r7 = C041B2AC  r6 = C0397E4C  r5 = 00000000  r4 = 00000005
    [<c0288020>] (request_irq+0x0/0xd0) from [<c03985f4>] 
    [<c03984ac>] (mv64xxx_i2c_probe+0x0/0x244) from [<c038bedc>] 
    The oops is caused by a spurious interrupt that occurs when request_irq
    is called. mv64xxx_i2c_fsm() tries to read drv_data->msg, which is NULL.
    I noticed that hardware init is done after requesting irq. Thus any
    pending irq from previous hardware usage may cause this.
    The following patch fixes it:
    Signed-off-by: Maxime Bizon <[EMAIL PROTECTED]>
    Acked-by: Mark A. Greer <[EMAIL PROTECTED]>
    Signed-off-by: Jean Delvare <[EMAIL PROTECTED]>
 drivers/i2c/busses/i2c-mv64xxx.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c
index bbc8e3a..4901736 100644
--- a/drivers/i2c/busses/i2c-mv64xxx.c
+++ b/drivers/i2c/busses/i2c-mv64xxx.c
@@ -529,6 +529,8 @@ mv64xxx_i2c_probe(struct platform_device *pd)
        platform_set_drvdata(pd, drv_data);
        i2c_set_adapdata(&drv_data->adapter, drv_data);
+       mv64xxx_i2c_hw_init(drv_data);
        if (request_irq(drv_data->irq, mv64xxx_i2c_intr, 0,
                        MV64XXX_I2C_CTLR_NAME, drv_data)) {
@@ -542,8 +544,6 @@ mv64xxx_i2c_probe(struct platform_device *pd)
                goto exit_free_irq;
-       mv64xxx_i2c_hw_init(drv_data);
        return 0;
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to