summaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.24/1087-introduce-fiq-hdq.patch.patch
blob: ada6b7cd2e84320c60a21c98eaf4bad75d0875df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
From ab6e925546e3d3361ab59c2b090eccf0cb411c7b Mon Sep 17 00:00:00 2001
From: Andy Green <andy@openmoko.com>
Date: Sun, 13 Apr 2008 07:25:48 +0100
Subject: [PATCH] introduce-fiq-hdq.patch

This adds a platform driver and device which performs HDQ
battery protocol using a single GPIO pin which is set
through platform data.

HDQ has some hard latency requirements which can't
be met if interrupts are enabled, so normally using
a GPIO for this will require blocking out all other
interrupts and processes for several milliseconds
per register being read or written.

This HDQ protocol engine is a FSM implemented inside the
the FIQ ISR and regulated by timer interrupts happening
at 20us intervals.  The path through the FSM on any
"clock" is very short and should be over with in ~
1us.  Because FIQ has guaranteed latencies of <1us,
it means we can service the HDQ protocol without
blocking interrupts or any other process other than
the caller that is waiting for the result. It's pretty
cool performance from 1 GPIO ;-)

Due to it being hard to do locking from the FIQ ISR
the code simply sleeps 10ms or whatever the scheduler
gives it and checks if the transfer took place yet.

This platform driver doesn't have any knowledge about
the device it is talking to, it just knows it is a
HDQ device.  It exports three functions for read, write
and confirming HDQ is initialized.  It also exports two
/sys nodes that are usable by humans, one dumps the whole
127 register HDQ register space

# cat /sys/devices/platform/gta02-hdq.0/hdq/dump
00 44 55 00 00 00 ba 04 a2 0d 50 00 00 00 00 00
00 00 9a 1a 00 00 ff ff ff ff 29 00 00 00 80 2b
00 00 00 00 00 00 ff ff 00 00 00 00 00 32 af 06
a0 d8 37 4e 00 00 00 00 00 00 00 34 2e 03 b4 e7
00 00 06 00 41 00 4c 02 00 00 00 00 00 00 00 00
83 02 00 00 94 09 59 b9 a5 0d 7f 21 00 00 7a ff
df ff 62 ff a7 04 2e 05 00 00 00 01 00 07 00 00
2a 78 36 67 7b b5 1b a9 af 19 38 89 63 57 42 7c
#

and the other allows to set one register

# echo 2 170 > /sys/devices/platform/gta02-hdq.0/hdq/write

writes 0xAA into register 2.

Signed-off-by: Andy Green <andy@openmoko.com>
---
 defconfig-2.6.24      |    1 +
 drivers/power/Kconfig |    8 ++++++++
 2 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/defconfig-2.6.24 b/defconfig-2.6.24
index 833e15e..6d750a5 100644
--- a/defconfig-2.6.24
+++ b/defconfig-2.6.24
@@ -1825,3 +1825,4 @@ CONFIG_TEXTSEARCH_FSM=m
 CONFIG_PLIST=y
 CONFIG_HAS_IOMEM=y
 CONFIG_HAS_DMA=y
+CONFIG_GTA02_HDQ=y
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index feb8b0a..5ace872 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -63,3 +63,11 @@ config GTA02_HDQ
 	  at least BATTERY_BQ27000_HDQ as well
 
 endif # POWER_SUPPLY
+
+config GTA02_HDQ
+	tristate "Neo Freerunner HDQ"
+	depends on MACH_NEO1973_GTA02 && FIQ && S3C2440_C_FIQ
+	help
+	  Say Y to enable support for communicating with an HDQ battery
+	  on the Neo Freerunner.  You probably want to select
+	  at least BATTERY_BQ27000_HDQ as well
-- 
1.5.6.5