aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:11:07 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:11:07 +0000
commit1826972ef0e9d1b413d90b42dbcaa617eabf6220 (patch)
tree5215a651e5191677ce6d704bb6ec5ed765fb0241 /arch
parenta2710e79243f81b0a203eb04a311c8db07b919cb (diff)
add-gta02-fiq-begets-hdq-begets-bq27000.patch
HDQ secretly depends on FIQ, bq27000 depends on HDQ, this patch uses the new callbacks to make that explicit in both cases for our device Here's what can happen without it: [ 2.680000] Bad mode in data abort handler detected [ 2.680000] Internal error: Oops - bad mode: 0 [#1] PREEMPT [ 2.680000] Modules linked in: [ 2.680000] CPU: 0 Not tainted (2.6.24 #791) [ 2.680000] PC is at trace_hardirqs_off+0x28/0xfc [ 2.680000] LR is at fiq_kick+0x90/0xa8 [ 2.680000] pc : [<c006759c>] lr : [<c0035000>] psr: 200000d1 [ 2.680000] sp : c7c2dd98 ip : c7c2dde0 fp : c7c2ddf4 [ 2.680000] r10: 00000008 r9 : c7d70e00 r8 : 00000002 [ 2.680000] r7 : 00000009 r6 : 200000d1 r5 : 00000000 r4 : 0000006e [ 2.680000] r3 : c03ec000 r2 : 00000000 r1 : 00000000 r0 : 0000006e [ 2.680000] Flags: nzCv IRQs off FIQs off Mode FIQ_32 ISA ARM Segment kernel [ 2.680000] Control: c000717f Table: 30004000 DAC: 00000017 [ 2.680000] Process events/0 (pid: 5, stack limit = 0xc7c2c268) [ 2.680000] Stack: (0xc7c2dd98 to 0xc7c2e000) [ 2.680000] dd80: 0000006e 00000000 [ 2.680000] dda0: 00000000 c03ec000 0000006e 00000000 200000d1 00000009 00000002 c7d70e00 [ 2.680000] ddc0: 00000008 c7c2ddf4 c7c2dde0 c7c2dd98 c0035000 c006759c 200000d1 ffffffff [ 2.680000] dde0: 00000009 00000004 c7c2de0c c7c2ddf8 c01f87d0 c0034f80 c7d49260 c7d49260 [ 2.680000] de00: c7c2de34 c7c2de10 c01f80dc c01f87a8 c7d49260 00000007 c7c2de5c c7d8e000 [ 2.680000] de20: c03e2908 c7d6b000 c7c2de54 c7c2de38 c01f82d0 c01f80c0 c7c2de64 00000000 [ 2.680000] de40: 00000007 c7d70e00 c7c2de84 c7c2de58 c01f79d4 c01f8154 c7c2de84 c7c2de68 [ 2.680000] de60: c0098c28 00000000 0000008c c7d8e000 c7d49264 00000001 c7c2deb4 c7c2de88 [ 2.680000] de80: c01f7d4c c01f799c c038c450 c7d70e00 c7d6b000 00000000 c7d6b000 c03da064 [ 2.680000] dea0: c038c450 c7d70ee8 c7c2decc c7c2deb8 c01aa924 c01f7c6c 00000002 c03d9fe0 [ 2.680000] dec0: c7c2df24 c7c2ded0 c016c828 c01aa864 c7c2def4 c7c2dee0 c02eb438 00000000 [ 2.680000] dee0: c0380680 c7d867e0 c7c2df14 c7c2def8 c0227888 c02eb414 c7d49264 00000002 [ 2.680000] df00: c7c03d40 c7d49264 00000000 c7c2df68 00000000 c01f7844 c7c2df34 c7c2df28 [ 2.680000] df20: c016caa8 c016c6b8 c7c2df5c c7c2df38 c01f794c c016caa4 c7c03d40 00000002 [ 2.680000] df40: c7c03d40 c7c2c000 c7d4928c c7c2df68 c7c2df9c c7c2df60 c005a30c c01f7854 [ 2.680000] df60: 00000002 c005a2a4 c0664458 c044c148 c038c460 00000000 c7c2dfb0 c7c03d40 [ 2.680000] df80: c7c2c000 00000000 00000000 00000000 c7c2dfd4 c7c2dfa0 c005b094 c005a218 [ 2.680000] dfa0: c02e8e68 00000000 c7c2ab60 c005ecb0 c7c2dfb0 c7c2dfb0 00000000 c7c2c000 [ 2.680000] dfc0: c7c03d40 c005afb0 c7c2dff4 c7c2dfd8 c005ebac c005afc0 00000000 00000000 [ 2.680000] dfe0: 00000000 00000000 00000000 c7c2dff8 c004c138 c005eb5c 00000000 00000000 [ 2.680000] Backtrace: [ 2.680000] [<c0034f70>] (fiq_kick+0x0/0xa8) from [<c01f87d0>] (gta02hdq_read+0x38/0x90) [ 2.680000] r5:00000004 r4:00000009 [ 2.680000] [<c01f8798>] (gta02hdq_read+0x0/0x90) from [<c01f80dc>] (hdq_read16+0x2c/0x84) [ 2.680000] r5:c7d49260 r4:c7d49260 [ 2.680000] [<c01f80b0>] (hdq_read16+0x0/0x84) from [<c01f82d0>] (bq27000_battery_get_property+0x18c/0x304) [ 2.680000] [<c01f8144>] (bq27000_battery_get_property+0x0/0x304) from [<c01f79d4>] (power_supply_show_property+0x48/0x124) [ 2.680000] r6:c7d70e00 r5:00000007 r4:00000000 [ 2.680000] [<c01f798c>] (power_supply_show_property+0x0/0x124) from [<c01f7d4c>] (power_supply_uevent+0xf0/0x1a4) [ 2.680000] r8:00000001 r7:c7d49264 r6:c7d8e000 r5:0000008c r4:00000000 [ 2.680000] [<c01f7c5c>] (power_supply_uevent+0x0/0x1a4) from [<c01aa924>] (dev_uevent+0xd0/0x10c) [ 2.680000] [<c01aa854>] (dev_uevent+0x0/0x10c) from [<c016c828>] (kobject_uevent_env+0x180/0x3ec) [ 2.680000] r5:c03d9fe0 r4:00000002 [ 2.680000] [<c016c6a8>] (kobject_uevent_env+0x0/0x3ec) from [<c016caa8>] (kobject_uevent+0x14/0x18) [ 2.680000] [<c016ca94>] (kobject_uevent+0x0/0x18) from [<c01f794c>] (power_supply_changed_work+0x108/0x114) [ 2.680000] [<c01f7844>] (power_supply_changed_work+0x0/0x114) from [<c005a30c>] (run_workqueue+0x104/0x208) [ 2.680000] r8:c7c2df68 r7:c7d4928c r6:c7c2c000 r5:c7c03d40 r4:00000002 [ 2.680000] [<c005a208>] (run_workqueue+0x0/0x208) from [<c005b094>] (worker_thread+0xe4/0xf8) [ 2.680000] [<c005afb0>] (worker_thread+0x0/0xf8) from [<c005ebac>] (kthread+0x60/0x94) [ 2.680000] r6:c005afb0 r5:c7c03d40 r4:c7c2c000 [ 2.680000] [<c005eb4c>] (kthread+0x0/0x94) from [<c004c138>] (do_exit+0x0/0x6f0) [ 2.680000] r6:00000000 r5:00000000 r4:00000000 [ 2.680000] Code: e3c3303f e3520000 e593200c 089da800 (e5923a68) Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-s3c2440/mach-gta02.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
index 6b44f1731b6..ce552879709 100644
--- a/arch/arm/mach-s3c2440/mach-gta02.c
+++ b/arch/arm/mach-s3c2440/mach-gta02.c
@@ -779,6 +779,19 @@ struct platform_device sc32440_fiq_device = {
#ifdef CONFIG_GTA02_HDQ
/* HDQ */
+static void gta02_hdq_attach_child_devices(struct device *parent_device)
+{
+ switch (system_rev) {
+ case GTA02v5_SYSTEM_REV:
+ case GTA02v6_SYSTEM_REV:
+ bq27000_battery_device.dev.parent = parent_device;
+ platform_device_register(&bq27000_battery_device);
+ break;
+ default:
+ break;
+ }
+}
+
static struct resource gta02_hdq_resources[] = {
[0] = {
.start = GTA02v5_GPIO_HDQ,
@@ -786,13 +799,58 @@ static struct resource gta02_hdq_resources[] = {
},
};
+struct gta02_hdq_platform_data gta02_hdq_platform_data = {
+ .attach_child_devices = gta02_hdq_attach_child_devices
+};
+
struct platform_device gta02_hdq_device = {
.name = "gta02-hdq",
.num_resources = 1,
.resource = gta02_hdq_resources,
+ .dev = {
+ .platform_data = &gta02_hdq_platform_data,
+ },
};
#endif
+/* FIQ */
+
+static void gta02_fiq_attach_child_devices(struct device *parent_device)
+{
+#ifdef CONFIG_GTA02_HDQ
+ switch (system_rev) {
+ case GTA02v5_SYSTEM_REV:
+ case GTA02v6_SYSTEM_REV:
+ gta02_hdq_device.dev.parent = parent_device;
+ platform_device_register(&gta02_hdq_device);
+ break;
+ default:
+ break;
+ }
+#endif
+}
+
+
+static struct resource sc32440_fiq_resources[] = {
+ [0] = {
+ .flags = IORESOURCE_IRQ,
+ .start = IRQ_TIMER3,
+ .end = IRQ_TIMER3,
+ },
+};
+
+struct sc32440_fiq_platform_data gta02_sc32440_fiq_platform_data = {
+ .attach_child_devices = gta02_fiq_attach_child_devices
+};
+
+struct platform_device sc32440_fiq_device = {
+ .name = "sc32440_fiq",
+ .num_resources = 1,
+ .resource = sc32440_fiq_resources,
+ .dev = {
+ .platform_data = &gta02_sc32440_fiq_platform_data,
+ },
+};
/* NOR Flash */