• M
    i2c-omap: fix OOPS in omap_i2c_unidle() during probe · 7c6bd201
    Mika Westerberg 提交于
    Commit d84d3ea3 added register shift to allow
    also 16-bit register access. However, omap_i2c_unidle() is called before these
    are set which causes the following OOPS:
    
        Unhandled fault: alignment exception (0x801) at 0xfa070009
        Internal error: : 801 [#1]
        last sysfs file:
        Modules linked in:
        CPU: 0    Not tainted  (2.6.34-rc2-00052-gae6be51e #3)
        PC is at omap_i2c_unidle+0x44/0x138
        LR is at trace_hardirqs_on_caller+0x158/0x18c
        pc : [<c01cd2c4>]    lr : [<c00743f8>]    psr: 20000013
        sp : cfc2bf10  ip : 00000009  fp : 00000000
        r10: 00000000  r9 : 00000000  r8 : c0378560
        r7 : c0378b88  r6 : c0378558  r5 : cfcadc00  r4 : cfcadc00
        r3 : 00000009  r2 : fa070000  r1 : 00000000  r0 : 00000000
        Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
        Control: 10c5387f  Table: 80004019  DAC: 00000017
        Process swapper (pid: 1, stack limit = 0xcfc2a2e8)
        Stack: (0xcfc2bf10 to 0xcfc2c000)
        bf00:                                     c0372cf8 c027225c 00000000 c0a69678
        bf20: cfc3e508 c0500898 c0378560 c0378560 c0500898 cfcac8c0 c04fc280 c017d4f4
        bf40: c0378560 c017c63c c0378560 c0378594 c0500898 cfcac8c0 c04fc280 c017c754
        bf60: 00000000 c017c6f4 c0500898 c017beac cfc16a5c cfc3fd94 c0023448 c0500898
        bf80: c0500898 c017b7d4 c032dc7f 00000093 cfc28d40 c0023448 00000000 c0500898
        bfa0: 00000000 00000000 00000000 c017ca48 c0023448 00000000 c001d274 00000000
        bfc0: 00000000 c002b344 00000031 00000000 00000000 00000192 00000000 c0023448
        bfe0: 00000000 00000000 00000000 c0008578 00000000 c002c304 ffdfffff ffffffff
        [<c01cd2c4>] (omap_i2c_unidle+0x44/0x138) from [<c027225c>] (omap_i2c_probe+0x1a4/0x398)
        [<c027225c>] (omap_i2c_probe+0x1a4/0x398) from [<c017d4f4>] (platform_drv_probe+0x18/0x1c)
        [<c017d4f4>] (platform_drv_probe+0x18/0x1c) from [<c017c63c>] (driver_probe_device+0xc0/0x178)
        [<c017c63c>] (driver_probe_device+0xc0/0x178) from [<c017c754>] (__driver_attach+0x60/0x84)
        [<c017c754>] (__driver_attach+0x60/0x84) from [<c017beac>] (bus_for_each_dev+0x44/0x74)
        [<c017beac>] (bus_for_each_dev+0x44/0x74) from [<c017b7d4>] (bus_add_driver+0x9c/0x218)
        [<c017b7d4>] (bus_add_driver+0x9c/0x218) from [<c017ca48>] (driver_register+0xa8/0x130)
        [<c017ca48>] (driver_register+0xa8/0x130) from [<c002b344>] (do_one_initcall+0x5c/0x1b8)
        [<c002b344>] (do_one_initcall+0x5c/0x1b8) from [<c0008578>] (kernel_init+0x90/0x144)
        [<c0008578>] (kernel_init+0x90/0x144) from [<c002c304>] (kernel_thread_exit+0x0/0x8)
        Code: e5942004 e3a0c009 e1a0331c e3a01000 (e18210b3)
        ---[ end trace 1b75b31a2719ed1c ]---
    
    This patch moves register shift setting before any register accesses are done.
    Signed-off-by: NMika Westerberg <ext-mika.1.westerberg@nokia.com>
    Cc: Cory Maccarrone <darkstar6262@gmail.com>
    Signed-off-by: NBen Dooks <ben-linux@fluff.org>
    7c6bd201
i2c-omap.c 27.9 KB