i2c-omap: fix OOPS in omap_i2c_unidle() during probe
Commit d84d3ea317ce0db89ce0903b4037f800c5d4c477 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-gae6be51 #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: Mika Westerberg <ext-mika.1.westerberg@nokia.com>
Cc: Cory Maccarrone <darkstar6262@gmail.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
1 file changed