diff options
author | Andy Green <andy@openmoko.com> | 2008-11-19 17:11:12 +0000 |
---|---|---|
committer | Andy Green <agreen@pads.home.warmcat.com> | 2008-11-19 17:11:12 +0000 |
commit | 53df9cfb700f5bdb144f232cc0ef02785aa5744f (patch) | |
tree | d069d38f32e8ce5ff966072b2bd13c0adb2453a6 /include/linux | |
parent | 2ea904b26ed24ece7ea09d61967fe44c1d6cc2a4 (diff) |
fix-lid302dl-bitbang-all-the-way-baby.patch
This large patch removes motion sensor from Linux SPI bitbang driver.
Previously, some access was done through Linux SPI protected
by a mutex, and the ISR access was done by platform bitbang code due
to inability of Linux SPI driver to work in the interrupt context.
Now all access is done by bitbang callbacks in mach_gta02.c and are
protected by single scheme of interrupt lockout for the duration --
I line-by-line'd the driver to confirm that best I could, adding
protection and taking more care on several /sys related paths.
Because this is no longer a Linux SPI bus driver, the path for various
/sys things have changed. They can now be found down, eg,
/sys/devices/platform/lis302dl.1/sample_rate
lis302dl.1 is the top sensor and .2 the bottom. The names of the input
susbsytem paths remain the same as before.
Not working in interrupt context made trouble using interrupt lockout as
locking
[21474615.495000] BUG: sleeping function called from invalid context at kernel/sched.c:4684
[21474615.495000] in_atomic():0, irqs_disabled():128
[21474615.495000] 2 locks held by bash/779:
[21474615.495000] #0: (&buffer->mutex){....}, at: [<c00ec1b0>] sysfs_write_file+0x30/0x80
[21474615.495000] #1: (pm_mutex){....}, at: [<c007a34c>] enter_state+0xd4/0x10c
[21474615.495000] [<c0032a14>] (dump_stack+0x0/0x14) from [<c0049410>] (__might_sleep+0xdc/0xf8)
[21474615.495000] [<c0049334>] (__might_sleep+0x0/0xf8) from [<c0316c38>] (wait_for_common+0x28/0x190)
[21474615.495000] r5:c79ffd00 r4:c79ffd4c
[21474615.495000] [<c0316c10>] (wait_for_common+0x0/0x190) from [<c0316e30>] (wait_for_completion+0x18/0x1c)
[21474615.495000] r8:c79ffd84 r7:c79c4800 r6:c79ffd00 r5:c79ffd20 r4:c79ffd4c
[21474615.495000] [<c0316e18>] (wait_for_completion+0x0/0x1c) from [<c01d28ec>] (spi_sync+0xa0/0xb8)
[21474615.495000] [<c01d284c>] (spi_sync+0x0/0xb8) from [<c020ca10>] (__reg_write+0x88/0x94)
[21474615.495000] [<c020c988>] (__reg_write+0x0/0x94) from [<c020cc30>] (lis302dl_resume+0x54/0x198)
[21474615.495000] r6:60000013 r5:c79c4800 r4:c79bc9c0
[21474615.495000] [<c020cbdc>] (lis302dl_resume+0x0/0x198) from [<c01d2fb0>] (spi_resume+0x38/0x44)
[21474615.495000] r6:00000010 r5:c79c4800 r4:c79c4974
[21474615.495000] [<c01d2f78>] (spi_resume+0x0/0x44) from [<c0198f34>] (resume_device+0x8c/0x1b0)
[21474615.495000] [<c0198ea8>] (resume_device+0x0/0x1b0) from [<c01990c0>] (dpm_resume+0x68/0x134)
[21474615.495000] r7:00000003 r6:00000010 r5:c79c4800 r4:c79c4974
[21474615.495000] [<c0199058>] (dpm_resume+0x0/0x134) from [<c01991b4>] (device_resume+0x28/0x38)
[21474615.495000] r6:00000003 r5:c08b7188 r4:00000010
[21474615.495000] [<c019918c>] (device_resume+0x0/0x38) from [<c007a0f8>] (suspend_devices_and_enter+0x110/0x180)
[21474615.495000] r4:00000000
[21474615.495000] [<c0079fe8>] (suspend_devices_and_enter+0x0/0x180) from [<c007a320>] (enter_state+0xa8/0x10c)
[21474615.495000] r6:00000003 r5:c03aa414 r4:00000000
[21474615.495000] [<c007a278>] (enter_state+0x0/0x10c) from [<c007a430>] (state_store+0xac/0xc0)
[21474615.495000] r6:c7b80000 r5:00000003 r4:c03aa414
[21474615.495000] [<c007a384>] (state_store+0x0/0xc0) from [<c014dfb4>] (kobj_attr_store+0x24/0x30)
[21474615.495000] [<c014df90>] (kobj_attr_store+0x0/0x30) from [<c00ebe58>] (flush_write_buffer+0x54/0x68)
[21474615.495000] [<c00ebe04>] (flush_write_buffer+0x0/0x68) from [<c00ec1d8>] (sysfs_write_file+0x58/0x80)
[21474615.495000] r8:c7acca80 r7:c79fff78 r6:000be408 r5:00000004 r4:c7a19ea0
[21474615.495000] [<c00ec180>] (sysfs_write_file+0x0/0x80) from [<c00a91b8>] (vfs_write+0xbc/0x14c)
[21474615.495000] [<c00a90fc>] (vfs_write+0x0/0x14c) from [<c00a9774>] (sys_write+0x4c/0x7c)
[21474615.495000] r7:00000004 r6:00000000 r5:00000000 r4:c7acca80
[21474615.495000] [<c00a9728>] (sys_write+0x0/0x7c) from [<c002dc20>] (ret_fast_syscall+0x0/0x2c)
Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/lis302dl.h | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/include/linux/lis302dl.h b/include/linux/lis302dl.h index 7daa8b39980..4578db4ad6d 100644 --- a/include/linux/lis302dl.h +++ b/include/linux/lis302dl.h @@ -15,15 +15,18 @@ struct lis302dl_platform_data { unsigned long pin_mosi; unsigned long pin_miso; int open_drain; - void (*lis302dl_bitbang_read)(struct lis302dl_info *); + int interrupt; + void (*lis302dl_bitbang_read_sample)(struct lis302dl_info *); void (*lis302dl_suspend_io)(struct lis302dl_info *, int resuming); + int (*lis302dl_bitbang_reg_read)(struct lis302dl_info *, u8 reg); + void (*lis302dl_bitbang_reg_write)(struct lis302dl_info *, u8 reg, + u8 val); }; struct lis302dl_info { struct lis302dl_platform_data *pdata; - struct spi_device *spi_dev; + struct device *dev; struct input_dev *input_dev; - struct mutex lock; unsigned int flags; u_int8_t regs[0x40]; }; |