diff options
Diffstat (limited to 'meta/recipes-kernel')
16 files changed, 0 insertions, 18748 deletions
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/1300-fix-gcc-4.3-false-modulo-optimization.patch.patch b/meta/recipes-kernel/linux/linux-2.6.23/1300-fix-gcc-4.3-false-modulo-optimization.patch.patch deleted file mode 100644 index 3ff0c07c18..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/1300-fix-gcc-4.3-false-modulo-optimization.patch.patch +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | From f5b973489beb1a1239dfad53e3ad6e36ff7ee958 Mon Sep 17 00:00:00 2001 | ||
2 | From: Segher Boessenkool <segher@kernel.crashing.org> | ||
3 | Date: Thu, 9 Oct 2008 21:18:27 +0100 | ||
4 | Subject: [PATCH] fix-gcc-4.3-false-modulo-optimization.patch | ||
5 | |||
6 | I tried to compile the current stable kernel | ||
7 | (a2ef813d2f439a3e9f377d33a2e5baad098afb7e) | ||
8 | and get the following errors: | ||
9 | |||
10 | kernel/built-in.o: In function `timespec_add_ns': | ||
11 | /mnt/data/Freerunner/Gentoo/rootinstall/usr/src/linux/include/linux/time.h:174: | ||
12 | undefined reference to `__aeabi_uldivmod' | ||
13 | /mnt/data/Freerunner/Gentoo/rootinstall/usr/src/linux/include/linux/time.h:179: | ||
14 | undefined reference to `__aeabi_uldivmod' | ||
15 | /mnt/data/Freerunner/Gentoo/rootinstall/usr/src/linux/include/linux/time.h:174: | ||
16 | undefined reference to `__aeabi_uldivmod' | ||
17 | /mnt/data/Freerunner/Gentoo/rootinstall/usr/src/linux/include/linux/time.h:179: | ||
18 | undefined reference to `__aeabi_uldivmod' | ||
19 | |||
20 | applying the following patch solved the problem: | ||
21 | -------- | ||
22 | Prevent gcc-4.3 form "optimizing" the while loop into a costly modulo operation. | ||
23 | Patch found at http://lkml.org/lkml/2008/2/22/464. | ||
24 | |||
25 | Reported-by: Sven Rebhan <odinshorse@googlemail.com> | ||
26 | Signed-off-by: Segher Boessenkool <segher@kernel.crashing.org> | ||
27 | --- | ||
28 | include/linux/time.h | 4 ++++ | ||
29 | 1 files changed, 4 insertions(+), 0 deletions(-) | ||
30 | |||
31 | diff --git a/include/linux/time.h b/include/linux/time.h | ||
32 | index b04136d..3e8fd9e 100644 | ||
33 | --- a/include/linux/time.h | ||
34 | +++ b/include/linux/time.h | ||
35 | @@ -173,6 +173,10 @@ static inline void timespec_add_ns(struct timespec *a, u64 ns) | ||
36 | { | ||
37 | ns += a->tv_nsec; | ||
38 | while(unlikely(ns >= NSEC_PER_SEC)) { | ||
39 | + /* The following asm() prevents the compiler from | ||
40 | + * optimising this loop into a modulo operation. */ | ||
41 | + asm("" : "+r"(ns)); | ||
42 | + | ||
43 | ns -= NSEC_PER_SEC; | ||
44 | a->tv_sec++; | ||
45 | } | ||
46 | -- | ||
47 | 1.5.6.5 | ||
48 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/binutils-buildid-arm.patch b/meta/recipes-kernel/linux/linux-2.6.23/binutils-buildid-arm.patch deleted file mode 100644 index 68e35e89e1..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/binutils-buildid-arm.patch +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | --- | ||
2 | arch/arm/kernel/vmlinux.lds.S | 1 + | ||
3 | 1 file changed, 1 insertion(+) | ||
4 | |||
5 | Index: linux-2.6.22/arch/arm/kernel/vmlinux.lds.S | ||
6 | =================================================================== | ||
7 | --- linux-2.6.22.orig/arch/arm/kernel/vmlinux.lds.S 2007-09-11 18:32:29.000000000 +0200 | ||
8 | +++ linux-2.6.22/arch/arm/kernel/vmlinux.lds.S 2007-09-11 18:33:42.000000000 +0200 | ||
9 | @@ -94,6 +94,7 @@ | ||
10 | TEXT_TEXT | ||
11 | SCHED_TEXT | ||
12 | LOCK_TEXT | ||
13 | + *(.note.*) | ||
14 | #ifdef CONFIG_MMU | ||
15 | *(.fixup) | ||
16 | #endif | ||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0001-cm-x270-base2.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0001-cm-x270-base2.patch deleted file mode 100644 index dc68ce9d43..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0001-cm-x270-base2.patch +++ /dev/null | |||
@@ -1,2851 +0,0 @@ | |||
1 | From 299199b0cf17d0247a58af6ccd6cf6b859c60e9a Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 18:55:59 -0400 | ||
4 | Subject: [PATCH] cm-x270-base2 | ||
5 | |||
6 | --- | ||
7 | arch/arm/Kconfig | 8 +- | ||
8 | arch/arm/configs/cm_x270_defconfig | 1567 +++++++++++++++++++++++++++++++++++ | ||
9 | arch/arm/mach-pxa/Kconfig | 6 + | ||
10 | arch/arm/mach-pxa/Makefile | 7 + | ||
11 | arch/arm/mach-pxa/cm-x270.c | 821 ++++++++++++++++++ | ||
12 | drivers/leds/Kconfig | 6 + | ||
13 | drivers/leds/Makefile | 1 + | ||
14 | drivers/leds/leds-cm-x270.c | 126 +++ | ||
15 | drivers/net/Kconfig | 8 + | ||
16 | drivers/net/dm9000.c | 6 + | ||
17 | include/asm-arm/arch-pxa/cm-x270.h | 71 ++ | ||
18 | include/asm-arm/arch-pxa/hardware.h | 11 + | ||
19 | include/asm-arm/arch-pxa/irqs.h | 20 + | ||
20 | include/asm-arm/memory.h | 10 + | ||
21 | 14 files changed, 2667 insertions(+), 1 deletions(-) | ||
22 | create mode 100644 arch/arm/configs/cm_x270_defconfig | ||
23 | create mode 100644 arch/arm/mach-pxa/cm-x270.c | ||
24 | create mode 100644 drivers/leds/leds-cm-x270.c | ||
25 | create mode 100644 include/asm-arm/arch-pxa/cm-x270.h | ||
26 | |||
27 | diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig | ||
28 | index 691aae3..b9a2b11 100644 | ||
29 | --- a/arch/arm/Kconfig | ||
30 | +++ b/arch/arm/Kconfig | ||
31 | @@ -534,7 +534,7 @@ config ISA_DMA_API | ||
32 | bool | ||
33 | |||
34 | config PCI | ||
35 | - bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX || ARCH_KS8695 | ||
36 | + bool "PCI support" if ARCH_INTEGRATOR_AP || ARCH_VERSATILE_PB || ARCH_IXP4XX || ARCH_KS8695 || MACH_ARMCORE | ||
37 | help | ||
38 | Find out whether you have a PCI motherboard. PCI is the name of a | ||
39 | bus system, i.e. the way the CPU talks to the other stuff inside | ||
40 | @@ -555,6 +555,12 @@ config PCI_HOST_VIA82C505 | ||
41 | depends on PCI && ARCH_SHARK | ||
42 | default y | ||
43 | |||
44 | +config PCI_HOST_ITE8152 | ||
45 | + bool | ||
46 | + depends on PCI && MACH_ARMCORE | ||
47 | + default y | ||
48 | + select DMABOUNCE | ||
49 | + | ||
50 | source "drivers/pci/Kconfig" | ||
51 | |||
52 | source "drivers/pcmcia/Kconfig" | ||
53 | diff --git a/arch/arm/configs/cm_x270_defconfig b/arch/arm/configs/cm_x270_defconfig | ||
54 | new file mode 100644 | ||
55 | index 0000000..f728363 | ||
56 | --- /dev/null | ||
57 | +++ b/arch/arm/configs/cm_x270_defconfig | ||
58 | @@ -0,0 +1,1567 @@ | ||
59 | +# | ||
60 | +# Automatically generated make config: don't edit | ||
61 | +# Linux kernel version: 2.6.21-rc4 | ||
62 | +# Wed Apr 4 16:42:03 2007 | ||
63 | +# | ||
64 | +CONFIG_ARM=y | ||
65 | +CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
66 | +CONFIG_GENERIC_GPIO=y | ||
67 | +CONFIG_GENERIC_TIME=y | ||
68 | +CONFIG_MMU=y | ||
69 | +# CONFIG_NO_IOPORT is not set | ||
70 | +CONFIG_GENERIC_HARDIRQS=y | ||
71 | +CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
72 | +CONFIG_HARDIRQS_SW_RESEND=y | ||
73 | +CONFIG_GENERIC_IRQ_PROBE=y | ||
74 | +CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
75 | +# CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
76 | +# CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
77 | +CONFIG_GENERIC_HWEIGHT=y | ||
78 | +CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
79 | +CONFIG_ZONE_DMA=y | ||
80 | +CONFIG_ARCH_MTD_XIP=y | ||
81 | +CONFIG_VECTORS_BASE=0xffff0000 | ||
82 | +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
83 | + | ||
84 | +# | ||
85 | +# Code maturity level options | ||
86 | +# | ||
87 | +CONFIG_EXPERIMENTAL=y | ||
88 | +CONFIG_BROKEN_ON_SMP=y | ||
89 | +CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
90 | + | ||
91 | +# | ||
92 | +# General setup | ||
93 | +# | ||
94 | +CONFIG_LOCALVERSION="" | ||
95 | +# CONFIG_LOCALVERSION_AUTO is not set | ||
96 | +CONFIG_SWAP=y | ||
97 | +CONFIG_SYSVIPC=y | ||
98 | +# CONFIG_IPC_NS is not set | ||
99 | +CONFIG_SYSVIPC_SYSCTL=y | ||
100 | +# CONFIG_POSIX_MQUEUE is not set | ||
101 | +# CONFIG_BSD_PROCESS_ACCT is not set | ||
102 | +# CONFIG_TASKSTATS is not set | ||
103 | +# CONFIG_UTS_NS is not set | ||
104 | +# CONFIG_AUDIT is not set | ||
105 | +CONFIG_IKCONFIG=y | ||
106 | +CONFIG_IKCONFIG_PROC=y | ||
107 | +CONFIG_SYSFS_DEPRECATED=y | ||
108 | +# CONFIG_RELAY is not set | ||
109 | +CONFIG_BLK_DEV_INITRD=y | ||
110 | +CONFIG_INITRAMFS_SOURCE="" | ||
111 | +CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
112 | +CONFIG_SYSCTL=y | ||
113 | +CONFIG_EMBEDDED=y | ||
114 | +CONFIG_UID16=y | ||
115 | +CONFIG_SYSCTL_SYSCALL=y | ||
116 | +CONFIG_KALLSYMS=y | ||
117 | +# CONFIG_KALLSYMS_ALL is not set | ||
118 | +# CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
119 | +CONFIG_HOTPLUG=y | ||
120 | +CONFIG_PRINTK=y | ||
121 | +CONFIG_BUG=y | ||
122 | +CONFIG_ELF_CORE=y | ||
123 | +CONFIG_BASE_FULL=y | ||
124 | +CONFIG_FUTEX=y | ||
125 | +CONFIG_EPOLL=y | ||
126 | +CONFIG_SHMEM=y | ||
127 | +CONFIG_SLAB=y | ||
128 | +CONFIG_VM_EVENT_COUNTERS=y | ||
129 | +CONFIG_RT_MUTEXES=y | ||
130 | +# CONFIG_TINY_SHMEM is not set | ||
131 | +CONFIG_BASE_SMALL=0 | ||
132 | +# CONFIG_SLOB is not set | ||
133 | + | ||
134 | +# | ||
135 | +# Loadable module support | ||
136 | +# | ||
137 | +CONFIG_MODULES=y | ||
138 | +CONFIG_MODULE_UNLOAD=y | ||
139 | +CONFIG_MODULE_FORCE_UNLOAD=y | ||
140 | +# CONFIG_MODVERSIONS is not set | ||
141 | +# CONFIG_MODULE_SRCVERSION_ALL is not set | ||
142 | +CONFIG_KMOD=y | ||
143 | + | ||
144 | +# | ||
145 | +# Block layer | ||
146 | +# | ||
147 | +CONFIG_BLOCK=y | ||
148 | +# CONFIG_LBD is not set | ||
149 | +# CONFIG_BLK_DEV_IO_TRACE is not set | ||
150 | +# CONFIG_LSF is not set | ||
151 | + | ||
152 | +# | ||
153 | +# IO Schedulers | ||
154 | +# | ||
155 | +CONFIG_IOSCHED_NOOP=y | ||
156 | +CONFIG_IOSCHED_AS=y | ||
157 | +CONFIG_IOSCHED_DEADLINE=y | ||
158 | +CONFIG_IOSCHED_CFQ=y | ||
159 | +CONFIG_DEFAULT_AS=y | ||
160 | +# CONFIG_DEFAULT_DEADLINE is not set | ||
161 | +# CONFIG_DEFAULT_CFQ is not set | ||
162 | +# CONFIG_DEFAULT_NOOP is not set | ||
163 | +CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
164 | + | ||
165 | +# | ||
166 | +# System Type | ||
167 | +# | ||
168 | +# CONFIG_ARCH_AAEC2000 is not set | ||
169 | +# CONFIG_ARCH_INTEGRATOR is not set | ||
170 | +# CONFIG_ARCH_REALVIEW is not set | ||
171 | +# CONFIG_ARCH_VERSATILE is not set | ||
172 | +# CONFIG_ARCH_AT91 is not set | ||
173 | +# CONFIG_ARCH_CLPS7500 is not set | ||
174 | +# CONFIG_ARCH_CLPS711X is not set | ||
175 | +# CONFIG_ARCH_CO285 is not set | ||
176 | +# CONFIG_ARCH_EBSA110 is not set | ||
177 | +# CONFIG_ARCH_EP93XX is not set | ||
178 | +# CONFIG_ARCH_FOOTBRIDGE is not set | ||
179 | +# CONFIG_ARCH_NETX is not set | ||
180 | +# CONFIG_ARCH_H720X is not set | ||
181 | +# CONFIG_ARCH_IMX is not set | ||
182 | +# CONFIG_ARCH_IOP32X is not set | ||
183 | +# CONFIG_ARCH_IOP33X is not set | ||
184 | +# CONFIG_ARCH_IOP13XX is not set | ||
185 | +# CONFIG_ARCH_IXP4XX is not set | ||
186 | +# CONFIG_ARCH_IXP2000 is not set | ||
187 | +# CONFIG_ARCH_IXP23XX is not set | ||
188 | +# CONFIG_ARCH_L7200 is not set | ||
189 | +# CONFIG_ARCH_NS9XXX is not set | ||
190 | +# CONFIG_ARCH_PNX4008 is not set | ||
191 | +CONFIG_ARCH_PXA=y | ||
192 | +# CONFIG_ARCH_RPC is not set | ||
193 | +# CONFIG_ARCH_SA1100 is not set | ||
194 | +# CONFIG_ARCH_S3C2410 is not set | ||
195 | +# CONFIG_ARCH_SHARK is not set | ||
196 | +# CONFIG_ARCH_LH7A40X is not set | ||
197 | +# CONFIG_ARCH_OMAP is not set | ||
198 | +CONFIG_DMABOUNCE=y | ||
199 | + | ||
200 | +# | ||
201 | +# Intel PXA2xx Implementations | ||
202 | +# | ||
203 | +# CONFIG_ARCH_LUBBOCK is not set | ||
204 | +# CONFIG_MACH_LOGICPD_PXA270 is not set | ||
205 | +# CONFIG_MACH_MAINSTONE is not set | ||
206 | +# CONFIG_ARCH_PXA_IDP is not set | ||
207 | +# CONFIG_PXA_SHARPSL is not set | ||
208 | +# CONFIG_MACH_TRIZEPS4 is not set | ||
209 | +CONFIG_MACH_ARMCORE=y | ||
210 | +CONFIG_PXA27x=y | ||
211 | + | ||
212 | +# | ||
213 | +# Processor Type | ||
214 | +# | ||
215 | +CONFIG_CPU_32=y | ||
216 | +CONFIG_CPU_XSCALE=y | ||
217 | +CONFIG_CPU_32v5=y | ||
218 | +CONFIG_CPU_ABRT_EV5T=y | ||
219 | +CONFIG_CPU_CACHE_VIVT=y | ||
220 | +CONFIG_CPU_TLB_V4WBI=y | ||
221 | +CONFIG_CPU_CP15=y | ||
222 | +CONFIG_CPU_CP15_MMU=y | ||
223 | + | ||
224 | +# | ||
225 | +# Processor Features | ||
226 | +# | ||
227 | +CONFIG_ARM_THUMB=y | ||
228 | +# CONFIG_CPU_DCACHE_DISABLE is not set | ||
229 | +# CONFIG_OUTER_CACHE is not set | ||
230 | +CONFIG_IWMMXT=y | ||
231 | +CONFIG_XSCALE_PMU=y | ||
232 | + | ||
233 | +# | ||
234 | +# Bus support | ||
235 | +# | ||
236 | +CONFIG_PCI=y | ||
237 | +CONFIG_PCI_HOST_ITE8152=y | ||
238 | +# CONFIG_PCI_DEBUG is not set | ||
239 | + | ||
240 | +# | ||
241 | +# PCCARD (PCMCIA/CardBus) support | ||
242 | +# | ||
243 | +CONFIG_PCCARD=y | ||
244 | +# CONFIG_PCMCIA_DEBUG is not set | ||
245 | +CONFIG_PCMCIA=m | ||
246 | +# CONFIG_PCMCIA_LOAD_CIS is not set | ||
247 | +CONFIG_PCMCIA_IOCTL=y | ||
248 | +CONFIG_CARDBUS=y | ||
249 | + | ||
250 | +# | ||
251 | +# PC-card bridges | ||
252 | +# | ||
253 | +# CONFIG_YENTA is not set | ||
254 | +# CONFIG_PD6729 is not set | ||
255 | +# CONFIG_I82092 is not set | ||
256 | +CONFIG_PCMCIA_PXA2XX=m | ||
257 | + | ||
258 | +# | ||
259 | +# Kernel Features | ||
260 | +# | ||
261 | +# CONFIG_PREEMPT is not set | ||
262 | +# CONFIG_NO_IDLE_HZ is not set | ||
263 | +CONFIG_HZ=100 | ||
264 | +# CONFIG_AEABI is not set | ||
265 | +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
266 | +CONFIG_SELECT_MEMORY_MODEL=y | ||
267 | +CONFIG_FLATMEM_MANUAL=y | ||
268 | +# CONFIG_DISCONTIGMEM_MANUAL is not set | ||
269 | +# CONFIG_SPARSEMEM_MANUAL is not set | ||
270 | +CONFIG_FLATMEM=y | ||
271 | +CONFIG_FLAT_NODE_MEM_MAP=y | ||
272 | +# CONFIG_SPARSEMEM_STATIC is not set | ||
273 | +CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
274 | +# CONFIG_RESOURCES_64BIT is not set | ||
275 | +CONFIG_ZONE_DMA_FLAG=1 | ||
276 | +CONFIG_ALIGNMENT_TRAP=y | ||
277 | + | ||
278 | +# | ||
279 | +# Boot options | ||
280 | +# | ||
281 | +CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
282 | +CONFIG_ZBOOT_ROM_BSS=0x0 | ||
283 | +CONFIG_CMDLINE="" | ||
284 | +# CONFIG_XIP_KERNEL is not set | ||
285 | +# CONFIG_KEXEC is not set | ||
286 | + | ||
287 | +# | ||
288 | +# Floating point emulation | ||
289 | +# | ||
290 | + | ||
291 | +# | ||
292 | +# At least one emulation must be selected | ||
293 | +# | ||
294 | +CONFIG_FPE_NWFPE=y | ||
295 | +# CONFIG_FPE_NWFPE_XP is not set | ||
296 | +# CONFIG_FPE_FASTFPE is not set | ||
297 | + | ||
298 | +# | ||
299 | +# Userspace binary formats | ||
300 | +# | ||
301 | +CONFIG_BINFMT_ELF=y | ||
302 | +# CONFIG_BINFMT_AOUT is not set | ||
303 | +# CONFIG_BINFMT_MISC is not set | ||
304 | +# CONFIG_ARTHUR is not set | ||
305 | + | ||
306 | +# | ||
307 | +# Power management options | ||
308 | +# | ||
309 | +CONFIG_PM=y | ||
310 | +# CONFIG_PM_LEGACY is not set | ||
311 | +# CONFIG_PM_DEBUG is not set | ||
312 | +# CONFIG_PM_SYSFS_DEPRECATED is not set | ||
313 | +# CONFIG_APM_EMULATION is not set | ||
314 | + | ||
315 | +# | ||
316 | +# Networking | ||
317 | +# | ||
318 | +CONFIG_NET=y | ||
319 | + | ||
320 | +# | ||
321 | +# Networking options | ||
322 | +# | ||
323 | +# CONFIG_NETDEBUG is not set | ||
324 | +CONFIG_PACKET=y | ||
325 | +# CONFIG_PACKET_MMAP is not set | ||
326 | +CONFIG_UNIX=y | ||
327 | +CONFIG_XFRM=y | ||
328 | +# CONFIG_XFRM_USER is not set | ||
329 | +# CONFIG_XFRM_SUB_POLICY is not set | ||
330 | +# CONFIG_XFRM_MIGRATE is not set | ||
331 | +# CONFIG_NET_KEY is not set | ||
332 | +CONFIG_INET=y | ||
333 | +# CONFIG_IP_MULTICAST is not set | ||
334 | +# CONFIG_IP_ADVANCED_ROUTER is not set | ||
335 | +CONFIG_IP_FIB_HASH=y | ||
336 | +CONFIG_IP_PNP=y | ||
337 | +CONFIG_IP_PNP_DHCP=y | ||
338 | +CONFIG_IP_PNP_BOOTP=y | ||
339 | +# CONFIG_IP_PNP_RARP is not set | ||
340 | +# CONFIG_NET_IPIP is not set | ||
341 | +# CONFIG_NET_IPGRE is not set | ||
342 | +# CONFIG_ARPD is not set | ||
343 | +# CONFIG_SYN_COOKIES is not set | ||
344 | +# CONFIG_INET_AH is not set | ||
345 | +# CONFIG_INET_ESP is not set | ||
346 | +# CONFIG_INET_IPCOMP is not set | ||
347 | +# CONFIG_INET_XFRM_TUNNEL is not set | ||
348 | +# CONFIG_INET_TUNNEL is not set | ||
349 | +CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
350 | +CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
351 | +CONFIG_INET_XFRM_MODE_BEET=y | ||
352 | +CONFIG_INET_DIAG=y | ||
353 | +CONFIG_INET_TCP_DIAG=y | ||
354 | +# CONFIG_TCP_CONG_ADVANCED is not set | ||
355 | +CONFIG_TCP_CONG_CUBIC=y | ||
356 | +CONFIG_DEFAULT_TCP_CONG="cubic" | ||
357 | +# CONFIG_TCP_MD5SIG is not set | ||
358 | +# CONFIG_IPV6 is not set | ||
359 | +# CONFIG_INET6_XFRM_TUNNEL is not set | ||
360 | +# CONFIG_INET6_TUNNEL is not set | ||
361 | +# CONFIG_NETWORK_SECMARK is not set | ||
362 | +# CONFIG_NETFILTER is not set | ||
363 | + | ||
364 | +# | ||
365 | +# DCCP Configuration (EXPERIMENTAL) | ||
366 | +# | ||
367 | +# CONFIG_IP_DCCP is not set | ||
368 | + | ||
369 | +# | ||
370 | +# SCTP Configuration (EXPERIMENTAL) | ||
371 | +# | ||
372 | +# CONFIG_IP_SCTP is not set | ||
373 | + | ||
374 | +# | ||
375 | +# TIPC Configuration (EXPERIMENTAL) | ||
376 | +# | ||
377 | +# CONFIG_TIPC is not set | ||
378 | +# CONFIG_ATM is not set | ||
379 | +# CONFIG_BRIDGE is not set | ||
380 | +# CONFIG_VLAN_8021Q is not set | ||
381 | +# CONFIG_DECNET is not set | ||
382 | +# CONFIG_LLC2 is not set | ||
383 | +# CONFIG_IPX is not set | ||
384 | +# CONFIG_ATALK is not set | ||
385 | +# CONFIG_X25 is not set | ||
386 | +# CONFIG_LAPB is not set | ||
387 | +# CONFIG_ECONET is not set | ||
388 | +# CONFIG_WAN_ROUTER is not set | ||
389 | + | ||
390 | +# | ||
391 | +# QoS and/or fair queueing | ||
392 | +# | ||
393 | +# CONFIG_NET_SCHED is not set | ||
394 | + | ||
395 | +# | ||
396 | +# Network testing | ||
397 | +# | ||
398 | +# CONFIG_NET_PKTGEN is not set | ||
399 | +# CONFIG_HAMRADIO is not set | ||
400 | +# CONFIG_IRDA is not set | ||
401 | +# CONFIG_BT is not set | ||
402 | +CONFIG_IEEE80211=m | ||
403 | +# CONFIG_IEEE80211_DEBUG is not set | ||
404 | +CONFIG_IEEE80211_CRYPT_WEP=m | ||
405 | +CONFIG_IEEE80211_CRYPT_CCMP=m | ||
406 | +# CONFIG_IEEE80211_CRYPT_TKIP is not set | ||
407 | +# CONFIG_IEEE80211_SOFTMAC is not set | ||
408 | +CONFIG_WIRELESS_EXT=y | ||
409 | + | ||
410 | +# | ||
411 | +# Device Drivers | ||
412 | +# | ||
413 | + | ||
414 | +# | ||
415 | +# Generic Driver Options | ||
416 | +# | ||
417 | +CONFIG_STANDALONE=y | ||
418 | +CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
419 | +CONFIG_FW_LOADER=y | ||
420 | +# CONFIG_DEBUG_DRIVER is not set | ||
421 | +# CONFIG_DEBUG_DEVRES is not set | ||
422 | +# CONFIG_SYS_HYPERVISOR is not set | ||
423 | + | ||
424 | +# | ||
425 | +# Connector - unified userspace <-> kernelspace linker | ||
426 | +# | ||
427 | +# CONFIG_CONNECTOR is not set | ||
428 | + | ||
429 | +# | ||
430 | +# Memory Technology Devices (MTD) | ||
431 | +# | ||
432 | +CONFIG_MTD=m | ||
433 | +# CONFIG_MTD_DEBUG is not set | ||
434 | +# CONFIG_MTD_CONCAT is not set | ||
435 | +CONFIG_MTD_PARTITIONS=y | ||
436 | +# CONFIG_MTD_REDBOOT_PARTS is not set | ||
437 | +# CONFIG_MTD_AFS_PARTS is not set | ||
438 | + | ||
439 | +# | ||
440 | +# User Modules And Translation Layers | ||
441 | +# | ||
442 | +CONFIG_MTD_CHAR=m | ||
443 | +CONFIG_MTD_BLKDEVS=m | ||
444 | +CONFIG_MTD_BLOCK=m | ||
445 | +# CONFIG_MTD_BLOCK_RO is not set | ||
446 | +# CONFIG_FTL is not set | ||
447 | +# CONFIG_NFTL is not set | ||
448 | +# CONFIG_INFTL is not set | ||
449 | +# CONFIG_RFD_FTL is not set | ||
450 | +# CONFIG_SSFDC is not set | ||
451 | + | ||
452 | +# | ||
453 | +# RAM/ROM/Flash chip drivers | ||
454 | +# | ||
455 | +# CONFIG_MTD_CFI is not set | ||
456 | +# CONFIG_MTD_JEDECPROBE is not set | ||
457 | +CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
458 | +CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
459 | +CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
460 | +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
461 | +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
462 | +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
463 | +CONFIG_MTD_CFI_I1=y | ||
464 | +CONFIG_MTD_CFI_I2=y | ||
465 | +# CONFIG_MTD_CFI_I4 is not set | ||
466 | +# CONFIG_MTD_CFI_I8 is not set | ||
467 | +# CONFIG_MTD_RAM is not set | ||
468 | +# CONFIG_MTD_ROM is not set | ||
469 | +# CONFIG_MTD_ABSENT is not set | ||
470 | +# CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
471 | + | ||
472 | +# | ||
473 | +# Mapping drivers for chip access | ||
474 | +# | ||
475 | +# CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
476 | +# CONFIG_MTD_SHARP_SL is not set | ||
477 | +# CONFIG_MTD_PLATRAM is not set | ||
478 | + | ||
479 | +# | ||
480 | +# Self-contained MTD device drivers | ||
481 | +# | ||
482 | +# CONFIG_MTD_PMC551 is not set | ||
483 | +# CONFIG_MTD_SLRAM is not set | ||
484 | +# CONFIG_MTD_PHRAM is not set | ||
485 | +# CONFIG_MTD_MTDRAM is not set | ||
486 | +# CONFIG_MTD_BLOCK2MTD is not set | ||
487 | + | ||
488 | +# | ||
489 | +# Disk-On-Chip Device Drivers | ||
490 | +# | ||
491 | +# CONFIG_MTD_DOC2000 is not set | ||
492 | +# CONFIG_MTD_DOC2001 is not set | ||
493 | +# CONFIG_MTD_DOC2001PLUS is not set | ||
494 | + | ||
495 | +# | ||
496 | +# NAND Flash Device Drivers | ||
497 | +# | ||
498 | +CONFIG_MTD_NAND=m | ||
499 | +# CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
500 | +# CONFIG_MTD_NAND_ECC_SMC is not set | ||
501 | +# CONFIG_MTD_NAND_H1900 is not set | ||
502 | +CONFIG_MTD_NAND_IDS=m | ||
503 | +# CONFIG_MTD_NAND_DISKONCHIP is not set | ||
504 | +# CONFIG_MTD_NAND_SHARPSL is not set | ||
505 | +# CONFIG_MTD_NAND_CAFE is not set | ||
506 | +CONFIG_MTD_NAND_CM_X270=m | ||
507 | +# CONFIG_MTD_NAND_NANDSIM is not set | ||
508 | + | ||
509 | +# | ||
510 | +# OneNAND Flash Device Drivers | ||
511 | +# | ||
512 | +# CONFIG_MTD_ONENAND is not set | ||
513 | + | ||
514 | +# | ||
515 | +# Parallel port support | ||
516 | +# | ||
517 | +# CONFIG_PARPORT is not set | ||
518 | + | ||
519 | +# | ||
520 | +# Plug and Play support | ||
521 | +# | ||
522 | +# CONFIG_PNPACPI is not set | ||
523 | + | ||
524 | +# | ||
525 | +# Block devices | ||
526 | +# | ||
527 | +# CONFIG_BLK_CPQ_DA is not set | ||
528 | +# CONFIG_BLK_CPQ_CISS_DA is not set | ||
529 | +# CONFIG_BLK_DEV_DAC960 is not set | ||
530 | +# CONFIG_BLK_DEV_UMEM is not set | ||
531 | +# CONFIG_BLK_DEV_COW_COMMON is not set | ||
532 | +CONFIG_BLK_DEV_LOOP=y | ||
533 | +# CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
534 | +# CONFIG_BLK_DEV_NBD is not set | ||
535 | +# CONFIG_BLK_DEV_SX8 is not set | ||
536 | +# CONFIG_BLK_DEV_UB is not set | ||
537 | +CONFIG_BLK_DEV_RAM=y | ||
538 | +CONFIG_BLK_DEV_RAM_COUNT=16 | ||
539 | +CONFIG_BLK_DEV_RAM_SIZE=12000 | ||
540 | +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
541 | +# CONFIG_CDROM_PKTCDVD is not set | ||
542 | +# CONFIG_ATA_OVER_ETH is not set | ||
543 | + | ||
544 | +# | ||
545 | +# ATA/ATAPI/MFM/RLL support | ||
546 | +# | ||
547 | +CONFIG_IDE=m | ||
548 | +CONFIG_IDE_MAX_HWIFS=4 | ||
549 | +CONFIG_BLK_DEV_IDE=m | ||
550 | + | ||
551 | +# | ||
552 | +# Please see Documentation/ide.txt for help/info on IDE drives | ||
553 | +# | ||
554 | +# CONFIG_BLK_DEV_IDE_SATA is not set | ||
555 | +CONFIG_BLK_DEV_IDEDISK=m | ||
556 | +# CONFIG_IDEDISK_MULTI_MODE is not set | ||
557 | +CONFIG_BLK_DEV_IDECS=m | ||
558 | +# CONFIG_BLK_DEV_DELKIN is not set | ||
559 | +CONFIG_BLK_DEV_IDECD=m | ||
560 | +# CONFIG_BLK_DEV_IDETAPE is not set | ||
561 | +# CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
562 | +# CONFIG_BLK_DEV_IDESCSI is not set | ||
563 | +# CONFIG_IDE_TASK_IOCTL is not set | ||
564 | + | ||
565 | +# | ||
566 | +# IDE chipset support/bugfixes | ||
567 | +# | ||
568 | +# CONFIG_IDE_GENERIC is not set | ||
569 | +# CONFIG_BLK_DEV_IDEPCI is not set | ||
570 | +# CONFIG_IDE_ARM is not set | ||
571 | +CONFIG_BLK_DEV_IDE_CM_X270=m | ||
572 | +# CONFIG_BLK_DEV_IDEDMA is not set | ||
573 | +# CONFIG_BLK_DEV_HD is not set | ||
574 | + | ||
575 | +# | ||
576 | +# SCSI device support | ||
577 | +# | ||
578 | +# CONFIG_RAID_ATTRS is not set | ||
579 | +CONFIG_SCSI=y | ||
580 | +# CONFIG_SCSI_TGT is not set | ||
581 | +# CONFIG_SCSI_NETLINK is not set | ||
582 | +# CONFIG_SCSI_PROC_FS is not set | ||
583 | + | ||
584 | +# | ||
585 | +# SCSI support type (disk, tape, CD-ROM) | ||
586 | +# | ||
587 | +CONFIG_BLK_DEV_SD=y | ||
588 | +# CONFIG_CHR_DEV_ST is not set | ||
589 | +# CONFIG_CHR_DEV_OSST is not set | ||
590 | +# CONFIG_BLK_DEV_SR is not set | ||
591 | +# CONFIG_CHR_DEV_SG is not set | ||
592 | +# CONFIG_CHR_DEV_SCH is not set | ||
593 | + | ||
594 | +# | ||
595 | +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
596 | +# | ||
597 | +# CONFIG_SCSI_MULTI_LUN is not set | ||
598 | +# CONFIG_SCSI_CONSTANTS is not set | ||
599 | +# CONFIG_SCSI_LOGGING is not set | ||
600 | +# CONFIG_SCSI_SCAN_ASYNC is not set | ||
601 | + | ||
602 | +# | ||
603 | +# SCSI Transports | ||
604 | +# | ||
605 | +# CONFIG_SCSI_SPI_ATTRS is not set | ||
606 | +# CONFIG_SCSI_FC_ATTRS is not set | ||
607 | +# CONFIG_SCSI_ISCSI_ATTRS is not set | ||
608 | +# CONFIG_SCSI_SAS_ATTRS is not set | ||
609 | +# CONFIG_SCSI_SAS_LIBSAS is not set | ||
610 | + | ||
611 | +# | ||
612 | +# SCSI low-level drivers | ||
613 | +# | ||
614 | +# CONFIG_ISCSI_TCP is not set | ||
615 | +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
616 | +# CONFIG_SCSI_3W_9XXX is not set | ||
617 | +# CONFIG_SCSI_ACARD is not set | ||
618 | +# CONFIG_SCSI_AACRAID is not set | ||
619 | +# CONFIG_SCSI_AIC7XXX is not set | ||
620 | +# CONFIG_SCSI_AIC7XXX_OLD is not set | ||
621 | +# CONFIG_SCSI_AIC79XX is not set | ||
622 | +# CONFIG_SCSI_AIC94XX is not set | ||
623 | +# CONFIG_SCSI_DPT_I2O is not set | ||
624 | +# CONFIG_SCSI_ARCMSR is not set | ||
625 | +# CONFIG_MEGARAID_NEWGEN is not set | ||
626 | +# CONFIG_MEGARAID_LEGACY is not set | ||
627 | +# CONFIG_MEGARAID_SAS is not set | ||
628 | +# CONFIG_SCSI_HPTIOP is not set | ||
629 | +# CONFIG_SCSI_DMX3191D is not set | ||
630 | +# CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
631 | +# CONFIG_SCSI_IPS is not set | ||
632 | +# CONFIG_SCSI_INITIO is not set | ||
633 | +# CONFIG_SCSI_INIA100 is not set | ||
634 | +# CONFIG_SCSI_STEX is not set | ||
635 | +# CONFIG_SCSI_SYM53C8XX_2 is not set | ||
636 | +# CONFIG_SCSI_QLOGIC_1280 is not set | ||
637 | +# CONFIG_SCSI_QLA_FC is not set | ||
638 | +# CONFIG_SCSI_QLA_ISCSI is not set | ||
639 | +# CONFIG_SCSI_LPFC is not set | ||
640 | +# CONFIG_SCSI_DC395x is not set | ||
641 | +# CONFIG_SCSI_DC390T is not set | ||
642 | +# CONFIG_SCSI_NSP32 is not set | ||
643 | +# CONFIG_SCSI_DEBUG is not set | ||
644 | +# CONFIG_SCSI_SRP is not set | ||
645 | + | ||
646 | +# | ||
647 | +# PCMCIA SCSI adapter support | ||
648 | +# | ||
649 | +# CONFIG_PCMCIA_AHA152X is not set | ||
650 | +# CONFIG_PCMCIA_FDOMAIN is not set | ||
651 | +# CONFIG_PCMCIA_NINJA_SCSI is not set | ||
652 | +# CONFIG_PCMCIA_QLOGIC is not set | ||
653 | +# CONFIG_PCMCIA_SYM53C500 is not set | ||
654 | + | ||
655 | +# | ||
656 | +# Serial ATA (prod) and Parallel ATA (experimental) drivers | ||
657 | +# | ||
658 | +# CONFIG_ATA is not set | ||
659 | + | ||
660 | +# | ||
661 | +# Multi-device support (RAID and LVM) | ||
662 | +# | ||
663 | +# CONFIG_MD is not set | ||
664 | + | ||
665 | +# | ||
666 | +# Fusion MPT device support | ||
667 | +# | ||
668 | +# CONFIG_FUSION is not set | ||
669 | +# CONFIG_FUSION_SPI is not set | ||
670 | +# CONFIG_FUSION_FC is not set | ||
671 | +# CONFIG_FUSION_SAS is not set | ||
672 | + | ||
673 | +# | ||
674 | +# IEEE 1394 (FireWire) support | ||
675 | +# | ||
676 | +# CONFIG_IEEE1394 is not set | ||
677 | + | ||
678 | +# | ||
679 | +# I2O device support | ||
680 | +# | ||
681 | +# CONFIG_I2O is not set | ||
682 | + | ||
683 | +# | ||
684 | +# Network device support | ||
685 | +# | ||
686 | +CONFIG_NETDEVICES=y | ||
687 | +# CONFIG_DUMMY is not set | ||
688 | +# CONFIG_BONDING is not set | ||
689 | +# CONFIG_EQUALIZER is not set | ||
690 | +# CONFIG_TUN is not set | ||
691 | + | ||
692 | +# | ||
693 | +# ARCnet devices | ||
694 | +# | ||
695 | +# CONFIG_ARCNET is not set | ||
696 | + | ||
697 | +# | ||
698 | +# PHY device support | ||
699 | +# | ||
700 | +# CONFIG_PHYLIB is not set | ||
701 | + | ||
702 | +# | ||
703 | +# Ethernet (10 or 100Mbit) | ||
704 | +# | ||
705 | +CONFIG_NET_ETHERNET=y | ||
706 | +CONFIG_MII=y | ||
707 | +# CONFIG_HAPPYMEAL is not set | ||
708 | +# CONFIG_SUNGEM is not set | ||
709 | +# CONFIG_CASSINI is not set | ||
710 | +# CONFIG_NET_VENDOR_3COM is not set | ||
711 | +# CONFIG_SMC91X is not set | ||
712 | +CONFIG_DM9000=y | ||
713 | +CONFIG_DM9000_NOEPROM=y | ||
714 | +# CONFIG_SMC911X is not set | ||
715 | + | ||
716 | +# | ||
717 | +# Tulip family network device support | ||
718 | +# | ||
719 | +# CONFIG_NET_TULIP is not set | ||
720 | +# CONFIG_HP100 is not set | ||
721 | +CONFIG_NET_PCI=y | ||
722 | +# CONFIG_PCNET32 is not set | ||
723 | +# CONFIG_AMD8111_ETH is not set | ||
724 | +# CONFIG_ADAPTEC_STARFIRE is not set | ||
725 | +# CONFIG_B44 is not set | ||
726 | +# CONFIG_FORCEDETH is not set | ||
727 | +# CONFIG_DGRS is not set | ||
728 | +# CONFIG_EEPRO100 is not set | ||
729 | +# CONFIG_E100 is not set | ||
730 | +# CONFIG_FEALNX is not set | ||
731 | +# CONFIG_NATSEMI is not set | ||
732 | +# CONFIG_NE2K_PCI is not set | ||
733 | +# CONFIG_8139CP is not set | ||
734 | +CONFIG_8139TOO=m | ||
735 | +# CONFIG_8139TOO_PIO is not set | ||
736 | +# CONFIG_8139TOO_TUNE_TWISTER is not set | ||
737 | +# CONFIG_8139TOO_8129 is not set | ||
738 | +# CONFIG_8139_OLD_RX_RESET is not set | ||
739 | +# CONFIG_SIS900 is not set | ||
740 | +# CONFIG_EPIC100 is not set | ||
741 | +# CONFIG_SUNDANCE is not set | ||
742 | +# CONFIG_TLAN is not set | ||
743 | +# CONFIG_VIA_RHINE is not set | ||
744 | +# CONFIG_SC92031 is not set | ||
745 | + | ||
746 | +# | ||
747 | +# Ethernet (1000 Mbit) | ||
748 | +# | ||
749 | +# CONFIG_ACENIC is not set | ||
750 | +# CONFIG_DL2K is not set | ||
751 | +# CONFIG_E1000 is not set | ||
752 | +# CONFIG_NS83820 is not set | ||
753 | +# CONFIG_HAMACHI is not set | ||
754 | +# CONFIG_YELLOWFIN is not set | ||
755 | +# CONFIG_R8169 is not set | ||
756 | +# CONFIG_SIS190 is not set | ||
757 | +# CONFIG_SKGE is not set | ||
758 | +# CONFIG_SKY2 is not set | ||
759 | +# CONFIG_SK98LIN is not set | ||
760 | +# CONFIG_VIA_VELOCITY is not set | ||
761 | +# CONFIG_TIGON3 is not set | ||
762 | +# CONFIG_BNX2 is not set | ||
763 | +# CONFIG_QLA3XXX is not set | ||
764 | +# CONFIG_ATL1 is not set | ||
765 | + | ||
766 | +# | ||
767 | +# Ethernet (10000 Mbit) | ||
768 | +# | ||
769 | +# CONFIG_CHELSIO_T1 is not set | ||
770 | +# CONFIG_CHELSIO_T3 is not set | ||
771 | +# CONFIG_IXGB is not set | ||
772 | +# CONFIG_S2IO is not set | ||
773 | +# CONFIG_MYRI10GE is not set | ||
774 | +# CONFIG_NETXEN_NIC is not set | ||
775 | + | ||
776 | +# | ||
777 | +# Token Ring devices | ||
778 | +# | ||
779 | +# CONFIG_TR is not set | ||
780 | + | ||
781 | +# | ||
782 | +# Wireless LAN (non-hamradio) | ||
783 | +# | ||
784 | +CONFIG_NET_RADIO=y | ||
785 | +# CONFIG_NET_WIRELESS_RTNETLINK is not set | ||
786 | + | ||
787 | +# | ||
788 | +# Obsolete Wireless cards support (pre-802.11) | ||
789 | +# | ||
790 | +# CONFIG_STRIP is not set | ||
791 | +# CONFIG_PCMCIA_WAVELAN is not set | ||
792 | +# CONFIG_PCMCIA_NETWAVE is not set | ||
793 | + | ||
794 | +# | ||
795 | +# Wireless 802.11 Frequency Hopping cards support | ||
796 | +# | ||
797 | +# CONFIG_PCMCIA_RAYCS is not set | ||
798 | + | ||
799 | +# | ||
800 | +# Wireless 802.11b ISA/PCI cards support | ||
801 | +# | ||
802 | +# CONFIG_IPW2100 is not set | ||
803 | +# CONFIG_IPW2200 is not set | ||
804 | +# CONFIG_HERMES is not set | ||
805 | +# CONFIG_ATMEL is not set | ||
806 | + | ||
807 | +# | ||
808 | +# Wireless 802.11b Pcmcia/Cardbus cards support | ||
809 | +# | ||
810 | +# CONFIG_AIRO_CS is not set | ||
811 | +# CONFIG_PCMCIA_WL3501 is not set | ||
812 | + | ||
813 | +# | ||
814 | +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support | ||
815 | +# | ||
816 | +# CONFIG_PRISM54 is not set | ||
817 | +# CONFIG_USB_ZD1201 is not set | ||
818 | +# CONFIG_HOSTAP is not set | ||
819 | +CONFIG_NET_WIRELESS=y | ||
820 | + | ||
821 | +# | ||
822 | +# PCMCIA network device support | ||
823 | +# | ||
824 | +CONFIG_NET_PCMCIA=y | ||
825 | +# CONFIG_PCMCIA_3C589 is not set | ||
826 | +# CONFIG_PCMCIA_3C574 is not set | ||
827 | +# CONFIG_PCMCIA_FMVJ18X is not set | ||
828 | +CONFIG_PCMCIA_PCNET=m | ||
829 | +# CONFIG_PCMCIA_NMCLAN is not set | ||
830 | +# CONFIG_PCMCIA_SMC91C92 is not set | ||
831 | +# CONFIG_PCMCIA_XIRC2PS is not set | ||
832 | +# CONFIG_PCMCIA_AXNET is not set | ||
833 | + | ||
834 | +# | ||
835 | +# Wan interfaces | ||
836 | +# | ||
837 | +# CONFIG_WAN is not set | ||
838 | +# CONFIG_FDDI is not set | ||
839 | +# CONFIG_HIPPI is not set | ||
840 | +# CONFIG_PPP is not set | ||
841 | +# CONFIG_SLIP is not set | ||
842 | +# CONFIG_NET_FC is not set | ||
843 | +# CONFIG_SHAPER is not set | ||
844 | +# CONFIG_NETCONSOLE is not set | ||
845 | +# CONFIG_NETPOLL is not set | ||
846 | +# CONFIG_NET_POLL_CONTROLLER is not set | ||
847 | + | ||
848 | +# | ||
849 | +# ISDN subsystem | ||
850 | +# | ||
851 | +# CONFIG_ISDN is not set | ||
852 | + | ||
853 | +# | ||
854 | +# Input device support | ||
855 | +# | ||
856 | +CONFIG_INPUT=y | ||
857 | +# CONFIG_INPUT_FF_MEMLESS is not set | ||
858 | + | ||
859 | +# | ||
860 | +# Userland interfaces | ||
861 | +# | ||
862 | +# CONFIG_INPUT_MOUSEDEV is not set | ||
863 | +# CONFIG_INPUT_JOYDEV is not set | ||
864 | +# CONFIG_INPUT_TSDEV is not set | ||
865 | +CONFIG_INPUT_EVDEV=y | ||
866 | +# CONFIG_INPUT_EVBUG is not set | ||
867 | + | ||
868 | +# | ||
869 | +# Input Device Drivers | ||
870 | +# | ||
871 | +# CONFIG_INPUT_KEYBOARD is not set | ||
872 | +# CONFIG_INPUT_MOUSE is not set | ||
873 | +# CONFIG_INPUT_JOYSTICK is not set | ||
874 | +CONFIG_INPUT_TOUCHSCREEN=y | ||
875 | +# CONFIG_TOUCHSCREEN_GUNZE is not set | ||
876 | +# CONFIG_TOUCHSCREEN_ELO is not set | ||
877 | +# CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
878 | +# CONFIG_TOUCHSCREEN_MK712 is not set | ||
879 | +# CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
880 | +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
881 | +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
882 | +CONFIG_TOUCHSCREEN_UCB1400=m | ||
883 | +# CONFIG_INPUT_MISC is not set | ||
884 | + | ||
885 | +# | ||
886 | +# Hardware I/O ports | ||
887 | +# | ||
888 | +# CONFIG_SERIO is not set | ||
889 | +# CONFIG_GAMEPORT is not set | ||
890 | + | ||
891 | +# | ||
892 | +# Character devices | ||
893 | +# | ||
894 | +CONFIG_VT=y | ||
895 | +CONFIG_VT_CONSOLE=y | ||
896 | +CONFIG_HW_CONSOLE=y | ||
897 | +# CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
898 | +# CONFIG_SERIAL_NONSTANDARD is not set | ||
899 | + | ||
900 | +# | ||
901 | +# Serial drivers | ||
902 | +# | ||
903 | +# CONFIG_SERIAL_8250 is not set | ||
904 | + | ||
905 | +# | ||
906 | +# Non-8250 serial port support | ||
907 | +# | ||
908 | +CONFIG_SERIAL_PXA=y | ||
909 | +CONFIG_SERIAL_PXA_CONSOLE=y | ||
910 | +CONFIG_SERIAL_CORE=y | ||
911 | +CONFIG_SERIAL_CORE_CONSOLE=y | ||
912 | +# CONFIG_SERIAL_JSM is not set | ||
913 | +CONFIG_UNIX98_PTYS=y | ||
914 | +CONFIG_LEGACY_PTYS=y | ||
915 | +CONFIG_LEGACY_PTY_COUNT=256 | ||
916 | + | ||
917 | +# | ||
918 | +# IPMI | ||
919 | +# | ||
920 | +# CONFIG_IPMI_HANDLER is not set | ||
921 | + | ||
922 | +# | ||
923 | +# Watchdog Cards | ||
924 | +# | ||
925 | +# CONFIG_WATCHDOG is not set | ||
926 | +CONFIG_HW_RANDOM=m | ||
927 | +# CONFIG_NVRAM is not set | ||
928 | +# CONFIG_DTLK is not set | ||
929 | +# CONFIG_R3964 is not set | ||
930 | +# CONFIG_APPLICOM is not set | ||
931 | +# CONFIG_DRM is not set | ||
932 | + | ||
933 | +# | ||
934 | +# PCMCIA character devices | ||
935 | +# | ||
936 | +# CONFIG_SYNCLINK_CS is not set | ||
937 | +# CONFIG_CARDMAN_4000 is not set | ||
938 | +# CONFIG_CARDMAN_4040 is not set | ||
939 | +# CONFIG_RAW_DRIVER is not set | ||
940 | + | ||
941 | +# | ||
942 | +# TPM devices | ||
943 | +# | ||
944 | +# CONFIG_TCG_TPM is not set | ||
945 | + | ||
946 | +# | ||
947 | +# I2C support | ||
948 | +# | ||
949 | +# CONFIG_I2C is not set | ||
950 | + | ||
951 | +# | ||
952 | +# SPI support | ||
953 | +# | ||
954 | +# CONFIG_SPI is not set | ||
955 | +# CONFIG_SPI_MASTER is not set | ||
956 | + | ||
957 | +# | ||
958 | +# Dallas's 1-wire bus | ||
959 | +# | ||
960 | +# CONFIG_W1 is not set | ||
961 | + | ||
962 | +# | ||
963 | +# Hardware Monitoring support | ||
964 | +# | ||
965 | +# CONFIG_HWMON is not set | ||
966 | +# CONFIG_HWMON_VID is not set | ||
967 | + | ||
968 | +# | ||
969 | +# Misc devices | ||
970 | +# | ||
971 | +# CONFIG_SGI_IOC4 is not set | ||
972 | +# CONFIG_TIFM_CORE is not set | ||
973 | + | ||
974 | +# | ||
975 | +# Multifunction device drivers | ||
976 | +# | ||
977 | +# CONFIG_MFD_SM501 is not set | ||
978 | + | ||
979 | +# | ||
980 | +# LED devices | ||
981 | +# | ||
982 | +CONFIG_NEW_LEDS=y | ||
983 | +CONFIG_LEDS_CLASS=y | ||
984 | + | ||
985 | +# | ||
986 | +# LED drivers | ||
987 | +# | ||
988 | +CONFIG_LEDS_CM_X270=y | ||
989 | + | ||
990 | +# | ||
991 | +# LED Triggers | ||
992 | +# | ||
993 | +CONFIG_LEDS_TRIGGERS=y | ||
994 | +# CONFIG_LEDS_TRIGGER_TIMER is not set | ||
995 | +# CONFIG_LEDS_TRIGGER_IDE_DISK is not set | ||
996 | +CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
997 | + | ||
998 | +# | ||
999 | +# Multimedia devices | ||
1000 | +# | ||
1001 | +# CONFIG_VIDEO_DEV is not set | ||
1002 | + | ||
1003 | +# | ||
1004 | +# Digital Video Broadcasting Devices | ||
1005 | +# | ||
1006 | +# CONFIG_DVB is not set | ||
1007 | +# CONFIG_USB_DABUSB is not set | ||
1008 | + | ||
1009 | +# | ||
1010 | +# Graphics support | ||
1011 | +# | ||
1012 | +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
1013 | +CONFIG_FB=y | ||
1014 | +# CONFIG_FIRMWARE_EDID is not set | ||
1015 | +# CONFIG_FB_DDC is not set | ||
1016 | +CONFIG_FB_CFB_FILLRECT=y | ||
1017 | +CONFIG_FB_CFB_COPYAREA=y | ||
1018 | +CONFIG_FB_CFB_IMAGEBLIT=y | ||
1019 | +# CONFIG_FB_SVGALIB is not set | ||
1020 | +# CONFIG_FB_MACMODES is not set | ||
1021 | +# CONFIG_FB_BACKLIGHT is not set | ||
1022 | +# CONFIG_FB_MODE_HELPERS is not set | ||
1023 | +# CONFIG_FB_TILEBLITTING is not set | ||
1024 | + | ||
1025 | +# | ||
1026 | +# Frambuffer hardware drivers | ||
1027 | +# | ||
1028 | +# CONFIG_FB_CIRRUS is not set | ||
1029 | +# CONFIG_FB_PM2 is not set | ||
1030 | +# CONFIG_FB_CYBER2000 is not set | ||
1031 | +# CONFIG_FB_ASILIANT is not set | ||
1032 | +# CONFIG_FB_IMSTT is not set | ||
1033 | +# CONFIG_FB_S1D13XXX is not set | ||
1034 | +# CONFIG_FB_NVIDIA is not set | ||
1035 | +# CONFIG_FB_RIVA is not set | ||
1036 | +# CONFIG_FB_MATROX is not set | ||
1037 | +# CONFIG_FB_RADEON is not set | ||
1038 | +# CONFIG_FB_ATY128 is not set | ||
1039 | +# CONFIG_FB_ATY is not set | ||
1040 | +# CONFIG_FB_S3 is not set | ||
1041 | +# CONFIG_FB_SAVAGE is not set | ||
1042 | +# CONFIG_FB_SIS is not set | ||
1043 | +# CONFIG_FB_NEOMAGIC is not set | ||
1044 | +# CONFIG_FB_KYRO is not set | ||
1045 | +# CONFIG_FB_3DFX is not set | ||
1046 | +# CONFIG_FB_VOODOO1 is not set | ||
1047 | +# CONFIG_FB_TRIDENT is not set | ||
1048 | +CONFIG_FB_PXA=y | ||
1049 | +# CONFIG_FB_PXA_PARAMETERS is not set | ||
1050 | +CONFIG_FB_MBX=m | ||
1051 | +# CONFIG_FB_VIRTUAL is not set | ||
1052 | + | ||
1053 | +# | ||
1054 | +# Console display driver support | ||
1055 | +# | ||
1056 | +# CONFIG_VGA_CONSOLE is not set | ||
1057 | +CONFIG_DUMMY_CONSOLE=y | ||
1058 | +CONFIG_FRAMEBUFFER_CONSOLE=y | ||
1059 | +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
1060 | +# CONFIG_FONTS is not set | ||
1061 | +CONFIG_FONT_8x8=y | ||
1062 | +CONFIG_FONT_8x16=y | ||
1063 | + | ||
1064 | +# | ||
1065 | +# Logo configuration | ||
1066 | +# | ||
1067 | +CONFIG_LOGO=y | ||
1068 | +CONFIG_LOGO_LINUX_MONO=y | ||
1069 | +CONFIG_LOGO_LINUX_VGA16=y | ||
1070 | +CONFIG_LOGO_LINUX_CLUT224=y | ||
1071 | + | ||
1072 | +# | ||
1073 | +# Sound | ||
1074 | +# | ||
1075 | +CONFIG_SOUND=m | ||
1076 | + | ||
1077 | +# | ||
1078 | +# Advanced Linux Sound Architecture | ||
1079 | +# | ||
1080 | +CONFIG_SND=m | ||
1081 | +CONFIG_SND_TIMER=m | ||
1082 | +CONFIG_SND_PCM=m | ||
1083 | +# CONFIG_SND_SEQUENCER is not set | ||
1084 | +CONFIG_SND_OSSEMUL=y | ||
1085 | +CONFIG_SND_MIXER_OSS=m | ||
1086 | +CONFIG_SND_PCM_OSS=m | ||
1087 | +CONFIG_SND_PCM_OSS_PLUGINS=y | ||
1088 | +# CONFIG_SND_DYNAMIC_MINORS is not set | ||
1089 | +CONFIG_SND_SUPPORT_OLD_API=y | ||
1090 | +CONFIG_SND_VERBOSE_PROCFS=y | ||
1091 | +# CONFIG_SND_VERBOSE_PRINTK is not set | ||
1092 | +# CONFIG_SND_DEBUG is not set | ||
1093 | + | ||
1094 | +# | ||
1095 | +# Generic devices | ||
1096 | +# | ||
1097 | +CONFIG_SND_AC97_CODEC=m | ||
1098 | +# CONFIG_SND_DUMMY is not set | ||
1099 | +# CONFIG_SND_MTPAV is not set | ||
1100 | +# CONFIG_SND_SERIAL_U16550 is not set | ||
1101 | +# CONFIG_SND_MPU401 is not set | ||
1102 | + | ||
1103 | +# | ||
1104 | +# PCI devices | ||
1105 | +# | ||
1106 | +# CONFIG_SND_AD1889 is not set | ||
1107 | +# CONFIG_SND_ALS300 is not set | ||
1108 | +# CONFIG_SND_ALI5451 is not set | ||
1109 | +# CONFIG_SND_ATIIXP is not set | ||
1110 | +# CONFIG_SND_ATIIXP_MODEM is not set | ||
1111 | +# CONFIG_SND_AU8810 is not set | ||
1112 | +# CONFIG_SND_AU8820 is not set | ||
1113 | +# CONFIG_SND_AU8830 is not set | ||
1114 | +# CONFIG_SND_AZT3328 is not set | ||
1115 | +# CONFIG_SND_BT87X is not set | ||
1116 | +# CONFIG_SND_CA0106 is not set | ||
1117 | +# CONFIG_SND_CMIPCI is not set | ||
1118 | +# CONFIG_SND_CS4281 is not set | ||
1119 | +# CONFIG_SND_CS46XX is not set | ||
1120 | +# CONFIG_SND_DARLA20 is not set | ||
1121 | +# CONFIG_SND_GINA20 is not set | ||
1122 | +# CONFIG_SND_LAYLA20 is not set | ||
1123 | +# CONFIG_SND_DARLA24 is not set | ||
1124 | +# CONFIG_SND_GINA24 is not set | ||
1125 | +# CONFIG_SND_LAYLA24 is not set | ||
1126 | +# CONFIG_SND_MONA is not set | ||
1127 | +# CONFIG_SND_MIA is not set | ||
1128 | +# CONFIG_SND_ECHO3G is not set | ||
1129 | +# CONFIG_SND_INDIGO is not set | ||
1130 | +# CONFIG_SND_INDIGOIO is not set | ||
1131 | +# CONFIG_SND_INDIGODJ is not set | ||
1132 | +# CONFIG_SND_EMU10K1 is not set | ||
1133 | +# CONFIG_SND_EMU10K1X is not set | ||
1134 | +# CONFIG_SND_ENS1370 is not set | ||
1135 | +# CONFIG_SND_ENS1371 is not set | ||
1136 | +# CONFIG_SND_ES1938 is not set | ||
1137 | +# CONFIG_SND_ES1968 is not set | ||
1138 | +# CONFIG_SND_FM801 is not set | ||
1139 | +# CONFIG_SND_HDA_INTEL is not set | ||
1140 | +# CONFIG_SND_HDSP is not set | ||
1141 | +# CONFIG_SND_HDSPM is not set | ||
1142 | +# CONFIG_SND_ICE1712 is not set | ||
1143 | +# CONFIG_SND_ICE1724 is not set | ||
1144 | +# CONFIG_SND_INTEL8X0 is not set | ||
1145 | +# CONFIG_SND_INTEL8X0M is not set | ||
1146 | +# CONFIG_SND_KORG1212 is not set | ||
1147 | +# CONFIG_SND_MAESTRO3 is not set | ||
1148 | +# CONFIG_SND_MIXART is not set | ||
1149 | +# CONFIG_SND_NM256 is not set | ||
1150 | +# CONFIG_SND_PCXHR is not set | ||
1151 | +# CONFIG_SND_RIPTIDE is not set | ||
1152 | +# CONFIG_SND_RME32 is not set | ||
1153 | +# CONFIG_SND_RME96 is not set | ||
1154 | +# CONFIG_SND_RME9652 is not set | ||
1155 | +# CONFIG_SND_SONICVIBES is not set | ||
1156 | +# CONFIG_SND_TRIDENT is not set | ||
1157 | +# CONFIG_SND_VIA82XX is not set | ||
1158 | +# CONFIG_SND_VIA82XX_MODEM is not set | ||
1159 | +# CONFIG_SND_VX222 is not set | ||
1160 | +# CONFIG_SND_YMFPCI is not set | ||
1161 | +# CONFIG_SND_AC97_POWER_SAVE is not set | ||
1162 | + | ||
1163 | +# | ||
1164 | +# ALSA ARM devices | ||
1165 | +# | ||
1166 | +CONFIG_SND_PXA2XX_PCM=m | ||
1167 | +CONFIG_SND_PXA2XX_AC97=m | ||
1168 | + | ||
1169 | +# | ||
1170 | +# USB devices | ||
1171 | +# | ||
1172 | +# CONFIG_SND_USB_AUDIO is not set | ||
1173 | + | ||
1174 | +# | ||
1175 | +# PCMCIA devices | ||
1176 | +# | ||
1177 | +# CONFIG_SND_VXPOCKET is not set | ||
1178 | +# CONFIG_SND_PDAUDIOCF is not set | ||
1179 | + | ||
1180 | +# | ||
1181 | +# SoC audio support | ||
1182 | +# | ||
1183 | +# CONFIG_SND_SOC is not set | ||
1184 | + | ||
1185 | +# | ||
1186 | +# Open Sound System | ||
1187 | +# | ||
1188 | +# CONFIG_SOUND_PRIME is not set | ||
1189 | +CONFIG_AC97_BUS=m | ||
1190 | + | ||
1191 | +# | ||
1192 | +# HID Devices | ||
1193 | +# | ||
1194 | +CONFIG_HID=y | ||
1195 | +# CONFIG_HID_DEBUG is not set | ||
1196 | + | ||
1197 | +# | ||
1198 | +# USB support | ||
1199 | +# | ||
1200 | +CONFIG_USB_ARCH_HAS_HCD=y | ||
1201 | +CONFIG_USB_ARCH_HAS_OHCI=y | ||
1202 | +CONFIG_USB_ARCH_HAS_EHCI=y | ||
1203 | +CONFIG_USB=y | ||
1204 | +# CONFIG_USB_DEBUG is not set | ||
1205 | + | ||
1206 | +# | ||
1207 | +# Miscellaneous USB options | ||
1208 | +# | ||
1209 | +CONFIG_USB_DEVICEFS=y | ||
1210 | +# CONFIG_USB_DYNAMIC_MINORS is not set | ||
1211 | +# CONFIG_USB_SUSPEND is not set | ||
1212 | +# CONFIG_USB_OTG is not set | ||
1213 | + | ||
1214 | +# | ||
1215 | +# USB Host Controller Drivers | ||
1216 | +# | ||
1217 | +# CONFIG_USB_EHCI_HCD is not set | ||
1218 | +# CONFIG_USB_ISP116X_HCD is not set | ||
1219 | +CONFIG_USB_OHCI_HCD=y | ||
1220 | +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
1221 | +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
1222 | +CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
1223 | +# CONFIG_USB_UHCI_HCD is not set | ||
1224 | +# CONFIG_USB_SL811_HCD is not set | ||
1225 | + | ||
1226 | +# | ||
1227 | +# USB Device Class drivers | ||
1228 | +# | ||
1229 | +# CONFIG_USB_ACM is not set | ||
1230 | +# CONFIG_USB_PRINTER is not set | ||
1231 | + | ||
1232 | +# | ||
1233 | +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
1234 | +# | ||
1235 | + | ||
1236 | +# | ||
1237 | +# may also be needed; see USB_STORAGE Help for more information | ||
1238 | +# | ||
1239 | +CONFIG_USB_STORAGE=y | ||
1240 | +# CONFIG_USB_STORAGE_DEBUG is not set | ||
1241 | +# CONFIG_USB_STORAGE_DATAFAB is not set | ||
1242 | +# CONFIG_USB_STORAGE_FREECOM is not set | ||
1243 | +# CONFIG_USB_STORAGE_DPCM is not set | ||
1244 | +# CONFIG_USB_STORAGE_USBAT is not set | ||
1245 | +# CONFIG_USB_STORAGE_SDDR09 is not set | ||
1246 | +# CONFIG_USB_STORAGE_SDDR55 is not set | ||
1247 | +# CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
1248 | +# CONFIG_USB_STORAGE_ALAUDA is not set | ||
1249 | +# CONFIG_USB_STORAGE_KARMA is not set | ||
1250 | +# CONFIG_USB_LIBUSUAL is not set | ||
1251 | + | ||
1252 | +# | ||
1253 | +# USB Input Devices | ||
1254 | +# | ||
1255 | +CONFIG_USB_HID=y | ||
1256 | +# CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
1257 | +# CONFIG_HID_FF is not set | ||
1258 | +# CONFIG_USB_HIDDEV is not set | ||
1259 | +# CONFIG_USB_AIPTEK is not set | ||
1260 | +# CONFIG_USB_WACOM is not set | ||
1261 | +# CONFIG_USB_ACECAD is not set | ||
1262 | +# CONFIG_USB_KBTAB is not set | ||
1263 | +# CONFIG_USB_POWERMATE is not set | ||
1264 | +# CONFIG_USB_TOUCHSCREEN is not set | ||
1265 | +# CONFIG_USB_YEALINK is not set | ||
1266 | +# CONFIG_USB_XPAD is not set | ||
1267 | +# CONFIG_USB_ATI_REMOTE is not set | ||
1268 | +# CONFIG_USB_ATI_REMOTE2 is not set | ||
1269 | +# CONFIG_USB_KEYSPAN_REMOTE is not set | ||
1270 | +# CONFIG_USB_APPLETOUCH is not set | ||
1271 | +# CONFIG_USB_GTCO is not set | ||
1272 | + | ||
1273 | +# | ||
1274 | +# USB Imaging devices | ||
1275 | +# | ||
1276 | +# CONFIG_USB_MDC800 is not set | ||
1277 | +# CONFIG_USB_MICROTEK is not set | ||
1278 | + | ||
1279 | +# | ||
1280 | +# USB Network Adapters | ||
1281 | +# | ||
1282 | +# CONFIG_USB_CATC is not set | ||
1283 | +# CONFIG_USB_KAWETH is not set | ||
1284 | +# CONFIG_USB_PEGASUS is not set | ||
1285 | +# CONFIG_USB_RTL8150 is not set | ||
1286 | +# CONFIG_USB_USBNET_MII is not set | ||
1287 | +# CONFIG_USB_USBNET is not set | ||
1288 | +CONFIG_USB_MON=y | ||
1289 | + | ||
1290 | +# | ||
1291 | +# USB port drivers | ||
1292 | +# | ||
1293 | + | ||
1294 | +# | ||
1295 | +# USB Serial Converter support | ||
1296 | +# | ||
1297 | +# CONFIG_USB_SERIAL is not set | ||
1298 | + | ||
1299 | +# | ||
1300 | +# USB Miscellaneous drivers | ||
1301 | +# | ||
1302 | +# CONFIG_USB_EMI62 is not set | ||
1303 | +# CONFIG_USB_EMI26 is not set | ||
1304 | +# CONFIG_USB_ADUTUX is not set | ||
1305 | +# CONFIG_USB_AUERSWALD is not set | ||
1306 | +# CONFIG_USB_RIO500 is not set | ||
1307 | +# CONFIG_USB_LEGOTOWER is not set | ||
1308 | +# CONFIG_USB_LCD is not set | ||
1309 | +# CONFIG_USB_BERRY_CHARGE is not set | ||
1310 | +# CONFIG_USB_LED is not set | ||
1311 | +# CONFIG_USB_CYPRESS_CY7C63 is not set | ||
1312 | +# CONFIG_USB_CYTHERM is not set | ||
1313 | +# CONFIG_USB_PHIDGET is not set | ||
1314 | +# CONFIG_USB_IDMOUSE is not set | ||
1315 | +# CONFIG_USB_FTDI_ELAN is not set | ||
1316 | +# CONFIG_USB_APPLEDISPLAY is not set | ||
1317 | +# CONFIG_USB_LD is not set | ||
1318 | +# CONFIG_USB_TRANCEVIBRATOR is not set | ||
1319 | +# CONFIG_USB_IOWARRIOR is not set | ||
1320 | +# CONFIG_USB_TEST is not set | ||
1321 | + | ||
1322 | +# | ||
1323 | +# USB DSL modem support | ||
1324 | +# | ||
1325 | + | ||
1326 | +# | ||
1327 | +# USB Gadget Support | ||
1328 | +# | ||
1329 | +# CONFIG_USB_GADGET is not set | ||
1330 | + | ||
1331 | +# | ||
1332 | +# MMC/SD Card support | ||
1333 | +# | ||
1334 | +CONFIG_MMC=m | ||
1335 | +# CONFIG_MMC_DEBUG is not set | ||
1336 | +CONFIG_MMC_BLOCK=m | ||
1337 | +CONFIG_MMC_PXA=m | ||
1338 | +# CONFIG_MMC_SDHCI is not set | ||
1339 | +# CONFIG_MMC_TIFM_SD is not set | ||
1340 | + | ||
1341 | +# | ||
1342 | +# Real Time Clock | ||
1343 | +# | ||
1344 | +CONFIG_RTC_LIB=y | ||
1345 | +CONFIG_RTC_CLASS=y | ||
1346 | +CONFIG_RTC_HCTOSYS=y | ||
1347 | +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
1348 | +# CONFIG_RTC_DEBUG is not set | ||
1349 | + | ||
1350 | +# | ||
1351 | +# RTC interfaces | ||
1352 | +# | ||
1353 | +CONFIG_RTC_INTF_SYSFS=y | ||
1354 | +CONFIG_RTC_INTF_PROC=y | ||
1355 | +CONFIG_RTC_INTF_DEV=y | ||
1356 | +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
1357 | + | ||
1358 | +# | ||
1359 | +# RTC drivers | ||
1360 | +# | ||
1361 | +# CONFIG_RTC_DRV_CMOS is not set | ||
1362 | +# CONFIG_RTC_DRV_DS1553 is not set | ||
1363 | +# CONFIG_RTC_DRV_DS1742 is not set | ||
1364 | +# CONFIG_RTC_DRV_M48T86 is not set | ||
1365 | +CONFIG_RTC_DRV_SA1100=y | ||
1366 | +# CONFIG_RTC_DRV_TEST is not set | ||
1367 | +CONFIG_RTC_DRV_V3020=y | ||
1368 | + | ||
1369 | +# | ||
1370 | +# File systems | ||
1371 | +# | ||
1372 | +CONFIG_EXT2_FS=y | ||
1373 | +# CONFIG_EXT2_FS_XATTR is not set | ||
1374 | +# CONFIG_EXT2_FS_XIP is not set | ||
1375 | +CONFIG_EXT3_FS=y | ||
1376 | +CONFIG_EXT3_FS_XATTR=y | ||
1377 | +# CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1378 | +# CONFIG_EXT3_FS_SECURITY is not set | ||
1379 | +# CONFIG_EXT4DEV_FS is not set | ||
1380 | +CONFIG_JBD=y | ||
1381 | +# CONFIG_JBD_DEBUG is not set | ||
1382 | +CONFIG_FS_MBCACHE=y | ||
1383 | +# CONFIG_REISERFS_FS is not set | ||
1384 | +# CONFIG_JFS_FS is not set | ||
1385 | +# CONFIG_FS_POSIX_ACL is not set | ||
1386 | +# CONFIG_XFS_FS is not set | ||
1387 | +# CONFIG_GFS2_FS is not set | ||
1388 | +# CONFIG_OCFS2_FS is not set | ||
1389 | +# CONFIG_MINIX_FS is not set | ||
1390 | +# CONFIG_ROMFS_FS is not set | ||
1391 | +CONFIG_INOTIFY=y | ||
1392 | +CONFIG_INOTIFY_USER=y | ||
1393 | +# CONFIG_QUOTA is not set | ||
1394 | +CONFIG_DNOTIFY=y | ||
1395 | +# CONFIG_AUTOFS_FS is not set | ||
1396 | +# CONFIG_AUTOFS4_FS is not set | ||
1397 | +# CONFIG_FUSE_FS is not set | ||
1398 | + | ||
1399 | +# | ||
1400 | +# CD-ROM/DVD Filesystems | ||
1401 | +# | ||
1402 | +# CONFIG_ISO9660_FS is not set | ||
1403 | +# CONFIG_UDF_FS is not set | ||
1404 | + | ||
1405 | +# | ||
1406 | +# DOS/FAT/NT Filesystems | ||
1407 | +# | ||
1408 | +CONFIG_FAT_FS=y | ||
1409 | +CONFIG_MSDOS_FS=y | ||
1410 | +CONFIG_VFAT_FS=y | ||
1411 | +CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1412 | +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1413 | +# CONFIG_NTFS_FS is not set | ||
1414 | + | ||
1415 | +# | ||
1416 | +# Pseudo filesystems | ||
1417 | +# | ||
1418 | +CONFIG_PROC_FS=y | ||
1419 | +CONFIG_PROC_SYSCTL=y | ||
1420 | +CONFIG_SYSFS=y | ||
1421 | +CONFIG_TMPFS=y | ||
1422 | +# CONFIG_TMPFS_POSIX_ACL is not set | ||
1423 | +# CONFIG_HUGETLB_PAGE is not set | ||
1424 | +CONFIG_RAMFS=y | ||
1425 | +# CONFIG_CONFIGFS_FS is not set | ||
1426 | + | ||
1427 | +# | ||
1428 | +# Miscellaneous filesystems | ||
1429 | +# | ||
1430 | +# CONFIG_ADFS_FS is not set | ||
1431 | +# CONFIG_AFFS_FS is not set | ||
1432 | +# CONFIG_HFS_FS is not set | ||
1433 | +# CONFIG_HFSPLUS_FS is not set | ||
1434 | +# CONFIG_BEFS_FS is not set | ||
1435 | +# CONFIG_BFS_FS is not set | ||
1436 | +# CONFIG_EFS_FS is not set | ||
1437 | +# CONFIG_JFFS2_FS is not set | ||
1438 | +# CONFIG_CRAMFS is not set | ||
1439 | +# CONFIG_VXFS_FS is not set | ||
1440 | +# CONFIG_HPFS_FS is not set | ||
1441 | +# CONFIG_QNX4FS_FS is not set | ||
1442 | +# CONFIG_SYSV_FS is not set | ||
1443 | +# CONFIG_UFS_FS is not set | ||
1444 | + | ||
1445 | +# | ||
1446 | +# Network File Systems | ||
1447 | +# | ||
1448 | +CONFIG_NFS_FS=y | ||
1449 | +CONFIG_NFS_V3=y | ||
1450 | +# CONFIG_NFS_V3_ACL is not set | ||
1451 | +# CONFIG_NFS_V4 is not set | ||
1452 | +# CONFIG_NFS_DIRECTIO is not set | ||
1453 | +# CONFIG_NFSD is not set | ||
1454 | +CONFIG_ROOT_NFS=y | ||
1455 | +CONFIG_LOCKD=y | ||
1456 | +CONFIG_LOCKD_V4=y | ||
1457 | +CONFIG_NFS_COMMON=y | ||
1458 | +CONFIG_SUNRPC=y | ||
1459 | +# CONFIG_RPCSEC_GSS_KRB5 is not set | ||
1460 | +# CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1461 | +CONFIG_SMB_FS=y | ||
1462 | +# CONFIG_SMB_NLS_DEFAULT is not set | ||
1463 | +# CONFIG_CIFS is not set | ||
1464 | +# CONFIG_NCP_FS is not set | ||
1465 | +# CONFIG_CODA_FS is not set | ||
1466 | +# CONFIG_AFS_FS is not set | ||
1467 | +# CONFIG_9P_FS is not set | ||
1468 | + | ||
1469 | +# | ||
1470 | +# Partition Types | ||
1471 | +# | ||
1472 | +# CONFIG_PARTITION_ADVANCED is not set | ||
1473 | +CONFIG_MSDOS_PARTITION=y | ||
1474 | + | ||
1475 | +# | ||
1476 | +# Native Language Support | ||
1477 | +# | ||
1478 | +CONFIG_NLS=y | ||
1479 | +CONFIG_NLS_DEFAULT="iso8859-1" | ||
1480 | +CONFIG_NLS_CODEPAGE_437=y | ||
1481 | +# CONFIG_NLS_CODEPAGE_737 is not set | ||
1482 | +# CONFIG_NLS_CODEPAGE_775 is not set | ||
1483 | +# CONFIG_NLS_CODEPAGE_850 is not set | ||
1484 | +# CONFIG_NLS_CODEPAGE_852 is not set | ||
1485 | +# CONFIG_NLS_CODEPAGE_855 is not set | ||
1486 | +# CONFIG_NLS_CODEPAGE_857 is not set | ||
1487 | +# CONFIG_NLS_CODEPAGE_860 is not set | ||
1488 | +# CONFIG_NLS_CODEPAGE_861 is not set | ||
1489 | +# CONFIG_NLS_CODEPAGE_862 is not set | ||
1490 | +# CONFIG_NLS_CODEPAGE_863 is not set | ||
1491 | +# CONFIG_NLS_CODEPAGE_864 is not set | ||
1492 | +# CONFIG_NLS_CODEPAGE_865 is not set | ||
1493 | +# CONFIG_NLS_CODEPAGE_866 is not set | ||
1494 | +# CONFIG_NLS_CODEPAGE_869 is not set | ||
1495 | +# CONFIG_NLS_CODEPAGE_936 is not set | ||
1496 | +# CONFIG_NLS_CODEPAGE_950 is not set | ||
1497 | +# CONFIG_NLS_CODEPAGE_932 is not set | ||
1498 | +# CONFIG_NLS_CODEPAGE_949 is not set | ||
1499 | +# CONFIG_NLS_CODEPAGE_874 is not set | ||
1500 | +# CONFIG_NLS_ISO8859_8 is not set | ||
1501 | +# CONFIG_NLS_CODEPAGE_1250 is not set | ||
1502 | +# CONFIG_NLS_CODEPAGE_1251 is not set | ||
1503 | +# CONFIG_NLS_ASCII is not set | ||
1504 | +CONFIG_NLS_ISO8859_1=y | ||
1505 | +# CONFIG_NLS_ISO8859_2 is not set | ||
1506 | +# CONFIG_NLS_ISO8859_3 is not set | ||
1507 | +# CONFIG_NLS_ISO8859_4 is not set | ||
1508 | +# CONFIG_NLS_ISO8859_5 is not set | ||
1509 | +# CONFIG_NLS_ISO8859_6 is not set | ||
1510 | +# CONFIG_NLS_ISO8859_7 is not set | ||
1511 | +# CONFIG_NLS_ISO8859_9 is not set | ||
1512 | +# CONFIG_NLS_ISO8859_13 is not set | ||
1513 | +# CONFIG_NLS_ISO8859_14 is not set | ||
1514 | +# CONFIG_NLS_ISO8859_15 is not set | ||
1515 | +# CONFIG_NLS_KOI8_R is not set | ||
1516 | +# CONFIG_NLS_KOI8_U is not set | ||
1517 | +# CONFIG_NLS_UTF8 is not set | ||
1518 | + | ||
1519 | +# | ||
1520 | +# Distributed Lock Manager | ||
1521 | +# | ||
1522 | +# CONFIG_DLM is not set | ||
1523 | + | ||
1524 | +# | ||
1525 | +# Profiling support | ||
1526 | +# | ||
1527 | +# CONFIG_PROFILING is not set | ||
1528 | + | ||
1529 | +# | ||
1530 | +# Kernel hacking | ||
1531 | +# | ||
1532 | +# CONFIG_PRINTK_TIME is not set | ||
1533 | +CONFIG_ENABLE_MUST_CHECK=y | ||
1534 | +CONFIG_MAGIC_SYSRQ=y | ||
1535 | +# CONFIG_UNUSED_SYMBOLS is not set | ||
1536 | +# CONFIG_DEBUG_FS is not set | ||
1537 | +# CONFIG_HEADERS_CHECK is not set | ||
1538 | +CONFIG_DEBUG_KERNEL=y | ||
1539 | +# CONFIG_DEBUG_SHIRQ is not set | ||
1540 | +CONFIG_LOG_BUF_SHIFT=17 | ||
1541 | +# CONFIG_DETECT_SOFTLOCKUP is not set | ||
1542 | +# CONFIG_SCHEDSTATS is not set | ||
1543 | +# CONFIG_TIMER_STATS is not set | ||
1544 | +# CONFIG_DEBUG_SLAB is not set | ||
1545 | +# CONFIG_DEBUG_RT_MUTEXES is not set | ||
1546 | +# CONFIG_RT_MUTEX_TESTER is not set | ||
1547 | +# CONFIG_DEBUG_SPINLOCK is not set | ||
1548 | +# CONFIG_DEBUG_MUTEXES is not set | ||
1549 | +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1550 | +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1551 | +# CONFIG_DEBUG_KOBJECT is not set | ||
1552 | +# CONFIG_DEBUG_BUGVERBOSE is not set | ||
1553 | +CONFIG_DEBUG_INFO=y | ||
1554 | +# CONFIG_DEBUG_VM is not set | ||
1555 | +# CONFIG_DEBUG_LIST is not set | ||
1556 | +CONFIG_FRAME_POINTER=y | ||
1557 | +CONFIG_FORCED_INLINING=y | ||
1558 | +# CONFIG_RCU_TORTURE_TEST is not set | ||
1559 | +# CONFIG_FAULT_INJECTION is not set | ||
1560 | +CONFIG_DEBUG_USER=y | ||
1561 | +CONFIG_DEBUG_ERRORS=y | ||
1562 | +CONFIG_DEBUG_LL=y | ||
1563 | +# CONFIG_DEBUG_ICEDCC is not set | ||
1564 | + | ||
1565 | +# | ||
1566 | +# Security options | ||
1567 | +# | ||
1568 | +# CONFIG_KEYS is not set | ||
1569 | +# CONFIG_SECURITY is not set | ||
1570 | + | ||
1571 | +# | ||
1572 | +# Cryptographic options | ||
1573 | +# | ||
1574 | +CONFIG_CRYPTO=y | ||
1575 | +CONFIG_CRYPTO_ALGAPI=m | ||
1576 | +CONFIG_CRYPTO_BLKCIPHER=m | ||
1577 | +CONFIG_CRYPTO_MANAGER=m | ||
1578 | +# CONFIG_CRYPTO_HMAC is not set | ||
1579 | +# CONFIG_CRYPTO_XCBC is not set | ||
1580 | +# CONFIG_CRYPTO_NULL is not set | ||
1581 | +# CONFIG_CRYPTO_MD4 is not set | ||
1582 | +# CONFIG_CRYPTO_MD5 is not set | ||
1583 | +# CONFIG_CRYPTO_SHA1 is not set | ||
1584 | +# CONFIG_CRYPTO_SHA256 is not set | ||
1585 | +# CONFIG_CRYPTO_SHA512 is not set | ||
1586 | +# CONFIG_CRYPTO_WP512 is not set | ||
1587 | +# CONFIG_CRYPTO_TGR192 is not set | ||
1588 | +# CONFIG_CRYPTO_GF128MUL is not set | ||
1589 | +CONFIG_CRYPTO_ECB=m | ||
1590 | +CONFIG_CRYPTO_CBC=m | ||
1591 | +CONFIG_CRYPTO_PCBC=m | ||
1592 | +# CONFIG_CRYPTO_LRW is not set | ||
1593 | +# CONFIG_CRYPTO_DES is not set | ||
1594 | +# CONFIG_CRYPTO_FCRYPT is not set | ||
1595 | +# CONFIG_CRYPTO_BLOWFISH is not set | ||
1596 | +# CONFIG_CRYPTO_TWOFISH is not set | ||
1597 | +# CONFIG_CRYPTO_SERPENT is not set | ||
1598 | +CONFIG_CRYPTO_AES=m | ||
1599 | +# CONFIG_CRYPTO_CAST5 is not set | ||
1600 | +# CONFIG_CRYPTO_CAST6 is not set | ||
1601 | +# CONFIG_CRYPTO_TEA is not set | ||
1602 | +CONFIG_CRYPTO_ARC4=m | ||
1603 | +# CONFIG_CRYPTO_KHAZAD is not set | ||
1604 | +# CONFIG_CRYPTO_ANUBIS is not set | ||
1605 | +# CONFIG_CRYPTO_DEFLATE is not set | ||
1606 | +# CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1607 | +# CONFIG_CRYPTO_CRC32C is not set | ||
1608 | +# CONFIG_CRYPTO_CAMELLIA is not set | ||
1609 | +# CONFIG_CRYPTO_TEST is not set | ||
1610 | + | ||
1611 | +# | ||
1612 | +# Hardware crypto devices | ||
1613 | +# | ||
1614 | + | ||
1615 | +# | ||
1616 | +# Library routines | ||
1617 | +# | ||
1618 | +CONFIG_BITREVERSE=y | ||
1619 | +# CONFIG_CRC_CCITT is not set | ||
1620 | +# CONFIG_CRC16 is not set | ||
1621 | +CONFIG_CRC32=y | ||
1622 | +# CONFIG_LIBCRC32C is not set | ||
1623 | +CONFIG_PLIST=y | ||
1624 | +CONFIG_HAS_IOMEM=y | ||
1625 | +CONFIG_HAS_IOPORT=y | ||
1626 | diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig | ||
1627 | index 5ebec6d..e126926 100644 | ||
1628 | --- a/arch/arm/mach-pxa/Kconfig | ||
1629 | +++ b/arch/arm/mach-pxa/Kconfig | ||
1630 | @@ -40,6 +40,12 @@ config MACH_TRIZEPS4 | ||
1631 | config MACH_EM_X270 | ||
1632 | bool "CompuLab EM-x270 platform" | ||
1633 | select PXA27x | ||
1634 | + select IWMMXT | ||
1635 | + | ||
1636 | +config MACH_ARMCORE | ||
1637 | + bool "CompuLab CM-X270 modules" | ||
1638 | + select PXA27x | ||
1639 | + select IWMMXT | ||
1640 | |||
1641 | endchoice | ||
1642 | |||
1643 | diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile | ||
1644 | index 7d6ab5c..b369289 100644 | ||
1645 | --- a/arch/arm/mach-pxa/Makefile | ||
1646 | +++ b/arch/arm/mach-pxa/Makefile | ||
1647 | @@ -19,6 +19,7 @@ obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o | ||
1648 | obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o | ||
1649 | obj-$(CONFIG_MACH_TOSA) += tosa.o | ||
1650 | obj-$(CONFIG_MACH_EM_X270) += em-x270.o | ||
1651 | +obj-$(CONFIG_MACH_ARMCORE) += cm-x270.o | ||
1652 | |||
1653 | # Support for blinky lights | ||
1654 | led-y := leds.o | ||
1655 | @@ -26,6 +27,8 @@ led-$(CONFIG_ARCH_LUBBOCK) += leds-lubbock.o | ||
1656 | led-$(CONFIG_MACH_MAINSTONE) += leds-mainstone.o | ||
1657 | led-$(CONFIG_ARCH_PXA_IDP) += leds-idp.o | ||
1658 | led-$(CONFIG_MACH_TRIZEPS4) += leds-trizeps4.o | ||
1659 | +# FIXME: use driver/leds instead | ||
1660 | +led-$(CONFIG_MACH_ARMCORE) += leds-cm-x270.o | ||
1661 | |||
1662 | obj-$(CONFIG_LEDS) += $(led-y) | ||
1663 | |||
1664 | @@ -36,3 +39,7 @@ obj-$(CONFIG_PXA_SSP) += ssp.o | ||
1665 | ifeq ($(CONFIG_PXA27x),y) | ||
1666 | obj-$(CONFIG_PM) += standby.o | ||
1667 | endif | ||
1668 | + | ||
1669 | +ifeq ($(CONFIG_PCI),y) | ||
1670 | +obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o | ||
1671 | +endif | ||
1672 | diff --git a/arch/arm/mach-pxa/cm-x270.c b/arch/arm/mach-pxa/cm-x270.c | ||
1673 | new file mode 100644 | ||
1674 | index 0000000..7b4e288 | ||
1675 | --- /dev/null | ||
1676 | +++ b/arch/arm/mach-pxa/cm-x270.c | ||
1677 | @@ -0,0 +1,821 @@ | ||
1678 | +/* | ||
1679 | + * linux/arch/arm/mach-pxa/cm-x270.c | ||
1680 | + * | ||
1681 | + * Copyright (C) 2007 CompuLab, Ltd. | ||
1682 | + * Mike Rapoport <mike@compulab.co.il> | ||
1683 | + * | ||
1684 | + * This program is free software; you can redistribute it and/or modify | ||
1685 | + * it under the terms of the GNU General Public License version 2 as | ||
1686 | + * published by the Free Software Foundation. | ||
1687 | + */ | ||
1688 | + | ||
1689 | +#include <linux/pm.h> | ||
1690 | +#include <linux/fb.h> | ||
1691 | +#include <linux/platform_device.h> | ||
1692 | +#include <linux/sysdev.h> | ||
1693 | +#include <linux/dm9000.h> | ||
1694 | +#include <linux/rtc-v3020.h> | ||
1695 | +#include <linux/serial_8250.h> | ||
1696 | +#include <video/mbxfb.h> | ||
1697 | + | ||
1698 | +#include <asm/types.h> | ||
1699 | +#include <asm/setup.h> | ||
1700 | +#include <asm/memory.h> | ||
1701 | +#include <asm/mach-types.h> | ||
1702 | +#include <asm/hardware.h> | ||
1703 | +#include <asm/irq.h> | ||
1704 | +#include <asm/io.h> | ||
1705 | +#include <asm/delay.h> | ||
1706 | + | ||
1707 | +#include <asm/mach/arch.h> | ||
1708 | +#include <asm/mach/map.h> | ||
1709 | +#include <asm/mach/irq.h> | ||
1710 | + | ||
1711 | +#include <asm/arch/pxa-regs.h> | ||
1712 | +#include <asm/arch/pxafb.h> | ||
1713 | +#include <asm/arch/ohci.h> | ||
1714 | +#include <asm/arch/mmc.h> | ||
1715 | +#include <asm/arch/bitfield.h> | ||
1716 | +#include <asm/arch/cm-x270.h> | ||
1717 | + | ||
1718 | +#include <asm/hardware/it8152.h> | ||
1719 | + | ||
1720 | +#include "generic.h" | ||
1721 | + | ||
1722 | +#define RTC_PHYS_BASE (PXA_CS1_PHYS + (5 << 22)) | ||
1723 | +#define DM9000_PHYS_BASE (PXA_CS1_PHYS + (6 << 22)) | ||
1724 | + | ||
1725 | +static struct resource cmx270_dm9k_resource[] = { | ||
1726 | + [0] = { | ||
1727 | + .start = DM9000_PHYS_BASE, | ||
1728 | + .end = DM9000_PHYS_BASE + 4, | ||
1729 | + .flags = IORESOURCE_MEM, | ||
1730 | + }, | ||
1731 | + [1] = { | ||
1732 | + .start = DM9000_PHYS_BASE + 8, | ||
1733 | + .end = DM9000_PHYS_BASE + 8 + 500, | ||
1734 | + .flags = IORESOURCE_MEM, | ||
1735 | + }, | ||
1736 | + [2] = { | ||
1737 | + .start = CMX270_ETHIRQ, | ||
1738 | + .end = CMX270_ETHIRQ, | ||
1739 | + .flags = IORESOURCE_IRQ, | ||
1740 | + } | ||
1741 | +}; | ||
1742 | + | ||
1743 | +/* for the moment we limit ourselves to 32bit IO until some | ||
1744 | + * better IO routines can be written and tested | ||
1745 | + */ | ||
1746 | +static struct dm9000_plat_data cmx270_dm9k_platdata = { | ||
1747 | + .flags = DM9000_PLATF_32BITONLY, | ||
1748 | +}; | ||
1749 | + | ||
1750 | +/* Ethernet device */ | ||
1751 | +static struct platform_device cmx270_device_dm9k = { | ||
1752 | + .name = "dm9000", | ||
1753 | + .id = 0, | ||
1754 | + .num_resources = ARRAY_SIZE(cmx270_dm9k_resource), | ||
1755 | + .resource = cmx270_dm9k_resource, | ||
1756 | + .dev = { | ||
1757 | + .platform_data = &cmx270_dm9k_platdata, | ||
1758 | + } | ||
1759 | +}; | ||
1760 | + | ||
1761 | +/* audio device */ | ||
1762 | +static struct platform_device cmx270_audio_device = { | ||
1763 | + .name = "pxa2xx-ac97", | ||
1764 | + .id = -1, | ||
1765 | +}; | ||
1766 | + | ||
1767 | +/* touchscreen controller */ | ||
1768 | +static struct platform_device cmx270_ts_device = { | ||
1769 | + .name = "ucb1x00-ts", | ||
1770 | + .id = -1, | ||
1771 | +}; | ||
1772 | + | ||
1773 | +/* RTC */ | ||
1774 | +static struct resource cmx270_v3020_resource[] = { | ||
1775 | + [0] = { | ||
1776 | + .start = RTC_PHYS_BASE, | ||
1777 | + .end = RTC_PHYS_BASE + 4, | ||
1778 | + .flags = IORESOURCE_MEM, | ||
1779 | + }, | ||
1780 | +}; | ||
1781 | + | ||
1782 | +struct v3020_platform_data cmx270_v3020_pdata = { | ||
1783 | + .leftshift = 16, | ||
1784 | +}; | ||
1785 | + | ||
1786 | +static struct platform_device cmx270_rtc_device = { | ||
1787 | + .name = "v3020", | ||
1788 | + .num_resources = ARRAY_SIZE(cmx270_v3020_resource), | ||
1789 | + .resource = cmx270_v3020_resource, | ||
1790 | + .id = -1, | ||
1791 | + .dev = { | ||
1792 | + .platform_data = &cmx270_v3020_pdata, | ||
1793 | + } | ||
1794 | +}; | ||
1795 | + | ||
1796 | +/* | ||
1797 | + * CM-X270 LEDs | ||
1798 | + */ | ||
1799 | +static struct platform_device cmx270led_device = { | ||
1800 | + .name = "cm-x270-led", | ||
1801 | + .id = -1, | ||
1802 | +}; | ||
1803 | + | ||
1804 | +/* 2700G graphics */ | ||
1805 | +static u64 fb_dma_mask = ~(u64)0; | ||
1806 | + | ||
1807 | +static struct resource cmx270_2700G_resource[] = { | ||
1808 | + /* frame buffer memory including ODFB and External SDRAM */ | ||
1809 | + [0] = { | ||
1810 | + .start = MARATHON_PHYS, | ||
1811 | + .end = MARATHON_PHYS + 0x02000000, | ||
1812 | + .flags = IORESOURCE_MEM, | ||
1813 | + }, | ||
1814 | + /* Marathon registers */ | ||
1815 | + [1] = { | ||
1816 | + .start = MARATHON_PHYS + 0x03fe0000, | ||
1817 | + .end = MARATHON_PHYS + 0x03ffffff, | ||
1818 | + .flags = IORESOURCE_MEM, | ||
1819 | + }, | ||
1820 | +}; | ||
1821 | + | ||
1822 | +static unsigned long save_lcd_regs[10]; | ||
1823 | + | ||
1824 | +static int cmx270_marathon_probe(struct fb_info *fb) | ||
1825 | +{ | ||
1826 | + /* save PXA-270 pin settings before enabling 2700G */ | ||
1827 | + save_lcd_regs[0] = GPDR1; | ||
1828 | + save_lcd_regs[1] = GPDR2; | ||
1829 | + save_lcd_regs[2] = GAFR1_U; | ||
1830 | + save_lcd_regs[3] = GAFR2_L; | ||
1831 | + save_lcd_regs[4] = GAFR2_U; | ||
1832 | + | ||
1833 | + /* Disable PXA-270 on-chip controller driving pins */ | ||
1834 | + GPDR1 &= ~(0xfc000000); | ||
1835 | + GPDR2 &= ~(0x00c03fff); | ||
1836 | + GAFR1_U &= ~(0xfff00000); | ||
1837 | + GAFR2_L &= ~(0x0fffffff); | ||
1838 | + GAFR2_U &= ~(0x0000f000); | ||
1839 | + return 0; | ||
1840 | +} | ||
1841 | + | ||
1842 | +static int cmx270_marathon_remove(struct fb_info *fb) | ||
1843 | +{ | ||
1844 | + GPDR1 = save_lcd_regs[0]; | ||
1845 | + GPDR2 = save_lcd_regs[1]; | ||
1846 | + GAFR1_U = save_lcd_regs[2]; | ||
1847 | + GAFR2_L = save_lcd_regs[3]; | ||
1848 | + GAFR2_U = save_lcd_regs[4]; | ||
1849 | + return 0; | ||
1850 | +} | ||
1851 | + | ||
1852 | +static struct mbxfb_platform_data cmx270_2700G_data = { | ||
1853 | + .xres = { | ||
1854 | + .min = 240, | ||
1855 | + .max = 1200, | ||
1856 | + .defval = 640, | ||
1857 | + }, | ||
1858 | + .yres = { | ||
1859 | + .min = 240, | ||
1860 | + .max = 1200, | ||
1861 | + .defval = 480, | ||
1862 | + }, | ||
1863 | + .bpp = { | ||
1864 | + .min = 16, | ||
1865 | + .max = 32, | ||
1866 | + .defval = 16, | ||
1867 | + }, | ||
1868 | + .memsize = 8*1024*1024, | ||
1869 | + .probe = cmx270_marathon_probe, | ||
1870 | + .remove = cmx270_marathon_remove, | ||
1871 | +}; | ||
1872 | + | ||
1873 | +static struct platform_device cmx270_2700G = { | ||
1874 | + .name = "mbx-fb", | ||
1875 | + .dev = { | ||
1876 | + .platform_data = &cmx270_2700G_data, | ||
1877 | + .dma_mask = &fb_dma_mask, | ||
1878 | + .coherent_dma_mask = 0xffffffff, | ||
1879 | + }, | ||
1880 | + .num_resources = ARRAY_SIZE(cmx270_2700G_resource), | ||
1881 | + .resource = cmx270_2700G_resource, | ||
1882 | + .id = -1, | ||
1883 | +}; | ||
1884 | + | ||
1885 | +/* platform devices */ | ||
1886 | +static struct platform_device *platform_devices[] __initdata = { | ||
1887 | + &cmx270_device_dm9k, | ||
1888 | + &cmx270_audio_device, | ||
1889 | + &cmx270_rtc_device, | ||
1890 | + &cmx270_2700G, | ||
1891 | + &cmx270led_device, | ||
1892 | +}; | ||
1893 | + | ||
1894 | +#ifdef CONFIG_PCI | ||
1895 | +/* | ||
1896 | + * Install handler for IT8152 IRQ. Yes, yes... we are way down the IRQ | ||
1897 | + * cascade which is not good for IRQ latency, but the hardware has been | ||
1898 | + * designed that way... | ||
1899 | + */ | ||
1900 | +static inline void cmx270_irq(int irq, struct pt_regs *regs) | ||
1901 | +{ | ||
1902 | + struct irq_desc *desc; | ||
1903 | + desc = irq_desc + irq; | ||
1904 | + desc_handle_irq(irq, desc); | ||
1905 | +} | ||
1906 | + | ||
1907 | +static void cmx270_irq_demux(unsigned int irq, struct irqdesc *desc, | ||
1908 | + struct pt_regs *regs) | ||
1909 | +{ | ||
1910 | + unsigned long pdcnimr, ldcnimr; | ||
1911 | + int pdcnirr, ldcnir; | ||
1912 | + | ||
1913 | + /* clear our parent irq */ | ||
1914 | + GEDR(GPIO_IT8152_IRQ) = GPIO_bit(GPIO_IT8152_IRQ); | ||
1915 | + | ||
1916 | + /* read pending IRQs in the chip registers and clear them */ | ||
1917 | + pdcnirr = IT8152_INTC_PDCNIRR; | ||
1918 | + ldcnir = IT8152_INTC_LDCNIRR; | ||
1919 | + IT8152_INTC_PDCNIRR = ~pdcnirr; | ||
1920 | + IT8152_INTC_LDCNIRR = ~ldcnir; | ||
1921 | + | ||
1922 | + /* mask ITE irqs */ | ||
1923 | + pdcnimr = IT8152_INTC_PDCNIMR; | ||
1924 | + ldcnimr = IT8152_INTC_LDCNIMR; | ||
1925 | + IT8152_INTC_PDCNIMR = 0xffff; | ||
1926 | + IT8152_INTC_LDCNIMR = 0xffff; | ||
1927 | + | ||
1928 | + pdcnirr &= (PCISERR_BIT | H2PTADR_BIT | H2PMAR_BIT | | ||
1929 | + PCI_INTD_BIT | PCI_INTC_BIT | PCI_INTB_BIT | PCI_INTA_BIT | | ||
1930 | + USB_INT_BIT | CDMA_INT_BIT); | ||
1931 | + | ||
1932 | + ldcnir &= ITESER_BIT; | ||
1933 | + | ||
1934 | + IT8152_INTC_PDCNIRR = ~pdcnirr; | ||
1935 | + IT8152_INTC_LDCNIRR = ~ldcnir; | ||
1936 | + | ||
1937 | + /* are there interrupts pending ? */ | ||
1938 | + if( (pdcnirr | ldcnir) ) { | ||
1939 | + if (pdcnirr) { | ||
1940 | + if( pdcnirr & PCISERR_BIT ) | ||
1941 | + cmx270_irq(PCISERR, regs); | ||
1942 | + if( pdcnirr & H2PTADR_BIT ) | ||
1943 | + cmx270_irq(H2PTADR, regs); | ||
1944 | + if( pdcnirr & H2PMAR_BIT ) | ||
1945 | + cmx270_irq(H2PMAR, regs); | ||
1946 | + if( pdcnirr & PCI_INTA_BIT ) | ||
1947 | + cmx270_irq(PCI_INTA, regs); | ||
1948 | + if( pdcnirr & PCI_INTB_BIT ) | ||
1949 | + cmx270_irq(PCI_INTB, regs); | ||
1950 | + if( pdcnirr & PCI_INTC_BIT ) | ||
1951 | + cmx270_irq(PCI_INTC, regs); | ||
1952 | + if( pdcnirr & PCI_INTD_BIT ) | ||
1953 | + cmx270_irq(PCI_INTD, regs); | ||
1954 | + if( pdcnirr & USB_INT_BIT ) | ||
1955 | + cmx270_irq(USB_INT, regs); | ||
1956 | + if( pdcnirr & CDMA_INT_BIT ) | ||
1957 | + cmx270_irq(CDMA_INT, regs); | ||
1958 | + } | ||
1959 | + if(ldcnir) { | ||
1960 | + if( ldcnir & ITESER_BIT ) | ||
1961 | + cmx270_irq(IRQ_ITESER, regs); | ||
1962 | + } | ||
1963 | + } | ||
1964 | + | ||
1965 | + /* re-enable ITE interrupts */ | ||
1966 | + IT8152_INTC_PDCNIMR = pdcnimr; | ||
1967 | + IT8152_INTC_LDCNIMR = ldcnimr; | ||
1968 | +} | ||
1969 | +#else | ||
1970 | +unsigned long it8152_base_address = CMX270_IT8152_VIRT; | ||
1971 | +#endif | ||
1972 | + | ||
1973 | +/* #define CMX270_FLASH_VIRT (CMX270_IDE104_VIRT + PXA_CS_SIZE - (8<<20)) */ | ||
1974 | +/* Map PCI companion and IDE/General Purpose CS statically */ | ||
1975 | +static struct map_desc cmx270_io_desc[] __initdata = { | ||
1976 | + [0] = { /* IDE/general purpose space */ | ||
1977 | + .virtual = CMX270_IDE104_VIRT, | ||
1978 | + .pfn = __phys_to_pfn(CMX270_IDE104_PHYS), | ||
1979 | + .length = PXA_CS_SIZE - (8<<20), | ||
1980 | + .type = MT_DEVICE | ||
1981 | + }, | ||
1982 | + [1] = { /* PCI bridge */ | ||
1983 | + .virtual = CMX270_IT8152_VIRT, | ||
1984 | + .pfn = __phys_to_pfn(CMX270_IT8152_PHYS), | ||
1985 | + .length = PXA_CS_SIZE, | ||
1986 | + .type = MT_DEVICE | ||
1987 | + }, | ||
1988 | +}; | ||
1989 | + | ||
1990 | +/* | ||
1991 | + Display definitions | ||
1992 | + keep these for backwards compatibility, although symbolic names (as | ||
1993 | + e.g. in lpd270.c) looks better | ||
1994 | + */ | ||
1995 | +#define MTYPE_STN320x240 0 | ||
1996 | +#define MTYPE_TFT640x480 1 | ||
1997 | +#define MTYPE_CRT640x480 2 | ||
1998 | +#define MTYPE_CRT800x600 3 | ||
1999 | +#define MTYPE_TFT320x240 6 | ||
2000 | +#define MTYPE_STN640x480 7 | ||
2001 | + | ||
2002 | +static struct pxafb_mode_info generic_stn_320x240_mode = { | ||
2003 | + .pixclock = 76923, | ||
2004 | + .bpp = 8, | ||
2005 | + .xres = 320, | ||
2006 | + .yres = 240, | ||
2007 | + .hsync_len = 3, | ||
2008 | + .vsync_len = 2, | ||
2009 | + .left_margin = 3, | ||
2010 | + .upper_margin = 0, | ||
2011 | + .right_margin = 3, | ||
2012 | + .lower_margin = 0, | ||
2013 | + .sync = (FB_SYNC_HOR_HIGH_ACT | | ||
2014 | + FB_SYNC_VERT_HIGH_ACT), | ||
2015 | + .cmap_greyscale = 0, | ||
2016 | +}; | ||
2017 | + | ||
2018 | +static struct pxafb_mach_info generic_stn_320x240 = { | ||
2019 | + .modes = &generic_stn_320x240_mode, | ||
2020 | + .num_modes = 1, | ||
2021 | + .lccr0 = 0, | ||
2022 | + .lccr3 = (LCCR3_PixClkDiv(0x03) | | ||
2023 | + LCCR3_Acb(0xff) | | ||
2024 | + LCCR3_PCP), | ||
2025 | + .cmap_inverse = 0, | ||
2026 | + .cmap_static = 0, | ||
2027 | +}; | ||
2028 | + | ||
2029 | +static struct pxafb_mode_info generic_tft_640x480_mode = { | ||
2030 | + .pixclock = 38461, | ||
2031 | + .bpp = 8, | ||
2032 | + .xres = 640, | ||
2033 | + .yres = 480, | ||
2034 | + .hsync_len = 60, | ||
2035 | + .vsync_len = 2, | ||
2036 | + .left_margin = 70, | ||
2037 | + .upper_margin = 10, | ||
2038 | + .right_margin = 70, | ||
2039 | + .lower_margin = 5, | ||
2040 | + .sync = 0, | ||
2041 | + .cmap_greyscale = 0, | ||
2042 | +}; | ||
2043 | + | ||
2044 | +static struct pxafb_mach_info generic_tft_640x480 = { | ||
2045 | + .modes = &generic_tft_640x480_mode, | ||
2046 | + .num_modes = 1, | ||
2047 | + .lccr0 = (LCCR0_PAS), | ||
2048 | + .lccr3 = (LCCR3_PixClkDiv(0x01) | | ||
2049 | + LCCR3_Acb(0xff) | | ||
2050 | + LCCR3_PCP), | ||
2051 | + .cmap_inverse = 0, | ||
2052 | + .cmap_static = 0, | ||
2053 | +}; | ||
2054 | + | ||
2055 | +static struct pxafb_mode_info generic_crt_640x480_mode = { | ||
2056 | + .pixclock = 38461, | ||
2057 | + .bpp = 8, | ||
2058 | + .xres = 640, | ||
2059 | + .yres = 480, | ||
2060 | + .hsync_len = 63, | ||
2061 | + .vsync_len = 2, | ||
2062 | + .left_margin = 81, | ||
2063 | + .upper_margin = 33, | ||
2064 | + .right_margin = 16, | ||
2065 | + .lower_margin = 10, | ||
2066 | + .sync = (FB_SYNC_HOR_HIGH_ACT | | ||
2067 | + FB_SYNC_VERT_HIGH_ACT), | ||
2068 | + .cmap_greyscale = 0, | ||
2069 | +}; | ||
2070 | + | ||
2071 | +static struct pxafb_mach_info generic_crt_640x480 = { | ||
2072 | + .modes = &generic_crt_640x480_mode, | ||
2073 | + .num_modes = 1, | ||
2074 | + .lccr0 = (LCCR0_PAS), | ||
2075 | + .lccr3 = (LCCR3_PixClkDiv(0x01) | | ||
2076 | + LCCR3_Acb(0xff)), | ||
2077 | + .cmap_inverse = 0, | ||
2078 | + .cmap_static = 0, | ||
2079 | +}; | ||
2080 | + | ||
2081 | +static struct pxafb_mode_info generic_crt_800x600_mode = { | ||
2082 | + .pixclock = 28846, | ||
2083 | + .bpp = 8, | ||
2084 | + .xres = 800, | ||
2085 | + .yres = 600, | ||
2086 | + .hsync_len = 63, | ||
2087 | + .vsync_len = 2, | ||
2088 | + .left_margin = 26, | ||
2089 | + .upper_margin = 21, | ||
2090 | + .right_margin = 26, | ||
2091 | + .lower_margin = 11, | ||
2092 | + .sync = (FB_SYNC_HOR_HIGH_ACT | | ||
2093 | + FB_SYNC_VERT_HIGH_ACT), | ||
2094 | + .cmap_greyscale = 0, | ||
2095 | +}; | ||
2096 | + | ||
2097 | +static struct pxafb_mach_info generic_crt_800x600 = { | ||
2098 | + .modes = &generic_crt_800x600_mode, | ||
2099 | + .num_modes = 1, | ||
2100 | + .lccr0 = (LCCR0_PAS), | ||
2101 | + .lccr3 = (LCCR3_PixClkDiv(0x02) | | ||
2102 | + LCCR3_Acb(0xff)), | ||
2103 | + .cmap_inverse = 0, | ||
2104 | + .cmap_static = 0, | ||
2105 | +}; | ||
2106 | + | ||
2107 | +static struct pxafb_mode_info generic_tft_320x240_mode = { | ||
2108 | + .pixclock = 134615, | ||
2109 | + .bpp = 16, | ||
2110 | + .xres = 320, | ||
2111 | + .yres = 240, | ||
2112 | + .hsync_len = 63, | ||
2113 | + .vsync_len = 7, | ||
2114 | + .left_margin = 75, | ||
2115 | + .upper_margin = 0, | ||
2116 | + .right_margin = 15, | ||
2117 | + .lower_margin = 15, | ||
2118 | + .sync = 0, | ||
2119 | + .cmap_greyscale = 0, | ||
2120 | +}; | ||
2121 | + | ||
2122 | +static struct pxafb_mach_info generic_tft_320x240 = { | ||
2123 | + .modes = &generic_tft_320x240_mode, | ||
2124 | + .num_modes = 1, | ||
2125 | + .lccr0 = (LCCR0_PAS), | ||
2126 | + .lccr3 = (LCCR3_PixClkDiv(0x06) | | ||
2127 | + LCCR3_Acb(0xff) | | ||
2128 | + LCCR3_PCP), | ||
2129 | + .cmap_inverse = 0, | ||
2130 | + .cmap_static = 0, | ||
2131 | +}; | ||
2132 | + | ||
2133 | +static struct pxafb_mode_info generic_stn_640x480_mode = { | ||
2134 | + .pixclock = 57692, | ||
2135 | + .bpp = 8, | ||
2136 | + .xres = 640, | ||
2137 | + .yres = 480, | ||
2138 | + .hsync_len = 4, | ||
2139 | + .vsync_len = 2, | ||
2140 | + .left_margin = 10, | ||
2141 | + .upper_margin = 5, | ||
2142 | + .right_margin = 10, | ||
2143 | + .lower_margin = 5, | ||
2144 | + .sync = (FB_SYNC_HOR_HIGH_ACT | | ||
2145 | + FB_SYNC_VERT_HIGH_ACT), | ||
2146 | + .cmap_greyscale = 0, | ||
2147 | +}; | ||
2148 | + | ||
2149 | +static struct pxafb_mach_info generic_stn_640x480 = { | ||
2150 | + .modes = &generic_stn_640x480_mode, | ||
2151 | + .num_modes = 1, | ||
2152 | + .lccr0 = 0, | ||
2153 | + .lccr3 = (LCCR3_PixClkDiv(0x02) | | ||
2154 | + LCCR3_Acb(0xff)), | ||
2155 | + .cmap_inverse = 0, | ||
2156 | + .cmap_static = 0, | ||
2157 | +}; | ||
2158 | + | ||
2159 | +static struct pxafb_mach_info *cmx270_display = &generic_crt_640x480; | ||
2160 | + | ||
2161 | +static int __init cmx270_set_display(char *str) | ||
2162 | +{ | ||
2163 | + int disp_type = simple_strtol(str, NULL, 0); | ||
2164 | + switch (disp_type) { | ||
2165 | + case MTYPE_STN320x240: | ||
2166 | + cmx270_display = &generic_stn_320x240; | ||
2167 | + break; | ||
2168 | + case MTYPE_TFT640x480: | ||
2169 | + cmx270_display = &generic_tft_640x480; | ||
2170 | + break; | ||
2171 | + case MTYPE_CRT640x480: | ||
2172 | + cmx270_display = &generic_crt_640x480; | ||
2173 | + break; | ||
2174 | + case MTYPE_CRT800x600: | ||
2175 | + cmx270_display = &generic_crt_800x600; | ||
2176 | + break; | ||
2177 | + case MTYPE_TFT320x240: | ||
2178 | + cmx270_display = &generic_tft_320x240; | ||
2179 | + break; | ||
2180 | + case MTYPE_STN640x480: | ||
2181 | + cmx270_display = &generic_stn_640x480; | ||
2182 | + break; | ||
2183 | + default: /* fallback to CRT 640x480 */ | ||
2184 | + cmx270_display = &generic_crt_640x480; | ||
2185 | + break; | ||
2186 | + } | ||
2187 | + return 1; | ||
2188 | +} | ||
2189 | + | ||
2190 | +__setup("monitor=", cmx270_set_display); | ||
2191 | + | ||
2192 | +/* PXA27x OHCI controller setup */ | ||
2193 | +static int cmx270_ohci_init(struct device *dev) | ||
2194 | +{ | ||
2195 | + /* Set the Power Control Polarity Low */ | ||
2196 | + UHCHR = (UHCHR | UHCHR_PCPL) & | ||
2197 | + ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE); | ||
2198 | + | ||
2199 | + return 0; | ||
2200 | +} | ||
2201 | + | ||
2202 | +static struct pxaohci_platform_data cmx270_ohci_platform_data = { | ||
2203 | + .port_mode = PMM_PERPORT_MODE, | ||
2204 | + .init = cmx270_ohci_init, | ||
2205 | +}; | ||
2206 | + | ||
2207 | + | ||
2208 | +static int cmx270_mci_init(struct device *dev, irq_handler_t cmx270_detect_int, void *data) | ||
2209 | +{ | ||
2210 | + int err; | ||
2211 | + | ||
2212 | + /* | ||
2213 | + * setup GPIO for PXA27x MMC controller | ||
2214 | + */ | ||
2215 | + pxa_gpio_mode(GPIO32_MMCCLK_MD); | ||
2216 | + pxa_gpio_mode(GPIO112_MMCCMD_MD); | ||
2217 | + pxa_gpio_mode(GPIO92_MMCDAT0_MD); | ||
2218 | + pxa_gpio_mode(GPIO109_MMCDAT1_MD); | ||
2219 | + pxa_gpio_mode(GPIO110_MMCDAT2_MD); | ||
2220 | + pxa_gpio_mode(GPIO111_MMCDAT3_MD); | ||
2221 | + | ||
2222 | + /* SB-X270 uses GPIO105 as SD power enable */ | ||
2223 | + pxa_gpio_mode(105 | GPIO_OUT); | ||
2224 | + | ||
2225 | + /* card detect IRQ on GPIO 83 */ | ||
2226 | + pxa_gpio_mode(IRQ_TO_GPIO(CMX270_MMC_IRQ)); | ||
2227 | + set_irq_type(CMX270_MMC_IRQ, IRQT_FALLING); | ||
2228 | + | ||
2229 | + err = request_irq(CMX270_MMC_IRQ, cmx270_detect_int, SA_INTERRUPT, | ||
2230 | + "MMC card detect", data); | ||
2231 | + if (err) { | ||
2232 | + printk(KERN_ERR "cmx270_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); | ||
2233 | + return -1; | ||
2234 | + } | ||
2235 | + | ||
2236 | + return 0; | ||
2237 | +} | ||
2238 | + | ||
2239 | +static void cmx270_mci_setpower(struct device *dev, unsigned int vdd) | ||
2240 | +{ | ||
2241 | + struct pxamci_platform_data* p_d = dev->platform_data; | ||
2242 | + | ||
2243 | + if (( 1 << vdd) & p_d->ocr_mask) { | ||
2244 | + printk(KERN_DEBUG "%s: on\n", __FUNCTION__); | ||
2245 | + GPCR(105) = GPIO_bit(105); | ||
2246 | + } else { | ||
2247 | + GPSR(105) = GPIO_bit(105); | ||
2248 | + printk(KERN_DEBUG "%s: off\n", __FUNCTION__); | ||
2249 | + } | ||
2250 | +} | ||
2251 | + | ||
2252 | +static void cmx270_mci_exit(struct device *dev, void *data) | ||
2253 | +{ | ||
2254 | + free_irq(CMX270_MMC_IRQ, data); | ||
2255 | +} | ||
2256 | + | ||
2257 | +static struct pxamci_platform_data cmx270_mci_platform_data = { | ||
2258 | + .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, | ||
2259 | + .init = cmx270_mci_init, | ||
2260 | + .setpower = cmx270_mci_setpower, | ||
2261 | + .exit = cmx270_mci_exit, | ||
2262 | +}; | ||
2263 | + | ||
2264 | +#ifdef CONFIG_PM | ||
2265 | +/* extern struct subsystem power_subsys; */ | ||
2266 | +static unsigned long sleep_save_ite[10]; | ||
2267 | +static unsigned long sleep_save_msc[10]; | ||
2268 | + | ||
2269 | +static int cmx270_suspend(struct sys_device *dev, pm_message_t state) | ||
2270 | +{ | ||
2271 | +#ifdef CONFIG_PCI | ||
2272 | + /* save ITE state */ | ||
2273 | + sleep_save_ite[0] = IT8152_INTC_PDCNIMR; | ||
2274 | + sleep_save_ite[1] = IT8152_INTC_LPCNIMR; | ||
2275 | + sleep_save_ite[2] = IT8152_INTC_LPNIAR; | ||
2276 | + | ||
2277 | + /* Clear ITE IRQ's */ | ||
2278 | + IT8152_INTC_PDCNIRR = 0; | ||
2279 | + IT8152_INTC_LPCNIRR = 0; | ||
2280 | +#endif | ||
2281 | + | ||
2282 | + /* save MSC registers */ | ||
2283 | + sleep_save_msc[0] = MSC0; | ||
2284 | + sleep_save_msc[1] = MSC1; | ||
2285 | + sleep_save_msc[2] = MSC2; | ||
2286 | + | ||
2287 | + /* setup power saving mode registers */ | ||
2288 | + PCFR = 0x0; | ||
2289 | + PSLR = 0xff400000; | ||
2290 | + PMCR = 0x00000005; | ||
2291 | + PWER = 0x80000000; | ||
2292 | + PFER = 0x00000000; | ||
2293 | + PRER = 0x00000000; | ||
2294 | + PGSR0 = 0xC0018800; | ||
2295 | + PGSR1 = 0x004F0002; | ||
2296 | + PGSR2 = 0x6021C000; | ||
2297 | + PGSR3 = 0x00020000; | ||
2298 | + | ||
2299 | + return 0; | ||
2300 | +} | ||
2301 | + | ||
2302 | +static int cmx270_resume(struct sys_device *dev) | ||
2303 | +{ | ||
2304 | +#ifdef CONFIG_PCI | ||
2305 | + /* restore IT8152 state */ | ||
2306 | + IT8152_INTC_PDCNIMR = sleep_save_ite[0]; | ||
2307 | + IT8152_INTC_LPCNIMR = sleep_save_ite[1]; | ||
2308 | + IT8152_INTC_LPNIAR = sleep_save_ite[2]; | ||
2309 | +#endif | ||
2310 | + | ||
2311 | + /* restore MSC registers */ | ||
2312 | + MSC0 = sleep_save_msc[0]; | ||
2313 | + MSC1 = sleep_save_msc[1]; | ||
2314 | + MSC2 = sleep_save_msc[2]; | ||
2315 | + | ||
2316 | + return 0; | ||
2317 | +} | ||
2318 | + | ||
2319 | +static struct sysdev_class cmx270_pm_sysclass = { | ||
2320 | + set_kset_name("pm"), | ||
2321 | + .resume = cmx270_resume, | ||
2322 | + .suspend = cmx270_suspend, | ||
2323 | +}; | ||
2324 | + | ||
2325 | +static struct sys_device cmx270_pm_device = { | ||
2326 | + .cls = &cmx270_pm_sysclass, | ||
2327 | +}; | ||
2328 | + | ||
2329 | +static int __init cmx270_pm_init(void) | ||
2330 | +{ | ||
2331 | + int error; | ||
2332 | + error = sysdev_class_register(&cmx270_pm_sysclass); | ||
2333 | + if (error == 0) | ||
2334 | + error = sysdev_register(&cmx270_pm_device); | ||
2335 | + return error; | ||
2336 | +} | ||
2337 | +#else | ||
2338 | +static int __init cmx270_pm_init(void) { return 0; } | ||
2339 | +#endif | ||
2340 | + | ||
2341 | +static void __init cmx270_init(void) | ||
2342 | +{ | ||
2343 | + cmx270_pm_init(); | ||
2344 | + | ||
2345 | + set_pxa_fb_info(cmx270_display); | ||
2346 | + | ||
2347 | + /* register CM-X270 platform devices */ | ||
2348 | + platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | ||
2349 | + | ||
2350 | + /* set MCI and OHCI platform parameters */ | ||
2351 | + pxa_set_mci_info(&cmx270_mci_platform_data); | ||
2352 | + pxa_set_ohci_info(&cmx270_ohci_platform_data); | ||
2353 | + | ||
2354 | + /* This enables the STUART */ | ||
2355 | + pxa_gpio_mode(GPIO46_STRXD_MD); | ||
2356 | + pxa_gpio_mode(GPIO47_STTXD_MD); | ||
2357 | + | ||
2358 | + /* This enables the BTUART */ | ||
2359 | + pxa_gpio_mode(GPIO42_BTRXD_MD); | ||
2360 | + pxa_gpio_mode(GPIO43_BTTXD_MD); | ||
2361 | + pxa_gpio_mode(GPIO44_BTCTS_MD); | ||
2362 | + pxa_gpio_mode(GPIO45_BTRTS_MD); | ||
2363 | +} | ||
2364 | + | ||
2365 | +#ifdef CONFIG_PCI | ||
2366 | +static void cmx270_mask_irq(unsigned int irq) | ||
2367 | +{ | ||
2368 | + switch(irq) { | ||
2369 | + case IT8152_IRQ(0): | ||
2370 | + IT8152_INTC_PDCNIMR |= PCISERR_BIT; | ||
2371 | + break; | ||
2372 | + case IT8152_IRQ(1): | ||
2373 | + IT8152_INTC_PDCNIMR |= H2PTADR_BIT; | ||
2374 | + break; | ||
2375 | + case IT8152_IRQ(2): | ||
2376 | + IT8152_INTC_PDCNIMR |= H2PMAR_BIT; | ||
2377 | + break; | ||
2378 | + case IT8152_IRQ(3): | ||
2379 | + IT8152_INTC_PDCNIMR |= PCI_INTA_BIT; | ||
2380 | + break; | ||
2381 | + case IT8152_IRQ(4): | ||
2382 | + IT8152_INTC_PDCNIMR |= PCI_INTB_BIT; | ||
2383 | + break; | ||
2384 | + case IT8152_IRQ(5): | ||
2385 | + IT8152_INTC_PDCNIMR |= PCI_INTC_BIT; | ||
2386 | + break; | ||
2387 | + case IT8152_IRQ(6): | ||
2388 | + IT8152_INTC_PDCNIMR |= PCI_INTD_BIT; | ||
2389 | + break; | ||
2390 | + case IT8152_IRQ(7): | ||
2391 | + IT8152_INTC_PDCNIMR |= USB_INT_BIT; | ||
2392 | + break; | ||
2393 | + case IT8152_IRQ(9): | ||
2394 | + IT8152_INTC_PDCNIMR |= CDMA_INT_BIT; | ||
2395 | + break; | ||
2396 | + case IT8152_IRQ(10): | ||
2397 | + IT8152_INTC_LDCNIMR |= ITESER_BIT; | ||
2398 | + break; | ||
2399 | + } | ||
2400 | +} | ||
2401 | + | ||
2402 | +static void cmx270_unmask_irq(unsigned int irq) | ||
2403 | +{ | ||
2404 | + switch(irq) { | ||
2405 | + case IT8152_IRQ(0): | ||
2406 | + IT8152_INTC_PDCNIMR &= (~PCISERR_BIT); | ||
2407 | + break; | ||
2408 | + case IT8152_IRQ(1): | ||
2409 | + IT8152_INTC_PDCNIMR &= (~H2PTADR_BIT); | ||
2410 | + break; | ||
2411 | + case IT8152_IRQ(2): | ||
2412 | + IT8152_INTC_PDCNIMR &= (~H2PMAR_BIT); | ||
2413 | + break; | ||
2414 | + case IT8152_IRQ(3): | ||
2415 | + IT8152_INTC_PDCNIMR &= (~PCI_INTA_BIT); | ||
2416 | + break; | ||
2417 | + case IT8152_IRQ(4): | ||
2418 | + IT8152_INTC_PDCNIMR &= (~PCI_INTB_BIT); | ||
2419 | + break; | ||
2420 | + case IT8152_IRQ(5): | ||
2421 | + IT8152_INTC_PDCNIMR &= (~PCI_INTC_BIT); | ||
2422 | + break; | ||
2423 | + case IT8152_IRQ(6): | ||
2424 | + IT8152_INTC_PDCNIMR &= (~PCI_INTD_BIT); | ||
2425 | + break; | ||
2426 | + case IT8152_IRQ(7): | ||
2427 | + IT8152_INTC_PDCNIMR &= (~USB_INT_BIT); | ||
2428 | + break; | ||
2429 | + case IT8152_IRQ(9): | ||
2430 | + IT8152_INTC_PDCNIMR &= (~CDMA_INT_BIT); | ||
2431 | + break; | ||
2432 | + case IT8152_IRQ(10): | ||
2433 | + IT8152_INTC_LDCNIMR &= (~ITESER_BIT); | ||
2434 | + break; | ||
2435 | + } | ||
2436 | +} | ||
2437 | + | ||
2438 | +static struct irq_chip cmx270_irq_chip = { | ||
2439 | + .ack = cmx270_mask_irq, | ||
2440 | + .mask = cmx270_mask_irq, | ||
2441 | + .unmask = cmx270_unmask_irq, | ||
2442 | +}; | ||
2443 | +#endif | ||
2444 | + | ||
2445 | +static void __init cmx270_init_irq(void) | ||
2446 | +{ | ||
2447 | + int irq; | ||
2448 | + | ||
2449 | + pxa27x_init_irq(); | ||
2450 | + | ||
2451 | + IT8152_INTC_PDCNIMR = 0xffff; | ||
2452 | + | ||
2453 | +#ifdef CONFIG_PCI | ||
2454 | + /* Disable and clear IRQ's for ITE8152 */ | ||
2455 | + IT8152_INTC_PDCNIMR = 0xffff; | ||
2456 | + IT8152_INTC_PDCNIRR = 0; | ||
2457 | + IT8152_INTC_LPCNIMR = 0xffff; | ||
2458 | + IT8152_INTC_LPCNIRR = 0; | ||
2459 | + IT8152_INTC_LDCNIMR = 0xffff; | ||
2460 | + IT8152_INTC_LDCNIRR = 0; | ||
2461 | + | ||
2462 | + for(irq = IT8152_IRQ(0); irq <= IT8152_IRQ_MAX; irq++) { | ||
2463 | + set_irq_chip(irq, &cmx270_irq_chip); | ||
2464 | + set_irq_handler(irq, handle_level_irq); | ||
2465 | + set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | ||
2466 | + } | ||
2467 | + | ||
2468 | + /* INTC signal from IT8152 is connected to GPIO0 */ | ||
2469 | + pxa_gpio_mode(IRQ_GPIO_IT8152_IRQ); | ||
2470 | + set_irq_chained_handler(IRQ_GPIO_IT8152_IRQ, cmx270_irq_demux); | ||
2471 | + set_irq_type(IRQ_GPIO_IT8152_IRQ, IRQT_RISING); | ||
2472 | +#endif | ||
2473 | + | ||
2474 | + /* Setup interrupt for dm9000 */ | ||
2475 | + pxa_gpio_mode(IRQ_TO_GPIO(CMX270_ETHIRQ)); | ||
2476 | + set_irq_type(CMX270_ETHIRQ, IRQT_RISING); | ||
2477 | + | ||
2478 | + /* Setup interrupt for 2700G */ | ||
2479 | + pxa_gpio_mode(IRQ_TO_GPIO(CMX270_GFXIRQ)); | ||
2480 | + set_irq_type(CMX270_GFXIRQ, IRQT_FALLING); | ||
2481 | +} | ||
2482 | + | ||
2483 | +static void __init cmx270_map_io(void) | ||
2484 | +{ | ||
2485 | + pxa_map_io(); | ||
2486 | + iotable_init(cmx270_io_desc, ARRAY_SIZE(cmx270_io_desc)); | ||
2487 | +} | ||
2488 | + | ||
2489 | + | ||
2490 | +MACHINE_START(ARMCORE, "Compulab CM-x270") | ||
2491 | + .boot_params = 0xa0000100, | ||
2492 | + .phys_io = 0x40000000, | ||
2493 | + .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||
2494 | + .map_io = cmx270_map_io, | ||
2495 | + .init_irq = cmx270_init_irq, | ||
2496 | + .timer = &pxa_timer, | ||
2497 | + .init_machine = cmx270_init, | ||
2498 | +MACHINE_END | ||
2499 | diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig | ||
2500 | index 4468cb3..02b04e2 100644 | ||
2501 | --- a/drivers/leds/Kconfig | ||
2502 | +++ b/drivers/leds/Kconfig | ||
2503 | @@ -87,6 +87,12 @@ config LEDS_H1940 | ||
2504 | help | ||
2505 | This option enables support for the LEDs on the h1940. | ||
2506 | |||
2507 | +config LEDS_CM_X270 | ||
2508 | + tristate "LED Support for the CM-X270 LEDs" | ||
2509 | + depends on LEDS_CLASS && MACH_ARMCORE | ||
2510 | + help | ||
2511 | + This option enables support for the CM-X270 LEDs. | ||
2512 | + | ||
2513 | config LEDS_COBALT | ||
2514 | tristate "LED Support for Cobalt Server front LED" | ||
2515 | depends on LEDS_CLASS && MIPS_COBALT | ||
2516 | diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile | ||
2517 | index f8995c9..12a860c 100644 | ||
2518 | --- a/drivers/leds/Makefile | ||
2519 | +++ b/drivers/leds/Makefile | ||
2520 | @@ -17,6 +17,7 @@ obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o | ||
2521 | obj-$(CONFIG_LEDS_H1940) += leds-h1940.o | ||
2522 | obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o | ||
2523 | obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o | ||
2524 | +obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o | ||
2525 | |||
2526 | # LED Triggers | ||
2527 | obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o | ||
2528 | diff --git a/drivers/leds/leds-cm-x270.c b/drivers/leds/leds-cm-x270.c | ||
2529 | new file mode 100644 | ||
2530 | index 0000000..63b7e9e | ||
2531 | --- /dev/null | ||
2532 | +++ b/drivers/leds/leds-cm-x270.c | ||
2533 | @@ -0,0 +1,126 @@ | ||
2534 | +/* | ||
2535 | + * drivers/leds/leds-cm-x270.c | ||
2536 | + * | ||
2537 | + * Copyright 2007 CompuLab Ltd. | ||
2538 | + * Author: Mike Rapoport <mike@compulab.co.il> | ||
2539 | + * | ||
2540 | + * Based on leds-corgi.c | ||
2541 | + * Author: Richard Purdie <rpurdie@openedhand.com> | ||
2542 | + * | ||
2543 | + * This program is free software; you can redistribute it and/or modify | ||
2544 | + * it under the terms of the GNU General Public License version 2 as | ||
2545 | + * published by the Free Software Foundation. | ||
2546 | + * | ||
2547 | + */ | ||
2548 | + | ||
2549 | +#include <linux/kernel.h> | ||
2550 | +#include <linux/init.h> | ||
2551 | +#include <linux/platform_device.h> | ||
2552 | +#include <linux/leds.h> | ||
2553 | + | ||
2554 | +#include <asm/arch/hardware.h> | ||
2555 | +#include <asm/arch/pxa-regs.h> | ||
2556 | + | ||
2557 | +#define GPIO_RED_LED (93) | ||
2558 | +#define GPIO_GREEN_LED (94) | ||
2559 | + | ||
2560 | +#define CMX270_RED_ON() GPCR(GPIO_RED_LED) = GPIO_bit(GPIO_RED_LED) | ||
2561 | +#define CMX270_RED_OFF() GPSR(GPIO_RED_LED) = GPIO_bit(GPIO_RED_LED) | ||
2562 | +#define CMX270_GREEN_ON() GPCR(GPIO_GREEN_LED) = GPIO_bit(GPIO_GREEN_LED) | ||
2563 | +#define CMX270_GREEN_OFF() GPSR(GPIO_GREEN_LED) = GPIO_bit(GPIO_GREEN_LED) | ||
2564 | + | ||
2565 | + | ||
2566 | +static void cmx270_red_set(struct led_classdev *led_cdev, enum led_brightness value) | ||
2567 | +{ | ||
2568 | + if (value) | ||
2569 | + CMX270_RED_ON(); | ||
2570 | + else | ||
2571 | + CMX270_RED_OFF(); | ||
2572 | +} | ||
2573 | + | ||
2574 | +static void cmx270_green_set(struct led_classdev *led_cdev, enum led_brightness value) | ||
2575 | +{ | ||
2576 | + if (value) | ||
2577 | + CMX270_GREEN_ON(); | ||
2578 | + else | ||
2579 | + CMX270_GREEN_OFF(); | ||
2580 | +} | ||
2581 | + | ||
2582 | +static struct led_classdev cmx270_red_led = { | ||
2583 | + .name = "cm-x270:red", | ||
2584 | + .default_trigger = "nand-disk", | ||
2585 | + .brightness_set = cmx270_red_set, | ||
2586 | +}; | ||
2587 | + | ||
2588 | +static struct led_classdev cmx270_green_led = { | ||
2589 | + .name = "cm-x270:green", | ||
2590 | + .default_trigger = "heartbeat", | ||
2591 | + .brightness_set = cmx270_green_set, | ||
2592 | +}; | ||
2593 | + | ||
2594 | +#ifdef CONFIG_PM | ||
2595 | +static int cmx270led_suspend(struct platform_device *dev, pm_message_t state) | ||
2596 | +{ | ||
2597 | + led_classdev_suspend(&cmx270_red_led); | ||
2598 | + led_classdev_suspend(&cmx270_green_led); | ||
2599 | + return 0; | ||
2600 | +} | ||
2601 | + | ||
2602 | +static int cmx270led_resume(struct platform_device *dev) | ||
2603 | +{ | ||
2604 | + led_classdev_resume(&cmx270_red_led); | ||
2605 | + led_classdev_resume(&cmx270_green_led); | ||
2606 | + return 0; | ||
2607 | +} | ||
2608 | +#endif | ||
2609 | + | ||
2610 | +static int cmx270led_probe(struct platform_device *pdev) | ||
2611 | +{ | ||
2612 | + int ret; | ||
2613 | + | ||
2614 | + ret = led_classdev_register(&pdev->dev, &cmx270_red_led); | ||
2615 | + if (ret < 0) | ||
2616 | + return ret; | ||
2617 | + | ||
2618 | + ret = led_classdev_register(&pdev->dev, &cmx270_green_led); | ||
2619 | + if (ret < 0) | ||
2620 | + led_classdev_unregister(&cmx270_red_led); | ||
2621 | + | ||
2622 | + return ret; | ||
2623 | +} | ||
2624 | + | ||
2625 | +static int cmx270led_remove(struct platform_device *pdev) | ||
2626 | +{ | ||
2627 | + led_classdev_unregister(&cmx270_red_led); | ||
2628 | + led_classdev_unregister(&cmx270_green_led); | ||
2629 | + return 0; | ||
2630 | +} | ||
2631 | + | ||
2632 | +static struct platform_driver cmx270led_driver = { | ||
2633 | + .probe = cmx270led_probe, | ||
2634 | + .remove = cmx270led_remove, | ||
2635 | +#ifdef CONFIG_PM | ||
2636 | + .suspend = cmx270led_suspend, | ||
2637 | + .resume = cmx270led_resume, | ||
2638 | +#endif | ||
2639 | + .driver = { | ||
2640 | + .name = "cm-x270-led", | ||
2641 | + }, | ||
2642 | +}; | ||
2643 | + | ||
2644 | +static int __init cmx270led_init(void) | ||
2645 | +{ | ||
2646 | + return platform_driver_register(&cmx270led_driver); | ||
2647 | +} | ||
2648 | + | ||
2649 | +static void __exit cmx270led_exit(void) | ||
2650 | +{ | ||
2651 | + platform_driver_unregister(&cmx270led_driver); | ||
2652 | +} | ||
2653 | + | ||
2654 | +module_init(cmx270led_init); | ||
2655 | +module_exit(cmx270led_exit); | ||
2656 | + | ||
2657 | +MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>"); | ||
2658 | +MODULE_DESCRIPTION("Corgi LED driver"); | ||
2659 | +MODULE_LICENSE("GPL"); | ||
2660 | diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig | ||
2661 | index c551925..b34f875 100644 | ||
2662 | --- a/drivers/net/Kconfig | ||
2663 | +++ b/drivers/net/Kconfig | ||
2664 | @@ -940,6 +940,14 @@ config DM9000 | ||
2665 | <file:Documentation/networking/net-modules.txt>. The module will be | ||
2666 | called dm9000. | ||
2667 | |||
2668 | +config DM9000_NOEPROM | ||
2669 | + bool "DM9000 without EEPROM attached" | ||
2670 | + depends on DM9000 | ||
2671 | + ---help--- | ||
2672 | + Select this option if you have DM9000 chipset without EEPROM | ||
2673 | + containing the MAC address. In this case MAC address should | ||
2674 | + be set either by the bootloader or using ifconfig | ||
2675 | + | ||
2676 | config SMC911X | ||
2677 | tristate "SMSC LAN911[5678] support" | ||
2678 | select CRC32 | ||
2679 | diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c | ||
2680 | index 738aa59..2371c6b 100644 | ||
2681 | --- a/drivers/net/dm9000.c | ||
2682 | +++ b/drivers/net/dm9000.c | ||
2683 | @@ -577,6 +577,7 @@ dm9000_probe(struct platform_device *pdev) | ||
2684 | db->mii.mdio_read = dm9000_phy_read; | ||
2685 | db->mii.mdio_write = dm9000_phy_write; | ||
2686 | |||
2687 | +#ifndef CONFIG_DM9000_NOEPROM | ||
2688 | /* Read SROM content */ | ||
2689 | for (i = 0; i < 64; i++) | ||
2690 | ((u16 *) db->srom)[i] = read_srom_word(db, i); | ||
2691 | @@ -584,6 +585,11 @@ dm9000_probe(struct platform_device *pdev) | ||
2692 | /* Set Node Address */ | ||
2693 | for (i = 0; i < 6; i++) | ||
2694 | ndev->dev_addr[i] = db->srom[i]; | ||
2695 | +#else | ||
2696 | + /* The Node Address was set by bootloader */ | ||
2697 | + for (i=0; i<6; i++) | ||
2698 | + ndev->dev_addr[i] = ior(db, 0x10+i); | ||
2699 | +#endif | ||
2700 | |||
2701 | if (!is_valid_ether_addr(ndev->dev_addr)) { | ||
2702 | /* try reading from mac */ | ||
2703 | diff --git a/include/asm-arm/arch-pxa/cm-x270.h b/include/asm-arm/arch-pxa/cm-x270.h | ||
2704 | new file mode 100644 | ||
2705 | index 0000000..24613a5 | ||
2706 | --- /dev/null | ||
2707 | +++ b/include/asm-arm/arch-pxa/cm-x270.h | ||
2708 | @@ -0,0 +1,71 @@ | ||
2709 | +/* | ||
2710 | + * linux/include/asm/arch-pxa/armcore.h | ||
2711 | + * | ||
2712 | + * Compulab Ltd., 2003 | ||
2713 | + * | ||
2714 | + * ARMCore registers | ||
2715 | + */ | ||
2716 | + | ||
2717 | + | ||
2718 | +#define CMX270_CS1_PHYS (PXA_CS1_PHYS) | ||
2719 | +#define MARATHON_PHYS (PXA_CS2_PHYS) | ||
2720 | +#define CMX270_IDE104_PHYS (PXA_CS3_PHYS) | ||
2721 | +#define CMX270_IT8152_PHYS (PXA_CS4_PHYS) | ||
2722 | + | ||
2723 | +#define PXA_CS_SIZE (64*1024*1024) | ||
2724 | + | ||
2725 | +/* Virtual map */ | ||
2726 | + | ||
2727 | +#define CMX270_VIRT_BASE (0xe8000000) | ||
2728 | + | ||
2729 | +#define CMX270_IT8152_VIRT (CMX270_VIRT_BASE) | ||
2730 | +#define CMX270_IDE104_VIRT (CMX270_IT8152_VIRT + PXA_CS_SIZE) | ||
2731 | + | ||
2732 | + | ||
2733 | +/* GPIO related definitions */ | ||
2734 | +#define GPIO_IT8152_IRQ (22) | ||
2735 | +#define GPIO_RED_LED (93) | ||
2736 | +#define GPIO_GREEN_LED (94) | ||
2737 | + | ||
2738 | + | ||
2739 | +#define IRQ_GPIO_IT8152_IRQ IRQ_GPIO(GPIO_IT8152_IRQ) | ||
2740 | +#define PME_IRQ IRQ_GPIO(0) | ||
2741 | +#define CMX270_IDE_IRQ IRQ_GPIO(100) | ||
2742 | +#define CMX270_GPIRQ1 IRQ_GPIO(101) | ||
2743 | +#define CMX270_TOUCHIRQ IRQ_GPIO(96) | ||
2744 | +#define CMX270_ETHIRQ IRQ_GPIO(10) | ||
2745 | +#define CMX270_GFXIRQ IRQ_GPIO(95) | ||
2746 | +#define CMX270_NANDIRQ IRQ_GPIO(89) | ||
2747 | +#define CMX270_MMC_IRQ IRQ_GPIO(83) | ||
2748 | + | ||
2749 | +/* LED macros */ | ||
2750 | +#define CMX270_RED_ON() GPCR(GPIO_RED_LED) = GPIO_bit(GPIO_RED_LED) | ||
2751 | +#define CMX270_RED_OFF() GPSR(GPIO_RED_LED) = GPIO_bit(GPIO_RED_LED) | ||
2752 | +#define CMX270_GREEN_ON() GPCR(GPIO_GREEN_LED) = GPIO_bit(GPIO_GREEN_LED) | ||
2753 | +#define CMX270_GREEN_OFF() GPSR(GPIO_GREEN_LED) = GPIO_bit(GPIO_GREEN_LED) | ||
2754 | + | ||
2755 | +/* PCMCIA related definitions */ | ||
2756 | +#define PCC_DETECT(x) (GPLR(84 - (x)) & GPIO_bit(84 - (x))) | ||
2757 | +#define PCC_READY(x) (GPLR(82 - (x)) & GPIO_bit(81 - (x))) | ||
2758 | + | ||
2759 | +#define PCMCIA_S0_CD_VALID IRQ_GPIO(84) | ||
2760 | +#define PCMCIA_S0_CD_VALID_EDGE GPIO_BOTH_EDGES | ||
2761 | + | ||
2762 | +#define PCMCIA_S1_CD_VALID IRQ_GPIO(83) | ||
2763 | +#define PCMCIA_S1_CD_VALID_EDGE GPIO_BOTH_EDGES | ||
2764 | + | ||
2765 | +#define PCMCIA_S0_RDYINT IRQ_GPIO(82) | ||
2766 | +#define PCMCIA_S1_RDYINT IRQ_GPIO(81) | ||
2767 | + | ||
2768 | +#define PCMCIA_RESET_GPIO 53 | ||
2769 | + | ||
2770 | + | ||
2771 | + | ||
2772 | + | ||
2773 | + | ||
2774 | + | ||
2775 | + | ||
2776 | + | ||
2777 | + | ||
2778 | + | ||
2779 | + | ||
2780 | diff --git a/include/asm-arm/arch-pxa/hardware.h b/include/asm-arm/arch-pxa/hardware.h | ||
2781 | index 3861217..beb240e 100644 | ||
2782 | --- a/include/asm-arm/arch-pxa/hardware.h | ||
2783 | +++ b/include/asm-arm/arch-pxa/hardware.h | ||
2784 | @@ -126,4 +126,15 @@ extern unsigned int get_lcdclk_frequency_10khz(void); | ||
2785 | |||
2786 | #endif | ||
2787 | |||
2788 | +#if defined(CONFIG_MACH_ARMCORE) && defined(CONFIG_PCI) | ||
2789 | +#define HAVE_ARCH_PCI_SET_DMA_MASK | ||
2790 | +#ifndef __ASSEMBLY__ | ||
2791 | +extern unsigned long armcore_pcibios_min_io; | ||
2792 | +extern unsigned long armcore_pcibios_min_mem; | ||
2793 | +#endif | ||
2794 | +#define PCIBIOS_MIN_IO (armcore_pcibios_min_io) | ||
2795 | +#define PCIBIOS_MIN_MEM (armcore_pcibios_min_mem) | ||
2796 | +#define pcibios_assign_all_busses() 1 | ||
2797 | +#endif | ||
2798 | + | ||
2799 | #endif /* _ASM_ARCH_HARDWARE_H */ | ||
2800 | diff --git a/include/asm-arm/arch-pxa/irqs.h b/include/asm-arm/arch-pxa/irqs.h | ||
2801 | index a07fe0f..efb3d42 100644 | ||
2802 | --- a/include/asm-arm/arch-pxa/irqs.h | ||
2803 | +++ b/include/asm-arm/arch-pxa/irqs.h | ||
2804 | @@ -216,3 +216,23 @@ | ||
2805 | #define IRQ_LOCOMO_GPIO_BASE (IRQ_BOARD_START + 1) | ||
2806 | #define IRQ_LOCOMO_LT_BASE (IRQ_BOARD_START + 2) | ||
2807 | #define IRQ_LOCOMO_SPI_BASE (IRQ_BOARD_START + 3) | ||
2808 | + | ||
2809 | +/* ITE8152 irqs on CM-x2xx */ | ||
2810 | +#ifdef CONFIG_MACH_ARMCORE | ||
2811 | +#define IT8152_IRQ(x) (IRQ_BOARD_START + (x)) | ||
2812 | +#define PCISERR IT8152_IRQ(0) | ||
2813 | +#define H2PTADR IT8152_IRQ(1) | ||
2814 | +#define H2PMAR IT8152_IRQ(2) | ||
2815 | +#define PCI_INTA IT8152_IRQ(3) | ||
2816 | +#define PCI_INTB IT8152_IRQ(4) | ||
2817 | +#define PCI_INTC IT8152_IRQ(5) | ||
2818 | +#define PCI_INTD IT8152_IRQ(6) | ||
2819 | +#define USB_INT IT8152_IRQ(7) | ||
2820 | +#define AUDIO_INT IT8152_IRQ(8) | ||
2821 | +#define CDMA_INT IT8152_IRQ(9) | ||
2822 | +#define IRQ_ITESER IT8152_IRQ(10) | ||
2823 | +#define IT8152_IRQ_MAX IT8152_IRQ(10) | ||
2824 | + | ||
2825 | +#undef NR_IRQS | ||
2826 | +#define NR_IRQS IT8152_IRQ_MAX+1 | ||
2827 | +#endif | ||
2828 | diff --git a/include/asm-arm/memory.h b/include/asm-arm/memory.h | ||
2829 | index d9bfb39..83db3cb 100644 | ||
2830 | --- a/include/asm-arm/memory.h | ||
2831 | +++ b/include/asm-arm/memory.h | ||
2832 | @@ -141,6 +141,16 @@ | ||
2833 | * allocations. This must be the smallest DMA mask in the system, | ||
2834 | * so a successful GFP_DMA allocation will always satisfy this. | ||
2835 | */ | ||
2836 | + | ||
2837 | +#ifdef CONFIG_PCI_HOST_ITE8152 | ||
2838 | +void it8152_adjust_zones(int node, unsigned long *size, unsigned long *holes); | ||
2839 | + | ||
2840 | +#define arch_adjust_zones(node, size, holes) \ | ||
2841 | + it8152_adjust_zones(node, size, holes) | ||
2842 | + | ||
2843 | +#define ISA_DMA_THRESHOLD (PHYS_OFFSET + SZ_64M - 1) | ||
2844 | +#endif | ||
2845 | + | ||
2846 | #ifndef ISA_DMA_THRESHOLD | ||
2847 | #define ISA_DMA_THRESHOLD (0xffffffffULL) | ||
2848 | #endif | ||
2849 | -- | ||
2850 | 1.5.2.5 | ||
2851 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0002-cm-x270-match-type.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0002-cm-x270-match-type.patch deleted file mode 100644 index 68da30191c..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0002-cm-x270-match-type.patch +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | From e566813cedb9f91724597df45c11075023a7b589 Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 18:58:27 -0400 | ||
4 | Subject: [PATCH] cm-x270-match-type | ||
5 | |||
6 | --- | ||
7 | arch/arm/boot/compressed/head-xscale.S | 5 +++++ | ||
8 | 1 files changed, 5 insertions(+), 0 deletions(-) | ||
9 | |||
10 | diff --git a/arch/arm/boot/compressed/head-xscale.S b/arch/arm/boot/compressed/head-xscale.S | ||
11 | index 73c5d9e..dc89459 100644 | ||
12 | --- a/arch/arm/boot/compressed/head-xscale.S | ||
13 | +++ b/arch/arm/boot/compressed/head-xscale.S | ||
14 | @@ -53,3 +53,8 @@ __XScale_start: | ||
15 | str r1, [r0, #0x18] | ||
16 | #endif | ||
17 | |||
18 | +#if defined(CONFIG_MACH_ARMCORE) | ||
19 | + mov r7, #(MACH_TYPE_ARMCORE & 0xFF00) | ||
20 | + add r7, r7, #(MACH_TYPE_ARMCORE & 0xFF) | ||
21 | +#endif | ||
22 | + | ||
23 | -- | ||
24 | 1.5.1.6 | ||
25 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0003-cm-x270-ide.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0003-cm-x270-ide.patch deleted file mode 100644 index 0ff115efc8..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0003-cm-x270-ide.patch +++ /dev/null | |||
@@ -1,186 +0,0 @@ | |||
1 | From f260d5fa4c99cd7df949e6408af59807f8ccf224 Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 18:59:39 -0400 | ||
4 | Subject: [PATCH] cm-x270-ide | ||
5 | |||
6 | --- | ||
7 | drivers/ide/Kconfig | 8 +++ | ||
8 | drivers/ide/arm/Makefile | 1 + | ||
9 | drivers/ide/arm/cm-x270-ide.c | 135 +++++++++++++++++++++++++++++++++++++++++ | ||
10 | 3 files changed, 144 insertions(+), 0 deletions(-) | ||
11 | create mode 100644 drivers/ide/arm/cm-x270-ide.c | ||
12 | |||
13 | diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig | ||
14 | index b1a9b81..7de4155 100644 | ||
15 | --- a/drivers/ide/Kconfig | ||
16 | +++ b/drivers/ide/Kconfig | ||
17 | @@ -864,6 +864,14 @@ config BLK_DEV_IDE_BAST | ||
18 | Say Y here if you want to support the onboard IDE channels on the | ||
19 | Simtec BAST or the Thorcom VR1000 | ||
20 | |||
21 | +config BLK_DEV_IDE_CM_X270 | ||
22 | + tristate "CompuLab CM-X270 IDE support" | ||
23 | + depends on ARM && (MACH_ARMCORE) | ||
24 | + help | ||
25 | + Say Y here if you want to support the onboard IDE channels on the | ||
26 | + CompuLab CM-X270 module | ||
27 | + | ||
28 | + | ||
29 | config BLK_DEV_GAYLE | ||
30 | bool "Amiga Gayle IDE interface support" | ||
31 | depends on AMIGA | ||
32 | diff --git a/drivers/ide/arm/Makefile b/drivers/ide/arm/Makefile | ||
33 | index 6a78f07..e5cadb7 100644 | ||
34 | --- a/drivers/ide/arm/Makefile | ||
35 | +++ b/drivers/ide/arm/Makefile | ||
36 | @@ -2,5 +2,6 @@ | ||
37 | obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o | ||
38 | obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o | ||
39 | obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o | ||
40 | +obj-$(CONFIG_BLK_DEV_IDE_CM_X270) += cm-x270-ide.o | ||
41 | |||
42 | EXTRA_CFLAGS := -Idrivers/ide | ||
43 | diff --git a/drivers/ide/arm/cm-x270-ide.c b/drivers/ide/arm/cm-x270-ide.c | ||
44 | new file mode 100644 | ||
45 | index 0000000..a8b15aa | ||
46 | --- /dev/null | ||
47 | +++ b/drivers/ide/arm/cm-x270-ide.c | ||
48 | @@ -0,0 +1,135 @@ | ||
49 | +/* linux/drivers/ide/arm/cm-x270-ide.c | ||
50 | + * | ||
51 | + * Copyright (c) 2006 CompuLab, Ltd | ||
52 | + * Mike Rapoport <mike@compulab.co.il> | ||
53 | + * | ||
54 | + * Based on linux/drivers/ide/arm/bast-ide.c | ||
55 | + * Copyright (c) 2003-2004 Simtec Electronics | ||
56 | + * Ben Dooks <ben@simtec.co.uk> | ||
57 | + * | ||
58 | + * This program is free software; you can redistribute it and/or modify | ||
59 | + * it under the terms of the GNU General Public License version 2 as | ||
60 | + * published by the Free Software Foundation. | ||
61 | + * | ||
62 | + */ | ||
63 | + | ||
64 | +#include <linux/module.h> | ||
65 | +#include <linux/errno.h> | ||
66 | +#include <linux/ide.h> | ||
67 | +#include <linux/init.h> | ||
68 | +#include <linux/irq.h> | ||
69 | + | ||
70 | +#include <asm/mach-types.h> | ||
71 | + | ||
72 | +#include <asm/io.h> | ||
73 | +#include <asm/arch/pxa-regs.h> | ||
74 | +#include <asm/arch/cm-x270.h> | ||
75 | + | ||
76 | +#define CMX270_SB270_IDECS0_VIRT (CMX270_IDE104_VIRT + (1<<24) + (1<<25)) | ||
77 | +#define CMX270_SB270_IDECS1_VIRT (CMX270_IDE104_VIRT + (1<<25)) | ||
78 | +#define CMX270_ATX_IDECS0_VIRT (CMX270_IDE104_VIRT + (1<<25)) | ||
79 | +#define CMX270_ATX_IDECS1_VIRT (CMX270_IDE104_VIRT + (1<<25) + (1<<22)) | ||
80 | + | ||
81 | +/* list of registered interfaces */ | ||
82 | +static ide_hwif_t *ifs[1]; | ||
83 | + | ||
84 | +static int __init | ||
85 | +cmx270_ide_register(unsigned int base, unsigned int aux, int irq, | ||
86 | + ide_hwif_t **hwif) | ||
87 | +{ | ||
88 | + hw_regs_t hw; | ||
89 | + | ||
90 | + memset(&hw, 0, sizeof(hw)); | ||
91 | + | ||
92 | + if(!base || !aux) return -EINVAL; | ||
93 | + | ||
94 | + printk(KERN_DEBUG "%s: base = %08x, aux = %08x\n", __FUNCTION__, | ||
95 | + base, aux); | ||
96 | + | ||
97 | + /* Different mappings for local bus IDE and PCMCIA IDE */ | ||
98 | + if(base == CMX270_SB270_IDECS0_VIRT) { | ||
99 | + hw.io_ports[IDE_DATA_OFFSET] = base + 0; | ||
100 | + hw.io_ports[IDE_ERROR_OFFSET] = base + (0x1<<3); | ||
101 | + hw.io_ports[IDE_NSECTOR_OFFSET]= base + (0x2<<3); | ||
102 | + hw.io_ports[IDE_SECTOR_OFFSET]= base + (0x3<<3); | ||
103 | + hw.io_ports[IDE_LCYL_OFFSET]= base + (0x4<<3); | ||
104 | + hw.io_ports[IDE_HCYL_OFFSET]= base + (0x5<<3); | ||
105 | + hw.io_ports[IDE_SELECT_OFFSET]= base + (0x6<<3); | ||
106 | + hw.io_ports[IDE_STATUS_OFFSET]= base + (0x7<<3); | ||
107 | + hw.io_ports[IDE_CONTROL_OFFSET] = aux+(0x6<<3); | ||
108 | + } | ||
109 | + else if (base == CMX270_ATX_IDECS0_VIRT) { /* atx base */ | ||
110 | + hw.io_ports[IDE_DATA_OFFSET] = base + 0; | ||
111 | + hw.io_ports[IDE_ERROR_OFFSET] = base + 8; | ||
112 | + hw.io_ports[IDE_NSECTOR_OFFSET]= base + 2; | ||
113 | + hw.io_ports[IDE_SECTOR_OFFSET]= base + 10; | ||
114 | + hw.io_ports[IDE_LCYL_OFFSET]= base + 4; | ||
115 | + hw.io_ports[IDE_HCYL_OFFSET]= base + 12; | ||
116 | + hw.io_ports[IDE_SELECT_OFFSET]= base + 6; //6; | ||
117 | + hw.io_ports[IDE_STATUS_OFFSET]= base + 14; | ||
118 | + hw.io_ports[IDE_CONTROL_OFFSET] = (aux+0x6); | ||
119 | + } else { | ||
120 | + printk(KERN_DEBUG "%s: registering wrong IDE i/f\n", __FUNCTION__); | ||
121 | + hw.io_ports[IDE_DATA_OFFSET] = base + 8; | ||
122 | + hw.io_ports[IDE_ERROR_OFFSET] = base + 13; | ||
123 | + hw.io_ports[IDE_NSECTOR_OFFSET] = base + 2; | ||
124 | + hw.io_ports[IDE_SECTOR_OFFSET] = base + 3; | ||
125 | + hw.io_ports[IDE_LCYL_OFFSET] = base + 4; | ||
126 | + hw.io_ports[IDE_HCYL_OFFSET] = base + 5; | ||
127 | + hw.io_ports[IDE_SELECT_OFFSET] = base + 6; | ||
128 | + hw.io_ports[IDE_STATUS_OFFSET] = base + 7; | ||
129 | + hw.io_ports[IDE_CONTROL_OFFSET] = aux; | ||
130 | + } | ||
131 | + | ||
132 | + hw.irq = irq; | ||
133 | + | ||
134 | + return ide_register_hw(&hw, hwif); | ||
135 | +} | ||
136 | + | ||
137 | +static int __init cmx270_ide_init(void) | ||
138 | +{ | ||
139 | + int retval = 0; | ||
140 | + | ||
141 | + if (!(machine_is_armcore())) | ||
142 | + goto out; | ||
143 | + | ||
144 | + printk("CM-X270: initializing IDE interface\n"); | ||
145 | + | ||
146 | + MSC1 = 0x7ffc7ff4; | ||
147 | + | ||
148 | + /* Interrupts on rising edge: lines are inverted before they get to | ||
149 | + the PXA */ | ||
150 | + pxa_gpio_mode(IRQ_TO_GPIO(CMX270_IDE_IRQ)); | ||
151 | + | ||
152 | + /* try SB-X270 */ | ||
153 | + set_irq_type(CMX270_IDE_IRQ, IRQ_TYPE_EDGE_RISING); | ||
154 | + retval = cmx270_ide_register(CMX270_SB270_IDECS0_VIRT, | ||
155 | + CMX270_SB270_IDECS1_VIRT, | ||
156 | + CMX270_IDE_IRQ, &ifs[0]); | ||
157 | + if (retval >= 0) { | ||
158 | + printk(KERN_DEBUG "%s: found IDE interface on SB-X270\n", | ||
159 | + __FUNCTION__); | ||
160 | + goto out; | ||
161 | + } | ||
162 | + | ||
163 | + /* SB-X270 detection failed, try ATX */ | ||
164 | + set_irq_type(CMX270_IDE_IRQ, IRQ_TYPE_EDGE_FALLING); | ||
165 | + retval = cmx270_ide_register(CMX270_ATX_IDECS0_VIRT, | ||
166 | + CMX270_ATX_IDECS1_VIRT, | ||
167 | + CMX270_IDE_IRQ, &ifs[0]); | ||
168 | + | ||
169 | + if ( retval >= 0 ) { | ||
170 | + printk(KERN_DEBUG "%s: found IDE interface on ATX\n", | ||
171 | + __FUNCTION__); | ||
172 | + goto out; | ||
173 | + } | ||
174 | + | ||
175 | + out: | ||
176 | + return retval; | ||
177 | +} | ||
178 | + | ||
179 | +module_init(cmx270_ide_init); | ||
180 | + | ||
181 | +MODULE_AUTHOR("CompuLab"); | ||
182 | +MODULE_LICENSE("GPL"); | ||
183 | +MODULE_DESCRIPTION("CompuLab CM-X270 IDE driver"); | ||
184 | -- | ||
185 | 1.5.1.6 | ||
186 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0004-cm-x270-it8152.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0004-cm-x270-it8152.patch deleted file mode 100644 index 274eaf24d8..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0004-cm-x270-it8152.patch +++ /dev/null | |||
@@ -1,496 +0,0 @@ | |||
1 | From 1306abec905df1ff5cf2b1d91ac0d94d18d96c5b Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 19:00:07 -0400 | ||
4 | Subject: [PATCH] cm-x270-it8152 | ||
5 | |||
6 | --- | ||
7 | arch/arm/common/Makefile | 1 + | ||
8 | arch/arm/common/it8152.c | 272 +++++++++++++++++++++++++++++++++++++ | ||
9 | arch/arm/kernel/bios32.c | 28 ++++- | ||
10 | include/asm-arm/hardware/it8152.h | 104 ++++++++++++++ | ||
11 | include/asm-arm/pci.h | 7 + | ||
12 | include/linux/pci_ids.h | 1 + | ||
13 | 6 files changed, 410 insertions(+), 3 deletions(-) | ||
14 | create mode 100644 arch/arm/common/it8152.c | ||
15 | create mode 100644 include/asm-arm/hardware/it8152.h | ||
16 | |||
17 | diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile | ||
18 | index e1289a2..3d0b9fa 100644 | ||
19 | --- a/arch/arm/common/Makefile | ||
20 | +++ b/arch/arm/common/Makefile | ||
21 | @@ -17,3 +17,4 @@ obj-$(CONFIG_SHARPSL_PM) += sharpsl_pm.o | ||
22 | obj-$(CONFIG_SHARP_SCOOP) += scoop.o | ||
23 | obj-$(CONFIG_ARCH_IXP2000) += uengine.o | ||
24 | obj-$(CONFIG_ARCH_IXP23XX) += uengine.o | ||
25 | +obj-$(CONFIG_PCI_HOST_ITE8152) += it8152.o | ||
26 | diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c | ||
27 | new file mode 100644 | ||
28 | index 0000000..8563610 | ||
29 | --- /dev/null | ||
30 | +++ b/arch/arm/common/it8152.c | ||
31 | @@ -0,0 +1,272 @@ | ||
32 | +/* | ||
33 | + * arch/arm/common/it8152.c: PCI functions for IT8152 | ||
34 | + * | ||
35 | + * Compulab Ltd, 2002-2006 | ||
36 | + * | ||
37 | + * The DMA bouncing is taken from arch/arm/mach-ixp4xx/common-pci.c | ||
38 | + * (see this file for respective copyrights) | ||
39 | + * | ||
40 | + * This program is free software; you can redistribute it and/or modify | ||
41 | + * it under the terms of the GNU General Public License version 2 as | ||
42 | + * published by the Free Software Foundation. | ||
43 | + */ | ||
44 | + | ||
45 | +#include <linux/sched.h> | ||
46 | +#include <linux/kernel.h> | ||
47 | +#include <linux/pci.h> | ||
48 | +#include <linux/ptrace.h> | ||
49 | +#include <linux/interrupt.h> | ||
50 | +#include <linux/mm.h> | ||
51 | +#include <linux/slab.h> | ||
52 | +#include <linux/init.h> | ||
53 | +#include <linux/ioport.h> | ||
54 | +#include <asm/mach/map.h> | ||
55 | + | ||
56 | + | ||
57 | +#include <asm/io.h> | ||
58 | +#include <asm/irq.h> | ||
59 | +#include <asm/system.h> | ||
60 | +#include <asm/mach/pci.h> | ||
61 | +#include <asm/hardware/it8152.h> | ||
62 | + | ||
63 | +#define MAX_SLOTS 21 | ||
64 | + | ||
65 | +static unsigned long | ||
66 | +it8152_pci_dev_base_address(struct pci_bus *bus, unsigned int devfn) | ||
67 | +{ | ||
68 | + unsigned long addr = 0; | ||
69 | + | ||
70 | + if (bus->number == 0) { | ||
71 | + if (devfn < PCI_DEVFN(MAX_SLOTS, 0)) | ||
72 | + addr = (devfn << 8); | ||
73 | + } else | ||
74 | + addr = (bus->number << 16) | (devfn << 8); | ||
75 | + | ||
76 | + return addr; | ||
77 | +} | ||
78 | + | ||
79 | +static int | ||
80 | +it8152_pci_read_config(struct pci_bus *bus, unsigned int devfn, int where, | ||
81 | + int size, u32 *value) | ||
82 | +{ | ||
83 | + unsigned long addr = it8152_pci_dev_base_address(bus, devfn); | ||
84 | + u32 v; | ||
85 | + int shift; | ||
86 | + | ||
87 | +#ifdef CONFIG_MACH_ARMCORE | ||
88 | + if(devfn!=0) IT8152_GPIO_GPLR=0x00; | ||
89 | +#endif | ||
90 | + shift = (where & 3); | ||
91 | + | ||
92 | + IT8152_PCI_CFG_ADDR = (addr + where); | ||
93 | + v = (IT8152_PCI_CFG_DATA >> (8 * (shift))); | ||
94 | + | ||
95 | + *value = v; | ||
96 | + | ||
97 | +#ifdef CONFIG_MACH_ARMCORE | ||
98 | + if(devfn!=0) IT8152_GPIO_GPLR=0x20; | ||
99 | +#endif | ||
100 | + | ||
101 | + return PCIBIOS_SUCCESSFUL; | ||
102 | +} | ||
103 | + | ||
104 | + | ||
105 | +static int | ||
106 | +it8152_pci_write_config(struct pci_bus *bus, unsigned int devfn, int where, | ||
107 | + int size, u32 value) | ||
108 | +{ | ||
109 | + unsigned long addr = it8152_pci_dev_base_address(bus, devfn); | ||
110 | + u32 v, vtemp, mask=0; | ||
111 | + int shift; | ||
112 | + | ||
113 | +#ifdef CONFIG_MACH_ARMCORE | ||
114 | + if(devfn!=0) IT8152_GPIO_GPLR=0x00; | ||
115 | +#endif | ||
116 | + | ||
117 | + if(size==1) mask=0xff; | ||
118 | + if(size==2) mask=0xffff; | ||
119 | + | ||
120 | + shift = (where & 3); | ||
121 | + | ||
122 | + IT8152_PCI_CFG_ADDR = addr + where; | ||
123 | + vtemp = IT8152_PCI_CFG_DATA; | ||
124 | + | ||
125 | + if(mask) vtemp &= ~(mask << (8 * shift)); | ||
126 | + else vtemp = 0; | ||
127 | + | ||
128 | + v = (value << (8 * shift)); | ||
129 | + IT8152_PCI_CFG_ADDR = addr + where; | ||
130 | + IT8152_PCI_CFG_DATA = (v | vtemp); | ||
131 | + | ||
132 | +#ifdef CONFIG_MACH_ARMCORE | ||
133 | + if(devfn!=0) IT8152_GPIO_GPLR=0x20; | ||
134 | +#endif | ||
135 | + | ||
136 | + return PCIBIOS_SUCCESSFUL; | ||
137 | +} | ||
138 | + | ||
139 | +static struct pci_ops it8152_ops = { | ||
140 | + .read = it8152_pci_read_config, | ||
141 | + .write = it8152_pci_write_config, | ||
142 | +}; | ||
143 | + | ||
144 | +static struct resource it8152_io = { | ||
145 | + .name = "IT8152 PCI I/O region", | ||
146 | + .flags = IORESOURCE_IO, | ||
147 | +}; | ||
148 | + | ||
149 | +static struct resource it8152_mem1 = { | ||
150 | + .name = "First IT8152 PCI memory region", | ||
151 | + .start = 0x10000000, | ||
152 | + .end = 0x13e00000, | ||
153 | + .flags = IORESOURCE_MEM, | ||
154 | +}; | ||
155 | + | ||
156 | +/* | ||
157 | + * The following functions are needed for DMA bouncing. | ||
158 | + * ITE8152 chip can addrees up to 64MByte, so all the devices | ||
159 | + * connected to ITE8152 (PCI and USB) should have limited DMA window | ||
160 | + */ | ||
161 | + | ||
162 | +/* | ||
163 | + * Setup DMA mask to 64MB on devices connected to ITE8152. Ignore all | ||
164 | + * other devices. | ||
165 | + */ | ||
166 | +static int it8152_pci_platform_notify(struct device *dev) | ||
167 | +{ | ||
168 | + if ( dev->bus == &pci_bus_type ) { | ||
169 | + if ( dev->dma_mask ) | ||
170 | + *dev->dma_mask = (SZ_64M - 1) | PHYS_OFFSET; | ||
171 | + dev->coherent_dma_mask = (SZ_64M - 1) | PHYS_OFFSET; | ||
172 | + dmabounce_register_dev(dev, 2048, 4096); | ||
173 | + } | ||
174 | + return 0; | ||
175 | +} | ||
176 | + | ||
177 | +static int it8152_pci_platform_notify_remove(struct device *dev) | ||
178 | +{ | ||
179 | + if ( dev->bus == &pci_bus_type ) { | ||
180 | + dmabounce_unregister_dev(dev); | ||
181 | + } | ||
182 | + return 0; | ||
183 | +} | ||
184 | + | ||
185 | +int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size) | ||
186 | +{ | ||
187 | + dev_dbg(dev, "%s: dma_addr %08x, size %08x\n", | ||
188 | + __FUNCTION__, dma_addr, size); | ||
189 | + return (dev->bus == &pci_bus_type ) && | ||
190 | + ((dma_addr + size - PHYS_OFFSET) >= SZ_64M); | ||
191 | +} | ||
192 | + | ||
193 | +/* | ||
194 | + * Only first 64MB of memory can be accessed via PCI. | ||
195 | + * We use GFP_DMA to allocate safe buffers to do map/unmap. | ||
196 | + * This is really ugly and we need a better way of specifying | ||
197 | + * DMA-capable regions of memory. | ||
198 | + */ | ||
199 | +void __init it8152_adjust_zones(int node, unsigned long *zone_size, | ||
200 | + unsigned long *zhole_size) | ||
201 | +{ | ||
202 | + unsigned int sz = SZ_64M >> PAGE_SHIFT; | ||
203 | + | ||
204 | + /* | ||
205 | + * Only adjust if > 64M on current system | ||
206 | + */ | ||
207 | + if (node || (zone_size[0] <= sz)) | ||
208 | + return; | ||
209 | + | ||
210 | + zone_size[1] = zone_size[0] - sz; | ||
211 | + zone_size[0] = sz; | ||
212 | + zhole_size[1] = zhole_size[0]; | ||
213 | + zhole_size[0] = 0; | ||
214 | +} | ||
215 | + | ||
216 | +/* | ||
217 | + * We override these so we properly do dmabounce otherwise drivers | ||
218 | + * are able to set the dma_mask to 0xffffffff and we can no longer | ||
219 | + * trap bounces. :( | ||
220 | + * | ||
221 | + * We just return true on everyhing except for < 64MB in which case | ||
222 | + * we will fail miseralby and die since we can't handle that case. | ||
223 | + */ | ||
224 | +int | ||
225 | +pci_set_dma_mask(struct pci_dev *dev, u64 mask) | ||
226 | +{ | ||
227 | + printk(KERN_INFO "===> %s: %s %x\n", __FUNCTION__, dev->dev.bus_id, mask); | ||
228 | + if (mask >= PHYS_OFFSET + SZ_64M - 1 ) | ||
229 | + return 0; | ||
230 | + | ||
231 | + return -EIO; | ||
232 | +} | ||
233 | + | ||
234 | +int | ||
235 | +pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) | ||
236 | +{ | ||
237 | + printk(KERN_INFO "===> %s: %s %x\n", __FUNCTION__, dev->dev.bus_id, mask); | ||
238 | + if (mask >= PHYS_OFFSET + SZ_64M - 1 ) | ||
239 | + return 0; | ||
240 | + | ||
241 | + return -EIO; | ||
242 | +} | ||
243 | + | ||
244 | +EXPORT_SYMBOL(pci_set_dma_mask); | ||
245 | +EXPORT_SYMBOL(pci_set_consistent_dma_mask); | ||
246 | + | ||
247 | + | ||
248 | +int __init it8152_pci_setup(int nr, struct pci_sys_data *sys) | ||
249 | +{ | ||
250 | + it8152_io.start = IT8152_IO_BASE + 0x12000; | ||
251 | + it8152_io.end = IT8152_IO_BASE + 0x100000; | ||
252 | + | ||
253 | + if (request_resource(&ioport_resource, &it8152_io)) { | ||
254 | + printk(KERN_ERR "PCI: unable to allocate IO region\n"); | ||
255 | + return -EBUSY; | ||
256 | + } | ||
257 | + if (request_resource(&iomem_resource, &it8152_mem1)) { | ||
258 | + printk(KERN_ERR "PCI: unable to allocate memory region\n"); | ||
259 | + return -EBUSY; | ||
260 | + } | ||
261 | + | ||
262 | + sys->resource[0] = &it8152_io; | ||
263 | + sys->resource[1] = &it8152_mem1; | ||
264 | + | ||
265 | + if (platform_notify || platform_notify_remove) { | ||
266 | + printk(KERN_ERR "PCI: Can't use platform_notify\n"); | ||
267 | + return -EBUSY; | ||
268 | + } | ||
269 | + | ||
270 | + platform_notify = it8152_pci_platform_notify; | ||
271 | + platform_notify_remove = it8152_pci_platform_notify_remove; | ||
272 | + | ||
273 | + return 1; | ||
274 | +} | ||
275 | + | ||
276 | +/* | ||
277 | + * If we set up a device for bus mastering, we need to check the latency | ||
278 | + * timer as we don't have even crappy BIOSes to set it properly. | ||
279 | + * The implementation is from arch/i386/pci/i386.c | ||
280 | + */ | ||
281 | +unsigned int pcibios_max_latency = 255; | ||
282 | + | ||
283 | +void pcibios_set_master(struct pci_dev *dev) | ||
284 | +{ | ||
285 | + u8 lat; | ||
286 | + | ||
287 | + pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat); | ||
288 | + if (lat < 16) | ||
289 | + lat = (64 <= pcibios_max_latency) ? 64 : pcibios_max_latency; | ||
290 | + else if (lat > pcibios_max_latency) | ||
291 | + lat = pcibios_max_latency; | ||
292 | + else | ||
293 | + return; | ||
294 | + printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat); | ||
295 | + pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); | ||
296 | +} | ||
297 | + | ||
298 | + | ||
299 | +struct pci_bus * __init it8152_pci_scan_bus(int nr, struct pci_sys_data *sys) | ||
300 | +{ | ||
301 | + return pci_scan_bus(nr, &it8152_ops, sys); | ||
302 | +} | ||
303 | + | ||
304 | diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c | ||
305 | index 240c448..d8d2352 100644 | ||
306 | --- a/arch/arm/kernel/bios32.c | ||
307 | +++ b/arch/arm/kernel/bios32.c | ||
308 | @@ -279,6 +279,25 @@ static void __devinit pci_fixup_cy82c693(struct pci_dev *dev) | ||
309 | } | ||
310 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693, pci_fixup_cy82c693); | ||
311 | |||
312 | +static void __init pci_fixup_it8152(struct pci_dev *dev) | ||
313 | +{ | ||
314 | + int i; | ||
315 | + /* fixup for ITE 8152 devices */ | ||
316 | + /* FIXME: add defines for class 0x68000 and 0x80103 */ | ||
317 | + if ((dev->class >> 8) == PCI_CLASS_BRIDGE_HOST || | ||
318 | + dev->class == 0x68000 || | ||
319 | + dev->class == 0x80103) { | ||
320 | + for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
321 | + dev->resource[i].start = 0; | ||
322 | + dev->resource[i].end = 0; | ||
323 | + dev->resource[i].flags = 0; | ||
324 | + } | ||
325 | + } | ||
326 | +} | ||
327 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8152, pci_fixup_it8152); | ||
328 | + | ||
329 | + | ||
330 | + | ||
331 | void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) | ||
332 | { | ||
333 | if (debug_pci) | ||
334 | @@ -292,9 +311,12 @@ void __devinit pcibios_update_irq(struct pci_dev *dev, int irq) | ||
335 | */ | ||
336 | static inline int pdev_bad_for_parity(struct pci_dev *dev) | ||
337 | { | ||
338 | - return (dev->vendor == PCI_VENDOR_ID_INTERG && | ||
339 | - (dev->device == PCI_DEVICE_ID_INTERG_2000 || | ||
340 | - dev->device == PCI_DEVICE_ID_INTERG_2010)); | ||
341 | + return ((dev->vendor == PCI_VENDOR_ID_INTERG && | ||
342 | + (dev->device == PCI_DEVICE_ID_INTERG_2000 || | ||
343 | + dev->device == PCI_DEVICE_ID_INTERG_2010)) || | ||
344 | + (dev->vendor == PCI_VENDOR_ID_ITE && | ||
345 | + dev->device == PCI_DEVICE_ID_ITE_8152)); | ||
346 | + | ||
347 | } | ||
348 | |||
349 | /* | ||
350 | diff --git a/include/asm-arm/hardware/it8152.h b/include/asm-arm/hardware/it8152.h | ||
351 | new file mode 100644 | ||
352 | index 0000000..d28210d | ||
353 | --- /dev/null | ||
354 | +++ b/include/asm-arm/hardware/it8152.h | ||
355 | @@ -0,0 +1,104 @@ | ||
356 | +/* | ||
357 | + * arch/arm/mach-pxa/it8152.h | ||
358 | + * | ||
359 | + * Compulab Ltd., 2006 | ||
360 | + * | ||
361 | + * ITE 8152 companion chip definitions | ||
362 | + */ | ||
363 | + | ||
364 | + | ||
365 | +/* #define CMX270_IT8152_VIRT (CMX270_VIRT_BASE) */ | ||
366 | + | ||
367 | + | ||
368 | +extern unsigned long it8152_base_address; | ||
369 | + | ||
370 | +#define IT8152_IO_BASE (it8152_base_address + 0x03e00000) | ||
371 | +#define IT8152_CFGREG_BASE (it8152_base_address + 0x03f00000) | ||
372 | + | ||
373 | +/* #define IRQ_GPIO_IT8152_IRQ IRQ_GPIO(GPIO_IT8152_IRQ) */ | ||
374 | + | ||
375 | +#define IT8152_SHORT_IO(x) (*((volatile unsigned short *)(IT8152_CFGREG_BASE+(x)))) | ||
376 | +#define IT8152_LONG_IO(x) (*((volatile unsigned long *)(IT8152_CFGREG_BASE+(x)))) | ||
377 | + | ||
378 | + | ||
379 | +#define IT8152_PCI_MEMBASE (*((volatile unsigned long *)(it8152_base_address))) | ||
380 | +/* #define IT8152_PCI_IOBASE (*((volatile unsigned long *)(it8152_base_address + 0x3e00000))) */ | ||
381 | + | ||
382 | +#define IT8152_PCI_IACK (*((volatile unsigned long *)(it8152_base_address + 0x3f00808))) | ||
383 | +#define IT8152_PCI_CFG_ADDR (*((volatile unsigned long *)(it8152_base_address + 0x3f00800))) | ||
384 | +#define IT8152_PCI_CFG_DATA (*((volatile unsigned long *)(it8152_base_address + 0x3f00804))) | ||
385 | + | ||
386 | +#define IT_BUSNUM_SHF 16 | ||
387 | +#define IT_DEVNUM_SHF 11 | ||
388 | +#define IT_FUNCNUM_SHF 8 | ||
389 | +#define IT_REGNUM_SHF 2 | ||
390 | + | ||
391 | +/* Power management & PLL registers */ | ||
392 | +#define IT8152_PMPLL_DSR IT8152_LONG_IO(0x00) | ||
393 | +#define IT8152_PMPLL_DSSR IT8152_LONG_IO(0x04) | ||
394 | +#define IT8152_PMPLL_PLLCR IT8152_LONG_IO(0x20) | ||
395 | +#define IT8152_PMPLL_MFSR IT8152_LONG_IO(0x24) | ||
396 | + | ||
397 | +/* Memory controller */ | ||
398 | +#define IT8152_MC_REG_OFFSET 0x100 | ||
399 | + | ||
400 | +#define IT8152_MC_SDCR IT8152_LONG_IO(IT8152_MC_REG_OFFSET + 0x00) | ||
401 | +#define IT8152_MC_PCICR IT8152_LONG_IO(IT8152_MC_REG_OFFSET + 0x04) | ||
402 | + | ||
403 | +/* Interrupt related definitions */ | ||
404 | +#define IT8152_INTC_REG_OFFSET 0x300 | ||
405 | + | ||
406 | +#define IT8152_INTC_LDCNIRR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x00) | ||
407 | +#define IT8152_INTC_LDPNIRR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x04) | ||
408 | +#define IT8152_INTC_LDCNIMR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x08) | ||
409 | +#define IT8152_INTC_LDPNIMR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x0C) | ||
410 | +#define IT8152_INTC_LDNITR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x10) | ||
411 | +#define IT8152_INTC_LDNIAR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x14) | ||
412 | +#define IT8152_INTC_LPCNIRR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x20) | ||
413 | +#define IT8152_INTC_LPPNIRR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x24) | ||
414 | +#define IT8152_INTC_LPCNIMR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x28) | ||
415 | +#define IT8152_INTC_LPPNIMR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x2C) | ||
416 | +#define IT8152_INTC_LPNITR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x30) | ||
417 | +#define IT8152_INTC_LPNIAR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x34) | ||
418 | +#define IT8152_INTC_PDCNIRR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x40) | ||
419 | +#define IT8152_INTC_PDPNIRR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x44) | ||
420 | +#define IT8152_INTC_PDCNIMR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x48) | ||
421 | +#define IT8152_INTC_PDPNIMR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x4C) | ||
422 | +#define IT8152_INTC_PDNITR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x50) | ||
423 | +#define IT8152_INTC_PDNIAR IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0x54) | ||
424 | +#define IT8152_INTC_INTC_TYPER IT8152_LONG_IO(IT8152_INTC_REG_OFFSET + 0xFC) | ||
425 | + | ||
426 | +#define IT8152_UART_BASE IT8152_LONG_IO(0x200) | ||
427 | + | ||
428 | +#define IT8152_GPIO_REG_OFFSET 0x500 | ||
429 | + | ||
430 | +#define IT8152_GPIO_GPLR IT8152_LONG_IO(IT8152_GPIO_REG_OFFSET) | ||
431 | +#define IT8152_GPIO_GPCR12 IT8152_LONG_IO(IT8152_GPIO_REG_OFFSET + 0x04) | ||
432 | +#define IT8152_GPIO_GPCR34 IT8152_LONG_IO(IT8152_GPIO_REG_OFFSET + 0x08) | ||
433 | + | ||
434 | + | ||
435 | +/* Interrupt bit definitions */ | ||
436 | +#define PCISERR_BIT (1<<14) | ||
437 | +#define H2PTADR_BIT (1<<13) | ||
438 | +#define H2PMAR_BIT (1<<12) | ||
439 | +#define PCI_INTD_BIT (1<<11) | ||
440 | +#define PCI_INTC_BIT (1<<10) | ||
441 | +#define PCI_INTB_BIT (1<<9) | ||
442 | +#define PCI_INTA_BIT (1<<8) | ||
443 | +#define CDMA_INT_BIT (1<<2) | ||
444 | +#define USB_INT_BIT (1<<1) | ||
445 | +#define AUDIO_INT_BIT (1<<0) | ||
446 | + | ||
447 | +/* IT8152 UART */ | ||
448 | +#define ITESER_BIT (1<<5) | ||
449 | + | ||
450 | + | ||
451 | + | ||
452 | + | ||
453 | + | ||
454 | + | ||
455 | + | ||
456 | + | ||
457 | + | ||
458 | + | ||
459 | + | ||
460 | diff --git a/include/asm-arm/pci.h b/include/asm-arm/pci.h | ||
461 | index f21abd4..2cf30bf 100644 | ||
462 | --- a/include/asm-arm/pci.h | ||
463 | +++ b/include/asm-arm/pci.h | ||
464 | @@ -8,10 +8,17 @@ | ||
465 | |||
466 | #define pcibios_scan_all_fns(a, b) 0 | ||
467 | |||
468 | +#ifdef CONFIG_PCI_HOST_ITE8152 | ||
469 | +/* ITE bridge requires setting latency timer to avoid early bus access | ||
470 | + termination by PIC bus mater devices | ||
471 | +*/ | ||
472 | +extern void pcibios_set_master(struct pci_dev *dev); | ||
473 | +#else | ||
474 | static inline void pcibios_set_master(struct pci_dev *dev) | ||
475 | { | ||
476 | /* No special bus mastering setup handling */ | ||
477 | } | ||
478 | +#endif | ||
479 | |||
480 | static inline void pcibios_penalize_isa_irq(int irq, int active) | ||
481 | { | ||
482 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h | ||
483 | index 5b1c999..b4c81d5 100644 | ||
484 | --- a/include/linux/pci_ids.h | ||
485 | +++ b/include/linux/pci_ids.h | ||
486 | @@ -1650,6 +1650,7 @@ | ||
487 | #define PCI_DEVICE_ID_ITE_8211 0x8211 | ||
488 | #define PCI_DEVICE_ID_ITE_8212 0x8212 | ||
489 | #define PCI_DEVICE_ID_ITE_8213 0x8213 | ||
490 | +#define PCI_DEVICE_ID_ITE_8152 0x8152 | ||
491 | #define PCI_DEVICE_ID_ITE_8872 0x8872 | ||
492 | #define PCI_DEVICE_ID_ITE_IT8330G_0 0xe886 | ||
493 | |||
494 | -- | ||
495 | 1.5.1.6 | ||
496 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0005-cm-x270-pcmcia.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0005-cm-x270-pcmcia.patch deleted file mode 100644 index 7dceff5c9d..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0005-cm-x270-pcmcia.patch +++ /dev/null | |||
@@ -1,228 +0,0 @@ | |||
1 | From 338653da8f8afcdf8afc7e8a5a0104d5083597cc Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 19:01:27 -0400 | ||
4 | Subject: [PATCH] cm-x270-pcmcia | ||
5 | |||
6 | --- | ||
7 | drivers/pcmcia/Makefile | 1 + | ||
8 | drivers/pcmcia/pxa2xx_cm_x270.c | 198 +++++++++++++++++++++++++++++++++++++++ | ||
9 | 2 files changed, 199 insertions(+), 0 deletions(-) | ||
10 | create mode 100644 drivers/pcmcia/pxa2xx_cm_x270.c | ||
11 | |||
12 | diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile | ||
13 | index 4276965..353d5b7 100644 | ||
14 | --- a/drivers/pcmcia/Makefile | ||
15 | +++ b/drivers/pcmcia/Makefile | ||
16 | @@ -69,4 +69,5 @@ sa1100_cs-$(CONFIG_SA1100_SIMPAD) += sa1100_simpad.o | ||
17 | pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o | ||
18 | pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o | ||
19 | pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o | ||
20 | +pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x270.o | ||
21 | |||
22 | diff --git a/drivers/pcmcia/pxa2xx_cm_x270.c b/drivers/pcmcia/pxa2xx_cm_x270.c | ||
23 | new file mode 100644 | ||
24 | index 0000000..25e369f | ||
25 | --- /dev/null | ||
26 | +++ b/drivers/pcmcia/pxa2xx_cm_x270.c | ||
27 | @@ -0,0 +1,198 @@ | ||
28 | +/* | ||
29 | + * linux/drivers/pcmcia/pxa/pxa_armcore.c | ||
30 | + * | ||
31 | + * This program is free software; you can redistribute it and/or modify | ||
32 | + * it under the terms of the GNU General Public License version 2 as | ||
33 | + * published by the Free Software Foundation. | ||
34 | + * | ||
35 | + * Compulab Ltd., 2003 | ||
36 | + * | ||
37 | + */ | ||
38 | + | ||
39 | +#include <linux/kernel.h> | ||
40 | +#include <linux/sched.h> | ||
41 | +#include <linux/platform_device.h> | ||
42 | +#include <linux/irq.h> | ||
43 | + | ||
44 | +#include <pcmcia/ss.h> | ||
45 | +#include <asm/delay.h> | ||
46 | +#include <asm/hardware.h> | ||
47 | + | ||
48 | +#include <asm/arch/pxa-regs.h> | ||
49 | +#include <asm/arch/cm-x270.h> | ||
50 | + | ||
51 | +#include "soc_common.h" | ||
52 | + | ||
53 | + | ||
54 | +static struct pcmcia_irqs irqs[] = { | ||
55 | + { 0, PCMCIA_S0_CD_VALID, "PCMCIA0 CD" }, | ||
56 | + { 1, PCMCIA_S1_CD_VALID, "PCMCIA1 CD" }, | ||
57 | +}; | ||
58 | + | ||
59 | + | ||
60 | +static int | ||
61 | +cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | ||
62 | +{ | ||
63 | + int return_val=0; | ||
64 | + | ||
65 | + GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | | ||
66 | + GPIO_bit(GPIO49_nPWE) | | ||
67 | + GPIO_bit(GPIO50_nPIOR) | | ||
68 | + GPIO_bit(GPIO51_nPIOW) | | ||
69 | + GPIO_bit(GPIO85_nPCE_1) | | ||
70 | + GPIO_bit(GPIO54_nPCE_2); | ||
71 | + | ||
72 | + pxa_gpio_mode(GPIO48_nPOE_MD); | ||
73 | + pxa_gpio_mode(GPIO49_nPWE_MD); | ||
74 | + pxa_gpio_mode(GPIO50_nPIOR_MD); | ||
75 | + pxa_gpio_mode(GPIO51_nPIOW_MD); | ||
76 | + pxa_gpio_mode(GPIO85_nPCE_1_MD); | ||
77 | + pxa_gpio_mode(GPIO54_nPCE_2_MD); | ||
78 | + //pxa_gpio_mode(GPIO79_pSKTSEL_MD); /* REVISIT: s/b dependent on num sockets (on ATX base not routed)*/ | ||
79 | + pxa_gpio_mode(GPIO55_nPREG_MD); | ||
80 | + pxa_gpio_mode(GPIO56_nPWAIT_MD); | ||
81 | + pxa_gpio_mode(GPIO57_nIOIS16_MD); | ||
82 | + | ||
83 | + // Reset signal | ||
84 | + GPDR(GPIO53_nPCE_2) |= GPIO_bit(GPIO53_nPCE_2); | ||
85 | + GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
86 | + | ||
87 | + GPDR(IRQ_TO_GPIO(PCMCIA_S0_CD_VALID)) &= ~GPIO_bit(IRQ_TO_GPIO(PCMCIA_S0_CD_VALID)); | ||
88 | + GPDR(IRQ_TO_GPIO(PCMCIA_S1_CD_VALID)) &= ~GPIO_bit(IRQ_TO_GPIO(PCMCIA_S1_CD_VALID)); | ||
89 | + | ||
90 | + set_irq_type(PCMCIA_S0_CD_VALID, IRQ_TYPE_EDGE_BOTH); | ||
91 | + set_irq_type(PCMCIA_S1_CD_VALID, IRQ_TYPE_EDGE_BOTH); | ||
92 | + | ||
93 | + //irq's for slots: | ||
94 | + GPDR(IRQ_TO_GPIO(PCMCIA_S0_RDYINT)) &= ~GPIO_bit(IRQ_TO_GPIO(PCMCIA_S0_RDYINT)); | ||
95 | + GPDR(IRQ_TO_GPIO(PCMCIA_S1_RDYINT)) &= ~GPIO_bit(IRQ_TO_GPIO(PCMCIA_S1_RDYINT)); | ||
96 | + | ||
97 | + set_irq_type(PCMCIA_S0_RDYINT, IRQ_TYPE_EDGE_FALLING); | ||
98 | + set_irq_type(PCMCIA_S1_RDYINT, IRQ_TYPE_EDGE_FALLING); | ||
99 | + | ||
100 | + skt->irq = (skt->nr == 0) ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT; | ||
101 | + return_val = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
102 | + | ||
103 | + return return_val; | ||
104 | +} | ||
105 | + | ||
106 | + | ||
107 | +static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt) | ||
108 | +{ | ||
109 | + soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); | ||
110 | + | ||
111 | + set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_CD_VALID), IRQ_TYPE_NONE); | ||
112 | + set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_CD_VALID), IRQ_TYPE_NONE); | ||
113 | + | ||
114 | + set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_RDYINT), IRQ_TYPE_NONE); | ||
115 | + set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_RDYINT), IRQ_TYPE_NONE); | ||
116 | +} | ||
117 | + | ||
118 | + | ||
119 | +static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | ||
120 | + struct pcmcia_state *state) | ||
121 | +{ | ||
122 | + | ||
123 | + state->detect = (PCC_DETECT(skt->nr) == 0) ? 1 : 0; | ||
124 | + state->ready = (PCC_READY(skt->nr) == 0) ? 0 : 1; | ||
125 | + state->bvd1 = 1; | ||
126 | + state->bvd2 = 1; | ||
127 | + state->vs_3v = 0; | ||
128 | + state->vs_Xv = 0; | ||
129 | + state->wrprot = 0; /* not available */ | ||
130 | + | ||
131 | +} | ||
132 | + | ||
133 | + | ||
134 | +static int | ||
135 | +cmx270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | ||
136 | + const socket_state_t *state) | ||
137 | +{ | ||
138 | + | ||
139 | + GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
140 | + pxa_gpio_mode(GPIO49_nPWE | GPIO_OUT); | ||
141 | + //pxa_gpio_mode(GPIO79_pSKTSEL_MD | GPIO_OUT); /* For 2-socket mode */ | ||
142 | + | ||
143 | + switch(skt->nr){ | ||
144 | + case 0: | ||
145 | + if(state->flags & SS_RESET) { | ||
146 | + //GPCR(GPIO79_pSKTSEL) = GPIO_bit(GPIO79_pSKTSEL); /* For 2-socket mode */ | ||
147 | + //udelay(1); | ||
148 | + GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
149 | + GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
150 | + udelay(10); | ||
151 | + GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
152 | + GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
153 | + } | ||
154 | + break; | ||
155 | + case 1: | ||
156 | + if(state->flags & SS_RESET) { | ||
157 | + //GPCR(GPIO79_pSKTSEL) = GPIO_bit(GPIO79_pSKTSEL); /* For 2-socket mode */ | ||
158 | + //udelay(1); | ||
159 | + GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
160 | + GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
161 | + udelay(10); | ||
162 | + GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2); | ||
163 | + GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE); | ||
164 | + } | ||
165 | + break; | ||
166 | + } | ||
167 | + | ||
168 | + pxa_gpio_mode(GPIO49_nPWE_MD); | ||
169 | + //pxa_gpio_mode(GPIO79_pSKTSEL_MD); /* For 2-socket mode */ | ||
170 | + | ||
171 | + | ||
172 | + return 0; | ||
173 | +} | ||
174 | + | ||
175 | +static void cmx270_pcmcia_socket_init(struct soc_pcmcia_socket *skt) | ||
176 | +{ | ||
177 | +} | ||
178 | + | ||
179 | +static void cmx270_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) | ||
180 | +{ | ||
181 | +} | ||
182 | + | ||
183 | + | ||
184 | +static struct pcmcia_low_level cmx270_pcmcia_ops = { | ||
185 | + .owner = THIS_MODULE, | ||
186 | + .hw_init = cmx270_pcmcia_hw_init, | ||
187 | + .hw_shutdown = cmx270_pcmcia_shutdown, | ||
188 | + .socket_state = cmx270_pcmcia_socket_state, | ||
189 | + .configure_socket = cmx270_pcmcia_configure_socket, | ||
190 | + .socket_init = cmx270_pcmcia_socket_init, | ||
191 | + .socket_suspend = cmx270_pcmcia_socket_suspend, | ||
192 | + .nr = 2, | ||
193 | +}; | ||
194 | + | ||
195 | +static struct platform_device *cmx270_pcmcia_device; | ||
196 | + | ||
197 | +static int __init cmx270_pcmcia_init(void) | ||
198 | +{ | ||
199 | + int ret; | ||
200 | + | ||
201 | + cmx270_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | ||
202 | + | ||
203 | + if (!cmx270_pcmcia_device) | ||
204 | + return -ENOMEM; | ||
205 | + | ||
206 | + cmx270_pcmcia_device->dev.platform_data = &cmx270_pcmcia_ops; | ||
207 | + | ||
208 | + printk ("Registering cm-x270 PCMCIA interface.\n"); | ||
209 | + ret = platform_device_add(cmx270_pcmcia_device); | ||
210 | + | ||
211 | + if (ret) | ||
212 | + platform_device_put(cmx270_pcmcia_device); | ||
213 | + | ||
214 | + return ret; | ||
215 | +} | ||
216 | + | ||
217 | +static void __exit cmx270_pcmcia_exit(void) | ||
218 | +{ | ||
219 | + platform_device_unregister(cmx270_pcmcia_device); | ||
220 | +} | ||
221 | + | ||
222 | +module_init(cmx270_pcmcia_init); | ||
223 | +module_exit(cmx270_pcmcia_exit); | ||
224 | + | ||
225 | +MODULE_LICENSE("GPL"); | ||
226 | -- | ||
227 | 1.5.1.6 | ||
228 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0006-ramdisk_load.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0006-ramdisk_load.patch deleted file mode 100644 index aa25dd9bfc..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0006-ramdisk_load.patch +++ /dev/null | |||
@@ -1,80 +0,0 @@ | |||
1 | From ca4508b1266109208f62e986b51397ce2788e255 Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 19:01:50 -0400 | ||
4 | Subject: [PATCH] ramdisk_load | ||
5 | |||
6 | --- | ||
7 | arch/arm/mach-pxa/cm-x270.c | 6 ++++++ | ||
8 | include/asm-arm/arch-pxa/cm-x270.h | 2 ++ | ||
9 | init/initramfs.c | 16 ++++++++++++++++ | ||
10 | 3 files changed, 24 insertions(+), 0 deletions(-) | ||
11 | |||
12 | diff --git a/arch/arm/mach-pxa/cm-x270.c b/arch/arm/mach-pxa/cm-x270.c | ||
13 | index 88b080d..c6ec489 100644 | ||
14 | --- a/arch/arm/mach-pxa/cm-x270.c | ||
15 | +++ b/arch/arm/mach-pxa/cm-x270.c | ||
16 | @@ -308,6 +308,12 @@ static struct map_desc cmx270_io_desc[] __initdata = { | ||
17 | .length = PXA_CS_SIZE, | ||
18 | .type = MT_DEVICE | ||
19 | }, | ||
20 | + [2] = { /* NOR flash */ | ||
21 | + .virtual = CMX270_FLASH_VIRT, | ||
22 | + .pfn = __phys_to_pfn(PXA_CS0_PHYS), | ||
23 | + .length = (8<<20), /* up to 8 MByte flash */ | ||
24 | + .type = MT_DEVICE | ||
25 | + }, | ||
26 | }; | ||
27 | |||
28 | /* | ||
29 | diff --git a/include/asm-arm/arch-pxa/cm-x270.h b/include/asm-arm/arch-pxa/cm-x270.h | ||
30 | index 24613a5..aad152e 100644 | ||
31 | --- a/include/asm-arm/arch-pxa/cm-x270.h | ||
32 | +++ b/include/asm-arm/arch-pxa/cm-x270.h | ||
33 | @@ -20,7 +20,9 @@ | ||
34 | |||
35 | #define CMX270_IT8152_VIRT (CMX270_VIRT_BASE) | ||
36 | #define CMX270_IDE104_VIRT (CMX270_IT8152_VIRT + PXA_CS_SIZE) | ||
37 | +#define CMX270_FLASH_VIRT (CMX270_IDE104_VIRT + PXA_CS_SIZE) | ||
38 | |||
39 | +#define CMX270_FLASH_RAMDISK_VIRT (CMX270_FLASH_VIRT + 0x1c0000) | ||
40 | |||
41 | /* GPIO related definitions */ | ||
42 | #define GPIO_IT8152_IRQ (22) | ||
43 | diff --git a/init/initramfs.c b/init/initramfs.c | ||
44 | index 00eff7a..0ecd40b 100644 | ||
45 | --- a/init/initramfs.c | ||
46 | +++ b/init/initramfs.c | ||
47 | @@ -7,6 +7,9 @@ | ||
48 | #include <linux/string.h> | ||
49 | #include <linux/syscalls.h> | ||
50 | |||
51 | +// HACK for compulab cm-x270 | ||
52 | +#include <asm/arch/cm-x270.h> | ||
53 | + | ||
54 | static __initdata char *message; | ||
55 | static void __init error(char *x) | ||
56 | { | ||
57 | @@ -550,7 +553,20 @@ static int __init populate_rootfs(void) | ||
58 | #ifdef CONFIG_BLK_DEV_INITRD | ||
59 | if (initrd_start) { | ||
60 | #ifdef CONFIG_BLK_DEV_RAM | ||
61 | + | ||
62 | + /* hack to make initramfs work because the | ||
63 | + * compulab BL does not zero out the | ||
64 | + * initrd memory. This only seems to affect loading | ||
65 | + * initramfs (cpio.gz) archives. Does not seem to | ||
66 | + * affect ramdisks. | ||
67 | + */ | ||
68 | + int initrd_size = *(int *)(CMX270_FLASH_RAMDISK_VIRT); | ||
69 | int fd; | ||
70 | + | ||
71 | + initrd_end = initrd_start + initrd_size; | ||
72 | + //printk("CLIFF: initrd_start = 0x%x\n", initrd_start); | ||
73 | + //printk("CLIFF: initrd_end = 0x%x\n", initrd_end); | ||
74 | + | ||
75 | printk(KERN_INFO "checking if image is initramfs..."); | ||
76 | err = unpack_to_rootfs((char *)initrd_start, | ||
77 | initrd_end - initrd_start, 1); | ||
78 | -- | ||
79 | 1.5.1.6 | ||
80 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0007-mmcsd_large_cards-r0.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0007-mmcsd_large_cards-r0.patch deleted file mode 100644 index 90e66b5308..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0007-mmcsd_large_cards-r0.patch +++ /dev/null | |||
@@ -1,36 +0,0 @@ | |||
1 | From 26638b93f7479dc597a58e2e2b2832c6ff4c8f7b Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 19:02:55 -0400 | ||
4 | Subject: [PATCH] mmcsd_large_cards-r0 | ||
5 | |||
6 | --- | ||
7 | drivers/mmc/card/block.c | 6 ++++++ | ||
8 | 1 files changed, 6 insertions(+), 0 deletions(-) | ||
9 | |||
10 | diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c | ||
11 | index 540ff4b..1f8d67d 100644 | ||
12 | --- a/drivers/mmc/card/block.c | ||
13 | +++ b/drivers/mmc/card/block.c | ||
14 | @@ -403,6 +403,7 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) | ||
15 | { | ||
16 | struct mmc_blk_data *md; | ||
17 | int devidx, ret; | ||
18 | + unsigned long cap; | ||
19 | |||
20 | devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS); | ||
21 | if (devidx >= MMC_NUM_MINORS) | ||
22 | @@ -467,6 +468,11 @@ static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) | ||
23 | |||
24 | sprintf(md->disk->disk_name, "mmcblk%d", devidx); | ||
25 | |||
26 | + if (card->csd.read_blkbits > 9) | ||
27 | + md->block_bits = 9; | ||
28 | + else | ||
29 | + md->block_bits = card->csd.read_blkbits; | ||
30 | + | ||
31 | blk_queue_hardsect_size(md->queue.queue, 1 << md->block_bits); | ||
32 | |||
33 | if (!mmc_card_sd(card) && mmc_card_blockaddr(card)) { | ||
34 | -- | ||
35 | 1.5.1.6 | ||
36 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0008-cm-x270-nand-simplify-name.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0008-cm-x270-nand-simplify-name.patch deleted file mode 100644 index c07f049e56..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/0008-cm-x270-nand-simplify-name.patch +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | From e1a243564a40d7542a62d4684f2e6ce0b95fa267 Mon Sep 17 00:00:00 2001 | ||
2 | From: Cliff Brake <cbrake@happy.dev.bec-systems.com> | ||
3 | Date: Fri, 20 Jul 2007 19:04:12 -0400 | ||
4 | Subject: [PATCH] cm-x270-nand-simplify-name | ||
5 | |||
6 | --- | ||
7 | drivers/mtd/nand/cmx270_nand.c | 2 ++ | ||
8 | 1 files changed, 2 insertions(+), 0 deletions(-) | ||
9 | |||
10 | diff --git a/drivers/mtd/nand/cmx270_nand.c b/drivers/mtd/nand/cmx270_nand.c | ||
11 | index cb663ef..3654ce4 100644 | ||
12 | --- a/drivers/mtd/nand/cmx270_nand.c | ||
13 | +++ b/drivers/mtd/nand/cmx270_nand.c | ||
14 | @@ -191,6 +191,8 @@ static int cmx270_init(void) | ||
15 | cmx270_nand_mtd->owner = THIS_MODULE; | ||
16 | cmx270_nand_mtd->priv = this; | ||
17 | |||
18 | + cmx270_nand_mtd->name = "cm-x270-nand"; | ||
19 | + | ||
20 | /* insert callbacks */ | ||
21 | this->IO_ADDR_R = cmx270_nand_io; | ||
22 | this->IO_ADDR_W = cmx270_nand_io; | ||
23 | -- | ||
24 | 1.5.1.6 | ||
25 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/16bpp.patch b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/16bpp.patch deleted file mode 100644 index 6f038e35d0..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/16bpp.patch +++ /dev/null | |||
@@ -1,13 +0,0 @@ | |||
1 | Index: linux-2.6.23/arch/arm/mach-pxa/cm-x270.c | ||
2 | =================================================================== | ||
3 | --- linux-2.6.23.orig/arch/arm/mach-pxa/cm-x270.c 2008-02-14 20:32:28.000000000 +0000 | ||
4 | +++ linux-2.6.23/arch/arm/mach-pxa/cm-x270.c 2008-02-14 20:27:55.000000000 +0000 | ||
5 | @@ -383,7 +383,7 @@ | ||
6 | |||
7 | static struct pxafb_mode_info generic_crt_640x480_mode = { | ||
8 | .pixclock = 38461, | ||
9 | - .bpp = 8, | ||
10 | + .bpp = 16, | ||
11 | .xres = 640, | ||
12 | .yres = 480, | ||
13 | .hsync_len = 63, | ||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/defconfig b/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/defconfig deleted file mode 100644 index 273de85b0a..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/cm-x270/defconfig +++ /dev/null | |||
@@ -1,1204 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.23 | ||
4 | # Thu Oct 11 15:47:57 2007 | ||
5 | # | ||
6 | CONFIG_ARM=y | ||
7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
8 | CONFIG_GENERIC_GPIO=y | ||
9 | CONFIG_GENERIC_TIME=y | ||
10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
11 | CONFIG_MMU=y | ||
12 | # CONFIG_NO_IOPORT is not set | ||
13 | CONFIG_GENERIC_HARDIRQS=y | ||
14 | CONFIG_STACKTRACE_SUPPORT=y | ||
15 | CONFIG_LOCKDEP_SUPPORT=y | ||
16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
22 | CONFIG_GENERIC_HWEIGHT=y | ||
23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
24 | CONFIG_ZONE_DMA=y | ||
25 | CONFIG_ARCH_MTD_XIP=y | ||
26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
28 | |||
29 | # | ||
30 | # General setup | ||
31 | # | ||
32 | CONFIG_EXPERIMENTAL=y | ||
33 | CONFIG_BROKEN_ON_SMP=y | ||
34 | CONFIG_LOCK_KERNEL=y | ||
35 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
36 | CONFIG_LOCALVERSION="-cm-x270" | ||
37 | # CONFIG_LOCALVERSION_AUTO is not set | ||
38 | CONFIG_SWAP=y | ||
39 | CONFIG_SYSVIPC=y | ||
40 | CONFIG_SYSVIPC_SYSCTL=y | ||
41 | # CONFIG_POSIX_MQUEUE is not set | ||
42 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
43 | # CONFIG_TASKSTATS is not set | ||
44 | # CONFIG_USER_NS is not set | ||
45 | # CONFIG_AUDIT is not set | ||
46 | CONFIG_IKCONFIG=y | ||
47 | CONFIG_IKCONFIG_PROC=y | ||
48 | CONFIG_LOG_BUF_SHIFT=14 | ||
49 | CONFIG_SYSFS_DEPRECATED=y | ||
50 | # CONFIG_RELAY is not set | ||
51 | CONFIG_BLK_DEV_INITRD=y | ||
52 | CONFIG_INITRAMFS_SOURCE="" | ||
53 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
54 | CONFIG_SYSCTL=y | ||
55 | CONFIG_EMBEDDED=y | ||
56 | CONFIG_UID16=y | ||
57 | CONFIG_SYSCTL_SYSCALL=y | ||
58 | CONFIG_KALLSYMS=y | ||
59 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
60 | CONFIG_HOTPLUG=y | ||
61 | CONFIG_PRINTK=y | ||
62 | CONFIG_BUG=y | ||
63 | CONFIG_ELF_CORE=y | ||
64 | CONFIG_BASE_FULL=y | ||
65 | CONFIG_FUTEX=y | ||
66 | CONFIG_ANON_INODES=y | ||
67 | CONFIG_EPOLL=y | ||
68 | CONFIG_SIGNALFD=y | ||
69 | CONFIG_EVENTFD=y | ||
70 | CONFIG_SHMEM=y | ||
71 | CONFIG_VM_EVENT_COUNTERS=y | ||
72 | CONFIG_SLAB=y | ||
73 | # CONFIG_SLUB is not set | ||
74 | # CONFIG_SLOB is not set | ||
75 | CONFIG_RT_MUTEXES=y | ||
76 | # CONFIG_TINY_SHMEM is not set | ||
77 | CONFIG_BASE_SMALL=0 | ||
78 | CONFIG_MODULES=y | ||
79 | CONFIG_MODULE_UNLOAD=y | ||
80 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
81 | # CONFIG_MODVERSIONS is not set | ||
82 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
83 | CONFIG_KMOD=y | ||
84 | CONFIG_BLOCK=y | ||
85 | # CONFIG_LBD is not set | ||
86 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
87 | # CONFIG_LSF is not set | ||
88 | # CONFIG_BLK_DEV_BSG is not set | ||
89 | |||
90 | # | ||
91 | # IO Schedulers | ||
92 | # | ||
93 | CONFIG_IOSCHED_NOOP=y | ||
94 | CONFIG_IOSCHED_AS=y | ||
95 | CONFIG_IOSCHED_DEADLINE=y | ||
96 | CONFIG_IOSCHED_CFQ=y | ||
97 | # CONFIG_DEFAULT_AS is not set | ||
98 | # CONFIG_DEFAULT_DEADLINE is not set | ||
99 | CONFIG_DEFAULT_CFQ=y | ||
100 | # CONFIG_DEFAULT_NOOP is not set | ||
101 | CONFIG_DEFAULT_IOSCHED="cfq" | ||
102 | |||
103 | # | ||
104 | # System Type | ||
105 | # | ||
106 | # CONFIG_ARCH_AAEC2000 is not set | ||
107 | # CONFIG_ARCH_INTEGRATOR is not set | ||
108 | # CONFIG_ARCH_REALVIEW is not set | ||
109 | # CONFIG_ARCH_VERSATILE is not set | ||
110 | # CONFIG_ARCH_AT91 is not set | ||
111 | # CONFIG_ARCH_CLPS7500 is not set | ||
112 | # CONFIG_ARCH_CLPS711X is not set | ||
113 | # CONFIG_ARCH_CO285 is not set | ||
114 | # CONFIG_ARCH_EBSA110 is not set | ||
115 | # CONFIG_ARCH_EP93XX is not set | ||
116 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
117 | # CONFIG_ARCH_NETX is not set | ||
118 | # CONFIG_ARCH_H720X is not set | ||
119 | # CONFIG_ARCH_IMX is not set | ||
120 | # CONFIG_ARCH_IOP13XX is not set | ||
121 | # CONFIG_ARCH_IOP32X is not set | ||
122 | # CONFIG_ARCH_IOP33X is not set | ||
123 | # CONFIG_ARCH_IXP23XX is not set | ||
124 | # CONFIG_ARCH_IXP2000 is not set | ||
125 | # CONFIG_ARCH_IXP4XX is not set | ||
126 | # CONFIG_ARCH_L7200 is not set | ||
127 | # CONFIG_ARCH_KS8695 is not set | ||
128 | # CONFIG_ARCH_NS9XXX is not set | ||
129 | # CONFIG_ARCH_MXC is not set | ||
130 | # CONFIG_ARCH_PNX4008 is not set | ||
131 | CONFIG_ARCH_PXA=y | ||
132 | # CONFIG_ARCH_RPC is not set | ||
133 | # CONFIG_ARCH_SA1100 is not set | ||
134 | # CONFIG_ARCH_S3C2410 is not set | ||
135 | # CONFIG_ARCH_SHARK is not set | ||
136 | # CONFIG_ARCH_LH7A40X is not set | ||
137 | # CONFIG_ARCH_DAVINCI is not set | ||
138 | # CONFIG_ARCH_OMAP is not set | ||
139 | |||
140 | # | ||
141 | # Intel PXA2xx Implementations | ||
142 | # | ||
143 | # CONFIG_ARCH_LUBBOCK is not set | ||
144 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
145 | # CONFIG_MACH_MAINSTONE is not set | ||
146 | # CONFIG_ARCH_PXA_IDP is not set | ||
147 | # CONFIG_PXA_SHARPSL is not set | ||
148 | # CONFIG_MACH_TRIZEPS4 is not set | ||
149 | # CONFIG_MACH_EM_X270 is not set | ||
150 | CONFIG_MACH_ARMCORE=y | ||
151 | CONFIG_PXA27x=y | ||
152 | |||
153 | # | ||
154 | # Boot options | ||
155 | # | ||
156 | |||
157 | # | ||
158 | # Power management | ||
159 | # | ||
160 | |||
161 | # | ||
162 | # Processor Type | ||
163 | # | ||
164 | CONFIG_CPU_32=y | ||
165 | CONFIG_CPU_XSCALE=y | ||
166 | CONFIG_CPU_32v5=y | ||
167 | CONFIG_CPU_ABRT_EV5T=y | ||
168 | CONFIG_CPU_CACHE_VIVT=y | ||
169 | CONFIG_CPU_TLB_V4WBI=y | ||
170 | CONFIG_CPU_CP15=y | ||
171 | CONFIG_CPU_CP15_MMU=y | ||
172 | |||
173 | # | ||
174 | # Processor Features | ||
175 | # | ||
176 | CONFIG_ARM_THUMB=y | ||
177 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
178 | # CONFIG_OUTER_CACHE is not set | ||
179 | CONFIG_IWMMXT=y | ||
180 | CONFIG_XSCALE_PMU=y | ||
181 | |||
182 | # | ||
183 | # Bus support | ||
184 | # | ||
185 | # CONFIG_PCI is not set | ||
186 | # CONFIG_PCI_SYSCALL is not set | ||
187 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
188 | |||
189 | # | ||
190 | # PCCARD (PCMCIA/CardBus) support | ||
191 | # | ||
192 | # CONFIG_PCCARD is not set | ||
193 | |||
194 | # | ||
195 | # Kernel Features | ||
196 | # | ||
197 | CONFIG_TICK_ONESHOT=y | ||
198 | # CONFIG_NO_HZ is not set | ||
199 | CONFIG_HIGH_RES_TIMERS=y | ||
200 | CONFIG_PREEMPT=y | ||
201 | CONFIG_HZ=100 | ||
202 | CONFIG_AEABI=y | ||
203 | CONFIG_OABI_COMPAT=y | ||
204 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
205 | CONFIG_SELECT_MEMORY_MODEL=y | ||
206 | CONFIG_FLATMEM_MANUAL=y | ||
207 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
208 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
209 | CONFIG_FLATMEM=y | ||
210 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
211 | # CONFIG_SPARSEMEM_STATIC is not set | ||
212 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
213 | # CONFIG_RESOURCES_64BIT is not set | ||
214 | CONFIG_ZONE_DMA_FLAG=1 | ||
215 | CONFIG_BOUNCE=y | ||
216 | CONFIG_VIRT_TO_BUS=y | ||
217 | CONFIG_ALIGNMENT_TRAP=y | ||
218 | |||
219 | # | ||
220 | # Boot options | ||
221 | # | ||
222 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
223 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
224 | CONFIG_CMDLINE="console=ttyS1,38400 monitor=8 bpp=16 mem=64M mtdparts=physmap-flash.0:256k(boot)ro,0x180000(kernel),-(root);cm-x270-nand:64m(app),-(data) rdinit=/sbin/init root=mtd3 rootfstype=jffs2" | ||
225 | # CONFIG_XIP_KERNEL is not set | ||
226 | # CONFIG_KEXEC is not set | ||
227 | |||
228 | # | ||
229 | # Floating point emulation | ||
230 | # | ||
231 | |||
232 | # | ||
233 | # At least one emulation must be selected | ||
234 | # | ||
235 | # CONFIG_FPE_NWFPE is not set | ||
236 | # CONFIG_FPE_FASTFPE is not set | ||
237 | |||
238 | # | ||
239 | # Userspace binary formats | ||
240 | # | ||
241 | CONFIG_BINFMT_ELF=y | ||
242 | # CONFIG_BINFMT_AOUT is not set | ||
243 | # CONFIG_BINFMT_MISC is not set | ||
244 | |||
245 | # | ||
246 | # Power management options | ||
247 | # | ||
248 | # CONFIG_PM is not set | ||
249 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
250 | |||
251 | # | ||
252 | # Networking | ||
253 | # | ||
254 | CONFIG_NET=y | ||
255 | |||
256 | # | ||
257 | # Networking options | ||
258 | # | ||
259 | CONFIG_PACKET=y | ||
260 | # CONFIG_PACKET_MMAP is not set | ||
261 | CONFIG_UNIX=y | ||
262 | CONFIG_XFRM=y | ||
263 | # CONFIG_XFRM_USER is not set | ||
264 | # CONFIG_XFRM_SUB_POLICY is not set | ||
265 | # CONFIG_XFRM_MIGRATE is not set | ||
266 | # CONFIG_NET_KEY is not set | ||
267 | CONFIG_INET=y | ||
268 | # CONFIG_IP_MULTICAST is not set | ||
269 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
270 | CONFIG_IP_FIB_HASH=y | ||
271 | CONFIG_IP_PNP=y | ||
272 | CONFIG_IP_PNP_DHCP=y | ||
273 | CONFIG_IP_PNP_BOOTP=y | ||
274 | # CONFIG_IP_PNP_RARP is not set | ||
275 | # CONFIG_NET_IPIP is not set | ||
276 | # CONFIG_NET_IPGRE is not set | ||
277 | # CONFIG_ARPD is not set | ||
278 | # CONFIG_SYN_COOKIES is not set | ||
279 | # CONFIG_INET_AH is not set | ||
280 | # CONFIG_INET_ESP is not set | ||
281 | # CONFIG_INET_IPCOMP is not set | ||
282 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
283 | # CONFIG_INET_TUNNEL is not set | ||
284 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
285 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
286 | CONFIG_INET_XFRM_MODE_BEET=y | ||
287 | CONFIG_INET_DIAG=y | ||
288 | CONFIG_INET_TCP_DIAG=y | ||
289 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
290 | CONFIG_TCP_CONG_CUBIC=y | ||
291 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
292 | # CONFIG_TCP_MD5SIG is not set | ||
293 | # CONFIG_IPV6 is not set | ||
294 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
295 | # CONFIG_INET6_TUNNEL is not set | ||
296 | # CONFIG_NETWORK_SECMARK is not set | ||
297 | # CONFIG_NETFILTER is not set | ||
298 | # CONFIG_IP_DCCP is not set | ||
299 | # CONFIG_IP_SCTP is not set | ||
300 | # CONFIG_TIPC is not set | ||
301 | # CONFIG_ATM is not set | ||
302 | # CONFIG_BRIDGE is not set | ||
303 | # CONFIG_VLAN_8021Q is not set | ||
304 | # CONFIG_DECNET is not set | ||
305 | # CONFIG_LLC2 is not set | ||
306 | # CONFIG_IPX is not set | ||
307 | # CONFIG_ATALK is not set | ||
308 | # CONFIG_X25 is not set | ||
309 | # CONFIG_LAPB is not set | ||
310 | # CONFIG_ECONET is not set | ||
311 | # CONFIG_WAN_ROUTER is not set | ||
312 | |||
313 | # | ||
314 | # QoS and/or fair queueing | ||
315 | # | ||
316 | # CONFIG_NET_SCHED is not set | ||
317 | |||
318 | # | ||
319 | # Network testing | ||
320 | # | ||
321 | # CONFIG_NET_PKTGEN is not set | ||
322 | # CONFIG_HAMRADIO is not set | ||
323 | # CONFIG_IRDA is not set | ||
324 | # CONFIG_BT is not set | ||
325 | # CONFIG_AF_RXRPC is not set | ||
326 | |||
327 | # | ||
328 | # Wireless | ||
329 | # | ||
330 | # CONFIG_CFG80211 is not set | ||
331 | # CONFIG_WIRELESS_EXT is not set | ||
332 | # CONFIG_MAC80211 is not set | ||
333 | # CONFIG_IEEE80211 is not set | ||
334 | # CONFIG_RFKILL is not set | ||
335 | # CONFIG_NET_9P is not set | ||
336 | |||
337 | # | ||
338 | # Device Drivers | ||
339 | # | ||
340 | |||
341 | # | ||
342 | # Generic Driver Options | ||
343 | # | ||
344 | CONFIG_STANDALONE=y | ||
345 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
346 | CONFIG_FW_LOADER=y | ||
347 | # CONFIG_SYS_HYPERVISOR is not set | ||
348 | # CONFIG_CONNECTOR is not set | ||
349 | CONFIG_MTD=y | ||
350 | # CONFIG_MTD_DEBUG is not set | ||
351 | # CONFIG_MTD_CONCAT is not set | ||
352 | CONFIG_MTD_PARTITIONS=y | ||
353 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
354 | CONFIG_MTD_CMDLINE_PARTS=y | ||
355 | # CONFIG_MTD_AFS_PARTS is not set | ||
356 | |||
357 | # | ||
358 | # User Modules And Translation Layers | ||
359 | # | ||
360 | CONFIG_MTD_CHAR=y | ||
361 | CONFIG_MTD_BLKDEVS=y | ||
362 | CONFIG_MTD_BLOCK=y | ||
363 | # CONFIG_FTL is not set | ||
364 | # CONFIG_NFTL is not set | ||
365 | # CONFIG_INFTL is not set | ||
366 | # CONFIG_RFD_FTL is not set | ||
367 | # CONFIG_SSFDC is not set | ||
368 | |||
369 | # | ||
370 | # RAM/ROM/Flash chip drivers | ||
371 | # | ||
372 | CONFIG_MTD_CFI=y | ||
373 | # CONFIG_MTD_JEDECPROBE is not set | ||
374 | CONFIG_MTD_GEN_PROBE=y | ||
375 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
376 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
377 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
378 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
379 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
380 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
381 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
382 | CONFIG_MTD_CFI_I1=y | ||
383 | CONFIG_MTD_CFI_I2=y | ||
384 | # CONFIG_MTD_CFI_I4 is not set | ||
385 | # CONFIG_MTD_CFI_I8 is not set | ||
386 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
387 | CONFIG_MTD_CFI_AMDSTD=y | ||
388 | # CONFIG_MTD_CFI_STAA is not set | ||
389 | CONFIG_MTD_CFI_UTIL=y | ||
390 | # CONFIG_MTD_RAM is not set | ||
391 | # CONFIG_MTD_ROM is not set | ||
392 | # CONFIG_MTD_ABSENT is not set | ||
393 | # CONFIG_MTD_XIP is not set | ||
394 | |||
395 | # | ||
396 | # Mapping drivers for chip access | ||
397 | # | ||
398 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
399 | CONFIG_MTD_PHYSMAP=y | ||
400 | CONFIG_MTD_PHYSMAP_START=0x0 | ||
401 | CONFIG_MTD_PHYSMAP_LEN=0x400000 | ||
402 | CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
403 | # CONFIG_MTD_ARM_INTEGRATOR is not set | ||
404 | # CONFIG_MTD_SHARP_SL is not set | ||
405 | # CONFIG_MTD_PLATRAM is not set | ||
406 | |||
407 | # | ||
408 | # Self-contained MTD device drivers | ||
409 | # | ||
410 | # CONFIG_MTD_SLRAM is not set | ||
411 | # CONFIG_MTD_PHRAM is not set | ||
412 | # CONFIG_MTD_MTDRAM is not set | ||
413 | # CONFIG_MTD_BLOCK2MTD is not set | ||
414 | |||
415 | # | ||
416 | # Disk-On-Chip Device Drivers | ||
417 | # | ||
418 | # CONFIG_MTD_DOC2000 is not set | ||
419 | # CONFIG_MTD_DOC2001 is not set | ||
420 | # CONFIG_MTD_DOC2001PLUS is not set | ||
421 | CONFIG_MTD_NAND=y | ||
422 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
423 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
424 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
425 | # CONFIG_MTD_NAND_H1900 is not set | ||
426 | CONFIG_MTD_NAND_IDS=y | ||
427 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
428 | # CONFIG_MTD_NAND_SHARPSL is not set | ||
429 | CONFIG_MTD_NAND_CM_X270=y | ||
430 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
431 | # CONFIG_MTD_NAND_PLATFORM is not set | ||
432 | # CONFIG_MTD_ONENAND is not set | ||
433 | |||
434 | # | ||
435 | # UBI - Unsorted block images | ||
436 | # | ||
437 | # CONFIG_MTD_UBI is not set | ||
438 | # CONFIG_PARPORT is not set | ||
439 | CONFIG_BLK_DEV=y | ||
440 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
441 | CONFIG_BLK_DEV_LOOP=y | ||
442 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
443 | # CONFIG_BLK_DEV_NBD is not set | ||
444 | # CONFIG_BLK_DEV_UB is not set | ||
445 | CONFIG_BLK_DEV_RAM=y | ||
446 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
447 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
448 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
449 | # CONFIG_CDROM_PKTCDVD is not set | ||
450 | # CONFIG_ATA_OVER_ETH is not set | ||
451 | # CONFIG_IDE is not set | ||
452 | |||
453 | # | ||
454 | # SCSI device support | ||
455 | # | ||
456 | # CONFIG_RAID_ATTRS is not set | ||
457 | CONFIG_SCSI=y | ||
458 | CONFIG_SCSI_DMA=y | ||
459 | # CONFIG_SCSI_TGT is not set | ||
460 | # CONFIG_SCSI_NETLINK is not set | ||
461 | CONFIG_SCSI_PROC_FS=y | ||
462 | |||
463 | # | ||
464 | # SCSI support type (disk, tape, CD-ROM) | ||
465 | # | ||
466 | CONFIG_BLK_DEV_SD=y | ||
467 | # CONFIG_CHR_DEV_ST is not set | ||
468 | # CONFIG_CHR_DEV_OSST is not set | ||
469 | # CONFIG_BLK_DEV_SR is not set | ||
470 | # CONFIG_CHR_DEV_SG is not set | ||
471 | # CONFIG_CHR_DEV_SCH is not set | ||
472 | |||
473 | # | ||
474 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
475 | # | ||
476 | # CONFIG_SCSI_MULTI_LUN is not set | ||
477 | # CONFIG_SCSI_CONSTANTS is not set | ||
478 | # CONFIG_SCSI_LOGGING is not set | ||
479 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
480 | CONFIG_SCSI_WAIT_SCAN=m | ||
481 | |||
482 | # | ||
483 | # SCSI Transports | ||
484 | # | ||
485 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
486 | # CONFIG_SCSI_FC_ATTRS is not set | ||
487 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
488 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
489 | CONFIG_SCSI_LOWLEVEL=y | ||
490 | # CONFIG_ISCSI_TCP is not set | ||
491 | # CONFIG_SCSI_DEBUG is not set | ||
492 | # CONFIG_ATA is not set | ||
493 | # CONFIG_MD is not set | ||
494 | CONFIG_NETDEVICES=y | ||
495 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
496 | # CONFIG_DUMMY is not set | ||
497 | # CONFIG_BONDING is not set | ||
498 | # CONFIG_MACVLAN is not set | ||
499 | # CONFIG_EQUALIZER is not set | ||
500 | # CONFIG_TUN is not set | ||
501 | # CONFIG_PHYLIB is not set | ||
502 | CONFIG_NET_ETHERNET=y | ||
503 | CONFIG_MII=y | ||
504 | # CONFIG_AX88796 is not set | ||
505 | # CONFIG_SMC91X is not set | ||
506 | CONFIG_DM9000=y | ||
507 | CONFIG_DM9000_NOEPROM=y | ||
508 | # CONFIG_SMC911X is not set | ||
509 | # CONFIG_NETDEV_1000 is not set | ||
510 | # CONFIG_NETDEV_10000 is not set | ||
511 | |||
512 | # | ||
513 | # Wireless LAN | ||
514 | # | ||
515 | # CONFIG_WLAN_PRE80211 is not set | ||
516 | # CONFIG_WLAN_80211 is not set | ||
517 | |||
518 | # | ||
519 | # USB Network Adapters | ||
520 | # | ||
521 | CONFIG_USB_CATC=m | ||
522 | CONFIG_USB_KAWETH=m | ||
523 | CONFIG_USB_PEGASUS=m | ||
524 | CONFIG_USB_RTL8150=m | ||
525 | CONFIG_USB_USBNET_MII=m | ||
526 | CONFIG_USB_USBNET=m | ||
527 | CONFIG_USB_NET_AX8817X=m | ||
528 | CONFIG_USB_NET_CDCETHER=m | ||
529 | # CONFIG_USB_NET_DM9601 is not set | ||
530 | CONFIG_USB_NET_GL620A=m | ||
531 | CONFIG_USB_NET_NET1080=m | ||
532 | CONFIG_USB_NET_PLUSB=m | ||
533 | CONFIG_USB_NET_MCS7830=m | ||
534 | # CONFIG_USB_NET_RNDIS_HOST is not set | ||
535 | # CONFIG_USB_NET_CDC_SUBSET is not set | ||
536 | # CONFIG_USB_NET_ZAURUS is not set | ||
537 | # CONFIG_WAN is not set | ||
538 | # CONFIG_PPP is not set | ||
539 | # CONFIG_SLIP is not set | ||
540 | # CONFIG_SHAPER is not set | ||
541 | # CONFIG_NETCONSOLE is not set | ||
542 | # CONFIG_NETPOLL is not set | ||
543 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
544 | # CONFIG_ISDN is not set | ||
545 | |||
546 | # | ||
547 | # Input device support | ||
548 | # | ||
549 | CONFIG_INPUT=y | ||
550 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
551 | # CONFIG_INPUT_POLLDEV is not set | ||
552 | |||
553 | # | ||
554 | # Userland interfaces | ||
555 | # | ||
556 | CONFIG_INPUT_MOUSEDEV=y | ||
557 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
558 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
559 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
560 | # CONFIG_INPUT_JOYDEV is not set | ||
561 | # CONFIG_INPUT_TSDEV is not set | ||
562 | CONFIG_INPUT_EVDEV=m | ||
563 | # CONFIG_INPUT_EVBUG is not set | ||
564 | |||
565 | # | ||
566 | # Input Device Drivers | ||
567 | # | ||
568 | CONFIG_INPUT_KEYBOARD=y | ||
569 | CONFIG_KEYBOARD_ATKBD=y | ||
570 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
571 | # CONFIG_KEYBOARD_LKKBD is not set | ||
572 | # CONFIG_KEYBOARD_XTKBD is not set | ||
573 | # CONFIG_KEYBOARD_NEWTON is not set | ||
574 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
575 | # CONFIG_KEYBOARD_PXA27x is not set | ||
576 | # CONFIG_KEYBOARD_GPIO is not set | ||
577 | CONFIG_INPUT_MOUSE=y | ||
578 | CONFIG_MOUSE_PS2=y | ||
579 | # CONFIG_MOUSE_PS2_ALPS is not set | ||
580 | # CONFIG_MOUSE_PS2_LOGIPS2PP is not set | ||
581 | # CONFIG_MOUSE_PS2_SYNAPTICS is not set | ||
582 | # CONFIG_MOUSE_PS2_LIFEBOOK is not set | ||
583 | # CONFIG_MOUSE_PS2_TRACKPOINT is not set | ||
584 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
585 | # CONFIG_MOUSE_SERIAL is not set | ||
586 | # CONFIG_MOUSE_APPLETOUCH is not set | ||
587 | # CONFIG_MOUSE_VSXXXAA is not set | ||
588 | # CONFIG_MOUSE_GPIO is not set | ||
589 | # CONFIG_INPUT_JOYSTICK is not set | ||
590 | # CONFIG_INPUT_TABLET is not set | ||
591 | CONFIG_INPUT_TOUCHSCREEN=y | ||
592 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
593 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
594 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
595 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
596 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
597 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
598 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
599 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
600 | CONFIG_TOUCHSCREEN_UCB1400=m | ||
601 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
602 | # CONFIG_INPUT_MISC is not set | ||
603 | |||
604 | # | ||
605 | # Hardware I/O ports | ||
606 | # | ||
607 | CONFIG_SERIO=y | ||
608 | CONFIG_SERIO_SERPORT=y | ||
609 | CONFIG_SERIO_LIBPS2=y | ||
610 | # CONFIG_SERIO_RAW is not set | ||
611 | # CONFIG_GAMEPORT is not set | ||
612 | |||
613 | # | ||
614 | # Character devices | ||
615 | # | ||
616 | CONFIG_VT=y | ||
617 | CONFIG_VT_CONSOLE=y | ||
618 | CONFIG_HW_CONSOLE=y | ||
619 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
620 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
621 | |||
622 | # | ||
623 | # Serial drivers | ||
624 | # | ||
625 | # CONFIG_SERIAL_8250 is not set | ||
626 | |||
627 | # | ||
628 | # Non-8250 serial port support | ||
629 | # | ||
630 | CONFIG_SERIAL_PXA=y | ||
631 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
632 | CONFIG_SERIAL_CORE=y | ||
633 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
634 | CONFIG_UNIX98_PTYS=y | ||
635 | # CONFIG_LEGACY_PTYS is not set | ||
636 | # CONFIG_IPMI_HANDLER is not set | ||
637 | # CONFIG_WATCHDOG is not set | ||
638 | CONFIG_HW_RANDOM=y | ||
639 | # CONFIG_NVRAM is not set | ||
640 | # CONFIG_R3964 is not set | ||
641 | # CONFIG_RAW_DRIVER is not set | ||
642 | # CONFIG_TCG_TPM is not set | ||
643 | CONFIG_I2C=m | ||
644 | CONFIG_I2C_BOARDINFO=y | ||
645 | CONFIG_I2C_CHARDEV=m | ||
646 | |||
647 | # | ||
648 | # I2C Algorithms | ||
649 | # | ||
650 | # CONFIG_I2C_ALGOBIT is not set | ||
651 | # CONFIG_I2C_ALGOPCF is not set | ||
652 | # CONFIG_I2C_ALGOPCA is not set | ||
653 | |||
654 | # | ||
655 | # I2C Hardware Bus support | ||
656 | # | ||
657 | # CONFIG_I2C_GPIO is not set | ||
658 | CONFIG_I2C_PXA=m | ||
659 | # CONFIG_I2C_PXA_SLAVE is not set | ||
660 | # CONFIG_I2C_OCORES is not set | ||
661 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
662 | # CONFIG_I2C_SIMTEC is not set | ||
663 | # CONFIG_I2C_TAOS_EVM is not set | ||
664 | # CONFIG_I2C_STUB is not set | ||
665 | # CONFIG_I2C_TINY_USB is not set | ||
666 | |||
667 | # | ||
668 | # Miscellaneous I2C Chip support | ||
669 | # | ||
670 | # CONFIG_SENSORS_DS1337 is not set | ||
671 | # CONFIG_SENSORS_DS1374 is not set | ||
672 | # CONFIG_DS1682 is not set | ||
673 | # CONFIG_SENSORS_EEPROM is not set | ||
674 | # CONFIG_SENSORS_PCF8574 is not set | ||
675 | # CONFIG_SENSORS_PCA9539 is not set | ||
676 | # CONFIG_SENSORS_PCF8591 is not set | ||
677 | # CONFIG_SENSORS_MAX6875 is not set | ||
678 | # CONFIG_SENSORS_TSL2550 is not set | ||
679 | # CONFIG_I2C_DEBUG_CORE is not set | ||
680 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
681 | # CONFIG_I2C_DEBUG_BUS is not set | ||
682 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
683 | |||
684 | # | ||
685 | # SPI support | ||
686 | # | ||
687 | # CONFIG_SPI is not set | ||
688 | # CONFIG_SPI_MASTER is not set | ||
689 | # CONFIG_W1 is not set | ||
690 | CONFIG_HWMON=y | ||
691 | # CONFIG_HWMON_VID is not set | ||
692 | # CONFIG_SENSORS_ABITUGURU is not set | ||
693 | # CONFIG_SENSORS_ABITUGURU3 is not set | ||
694 | # CONFIG_SENSORS_AD7418 is not set | ||
695 | # CONFIG_SENSORS_ADM1021 is not set | ||
696 | # CONFIG_SENSORS_ADM1025 is not set | ||
697 | # CONFIG_SENSORS_ADM1026 is not set | ||
698 | # CONFIG_SENSORS_ADM1029 is not set | ||
699 | # CONFIG_SENSORS_ADM1031 is not set | ||
700 | # CONFIG_SENSORS_ADM9240 is not set | ||
701 | # CONFIG_SENSORS_ASB100 is not set | ||
702 | # CONFIG_SENSORS_ATXP1 is not set | ||
703 | # CONFIG_SENSORS_DS1621 is not set | ||
704 | # CONFIG_SENSORS_F71805F is not set | ||
705 | # CONFIG_SENSORS_FSCHER is not set | ||
706 | # CONFIG_SENSORS_FSCPOS is not set | ||
707 | # CONFIG_SENSORS_GL518SM is not set | ||
708 | # CONFIG_SENSORS_GL520SM is not set | ||
709 | # CONFIG_SENSORS_IT87 is not set | ||
710 | # CONFIG_SENSORS_LM63 is not set | ||
711 | # CONFIG_SENSORS_LM75 is not set | ||
712 | # CONFIG_SENSORS_LM77 is not set | ||
713 | # CONFIG_SENSORS_LM78 is not set | ||
714 | # CONFIG_SENSORS_LM80 is not set | ||
715 | # CONFIG_SENSORS_LM83 is not set | ||
716 | # CONFIG_SENSORS_LM85 is not set | ||
717 | # CONFIG_SENSORS_LM87 is not set | ||
718 | # CONFIG_SENSORS_LM90 is not set | ||
719 | # CONFIG_SENSORS_LM92 is not set | ||
720 | # CONFIG_SENSORS_LM93 is not set | ||
721 | # CONFIG_SENSORS_MAX1619 is not set | ||
722 | # CONFIG_SENSORS_MAX6650 is not set | ||
723 | # CONFIG_SENSORS_PC87360 is not set | ||
724 | # CONFIG_SENSORS_PC87427 is not set | ||
725 | # CONFIG_SENSORS_DME1737 is not set | ||
726 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
727 | # CONFIG_SENSORS_SMSC47M192 is not set | ||
728 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
729 | # CONFIG_SENSORS_THMC50 is not set | ||
730 | # CONFIG_SENSORS_VT1211 is not set | ||
731 | # CONFIG_SENSORS_W83781D is not set | ||
732 | # CONFIG_SENSORS_W83791D is not set | ||
733 | # CONFIG_SENSORS_W83792D is not set | ||
734 | # CONFIG_SENSORS_W83793 is not set | ||
735 | # CONFIG_SENSORS_W83L785TS is not set | ||
736 | # CONFIG_SENSORS_W83627HF is not set | ||
737 | # CONFIG_SENSORS_W83627EHF is not set | ||
738 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
739 | CONFIG_MISC_DEVICES=y | ||
740 | # CONFIG_EEPROM_93CX6 is not set | ||
741 | |||
742 | # | ||
743 | # Multifunction device drivers | ||
744 | # | ||
745 | # CONFIG_MFD_SM501 is not set | ||
746 | CONFIG_NEW_LEDS=y | ||
747 | CONFIG_LEDS_CLASS=y | ||
748 | |||
749 | # | ||
750 | # LED drivers | ||
751 | # | ||
752 | CONFIG_LEDS_CM_X270=y | ||
753 | # CONFIG_LEDS_GPIO is not set | ||
754 | |||
755 | # | ||
756 | # LED Triggers | ||
757 | # | ||
758 | # CONFIG_LEDS_TRIGGERS is not set | ||
759 | |||
760 | # | ||
761 | # Multimedia devices | ||
762 | # | ||
763 | # CONFIG_VIDEO_DEV is not set | ||
764 | # CONFIG_DVB_CORE is not set | ||
765 | # CONFIG_DAB is not set | ||
766 | |||
767 | # | ||
768 | # Graphics support | ||
769 | # | ||
770 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
771 | |||
772 | # | ||
773 | # Display device support | ||
774 | # | ||
775 | # CONFIG_DISPLAY_SUPPORT is not set | ||
776 | # CONFIG_VGASTATE is not set | ||
777 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
778 | CONFIG_FB=y | ||
779 | # CONFIG_FIRMWARE_EDID is not set | ||
780 | # CONFIG_FB_DDC is not set | ||
781 | CONFIG_FB_CFB_FILLRECT=y | ||
782 | CONFIG_FB_CFB_COPYAREA=y | ||
783 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
784 | # CONFIG_FB_SYS_FILLRECT is not set | ||
785 | # CONFIG_FB_SYS_COPYAREA is not set | ||
786 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
787 | # CONFIG_FB_SYS_FOPS is not set | ||
788 | CONFIG_FB_DEFERRED_IO=y | ||
789 | # CONFIG_FB_SVGALIB is not set | ||
790 | # CONFIG_FB_MACMODES is not set | ||
791 | # CONFIG_FB_BACKLIGHT is not set | ||
792 | # CONFIG_FB_MODE_HELPERS is not set | ||
793 | # CONFIG_FB_TILEBLITTING is not set | ||
794 | |||
795 | # | ||
796 | # Frame buffer hardware drivers | ||
797 | # | ||
798 | # CONFIG_FB_S1D13XXX is not set | ||
799 | CONFIG_FB_PXA=y | ||
800 | CONFIG_FB_PXA_PARAMETERS=y | ||
801 | # CONFIG_FB_MBX is not set | ||
802 | # CONFIG_FB_VIRTUAL is not set | ||
803 | |||
804 | # | ||
805 | # Console display driver support | ||
806 | # | ||
807 | # CONFIG_VGA_CONSOLE is not set | ||
808 | CONFIG_DUMMY_CONSOLE=y | ||
809 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
810 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
811 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
812 | # CONFIG_FONTS is not set | ||
813 | CONFIG_FONT_8x8=y | ||
814 | CONFIG_FONT_8x16=y | ||
815 | # CONFIG_LOGO is not set | ||
816 | |||
817 | # | ||
818 | # Sound | ||
819 | # | ||
820 | CONFIG_SOUND=m | ||
821 | |||
822 | # | ||
823 | # Advanced Linux Sound Architecture | ||
824 | # | ||
825 | CONFIG_SND=m | ||
826 | CONFIG_SND_TIMER=m | ||
827 | CONFIG_SND_PCM=m | ||
828 | # CONFIG_SND_SEQUENCER is not set | ||
829 | # CONFIG_SND_MIXER_OSS is not set | ||
830 | # CONFIG_SND_PCM_OSS is not set | ||
831 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
832 | CONFIG_SND_SUPPORT_OLD_API=y | ||
833 | CONFIG_SND_VERBOSE_PROCFS=y | ||
834 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
835 | # CONFIG_SND_DEBUG is not set | ||
836 | |||
837 | # | ||
838 | # Generic devices | ||
839 | # | ||
840 | CONFIG_SND_AC97_CODEC=m | ||
841 | # CONFIG_SND_DUMMY is not set | ||
842 | # CONFIG_SND_MTPAV is not set | ||
843 | # CONFIG_SND_SERIAL_U16550 is not set | ||
844 | # CONFIG_SND_MPU401 is not set | ||
845 | |||
846 | # | ||
847 | # ALSA ARM devices | ||
848 | # | ||
849 | CONFIG_SND_PXA2XX_PCM=m | ||
850 | CONFIG_SND_PXA2XX_AC97=m | ||
851 | |||
852 | # | ||
853 | # USB devices | ||
854 | # | ||
855 | # CONFIG_SND_USB_AUDIO is not set | ||
856 | # CONFIG_SND_USB_CAIAQ is not set | ||
857 | |||
858 | # | ||
859 | # System on Chip audio support | ||
860 | # | ||
861 | # CONFIG_SND_SOC is not set | ||
862 | |||
863 | # | ||
864 | # SoC Audio support for SuperH | ||
865 | # | ||
866 | |||
867 | # | ||
868 | # Open Sound System | ||
869 | # | ||
870 | # CONFIG_SOUND_PRIME is not set | ||
871 | CONFIG_AC97_BUS=m | ||
872 | CONFIG_HID_SUPPORT=y | ||
873 | CONFIG_HID=y | ||
874 | # CONFIG_HID_DEBUG is not set | ||
875 | |||
876 | # | ||
877 | # USB Input Devices | ||
878 | # | ||
879 | CONFIG_USB_HID=y | ||
880 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
881 | # CONFIG_HID_FF is not set | ||
882 | # CONFIG_USB_HIDDEV is not set | ||
883 | CONFIG_USB_SUPPORT=y | ||
884 | CONFIG_USB_ARCH_HAS_HCD=y | ||
885 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
886 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
887 | CONFIG_USB=y | ||
888 | # CONFIG_USB_DEBUG is not set | ||
889 | |||
890 | # | ||
891 | # Miscellaneous USB options | ||
892 | # | ||
893 | CONFIG_USB_DEVICEFS=y | ||
894 | # CONFIG_USB_DEVICE_CLASS is not set | ||
895 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
896 | # CONFIG_USB_OTG is not set | ||
897 | |||
898 | # | ||
899 | # USB Host Controller Drivers | ||
900 | # | ||
901 | # CONFIG_USB_ISP116X_HCD is not set | ||
902 | CONFIG_USB_OHCI_HCD=y | ||
903 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
904 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
905 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
906 | # CONFIG_USB_SL811_HCD is not set | ||
907 | # CONFIG_USB_R8A66597_HCD is not set | ||
908 | |||
909 | # | ||
910 | # USB Device Class drivers | ||
911 | # | ||
912 | # CONFIG_USB_ACM is not set | ||
913 | # CONFIG_USB_PRINTER is not set | ||
914 | |||
915 | # | ||
916 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
917 | # | ||
918 | |||
919 | # | ||
920 | # may also be needed; see USB_STORAGE Help for more information | ||
921 | # | ||
922 | CONFIG_USB_STORAGE=y | ||
923 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
924 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
925 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
926 | # CONFIG_USB_STORAGE_DPCM is not set | ||
927 | # CONFIG_USB_STORAGE_USBAT is not set | ||
928 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
929 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
930 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
931 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
932 | # CONFIG_USB_STORAGE_ONETOUCH is not set | ||
933 | # CONFIG_USB_STORAGE_KARMA is not set | ||
934 | # CONFIG_USB_LIBUSUAL is not set | ||
935 | |||
936 | # | ||
937 | # USB Imaging devices | ||
938 | # | ||
939 | # CONFIG_USB_MDC800 is not set | ||
940 | # CONFIG_USB_MICROTEK is not set | ||
941 | CONFIG_USB_MON=y | ||
942 | |||
943 | # | ||
944 | # USB port drivers | ||
945 | # | ||
946 | |||
947 | # | ||
948 | # USB Serial Converter support | ||
949 | # | ||
950 | # CONFIG_USB_SERIAL is not set | ||
951 | |||
952 | # | ||
953 | # USB Miscellaneous drivers | ||
954 | # | ||
955 | # CONFIG_USB_EMI62 is not set | ||
956 | # CONFIG_USB_EMI26 is not set | ||
957 | # CONFIG_USB_ADUTUX is not set | ||
958 | # CONFIG_USB_AUERSWALD is not set | ||
959 | # CONFIG_USB_RIO500 is not set | ||
960 | # CONFIG_USB_LEGOTOWER is not set | ||
961 | # CONFIG_USB_LCD is not set | ||
962 | # CONFIG_USB_BERRY_CHARGE is not set | ||
963 | # CONFIG_USB_LED is not set | ||
964 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
965 | # CONFIG_USB_CYTHERM is not set | ||
966 | # CONFIG_USB_PHIDGET is not set | ||
967 | # CONFIG_USB_IDMOUSE is not set | ||
968 | # CONFIG_USB_FTDI_ELAN is not set | ||
969 | # CONFIG_USB_APPLEDISPLAY is not set | ||
970 | # CONFIG_USB_LD is not set | ||
971 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
972 | # CONFIG_USB_IOWARRIOR is not set | ||
973 | # CONFIG_USB_TEST is not set | ||
974 | |||
975 | # | ||
976 | # USB DSL modem support | ||
977 | # | ||
978 | |||
979 | # | ||
980 | # USB Gadget Support | ||
981 | # | ||
982 | # CONFIG_USB_GADGET is not set | ||
983 | CONFIG_MMC=m | ||
984 | # CONFIG_MMC_DEBUG is not set | ||
985 | # CONFIG_MMC_UNSAFE_RESUME is not set | ||
986 | |||
987 | # | ||
988 | # MMC/SD Card Drivers | ||
989 | # | ||
990 | CONFIG_MMC_BLOCK=m | ||
991 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
992 | |||
993 | # | ||
994 | # MMC/SD Host Controller Drivers | ||
995 | # | ||
996 | CONFIG_MMC_PXA=m | ||
997 | CONFIG_RTC_LIB=y | ||
998 | # CONFIG_RTC_CLASS is not set | ||
999 | |||
1000 | # | ||
1001 | # DMA Engine support | ||
1002 | # | ||
1003 | # CONFIG_DMA_ENGINE is not set | ||
1004 | |||
1005 | # | ||
1006 | # DMA Clients | ||
1007 | # | ||
1008 | |||
1009 | # | ||
1010 | # DMA Devices | ||
1011 | # | ||
1012 | |||
1013 | # | ||
1014 | # File systems | ||
1015 | # | ||
1016 | CONFIG_EXT2_FS=y | ||
1017 | # CONFIG_EXT2_FS_XATTR is not set | ||
1018 | # CONFIG_EXT2_FS_XIP is not set | ||
1019 | CONFIG_EXT3_FS=y | ||
1020 | CONFIG_EXT3_FS_XATTR=y | ||
1021 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1022 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1023 | # CONFIG_EXT4DEV_FS is not set | ||
1024 | CONFIG_JBD=y | ||
1025 | # CONFIG_JBD_DEBUG is not set | ||
1026 | CONFIG_FS_MBCACHE=y | ||
1027 | # CONFIG_REISERFS_FS is not set | ||
1028 | # CONFIG_JFS_FS is not set | ||
1029 | # CONFIG_FS_POSIX_ACL is not set | ||
1030 | # CONFIG_XFS_FS is not set | ||
1031 | # CONFIG_GFS2_FS is not set | ||
1032 | # CONFIG_OCFS2_FS is not set | ||
1033 | # CONFIG_MINIX_FS is not set | ||
1034 | # CONFIG_ROMFS_FS is not set | ||
1035 | CONFIG_INOTIFY=y | ||
1036 | CONFIG_INOTIFY_USER=y | ||
1037 | # CONFIG_QUOTA is not set | ||
1038 | CONFIG_DNOTIFY=y | ||
1039 | # CONFIG_AUTOFS_FS is not set | ||
1040 | # CONFIG_AUTOFS4_FS is not set | ||
1041 | # CONFIG_FUSE_FS is not set | ||
1042 | |||
1043 | # | ||
1044 | # CD-ROM/DVD Filesystems | ||
1045 | # | ||
1046 | # CONFIG_ISO9660_FS is not set | ||
1047 | # CONFIG_UDF_FS is not set | ||
1048 | |||
1049 | # | ||
1050 | # DOS/FAT/NT Filesystems | ||
1051 | # | ||
1052 | CONFIG_FAT_FS=y | ||
1053 | CONFIG_MSDOS_FS=y | ||
1054 | CONFIG_VFAT_FS=y | ||
1055 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1056 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1057 | # CONFIG_NTFS_FS is not set | ||
1058 | |||
1059 | # | ||
1060 | # Pseudo filesystems | ||
1061 | # | ||
1062 | CONFIG_PROC_FS=y | ||
1063 | CONFIG_PROC_SYSCTL=y | ||
1064 | CONFIG_SYSFS=y | ||
1065 | CONFIG_TMPFS=y | ||
1066 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
1067 | # CONFIG_HUGETLB_PAGE is not set | ||
1068 | CONFIG_RAMFS=y | ||
1069 | # CONFIG_CONFIGFS_FS is not set | ||
1070 | |||
1071 | # | ||
1072 | # Miscellaneous filesystems | ||
1073 | # | ||
1074 | # CONFIG_ADFS_FS is not set | ||
1075 | # CONFIG_AFFS_FS is not set | ||
1076 | # CONFIG_HFS_FS is not set | ||
1077 | # CONFIG_HFSPLUS_FS is not set | ||
1078 | # CONFIG_BEFS_FS is not set | ||
1079 | # CONFIG_BFS_FS is not set | ||
1080 | # CONFIG_EFS_FS is not set | ||
1081 | CONFIG_JFFS2_FS=y | ||
1082 | CONFIG_JFFS2_FS_DEBUG=0 | ||
1083 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
1084 | CONFIG_JFFS2_SUMMARY=y | ||
1085 | # CONFIG_JFFS2_FS_XATTR is not set | ||
1086 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
1087 | CONFIG_JFFS2_ZLIB=y | ||
1088 | CONFIG_JFFS2_RTIME=y | ||
1089 | # CONFIG_JFFS2_RUBIN is not set | ||
1090 | # CONFIG_CRAMFS is not set | ||
1091 | # CONFIG_VXFS_FS is not set | ||
1092 | # CONFIG_HPFS_FS is not set | ||
1093 | # CONFIG_QNX4FS_FS is not set | ||
1094 | # CONFIG_SYSV_FS is not set | ||
1095 | # CONFIG_UFS_FS is not set | ||
1096 | |||
1097 | # | ||
1098 | # Network File Systems | ||
1099 | # | ||
1100 | # CONFIG_NFS_FS is not set | ||
1101 | # CONFIG_NFSD is not set | ||
1102 | # CONFIG_SMB_FS is not set | ||
1103 | # CONFIG_CIFS is not set | ||
1104 | # CONFIG_NCP_FS is not set | ||
1105 | # CONFIG_CODA_FS is not set | ||
1106 | # CONFIG_AFS_FS is not set | ||
1107 | |||
1108 | # | ||
1109 | # Partition Types | ||
1110 | # | ||
1111 | # CONFIG_PARTITION_ADVANCED is not set | ||
1112 | CONFIG_MSDOS_PARTITION=y | ||
1113 | |||
1114 | # | ||
1115 | # Native Language Support | ||
1116 | # | ||
1117 | CONFIG_NLS=y | ||
1118 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1119 | CONFIG_NLS_CODEPAGE_437=y | ||
1120 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1121 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1122 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1123 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1124 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1125 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1126 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1127 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1128 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1129 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1130 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1131 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1132 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1133 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1134 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1135 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1136 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1137 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1138 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1139 | # CONFIG_NLS_ISO8859_8 is not set | ||
1140 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1141 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1142 | # CONFIG_NLS_ASCII is not set | ||
1143 | CONFIG_NLS_ISO8859_1=y | ||
1144 | # CONFIG_NLS_ISO8859_2 is not set | ||
1145 | # CONFIG_NLS_ISO8859_3 is not set | ||
1146 | # CONFIG_NLS_ISO8859_4 is not set | ||
1147 | # CONFIG_NLS_ISO8859_5 is not set | ||
1148 | # CONFIG_NLS_ISO8859_6 is not set | ||
1149 | # CONFIG_NLS_ISO8859_7 is not set | ||
1150 | # CONFIG_NLS_ISO8859_9 is not set | ||
1151 | # CONFIG_NLS_ISO8859_13 is not set | ||
1152 | # CONFIG_NLS_ISO8859_14 is not set | ||
1153 | # CONFIG_NLS_ISO8859_15 is not set | ||
1154 | # CONFIG_NLS_KOI8_R is not set | ||
1155 | # CONFIG_NLS_KOI8_U is not set | ||
1156 | # CONFIG_NLS_UTF8 is not set | ||
1157 | |||
1158 | # | ||
1159 | # Distributed Lock Manager | ||
1160 | # | ||
1161 | # CONFIG_DLM is not set | ||
1162 | |||
1163 | # | ||
1164 | # Profiling support | ||
1165 | # | ||
1166 | # CONFIG_PROFILING is not set | ||
1167 | |||
1168 | # | ||
1169 | # Kernel hacking | ||
1170 | # | ||
1171 | # CONFIG_PRINTK_TIME is not set | ||
1172 | CONFIG_ENABLE_MUST_CHECK=y | ||
1173 | # CONFIG_MAGIC_SYSRQ is not set | ||
1174 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1175 | # CONFIG_DEBUG_FS is not set | ||
1176 | # CONFIG_HEADERS_CHECK is not set | ||
1177 | # CONFIG_DEBUG_KERNEL is not set | ||
1178 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
1179 | CONFIG_FRAME_POINTER=y | ||
1180 | # CONFIG_DEBUG_USER is not set | ||
1181 | |||
1182 | # | ||
1183 | # Security options | ||
1184 | # | ||
1185 | # CONFIG_KEYS is not set | ||
1186 | # CONFIG_SECURITY is not set | ||
1187 | # CONFIG_CRYPTO is not set | ||
1188 | |||
1189 | # | ||
1190 | # Library routines | ||
1191 | # | ||
1192 | CONFIG_BITREVERSE=y | ||
1193 | # CONFIG_CRC_CCITT is not set | ||
1194 | # CONFIG_CRC16 is not set | ||
1195 | # CONFIG_CRC_ITU_T is not set | ||
1196 | CONFIG_CRC32=y | ||
1197 | # CONFIG_CRC7 is not set | ||
1198 | # CONFIG_LIBCRC32C is not set | ||
1199 | CONFIG_ZLIB_INFLATE=y | ||
1200 | CONFIG_ZLIB_DEFLATE=y | ||
1201 | CONFIG_PLIST=y | ||
1202 | CONFIG_HAS_IOMEM=y | ||
1203 | CONFIG_HAS_IOPORT=y | ||
1204 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/em-x270/defconfig b/meta/recipes-kernel/linux/linux-2.6.23/em-x270/defconfig deleted file mode 100644 index 3246136571..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/em-x270/defconfig +++ /dev/null | |||
@@ -1,1354 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.23-rc9 | ||
4 | # Tue Oct 9 11:19:21 2007 | ||
5 | # | ||
6 | CONFIG_ARM=y | ||
7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
8 | CONFIG_GENERIC_GPIO=y | ||
9 | CONFIG_GENERIC_TIME=y | ||
10 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
11 | CONFIG_MMU=y | ||
12 | # CONFIG_NO_IOPORT is not set | ||
13 | CONFIG_GENERIC_HARDIRQS=y | ||
14 | CONFIG_STACKTRACE_SUPPORT=y | ||
15 | CONFIG_LOCKDEP_SUPPORT=y | ||
16 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
17 | CONFIG_HARDIRQS_SW_RESEND=y | ||
18 | CONFIG_GENERIC_IRQ_PROBE=y | ||
19 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
22 | CONFIG_GENERIC_HWEIGHT=y | ||
23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
24 | CONFIG_ZONE_DMA=y | ||
25 | CONFIG_ARCH_MTD_XIP=y | ||
26 | CONFIG_VECTORS_BASE=0xffff0000 | ||
27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
28 | |||
29 | # | ||
30 | # General setup | ||
31 | # | ||
32 | CONFIG_EXPERIMENTAL=y | ||
33 | CONFIG_BROKEN_ON_SMP=y | ||
34 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
35 | CONFIG_LOCALVERSION="-em-x270" | ||
36 | # CONFIG_LOCALVERSION_AUTO is not set | ||
37 | CONFIG_SWAP=y | ||
38 | CONFIG_SYSVIPC=y | ||
39 | CONFIG_SYSVIPC_SYSCTL=y | ||
40 | # CONFIG_POSIX_MQUEUE is not set | ||
41 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
42 | # CONFIG_TASKSTATS is not set | ||
43 | # CONFIG_USER_NS is not set | ||
44 | # CONFIG_AUDIT is not set | ||
45 | CONFIG_IKCONFIG=y | ||
46 | CONFIG_IKCONFIG_PROC=y | ||
47 | CONFIG_LOG_BUF_SHIFT=17 | ||
48 | CONFIG_SYSFS_DEPRECATED=y | ||
49 | # CONFIG_RELAY is not set | ||
50 | CONFIG_BLK_DEV_INITRD=y | ||
51 | CONFIG_INITRAMFS_SOURCE="" | ||
52 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
53 | CONFIG_SYSCTL=y | ||
54 | CONFIG_EMBEDDED=y | ||
55 | CONFIG_UID16=y | ||
56 | CONFIG_SYSCTL_SYSCALL=y | ||
57 | CONFIG_KALLSYMS=y | ||
58 | # CONFIG_KALLSYMS_ALL is not set | ||
59 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
60 | CONFIG_HOTPLUG=y | ||
61 | CONFIG_PRINTK=y | ||
62 | CONFIG_BUG=y | ||
63 | CONFIG_ELF_CORE=y | ||
64 | CONFIG_BASE_FULL=y | ||
65 | CONFIG_FUTEX=y | ||
66 | CONFIG_ANON_INODES=y | ||
67 | CONFIG_EPOLL=y | ||
68 | CONFIG_SIGNALFD=y | ||
69 | CONFIG_EVENTFD=y | ||
70 | CONFIG_SHMEM=y | ||
71 | CONFIG_VM_EVENT_COUNTERS=y | ||
72 | CONFIG_SLUB_DEBUG=y | ||
73 | # CONFIG_SLAB is not set | ||
74 | CONFIG_SLUB=y | ||
75 | # CONFIG_SLOB is not set | ||
76 | CONFIG_RT_MUTEXES=y | ||
77 | # CONFIG_TINY_SHMEM is not set | ||
78 | CONFIG_BASE_SMALL=0 | ||
79 | CONFIG_MODULES=y | ||
80 | CONFIG_MODULE_UNLOAD=y | ||
81 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
82 | # CONFIG_MODVERSIONS is not set | ||
83 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
84 | CONFIG_KMOD=y | ||
85 | CONFIG_BLOCK=y | ||
86 | # CONFIG_LBD is not set | ||
87 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
88 | # CONFIG_LSF is not set | ||
89 | # CONFIG_BLK_DEV_BSG is not set | ||
90 | |||
91 | # | ||
92 | # IO Schedulers | ||
93 | # | ||
94 | CONFIG_IOSCHED_NOOP=y | ||
95 | CONFIG_IOSCHED_AS=y | ||
96 | CONFIG_IOSCHED_DEADLINE=y | ||
97 | CONFIG_IOSCHED_CFQ=y | ||
98 | CONFIG_DEFAULT_AS=y | ||
99 | # CONFIG_DEFAULT_DEADLINE is not set | ||
100 | # CONFIG_DEFAULT_CFQ is not set | ||
101 | # CONFIG_DEFAULT_NOOP is not set | ||
102 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
103 | |||
104 | # | ||
105 | # System Type | ||
106 | # | ||
107 | # CONFIG_ARCH_AAEC2000 is not set | ||
108 | # CONFIG_ARCH_INTEGRATOR is not set | ||
109 | # CONFIG_ARCH_REALVIEW is not set | ||
110 | # CONFIG_ARCH_VERSATILE is not set | ||
111 | # CONFIG_ARCH_AT91 is not set | ||
112 | # CONFIG_ARCH_CLPS7500 is not set | ||
113 | # CONFIG_ARCH_CLPS711X is not set | ||
114 | # CONFIG_ARCH_CO285 is not set | ||
115 | # CONFIG_ARCH_EBSA110 is not set | ||
116 | # CONFIG_ARCH_EP93XX is not set | ||
117 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
118 | # CONFIG_ARCH_NETX is not set | ||
119 | # CONFIG_ARCH_H720X is not set | ||
120 | # CONFIG_ARCH_IMX is not set | ||
121 | # CONFIG_ARCH_IOP13XX is not set | ||
122 | # CONFIG_ARCH_IOP32X is not set | ||
123 | # CONFIG_ARCH_IOP33X is not set | ||
124 | # CONFIG_ARCH_IXP23XX is not set | ||
125 | # CONFIG_ARCH_IXP2000 is not set | ||
126 | # CONFIG_ARCH_IXP4XX is not set | ||
127 | # CONFIG_ARCH_L7200 is not set | ||
128 | # CONFIG_ARCH_KS8695 is not set | ||
129 | # CONFIG_ARCH_NS9XXX is not set | ||
130 | # CONFIG_ARCH_MXC is not set | ||
131 | # CONFIG_ARCH_PNX4008 is not set | ||
132 | CONFIG_ARCH_PXA=y | ||
133 | # CONFIG_ARCH_RPC is not set | ||
134 | # CONFIG_ARCH_SA1100 is not set | ||
135 | # CONFIG_ARCH_S3C2410 is not set | ||
136 | # CONFIG_ARCH_SHARK is not set | ||
137 | # CONFIG_ARCH_LH7A40X is not set | ||
138 | # CONFIG_ARCH_DAVINCI is not set | ||
139 | # CONFIG_ARCH_OMAP is not set | ||
140 | |||
141 | # | ||
142 | # Intel PXA2xx Implementations | ||
143 | # | ||
144 | # CONFIG_ARCH_LUBBOCK is not set | ||
145 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
146 | # CONFIG_MACH_MAINSTONE is not set | ||
147 | # CONFIG_ARCH_PXA_IDP is not set | ||
148 | # CONFIG_PXA_SHARPSL is not set | ||
149 | # CONFIG_MACH_TRIZEPS4 is not set | ||
150 | CONFIG_MACH_EM_X270=y | ||
151 | CONFIG_PXA27x=y | ||
152 | CONFIG_PXA_PWR_I2C=y | ||
153 | |||
154 | # | ||
155 | # Boot options | ||
156 | # | ||
157 | |||
158 | # | ||
159 | # Power management | ||
160 | # | ||
161 | |||
162 | # | ||
163 | # Processor Type | ||
164 | # | ||
165 | CONFIG_CPU_32=y | ||
166 | CONFIG_CPU_XSCALE=y | ||
167 | CONFIG_CPU_32v5=y | ||
168 | CONFIG_CPU_ABRT_EV5T=y | ||
169 | CONFIG_CPU_CACHE_VIVT=y | ||
170 | CONFIG_CPU_TLB_V4WBI=y | ||
171 | CONFIG_CPU_CP15=y | ||
172 | CONFIG_CPU_CP15_MMU=y | ||
173 | |||
174 | # | ||
175 | # Processor Features | ||
176 | # | ||
177 | CONFIG_ARM_THUMB=y | ||
178 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
179 | # CONFIG_OUTER_CACHE is not set | ||
180 | CONFIG_IWMMXT=y | ||
181 | CONFIG_XSCALE_PMU=y | ||
182 | |||
183 | # | ||
184 | # Bus support | ||
185 | # | ||
186 | # CONFIG_PCI_SYSCALL is not set | ||
187 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
188 | |||
189 | # | ||
190 | # PCCARD (PCMCIA/CardBus) support | ||
191 | # | ||
192 | # CONFIG_PCCARD is not set | ||
193 | |||
194 | # | ||
195 | # Kernel Features | ||
196 | # | ||
197 | # CONFIG_TICK_ONESHOT is not set | ||
198 | # CONFIG_NO_HZ is not set | ||
199 | # CONFIG_HIGH_RES_TIMERS is not set | ||
200 | # CONFIG_PREEMPT is not set | ||
201 | CONFIG_HZ=100 | ||
202 | CONFIG_AEABI=y | ||
203 | CONFIG_OABI_COMPAT=y | ||
204 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
205 | CONFIG_SELECT_MEMORY_MODEL=y | ||
206 | CONFIG_FLATMEM_MANUAL=y | ||
207 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
208 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
209 | CONFIG_FLATMEM=y | ||
210 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
211 | # CONFIG_SPARSEMEM_STATIC is not set | ||
212 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
213 | # CONFIG_RESOURCES_64BIT is not set | ||
214 | CONFIG_ZONE_DMA_FLAG=1 | ||
215 | CONFIG_BOUNCE=y | ||
216 | CONFIG_VIRT_TO_BUS=y | ||
217 | CONFIG_ALIGNMENT_TRAP=y | ||
218 | |||
219 | # | ||
220 | # Boot options | ||
221 | # | ||
222 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
223 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
224 | CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=jffs2 console=ttyS0,115200" | ||
225 | # CONFIG_XIP_KERNEL is not set | ||
226 | # CONFIG_KEXEC is not set | ||
227 | |||
228 | # | ||
229 | # CPU Frequency scaling | ||
230 | # | ||
231 | CONFIG_CPU_FREQ=y | ||
232 | CONFIG_CPU_FREQ_TABLE=y | ||
233 | # CONFIG_CPU_FREQ_DEBUG is not set | ||
234 | CONFIG_CPU_FREQ_STAT=y | ||
235 | # CONFIG_CPU_FREQ_STAT_DETAILS is not set | ||
236 | CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y | ||
237 | # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set | ||
238 | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
239 | CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||
240 | CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||
241 | CONFIG_CPU_FREQ_GOV_ONDEMAND=m | ||
242 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m | ||
243 | CONFIG_CPU_FREQ_PXA=y | ||
244 | |||
245 | # | ||
246 | # Floating point emulation | ||
247 | # | ||
248 | |||
249 | # | ||
250 | # At least one emulation must be selected | ||
251 | # | ||
252 | CONFIG_FPE_NWFPE=y | ||
253 | # CONFIG_FPE_NWFPE_XP is not set | ||
254 | # CONFIG_FPE_FASTFPE is not set | ||
255 | |||
256 | # | ||
257 | # Userspace binary formats | ||
258 | # | ||
259 | CONFIG_BINFMT_ELF=y | ||
260 | CONFIG_BINFMT_AOUT=m | ||
261 | CONFIG_BINFMT_MISC=m | ||
262 | |||
263 | # | ||
264 | # Power management options | ||
265 | # | ||
266 | CONFIG_PM=y | ||
267 | CONFIG_PM_LEGACY=y | ||
268 | # CONFIG_PM_DEBUG is not set | ||
269 | CONFIG_PM_SLEEP=y | ||
270 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
271 | CONFIG_SUSPEND=y | ||
272 | CONFIG_APM_EMULATION=y | ||
273 | |||
274 | # | ||
275 | # Networking | ||
276 | # | ||
277 | CONFIG_NET=y | ||
278 | |||
279 | # | ||
280 | # Networking options | ||
281 | # | ||
282 | CONFIG_PACKET=y | ||
283 | # CONFIG_PACKET_MMAP is not set | ||
284 | CONFIG_UNIX=y | ||
285 | CONFIG_XFRM=y | ||
286 | # CONFIG_XFRM_USER is not set | ||
287 | # CONFIG_XFRM_SUB_POLICY is not set | ||
288 | # CONFIG_XFRM_MIGRATE is not set | ||
289 | # CONFIG_NET_KEY is not set | ||
290 | CONFIG_INET=y | ||
291 | # CONFIG_IP_MULTICAST is not set | ||
292 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
293 | CONFIG_IP_FIB_HASH=y | ||
294 | CONFIG_IP_PNP=y | ||
295 | CONFIG_IP_PNP_DHCP=y | ||
296 | CONFIG_IP_PNP_BOOTP=y | ||
297 | # CONFIG_IP_PNP_RARP is not set | ||
298 | # CONFIG_NET_IPIP is not set | ||
299 | # CONFIG_NET_IPGRE is not set | ||
300 | # CONFIG_ARPD is not set | ||
301 | # CONFIG_SYN_COOKIES is not set | ||
302 | # CONFIG_INET_AH is not set | ||
303 | # CONFIG_INET_ESP is not set | ||
304 | # CONFIG_INET_IPCOMP is not set | ||
305 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
306 | # CONFIG_INET_TUNNEL is not set | ||
307 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
308 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
309 | CONFIG_INET_XFRM_MODE_BEET=y | ||
310 | CONFIG_INET_DIAG=y | ||
311 | CONFIG_INET_TCP_DIAG=y | ||
312 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
313 | CONFIG_TCP_CONG_CUBIC=y | ||
314 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
315 | # CONFIG_TCP_MD5SIG is not set | ||
316 | # CONFIG_IPV6 is not set | ||
317 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
318 | # CONFIG_INET6_TUNNEL is not set | ||
319 | # CONFIG_NETWORK_SECMARK is not set | ||
320 | # CONFIG_NETFILTER is not set | ||
321 | # CONFIG_IP_DCCP is not set | ||
322 | # CONFIG_IP_SCTP is not set | ||
323 | # CONFIG_TIPC is not set | ||
324 | # CONFIG_ATM is not set | ||
325 | # CONFIG_BRIDGE is not set | ||
326 | # CONFIG_VLAN_8021Q is not set | ||
327 | # CONFIG_DECNET is not set | ||
328 | # CONFIG_LLC2 is not set | ||
329 | # CONFIG_IPX is not set | ||
330 | # CONFIG_ATALK is not set | ||
331 | # CONFIG_X25 is not set | ||
332 | # CONFIG_LAPB is not set | ||
333 | # CONFIG_ECONET is not set | ||
334 | # CONFIG_WAN_ROUTER is not set | ||
335 | |||
336 | # | ||
337 | # QoS and/or fair queueing | ||
338 | # | ||
339 | # CONFIG_NET_SCHED is not set | ||
340 | CONFIG_NET_SCH_FIFO=y | ||
341 | |||
342 | # | ||
343 | # Network testing | ||
344 | # | ||
345 | # CONFIG_NET_PKTGEN is not set | ||
346 | # CONFIG_HAMRADIO is not set | ||
347 | # CONFIG_IRDA is not set | ||
348 | CONFIG_BT=m | ||
349 | CONFIG_BT_L2CAP=m | ||
350 | CONFIG_BT_SCO=m | ||
351 | CONFIG_BT_RFCOMM=m | ||
352 | # CONFIG_BT_RFCOMM_TTY is not set | ||
353 | CONFIG_BT_BNEP=m | ||
354 | # CONFIG_BT_BNEP_MC_FILTER is not set | ||
355 | # CONFIG_BT_BNEP_PROTO_FILTER is not set | ||
356 | CONFIG_BT_HIDP=m | ||
357 | |||
358 | # | ||
359 | # Bluetooth device drivers | ||
360 | # | ||
361 | CONFIG_BT_HCIUSB=m | ||
362 | # CONFIG_BT_HCIUSB_SCO is not set | ||
363 | CONFIG_BT_HCIUART=m | ||
364 | # CONFIG_BT_HCIUART_H4 is not set | ||
365 | # CONFIG_BT_HCIUART_BCSP is not set | ||
366 | CONFIG_BT_HCIBCM203X=m | ||
367 | CONFIG_BT_HCIBPA10X=m | ||
368 | CONFIG_BT_HCIBFUSB=m | ||
369 | # CONFIG_BT_HCIVHCI is not set | ||
370 | # CONFIG_AF_RXRPC is not set | ||
371 | |||
372 | # | ||
373 | # Wireless | ||
374 | # | ||
375 | CONFIG_CFG80211=m | ||
376 | CONFIG_WIRELESS_EXT=y | ||
377 | CONFIG_MAC80211=m | ||
378 | # CONFIG_MAC80211_LEDS is not set | ||
379 | CONFIG_MAC80211_DEBUGFS=y | ||
380 | # CONFIG_MAC80211_DEBUG is not set | ||
381 | CONFIG_IEEE80211=m | ||
382 | # CONFIG_IEEE80211_DEBUG is not set | ||
383 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
384 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
385 | # CONFIG_IEEE80211_CRYPT_TKIP is not set | ||
386 | # CONFIG_IEEE80211_SOFTMAC is not set | ||
387 | # CONFIG_RFKILL is not set | ||
388 | # CONFIG_NET_9P is not set | ||
389 | |||
390 | # | ||
391 | # Device Drivers | ||
392 | # | ||
393 | |||
394 | # | ||
395 | # Generic Driver Options | ||
396 | # | ||
397 | CONFIG_STANDALONE=y | ||
398 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
399 | CONFIG_FW_LOADER=y | ||
400 | # CONFIG_DEBUG_DRIVER is not set | ||
401 | # CONFIG_DEBUG_DEVRES is not set | ||
402 | # CONFIG_SYS_HYPERVISOR is not set | ||
403 | # CONFIG_CONNECTOR is not set | ||
404 | CONFIG_MTD=y | ||
405 | # CONFIG_MTD_DEBUG is not set | ||
406 | CONFIG_MTD_CONCAT=y | ||
407 | CONFIG_MTD_PARTITIONS=y | ||
408 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
409 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
410 | # CONFIG_MTD_AFS_PARTS is not set | ||
411 | |||
412 | # | ||
413 | # User Modules And Translation Layers | ||
414 | # | ||
415 | CONFIG_MTD_CHAR=y | ||
416 | CONFIG_MTD_BLKDEVS=y | ||
417 | CONFIG_MTD_BLOCK=y | ||
418 | # CONFIG_FTL is not set | ||
419 | # CONFIG_NFTL is not set | ||
420 | # CONFIG_INFTL is not set | ||
421 | # CONFIG_RFD_FTL is not set | ||
422 | # CONFIG_SSFDC is not set | ||
423 | |||
424 | # | ||
425 | # RAM/ROM/Flash chip drivers | ||
426 | # | ||
427 | CONFIG_MTD_CFI=y | ||
428 | CONFIG_MTD_JEDECPROBE=y | ||
429 | CONFIG_MTD_GEN_PROBE=y | ||
430 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
431 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
432 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
433 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
434 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
435 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
436 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
437 | CONFIG_MTD_CFI_I1=y | ||
438 | CONFIG_MTD_CFI_I2=y | ||
439 | # CONFIG_MTD_CFI_I4 is not set | ||
440 | # CONFIG_MTD_CFI_I8 is not set | ||
441 | CONFIG_MTD_CFI_INTELEXT=y | ||
442 | CONFIG_MTD_CFI_AMDSTD=y | ||
443 | CONFIG_MTD_CFI_STAA=y | ||
444 | CONFIG_MTD_CFI_UTIL=y | ||
445 | # CONFIG_MTD_RAM is not set | ||
446 | # CONFIG_MTD_ROM is not set | ||
447 | # CONFIG_MTD_ABSENT is not set | ||
448 | # CONFIG_MTD_XIP is not set | ||
449 | |||
450 | # | ||
451 | # Mapping drivers for chip access | ||
452 | # | ||
453 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
454 | CONFIG_MTD_PHYSMAP=y | ||
455 | CONFIG_MTD_PHYSMAP_START=0x0 | ||
456 | CONFIG_MTD_PHYSMAP_LEN=0x100000 | ||
457 | CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
458 | # CONFIG_MTD_ARM_INTEGRATOR is not set | ||
459 | # CONFIG_MTD_IMPA7 is not set | ||
460 | # CONFIG_MTD_SHARP_SL is not set | ||
461 | # CONFIG_MTD_PLATRAM is not set | ||
462 | |||
463 | # | ||
464 | # Self-contained MTD device drivers | ||
465 | # | ||
466 | # CONFIG_MTD_SLRAM is not set | ||
467 | # CONFIG_MTD_PHRAM is not set | ||
468 | # CONFIG_MTD_MTDRAM is not set | ||
469 | # CONFIG_MTD_BLOCK2MTD is not set | ||
470 | |||
471 | # | ||
472 | # Disk-On-Chip Device Drivers | ||
473 | # | ||
474 | # CONFIG_MTD_DOC2000 is not set | ||
475 | # CONFIG_MTD_DOC2001 is not set | ||
476 | # CONFIG_MTD_DOC2001PLUS is not set | ||
477 | CONFIG_MTD_NAND=y | ||
478 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | ||
479 | # CONFIG_MTD_NAND_ECC_SMC is not set | ||
480 | # CONFIG_MTD_NAND_MUSEUM_IDS is not set | ||
481 | # CONFIG_MTD_NAND_H1900 is not set | ||
482 | CONFIG_MTD_NAND_IDS=y | ||
483 | # CONFIG_MTD_NAND_DISKONCHIP is not set | ||
484 | # CONFIG_MTD_NAND_SHARPSL is not set | ||
485 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
486 | CONFIG_MTD_NAND_PLATFORM=y | ||
487 | # CONFIG_MTD_ONENAND is not set | ||
488 | |||
489 | # | ||
490 | # UBI - Unsorted block images | ||
491 | # | ||
492 | CONFIG_MTD_UBI=m | ||
493 | CONFIG_MTD_UBI_WL_THRESHOLD=4096 | ||
494 | CONFIG_MTD_UBI_BEB_RESERVE=1 | ||
495 | CONFIG_MTD_UBI_GLUEBI=y | ||
496 | |||
497 | # | ||
498 | # UBI debugging options | ||
499 | # | ||
500 | # CONFIG_MTD_UBI_DEBUG is not set | ||
501 | # CONFIG_PARPORT is not set | ||
502 | CONFIG_BLK_DEV=y | ||
503 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
504 | CONFIG_BLK_DEV_LOOP=y | ||
505 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
506 | # CONFIG_BLK_DEV_NBD is not set | ||
507 | # CONFIG_BLK_DEV_UB is not set | ||
508 | CONFIG_BLK_DEV_RAM=y | ||
509 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
510 | CONFIG_BLK_DEV_RAM_SIZE=12000 | ||
511 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
512 | # CONFIG_CDROM_PKTCDVD is not set | ||
513 | # CONFIG_ATA_OVER_ETH is not set | ||
514 | # CONFIG_IDE is not set | ||
515 | |||
516 | # | ||
517 | # SCSI device support | ||
518 | # | ||
519 | # CONFIG_RAID_ATTRS is not set | ||
520 | CONFIG_SCSI=y | ||
521 | CONFIG_SCSI_DMA=y | ||
522 | # CONFIG_SCSI_TGT is not set | ||
523 | # CONFIG_SCSI_NETLINK is not set | ||
524 | # CONFIG_SCSI_PROC_FS is not set | ||
525 | |||
526 | # | ||
527 | # SCSI support type (disk, tape, CD-ROM) | ||
528 | # | ||
529 | CONFIG_BLK_DEV_SD=y | ||
530 | # CONFIG_CHR_DEV_ST is not set | ||
531 | # CONFIG_CHR_DEV_OSST is not set | ||
532 | # CONFIG_BLK_DEV_SR is not set | ||
533 | # CONFIG_CHR_DEV_SG is not set | ||
534 | # CONFIG_CHR_DEV_SCH is not set | ||
535 | |||
536 | # | ||
537 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
538 | # | ||
539 | # CONFIG_SCSI_MULTI_LUN is not set | ||
540 | # CONFIG_SCSI_CONSTANTS is not set | ||
541 | # CONFIG_SCSI_LOGGING is not set | ||
542 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
543 | CONFIG_SCSI_WAIT_SCAN=m | ||
544 | |||
545 | # | ||
546 | # SCSI Transports | ||
547 | # | ||
548 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
549 | # CONFIG_SCSI_FC_ATTRS is not set | ||
550 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
551 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
552 | CONFIG_SCSI_LOWLEVEL=y | ||
553 | # CONFIG_ISCSI_TCP is not set | ||
554 | # CONFIG_SCSI_DEBUG is not set | ||
555 | # CONFIG_ATA is not set | ||
556 | # CONFIG_MD is not set | ||
557 | CONFIG_NETDEVICES=y | ||
558 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
559 | # CONFIG_DUMMY is not set | ||
560 | # CONFIG_BONDING is not set | ||
561 | # CONFIG_MACVLAN is not set | ||
562 | # CONFIG_EQUALIZER is not set | ||
563 | # CONFIG_TUN is not set | ||
564 | # CONFIG_PHYLIB is not set | ||
565 | CONFIG_NET_ETHERNET=y | ||
566 | CONFIG_MII=y | ||
567 | # CONFIG_AX88796 is not set | ||
568 | # CONFIG_SMC91X is not set | ||
569 | CONFIG_DM9000=y | ||
570 | # CONFIG_SMC911X is not set | ||
571 | # CONFIG_NETDEV_1000 is not set | ||
572 | # CONFIG_NETDEV_10000 is not set | ||
573 | |||
574 | # | ||
575 | # Wireless LAN | ||
576 | # | ||
577 | # CONFIG_WLAN_PRE80211 is not set | ||
578 | # CONFIG_WLAN_80211 is not set | ||
579 | |||
580 | # | ||
581 | # USB Network Adapters | ||
582 | # | ||
583 | # CONFIG_USB_CATC is not set | ||
584 | # CONFIG_USB_KAWETH is not set | ||
585 | # CONFIG_USB_PEGASUS is not set | ||
586 | # CONFIG_USB_RTL8150 is not set | ||
587 | # CONFIG_USB_USBNET_MII is not set | ||
588 | # CONFIG_USB_USBNET is not set | ||
589 | # CONFIG_WAN is not set | ||
590 | CONFIG_PPP=m | ||
591 | # CONFIG_PPP_MULTILINK is not set | ||
592 | # CONFIG_PPP_FILTER is not set | ||
593 | CONFIG_PPP_ASYNC=m | ||
594 | CONFIG_PPP_SYNC_TTY=m | ||
595 | CONFIG_PPP_DEFLATE=m | ||
596 | CONFIG_PPP_BSDCOMP=m | ||
597 | CONFIG_PPP_MPPE=m | ||
598 | # CONFIG_PPPOE is not set | ||
599 | CONFIG_PPPOL2TP=m | ||
600 | # CONFIG_SLIP is not set | ||
601 | CONFIG_SLHC=m | ||
602 | # CONFIG_SHAPER is not set | ||
603 | # CONFIG_NETCONSOLE is not set | ||
604 | # CONFIG_NETPOLL is not set | ||
605 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
606 | # CONFIG_ISDN is not set | ||
607 | |||
608 | # | ||
609 | # Input device support | ||
610 | # | ||
611 | CONFIG_INPUT=y | ||
612 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
613 | # CONFIG_INPUT_POLLDEV is not set | ||
614 | |||
615 | # | ||
616 | # Userland interfaces | ||
617 | # | ||
618 | CONFIG_INPUT_MOUSEDEV=y | ||
619 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
620 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
621 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
622 | # CONFIG_INPUT_JOYDEV is not set | ||
623 | # CONFIG_INPUT_TSDEV is not set | ||
624 | CONFIG_INPUT_EVDEV=y | ||
625 | # CONFIG_INPUT_EVBUG is not set | ||
626 | |||
627 | # | ||
628 | # Input Device Drivers | ||
629 | # | ||
630 | CONFIG_INPUT_KEYBOARD=y | ||
631 | # CONFIG_KEYBOARD_ATKBD is not set | ||
632 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
633 | # CONFIG_KEYBOARD_LKKBD is not set | ||
634 | # CONFIG_KEYBOARD_XTKBD is not set | ||
635 | # CONFIG_KEYBOARD_NEWTON is not set | ||
636 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
637 | CONFIG_KEYBOARD_PXA27x=y | ||
638 | # CONFIG_KEYBOARD_GPIO is not set | ||
639 | # CONFIG_INPUT_MOUSE is not set | ||
640 | # CONFIG_INPUT_JOYSTICK is not set | ||
641 | # CONFIG_INPUT_TABLET is not set | ||
642 | CONFIG_INPUT_TOUCHSCREEN=y | ||
643 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
644 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
645 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
646 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
647 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
648 | CONFIG_TOUCHSCREEN_WM97XX=y | ||
649 | # CONFIG_TOUCHSCREEN_WM9705 is not set | ||
650 | CONFIG_TOUCHSCREEN_WM9712=y | ||
651 | # CONFIG_TOUCHSCREEN_WM9713 is not set | ||
652 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
653 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
654 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
655 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
656 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | ||
657 | # CONFIG_INPUT_MISC is not set | ||
658 | |||
659 | # | ||
660 | # Hardware I/O ports | ||
661 | # | ||
662 | CONFIG_SERIO=y | ||
663 | # CONFIG_SERIO_SERPORT is not set | ||
664 | CONFIG_SERIO_LIBPS2=y | ||
665 | # CONFIG_SERIO_RAW is not set | ||
666 | # CONFIG_GAMEPORT is not set | ||
667 | |||
668 | # | ||
669 | # Character devices | ||
670 | # | ||
671 | CONFIG_VT=y | ||
672 | CONFIG_VT_CONSOLE=y | ||
673 | CONFIG_HW_CONSOLE=y | ||
674 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
675 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
676 | |||
677 | # | ||
678 | # Serial drivers | ||
679 | # | ||
680 | # CONFIG_SERIAL_8250 is not set | ||
681 | |||
682 | # | ||
683 | # Non-8250 serial port support | ||
684 | # | ||
685 | CONFIG_SERIAL_PXA=y | ||
686 | CONFIG_SERIAL_PXA_CONSOLE=y | ||
687 | CONFIG_SERIAL_CORE=y | ||
688 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
689 | CONFIG_UNIX98_PTYS=y | ||
690 | # CONFIG_LEGACY_PTYS is not set | ||
691 | # CONFIG_IPMI_HANDLER is not set | ||
692 | # CONFIG_WATCHDOG is not set | ||
693 | CONFIG_HW_RANDOM=m | ||
694 | # CONFIG_NVRAM is not set | ||
695 | # CONFIG_R3964 is not set | ||
696 | # CONFIG_RAW_DRIVER is not set | ||
697 | # CONFIG_TCG_TPM is not set | ||
698 | CONFIG_I2C=y | ||
699 | CONFIG_I2C_BOARDINFO=y | ||
700 | # CONFIG_I2C_CHARDEV is not set | ||
701 | |||
702 | # | ||
703 | # I2C Algorithms | ||
704 | # | ||
705 | # CONFIG_I2C_ALGOBIT is not set | ||
706 | # CONFIG_I2C_ALGOPCF is not set | ||
707 | # CONFIG_I2C_ALGOPCA is not set | ||
708 | |||
709 | # | ||
710 | # I2C Hardware Bus support | ||
711 | # | ||
712 | # CONFIG_I2C_GPIO is not set | ||
713 | CONFIG_I2C_PXA=y | ||
714 | # CONFIG_I2C_PXA_SLAVE is not set | ||
715 | # CONFIG_I2C_OCORES is not set | ||
716 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
717 | # CONFIG_I2C_SIMTEC is not set | ||
718 | # CONFIG_I2C_TAOS_EVM is not set | ||
719 | # CONFIG_I2C_STUB is not set | ||
720 | # CONFIG_I2C_TINY_USB is not set | ||
721 | |||
722 | # | ||
723 | # Miscellaneous I2C Chip support | ||
724 | # | ||
725 | # CONFIG_SENSORS_DS1337 is not set | ||
726 | # CONFIG_SENSORS_DS1374 is not set | ||
727 | # CONFIG_DS1682 is not set | ||
728 | # CONFIG_SENSORS_EEPROM is not set | ||
729 | # CONFIG_SENSORS_PCF8574 is not set | ||
730 | # CONFIG_SENSORS_PCA9539 is not set | ||
731 | # CONFIG_SENSORS_PCF8591 is not set | ||
732 | # CONFIG_SENSORS_MAX6875 is not set | ||
733 | # CONFIG_SENSORS_TSL2550 is not set | ||
734 | CONFIG_DA9030=y | ||
735 | # CONFIG_I2C_DEBUG_CORE is not set | ||
736 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
737 | # CONFIG_I2C_DEBUG_BUS is not set | ||
738 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
739 | |||
740 | # | ||
741 | # SPI support | ||
742 | # | ||
743 | # CONFIG_SPI is not set | ||
744 | # CONFIG_SPI_MASTER is not set | ||
745 | # CONFIG_W1 is not set | ||
746 | CONFIG_POWER_SUPPLY=y | ||
747 | # CONFIG_POWER_SUPPLY_DEBUG is not set | ||
748 | # CONFIG_PDA_POWER is not set | ||
749 | CONFIG_APM_POWER=y | ||
750 | # CONFIG_BATTERY_DS2760 is not set | ||
751 | # CONFIG_BATTERY_EM_X270 is not set | ||
752 | # CONFIG_HWMON is not set | ||
753 | CONFIG_MISC_DEVICES=y | ||
754 | # CONFIG_EEPROM_93CX6 is not set | ||
755 | |||
756 | # | ||
757 | # Multifunction device drivers | ||
758 | # | ||
759 | # CONFIG_MFD_SM501 is not set | ||
760 | CONFIG_NEW_LEDS=y | ||
761 | CONFIG_LEDS_CLASS=m | ||
762 | |||
763 | # | ||
764 | # LED drivers | ||
765 | # | ||
766 | CONFIG_LEDS_GPIO=m | ||
767 | CONFIG_LEDS_EM_X270=m | ||
768 | |||
769 | # | ||
770 | # LED Triggers | ||
771 | # | ||
772 | CONFIG_LEDS_TRIGGERS=y | ||
773 | CONFIG_LEDS_TRIGGER_TIMER=m | ||
774 | CONFIG_LEDS_TRIGGER_HEARTBEAT=m | ||
775 | |||
776 | # | ||
777 | # Multimedia devices | ||
778 | # | ||
779 | # CONFIG_VIDEO_DEV is not set | ||
780 | # CONFIG_DVB_CORE is not set | ||
781 | # CONFIG_DAB is not set | ||
782 | |||
783 | # | ||
784 | # Graphics support | ||
785 | # | ||
786 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
787 | CONFIG_LCD_CLASS_DEVICE=y | ||
788 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
789 | CONFIG_BACKLIGHT_CORGI=y | ||
790 | |||
791 | # | ||
792 | # Display device support | ||
793 | # | ||
794 | # CONFIG_DISPLAY_SUPPORT is not set | ||
795 | # CONFIG_VGASTATE is not set | ||
796 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
797 | CONFIG_FB=y | ||
798 | # CONFIG_FIRMWARE_EDID is not set | ||
799 | # CONFIG_FB_DDC is not set | ||
800 | CONFIG_FB_CFB_FILLRECT=y | ||
801 | CONFIG_FB_CFB_COPYAREA=y | ||
802 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
803 | # CONFIG_FB_SYS_FILLRECT is not set | ||
804 | # CONFIG_FB_SYS_COPYAREA is not set | ||
805 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
806 | # CONFIG_FB_SYS_FOPS is not set | ||
807 | CONFIG_FB_DEFERRED_IO=y | ||
808 | # CONFIG_FB_SVGALIB is not set | ||
809 | # CONFIG_FB_MACMODES is not set | ||
810 | # CONFIG_FB_BACKLIGHT is not set | ||
811 | # CONFIG_FB_MODE_HELPERS is not set | ||
812 | # CONFIG_FB_TILEBLITTING is not set | ||
813 | |||
814 | # | ||
815 | # Frame buffer hardware drivers | ||
816 | # | ||
817 | # CONFIG_FB_S1D13XXX is not set | ||
818 | CONFIG_FB_PXA=y | ||
819 | CONFIG_FB_PXA_PARAMETERS=y | ||
820 | # CONFIG_FB_MBX is not set | ||
821 | # CONFIG_FB_VIRTUAL is not set | ||
822 | |||
823 | # | ||
824 | # Console display driver support | ||
825 | # | ||
826 | # CONFIG_VGA_CONSOLE is not set | ||
827 | CONFIG_DUMMY_CONSOLE=y | ||
828 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
829 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
830 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
831 | # CONFIG_FONTS is not set | ||
832 | CONFIG_FONT_8x8=y | ||
833 | CONFIG_FONT_8x16=y | ||
834 | CONFIG_LOGO=y | ||
835 | CONFIG_LOGO_LINUX_MONO=y | ||
836 | CONFIG_LOGO_LINUX_VGA16=y | ||
837 | CONFIG_LOGO_LINUX_CLUT224=y | ||
838 | |||
839 | # | ||
840 | # Sound | ||
841 | # | ||
842 | CONFIG_SOUND=y | ||
843 | |||
844 | # | ||
845 | # Advanced Linux Sound Architecture | ||
846 | # | ||
847 | CONFIG_SND=y | ||
848 | CONFIG_SND_TIMER=y | ||
849 | CONFIG_SND_PCM=y | ||
850 | # CONFIG_SND_SEQUENCER is not set | ||
851 | CONFIG_SND_OSSEMUL=y | ||
852 | CONFIG_SND_MIXER_OSS=y | ||
853 | CONFIG_SND_PCM_OSS=y | ||
854 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
855 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
856 | CONFIG_SND_SUPPORT_OLD_API=y | ||
857 | CONFIG_SND_VERBOSE_PROCFS=y | ||
858 | # CONFIG_SND_VERBOSE_PRINTK is not set | ||
859 | # CONFIG_SND_DEBUG is not set | ||
860 | |||
861 | # | ||
862 | # Generic devices | ||
863 | # | ||
864 | CONFIG_SND_AC97_CODEC=m | ||
865 | # CONFIG_SND_DUMMY is not set | ||
866 | # CONFIG_SND_MTPAV is not set | ||
867 | # CONFIG_SND_SERIAL_U16550 is not set | ||
868 | # CONFIG_SND_MPU401 is not set | ||
869 | |||
870 | # | ||
871 | # ALSA ARM devices | ||
872 | # | ||
873 | CONFIG_SND_PXA2XX_PCM=m | ||
874 | CONFIG_SND_PXA2XX_AC97=m | ||
875 | |||
876 | # | ||
877 | # USB devices | ||
878 | # | ||
879 | # CONFIG_SND_USB_AUDIO is not set | ||
880 | # CONFIG_SND_USB_CAIAQ is not set | ||
881 | |||
882 | # | ||
883 | # System on Chip audio support | ||
884 | # | ||
885 | CONFIG_SND_SOC_AC97_BUS=y | ||
886 | CONFIG_SND_SOC=y | ||
887 | CONFIG_SND_PXA2XX_SOC=y | ||
888 | CONFIG_SND_PXA2XX_SOC_AC97=y | ||
889 | CONFIG_SND_PXA2XX_SOC_EM_X270=y | ||
890 | |||
891 | # | ||
892 | # SoC Audio support for SuperH | ||
893 | # | ||
894 | CONFIG_SND_SOC_WM9712=y | ||
895 | |||
896 | # | ||
897 | # Open Sound System | ||
898 | # | ||
899 | # CONFIG_SOUND_PRIME is not set | ||
900 | CONFIG_AC97_BUS=y | ||
901 | CONFIG_HID_SUPPORT=y | ||
902 | CONFIG_HID=y | ||
903 | # CONFIG_HID_DEBUG is not set | ||
904 | |||
905 | # | ||
906 | # USB Input Devices | ||
907 | # | ||
908 | CONFIG_USB_HID=y | ||
909 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
910 | # CONFIG_HID_FF is not set | ||
911 | # CONFIG_USB_HIDDEV is not set | ||
912 | CONFIG_USB_SUPPORT=y | ||
913 | CONFIG_USB_ARCH_HAS_HCD=y | ||
914 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
915 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
916 | CONFIG_USB=y | ||
917 | # CONFIG_USB_DEBUG is not set | ||
918 | |||
919 | # | ||
920 | # Miscellaneous USB options | ||
921 | # | ||
922 | CONFIG_USB_DEVICEFS=y | ||
923 | # CONFIG_USB_DEVICE_CLASS is not set | ||
924 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
925 | # CONFIG_USB_SUSPEND is not set | ||
926 | # CONFIG_USB_PERSIST is not set | ||
927 | # CONFIG_USB_OTG is not set | ||
928 | |||
929 | # | ||
930 | # USB Host Controller Drivers | ||
931 | # | ||
932 | # CONFIG_USB_ISP116X_HCD is not set | ||
933 | CONFIG_USB_OHCI_HCD=y | ||
934 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
935 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
936 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
937 | # CONFIG_USB_SL811_HCD is not set | ||
938 | # CONFIG_USB_R8A66597_HCD is not set | ||
939 | |||
940 | # | ||
941 | # USB Device Class drivers | ||
942 | # | ||
943 | CONFIG_USB_ACM=m | ||
944 | CONFIG_USB_PRINTER=m | ||
945 | |||
946 | # | ||
947 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
948 | # | ||
949 | |||
950 | # | ||
951 | # may also be needed; see USB_STORAGE Help for more information | ||
952 | # | ||
953 | CONFIG_USB_STORAGE=y | ||
954 | # CONFIG_USB_STORAGE_DEBUG is not set | ||
955 | # CONFIG_USB_STORAGE_DATAFAB is not set | ||
956 | # CONFIG_USB_STORAGE_FREECOM is not set | ||
957 | # CONFIG_USB_STORAGE_DPCM is not set | ||
958 | # CONFIG_USB_STORAGE_USBAT is not set | ||
959 | # CONFIG_USB_STORAGE_SDDR09 is not set | ||
960 | # CONFIG_USB_STORAGE_SDDR55 is not set | ||
961 | # CONFIG_USB_STORAGE_JUMPSHOT is not set | ||
962 | # CONFIG_USB_STORAGE_ALAUDA is not set | ||
963 | # CONFIG_USB_STORAGE_KARMA is not set | ||
964 | # CONFIG_USB_LIBUSUAL is not set | ||
965 | |||
966 | # | ||
967 | # USB Imaging devices | ||
968 | # | ||
969 | CONFIG_USB_MDC800=m | ||
970 | CONFIG_USB_MICROTEK=m | ||
971 | # CONFIG_USB_MON is not set | ||
972 | |||
973 | # | ||
974 | # USB port drivers | ||
975 | # | ||
976 | |||
977 | # | ||
978 | # USB Serial Converter support | ||
979 | # | ||
980 | # CONFIG_USB_SERIAL is not set | ||
981 | |||
982 | # | ||
983 | # USB Miscellaneous drivers | ||
984 | # | ||
985 | # CONFIG_USB_EMI62 is not set | ||
986 | # CONFIG_USB_EMI26 is not set | ||
987 | # CONFIG_USB_ADUTUX is not set | ||
988 | # CONFIG_USB_AUERSWALD is not set | ||
989 | # CONFIG_USB_RIO500 is not set | ||
990 | # CONFIG_USB_LEGOTOWER is not set | ||
991 | # CONFIG_USB_LCD is not set | ||
992 | # CONFIG_USB_BERRY_CHARGE is not set | ||
993 | # CONFIG_USB_LED is not set | ||
994 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
995 | # CONFIG_USB_CYTHERM is not set | ||
996 | # CONFIG_USB_PHIDGET is not set | ||
997 | # CONFIG_USB_IDMOUSE is not set | ||
998 | # CONFIG_USB_FTDI_ELAN is not set | ||
999 | # CONFIG_USB_APPLEDISPLAY is not set | ||
1000 | # CONFIG_USB_LD is not set | ||
1001 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
1002 | # CONFIG_USB_IOWARRIOR is not set | ||
1003 | # CONFIG_USB_TEST is not set | ||
1004 | |||
1005 | # | ||
1006 | # USB DSL modem support | ||
1007 | # | ||
1008 | |||
1009 | # | ||
1010 | # USB Gadget Support | ||
1011 | # | ||
1012 | # CONFIG_USB_GADGET is not set | ||
1013 | CONFIG_MMC=y | ||
1014 | # CONFIG_MMC_DEBUG is not set | ||
1015 | CONFIG_MMC_UNSAFE_RESUME=y | ||
1016 | |||
1017 | # | ||
1018 | # MMC/SD Card Drivers | ||
1019 | # | ||
1020 | CONFIG_MMC_BLOCK=y | ||
1021 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
1022 | |||
1023 | # | ||
1024 | # MMC/SD Host Controller Drivers | ||
1025 | # | ||
1026 | CONFIG_MMC_PXA=y | ||
1027 | CONFIG_RTC_LIB=y | ||
1028 | CONFIG_RTC_CLASS=y | ||
1029 | CONFIG_RTC_HCTOSYS=y | ||
1030 | CONFIG_RTC_HCTOSYS_DEVICE="rtc1" | ||
1031 | # CONFIG_RTC_DEBUG is not set | ||
1032 | |||
1033 | # | ||
1034 | # RTC interfaces | ||
1035 | # | ||
1036 | CONFIG_RTC_INTF_SYSFS=y | ||
1037 | CONFIG_RTC_INTF_PROC=y | ||
1038 | CONFIG_RTC_INTF_DEV=y | ||
1039 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
1040 | # CONFIG_RTC_DRV_TEST is not set | ||
1041 | |||
1042 | # | ||
1043 | # I2C RTC drivers | ||
1044 | # | ||
1045 | # CONFIG_RTC_DRV_DS1307 is not set | ||
1046 | # CONFIG_RTC_DRV_DS1672 is not set | ||
1047 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
1048 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
1049 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
1050 | # CONFIG_RTC_DRV_X1205 is not set | ||
1051 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
1052 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
1053 | # CONFIG_RTC_DRV_M41T80 is not set | ||
1054 | |||
1055 | # | ||
1056 | # SPI RTC drivers | ||
1057 | # | ||
1058 | |||
1059 | # | ||
1060 | # Platform RTC drivers | ||
1061 | # | ||
1062 | # CONFIG_RTC_DRV_CMOS is not set | ||
1063 | # CONFIG_RTC_DRV_DS1553 is not set | ||
1064 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
1065 | # CONFIG_RTC_DRV_DS1742 is not set | ||
1066 | # CONFIG_RTC_DRV_M48T86 is not set | ||
1067 | # CONFIG_RTC_DRV_M48T59 is not set | ||
1068 | CONFIG_RTC_DRV_V3020=y | ||
1069 | |||
1070 | # | ||
1071 | # on-CPU RTC drivers | ||
1072 | # | ||
1073 | CONFIG_RTC_DRV_SA1100=y | ||
1074 | |||
1075 | # | ||
1076 | # DMA Engine support | ||
1077 | # | ||
1078 | # CONFIG_DMA_ENGINE is not set | ||
1079 | |||
1080 | # | ||
1081 | # DMA Clients | ||
1082 | # | ||
1083 | |||
1084 | # | ||
1085 | # DMA Devices | ||
1086 | # | ||
1087 | |||
1088 | # | ||
1089 | # File systems | ||
1090 | # | ||
1091 | CONFIG_EXT2_FS=y | ||
1092 | # CONFIG_EXT2_FS_XATTR is not set | ||
1093 | # CONFIG_EXT2_FS_XIP is not set | ||
1094 | CONFIG_EXT3_FS=y | ||
1095 | CONFIG_EXT3_FS_XATTR=y | ||
1096 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
1097 | # CONFIG_EXT3_FS_SECURITY is not set | ||
1098 | # CONFIG_EXT4DEV_FS is not set | ||
1099 | CONFIG_JBD=y | ||
1100 | # CONFIG_JBD_DEBUG is not set | ||
1101 | CONFIG_FS_MBCACHE=y | ||
1102 | # CONFIG_REISERFS_FS is not set | ||
1103 | # CONFIG_JFS_FS is not set | ||
1104 | # CONFIG_FS_POSIX_ACL is not set | ||
1105 | # CONFIG_XFS_FS is not set | ||
1106 | # CONFIG_GFS2_FS is not set | ||
1107 | # CONFIG_OCFS2_FS is not set | ||
1108 | # CONFIG_MINIX_FS is not set | ||
1109 | # CONFIG_ROMFS_FS is not set | ||
1110 | CONFIG_INOTIFY=y | ||
1111 | CONFIG_INOTIFY_USER=y | ||
1112 | # CONFIG_QUOTA is not set | ||
1113 | CONFIG_DNOTIFY=y | ||
1114 | # CONFIG_AUTOFS_FS is not set | ||
1115 | # CONFIG_AUTOFS4_FS is not set | ||
1116 | # CONFIG_FUSE_FS is not set | ||
1117 | |||
1118 | # | ||
1119 | # CD-ROM/DVD Filesystems | ||
1120 | # | ||
1121 | # CONFIG_ISO9660_FS is not set | ||
1122 | # CONFIG_UDF_FS is not set | ||
1123 | |||
1124 | # | ||
1125 | # DOS/FAT/NT Filesystems | ||
1126 | # | ||
1127 | CONFIG_FAT_FS=y | ||
1128 | CONFIG_MSDOS_FS=y | ||
1129 | CONFIG_VFAT_FS=y | ||
1130 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1131 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1132 | # CONFIG_NTFS_FS is not set | ||
1133 | |||
1134 | # | ||
1135 | # Pseudo filesystems | ||
1136 | # | ||
1137 | CONFIG_PROC_FS=y | ||
1138 | CONFIG_PROC_SYSCTL=y | ||
1139 | CONFIG_SYSFS=y | ||
1140 | CONFIG_TMPFS=y | ||
1141 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
1142 | # CONFIG_HUGETLB_PAGE is not set | ||
1143 | CONFIG_RAMFS=y | ||
1144 | # CONFIG_CONFIGFS_FS is not set | ||
1145 | |||
1146 | # | ||
1147 | # Miscellaneous filesystems | ||
1148 | # | ||
1149 | # CONFIG_ADFS_FS is not set | ||
1150 | # CONFIG_AFFS_FS is not set | ||
1151 | # CONFIG_HFS_FS is not set | ||
1152 | # CONFIG_HFSPLUS_FS is not set | ||
1153 | # CONFIG_BEFS_FS is not set | ||
1154 | # CONFIG_BFS_FS is not set | ||
1155 | # CONFIG_EFS_FS is not set | ||
1156 | CONFIG_JFFS2_FS=y | ||
1157 | CONFIG_JFFS2_FS_DEBUG=0 | ||
1158 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
1159 | CONFIG_JFFS2_SUMMARY=y | ||
1160 | # CONFIG_JFFS2_FS_XATTR is not set | ||
1161 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
1162 | CONFIG_JFFS2_ZLIB=y | ||
1163 | CONFIG_JFFS2_RTIME=y | ||
1164 | # CONFIG_JFFS2_RUBIN is not set | ||
1165 | # CONFIG_CRAMFS is not set | ||
1166 | # CONFIG_VXFS_FS is not set | ||
1167 | # CONFIG_HPFS_FS is not set | ||
1168 | # CONFIG_QNX4FS_FS is not set | ||
1169 | # CONFIG_SYSV_FS is not set | ||
1170 | # CONFIG_UFS_FS is not set | ||
1171 | |||
1172 | # | ||
1173 | # Network File Systems | ||
1174 | # | ||
1175 | CONFIG_NFS_FS=y | ||
1176 | CONFIG_NFS_V3=y | ||
1177 | # CONFIG_NFS_V3_ACL is not set | ||
1178 | # CONFIG_NFS_V4 is not set | ||
1179 | # CONFIG_NFS_DIRECTIO is not set | ||
1180 | # CONFIG_NFSD is not set | ||
1181 | CONFIG_ROOT_NFS=y | ||
1182 | CONFIG_LOCKD=y | ||
1183 | CONFIG_LOCKD_V4=y | ||
1184 | CONFIG_NFS_COMMON=y | ||
1185 | CONFIG_SUNRPC=y | ||
1186 | # CONFIG_SUNRPC_BIND34 is not set | ||
1187 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
1188 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1189 | CONFIG_SMB_FS=y | ||
1190 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
1191 | # CONFIG_CIFS is not set | ||
1192 | # CONFIG_NCP_FS is not set | ||
1193 | # CONFIG_CODA_FS is not set | ||
1194 | # CONFIG_AFS_FS is not set | ||
1195 | |||
1196 | # | ||
1197 | # Partition Types | ||
1198 | # | ||
1199 | # CONFIG_PARTITION_ADVANCED is not set | ||
1200 | CONFIG_MSDOS_PARTITION=y | ||
1201 | |||
1202 | # | ||
1203 | # Native Language Support | ||
1204 | # | ||
1205 | CONFIG_NLS=y | ||
1206 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1207 | CONFIG_NLS_CODEPAGE_437=y | ||
1208 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1209 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1210 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1211 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1212 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1213 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1214 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1215 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1216 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1217 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1218 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1219 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1220 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1221 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1222 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1223 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1224 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1225 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1226 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1227 | # CONFIG_NLS_ISO8859_8 is not set | ||
1228 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1229 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1230 | # CONFIG_NLS_ASCII is not set | ||
1231 | CONFIG_NLS_ISO8859_1=y | ||
1232 | # CONFIG_NLS_ISO8859_2 is not set | ||
1233 | # CONFIG_NLS_ISO8859_3 is not set | ||
1234 | # CONFIG_NLS_ISO8859_4 is not set | ||
1235 | # CONFIG_NLS_ISO8859_5 is not set | ||
1236 | # CONFIG_NLS_ISO8859_6 is not set | ||
1237 | # CONFIG_NLS_ISO8859_7 is not set | ||
1238 | # CONFIG_NLS_ISO8859_9 is not set | ||
1239 | # CONFIG_NLS_ISO8859_13 is not set | ||
1240 | # CONFIG_NLS_ISO8859_14 is not set | ||
1241 | # CONFIG_NLS_ISO8859_15 is not set | ||
1242 | # CONFIG_NLS_KOI8_R is not set | ||
1243 | # CONFIG_NLS_KOI8_U is not set | ||
1244 | CONFIG_NLS_UTF8=y | ||
1245 | |||
1246 | # | ||
1247 | # Distributed Lock Manager | ||
1248 | # | ||
1249 | # CONFIG_DLM is not set | ||
1250 | |||
1251 | # | ||
1252 | # Profiling support | ||
1253 | # | ||
1254 | # CONFIG_PROFILING is not set | ||
1255 | |||
1256 | # | ||
1257 | # Kernel hacking | ||
1258 | # | ||
1259 | # CONFIG_PRINTK_TIME is not set | ||
1260 | CONFIG_ENABLE_MUST_CHECK=y | ||
1261 | CONFIG_MAGIC_SYSRQ=y | ||
1262 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1263 | CONFIG_DEBUG_FS=y | ||
1264 | # CONFIG_HEADERS_CHECK is not set | ||
1265 | CONFIG_DEBUG_KERNEL=y | ||
1266 | # CONFIG_DEBUG_SHIRQ is not set | ||
1267 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
1268 | CONFIG_SCHED_DEBUG=y | ||
1269 | # CONFIG_SCHEDSTATS is not set | ||
1270 | # CONFIG_TIMER_STATS is not set | ||
1271 | # CONFIG_SLUB_DEBUG_ON is not set | ||
1272 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
1273 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1274 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1275 | # CONFIG_DEBUG_MUTEXES is not set | ||
1276 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
1277 | # CONFIG_PROVE_LOCKING is not set | ||
1278 | # CONFIG_LOCK_STAT is not set | ||
1279 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1280 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1281 | # CONFIG_DEBUG_KOBJECT is not set | ||
1282 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
1283 | CONFIG_DEBUG_INFO=y | ||
1284 | # CONFIG_DEBUG_VM is not set | ||
1285 | # CONFIG_DEBUG_LIST is not set | ||
1286 | CONFIG_FRAME_POINTER=y | ||
1287 | CONFIG_FORCED_INLINING=y | ||
1288 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1289 | # CONFIG_FAULT_INJECTION is not set | ||
1290 | CONFIG_DEBUG_USER=y | ||
1291 | CONFIG_DEBUG_ERRORS=y | ||
1292 | CONFIG_DEBUG_LL=y | ||
1293 | # CONFIG_DEBUG_ICEDCC is not set | ||
1294 | |||
1295 | # | ||
1296 | # Security options | ||
1297 | # | ||
1298 | # CONFIG_KEYS is not set | ||
1299 | # CONFIG_SECURITY is not set | ||
1300 | CONFIG_CRYPTO=y | ||
1301 | CONFIG_CRYPTO_ALGAPI=m | ||
1302 | CONFIG_CRYPTO_BLKCIPHER=m | ||
1303 | CONFIG_CRYPTO_MANAGER=m | ||
1304 | # CONFIG_CRYPTO_HMAC is not set | ||
1305 | # CONFIG_CRYPTO_XCBC is not set | ||
1306 | # CONFIG_CRYPTO_NULL is not set | ||
1307 | # CONFIG_CRYPTO_MD4 is not set | ||
1308 | # CONFIG_CRYPTO_MD5 is not set | ||
1309 | CONFIG_CRYPTO_SHA1=m | ||
1310 | # CONFIG_CRYPTO_SHA256 is not set | ||
1311 | # CONFIG_CRYPTO_SHA512 is not set | ||
1312 | # CONFIG_CRYPTO_WP512 is not set | ||
1313 | # CONFIG_CRYPTO_TGR192 is not set | ||
1314 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1315 | CONFIG_CRYPTO_ECB=m | ||
1316 | CONFIG_CRYPTO_CBC=m | ||
1317 | CONFIG_CRYPTO_PCBC=m | ||
1318 | # CONFIG_CRYPTO_LRW is not set | ||
1319 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1320 | # CONFIG_CRYPTO_DES is not set | ||
1321 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1322 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1323 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1324 | # CONFIG_CRYPTO_SERPENT is not set | ||
1325 | CONFIG_CRYPTO_AES=m | ||
1326 | # CONFIG_CRYPTO_CAST5 is not set | ||
1327 | # CONFIG_CRYPTO_CAST6 is not set | ||
1328 | # CONFIG_CRYPTO_TEA is not set | ||
1329 | CONFIG_CRYPTO_ARC4=m | ||
1330 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1331 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1332 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1333 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1334 | # CONFIG_CRYPTO_CRC32C is not set | ||
1335 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1336 | # CONFIG_CRYPTO_TEST is not set | ||
1337 | CONFIG_CRYPTO_HW=y | ||
1338 | |||
1339 | # | ||
1340 | # Library routines | ||
1341 | # | ||
1342 | CONFIG_BITREVERSE=y | ||
1343 | CONFIG_CRC_CCITT=m | ||
1344 | # CONFIG_CRC16 is not set | ||
1345 | # CONFIG_CRC_ITU_T is not set | ||
1346 | CONFIG_CRC32=y | ||
1347 | # CONFIG_CRC7 is not set | ||
1348 | # CONFIG_LIBCRC32C is not set | ||
1349 | CONFIG_ZLIB_INFLATE=y | ||
1350 | CONFIG_ZLIB_DEFLATE=y | ||
1351 | CONFIG_PLIST=y | ||
1352 | CONFIG_HAS_IOMEM=y | ||
1353 | CONFIG_HAS_IOPORT=y | ||
1354 | CONFIG_HAS_DMA=y | ||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/em-x270/em-x270-battery-sysfs-fix.patch b/meta/recipes-kernel/linux/linux-2.6.23/em-x270/em-x270-battery-sysfs-fix.patch deleted file mode 100644 index 51ec773e5c..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/em-x270/em-x270-battery-sysfs-fix.patch +++ /dev/null | |||
@@ -1,40 +0,0 @@ | |||
1 | Index: linux-2.6.23/arch/arm/mach-pxa/em-x270-pm.c | ||
2 | =================================================================== | ||
3 | --- linux-2.6.23.orig/arch/arm/mach-pxa/em-x270-pm.c 2008-02-21 14:30:06.000000000 +0000 | ||
4 | +++ linux-2.6.23/arch/arm/mach-pxa/em-x270-pm.c 2008-02-21 14:59:24.000000000 +0000 | ||
5 | @@ -461,6 +461,9 @@ | ||
6 | else { | ||
7 | val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; | ||
8 | } | ||
9 | + } | ||
10 | + else { | ||
11 | + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; | ||
12 | } | ||
13 | } | ||
14 | else { | ||
15 | @@ -547,8 +550,9 @@ | ||
16 | pr_debug("%s: MODEL = %s\n", __FUNCTION__, val->strval); | ||
17 | break; | ||
18 | default: break; | ||
19 | + return -1; | ||
20 | } | ||
21 | - | ||
22 | + | ||
23 | return 0; | ||
24 | } | ||
25 | |||
26 | Index: linux-2.6.23/drivers/power/em_x270_battery.c | ||
27 | =================================================================== | ||
28 | --- linux-2.6.23.orig/drivers/power/em_x270_battery.c 2008-02-21 12:21:53.000000000 +0000 | ||
29 | +++ linux-2.6.23/drivers/power/em_x270_battery.c 2008-02-21 15:00:51.000000000 +0000 | ||
30 | @@ -418,8 +418,9 @@ | ||
31 | pr_debug("%s: MODEL = %s\n", __FUNCTION__, val->strval); | ||
32 | break; | ||
33 | default: break; | ||
34 | + return -1; | ||
35 | } | ||
36 | - | ||
37 | + | ||
38 | return 0; | ||
39 | } | ||
40 | |||
diff --git a/meta/recipes-kernel/linux/linux-2.6.23/em-x270/em-x270.patch b/meta/recipes-kernel/linux/linux-2.6.23/em-x270/em-x270.patch deleted file mode 100644 index 3c28be83c7..0000000000 --- a/meta/recipes-kernel/linux/linux-2.6.23/em-x270/em-x270.patch +++ /dev/null | |||
@@ -1,12063 +0,0 @@ | |||
1 | arch/arm/Kconfig | 13 +- | ||
2 | arch/arm/configs/em_x270_defconfig | 367 +++-- | ||
3 | arch/arm/mach-pxa/Kconfig | 8 + | ||
4 | arch/arm/mach-pxa/Makefile | 9 +- | ||
5 | arch/arm/mach-pxa/cpu-pxa.c | 442 ++++++ | ||
6 | arch/arm/mach-pxa/em-x270-devices.c | 331 +++++ | ||
7 | arch/arm/mach-pxa/em-x270-lcd.c | 223 +++ | ||
8 | arch/arm/mach-pxa/em-x270-pm.c | 892 ++++++++++++ | ||
9 | arch/arm/mach-pxa/em-x270.c | 127 ++- | ||
10 | arch/arm/mach-pxa/pwr-i2c.c | 539 +++++++ | ||
11 | arch/arm/mach-pxa/pxa27x.c | 6 +- | ||
12 | arch/arm/mach-pxa/spitz.c | 27 + | ||
13 | drivers/i2c/chips/Kconfig | 13 + | ||
14 | drivers/i2c/chips/Makefile | 1 + | ||
15 | drivers/i2c/chips/da9030.c | 1213 ++++++++++++++++ | ||
16 | drivers/i2c/chips/da9030.h | 282 ++++ | ||
17 | drivers/input/touchscreen/Kconfig | 43 + | ||
18 | drivers/input/touchscreen/Makefile | 14 + | ||
19 | drivers/input/touchscreen/wm9705.c | 360 +++++ | ||
20 | drivers/input/touchscreen/wm9712.c | 464 ++++++ | ||
21 | drivers/input/touchscreen/wm9713.c | 461 ++++++ | ||
22 | drivers/input/touchscreen/wm97xx-core.c | 859 +++++++++++ | ||
23 | drivers/leds/Kconfig | 6 + | ||
24 | drivers/leds/Makefile | 1 + | ||
25 | drivers/leds/leds-em-x270.c | 99 ++ | ||
26 | drivers/mtd/chips/jedec_probe.c | 58 +- | ||
27 | drivers/net/dm9000.c | 1 + | ||
28 | drivers/power/Kconfig | 6 + | ||
29 | drivers/power/Makefile | 1 + | ||
30 | drivers/power/em_x270_battery.c | 579 ++++++++ | ||
31 | drivers/usb/gadget/Kconfig | 20 + | ||
32 | drivers/usb/gadget/Makefile | 1 + | ||
33 | drivers/usb/gadget/epautoconf.c | 9 +- | ||
34 | drivers/usb/gadget/ether.c | 63 +- | ||
35 | drivers/usb/gadget/file_storage.c | 11 +- | ||
36 | drivers/usb/gadget/pxa27x_udc.c | 2387 +++++++++++++++++++++++++++++++ | ||
37 | drivers/usb/gadget/pxa27x_udc.h | 298 ++++ | ||
38 | drivers/usb/gadget/pxa2xx_udc.h | 7 +- | ||
39 | drivers/usb/gadget/serial.c | 18 +- | ||
40 | drivers/usb/gadget/zero.c | 13 +- | ||
41 | drivers/video/backlight/Kconfig | 2 +- | ||
42 | include/asm-arm/arch-pxa/pwr-i2c.h | 61 + | ||
43 | include/linux/da9030.h | 118 ++ | ||
44 | include/linux/usb_gadget.h | 23 +- | ||
45 | include/linux/wm97xx.h | 291 ++++ | ||
46 | sound/soc/pxa/Kconfig | 9 + | ||
47 | sound/soc/pxa/Makefile | 2 + | ||
48 | sound/soc/pxa/em-x270.c | 137 ++ | ||
49 | 48 files changed, 10742 insertions(+), 173 deletions(-) | ||
50 | |||
51 | diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig | ||
52 | index 691aae3..cf1dbc2 100644 | ||
53 | --- a/arch/arm/Kconfig | ||
54 | +++ b/arch/arm/Kconfig | ||
55 | @@ -858,7 +858,7 @@ config KEXEC | ||
56 | |||
57 | endmenu | ||
58 | |||
59 | -if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX ) | ||
60 | +if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX || ARCH_PXA) | ||
61 | |||
62 | menu "CPU Frequency scaling" | ||
63 | |||
64 | @@ -894,6 +894,15 @@ config CPU_FREQ_IMX | ||
65 | |||
66 | If in doubt, say N. | ||
67 | |||
68 | +config CPU_FREQ_PXA | ||
69 | + tristate "CPUfreq driver for PXA2xx CPUs" | ||
70 | + depends on CPU_FREQ && ARCH_PXA | ||
71 | + default y | ||
72 | + help | ||
73 | + Thes enables the CPUfreq driver for PXA2xx CPUs. | ||
74 | + | ||
75 | + If in doubt, say Y. | ||
76 | + | ||
77 | endmenu | ||
78 | |||
79 | endif | ||
80 | @@ -1029,6 +1038,8 @@ source "drivers/spi/Kconfig" | ||
81 | |||
82 | source "drivers/w1/Kconfig" | ||
83 | |||
84 | +source "drivers/power/Kconfig" | ||
85 | + | ||
86 | source "drivers/hwmon/Kconfig" | ||
87 | |||
88 | #source "drivers/l3/Kconfig" | ||
89 | diff --git a/arch/arm/configs/em_x270_defconfig b/arch/arm/configs/em_x270_defconfig | ||
90 | index 6bea090..3246136 100644 | ||
91 | --- a/arch/arm/configs/em_x270_defconfig | ||
92 | +++ b/arch/arm/configs/em_x270_defconfig | ||
93 | @@ -1,13 +1,13 @@ | ||
94 | # | ||
95 | # Automatically generated make config: don't edit | ||
96 | -# Linux kernel version: 2.6.22 | ||
97 | -# Mon Jul 9 15:18:20 2007 | ||
98 | +# Linux kernel version: 2.6.23-rc9 | ||
99 | +# Tue Oct 9 11:19:21 2007 | ||
100 | # | ||
101 | CONFIG_ARM=y | ||
102 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
103 | CONFIG_GENERIC_GPIO=y | ||
104 | CONFIG_GENERIC_TIME=y | ||
105 | -# CONFIG_GENERIC_CLOCKEVENTS is not set | ||
106 | +CONFIG_GENERIC_CLOCKEVENTS=y | ||
107 | CONFIG_MMU=y | ||
108 | # CONFIG_NO_IOPORT is not set | ||
109 | CONFIG_GENERIC_HARDIRQS=y | ||
110 | @@ -27,25 +27,20 @@ CONFIG_VECTORS_BASE=0xffff0000 | ||
111 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
112 | |||
113 | # | ||
114 | -# Code maturity level options | ||
115 | +# General setup | ||
116 | # | ||
117 | CONFIG_EXPERIMENTAL=y | ||
118 | CONFIG_BROKEN_ON_SMP=y | ||
119 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
120 | - | ||
121 | -# | ||
122 | -# General setup | ||
123 | -# | ||
124 | CONFIG_LOCALVERSION="-em-x270" | ||
125 | # CONFIG_LOCALVERSION_AUTO is not set | ||
126 | CONFIG_SWAP=y | ||
127 | CONFIG_SYSVIPC=y | ||
128 | -# CONFIG_IPC_NS is not set | ||
129 | CONFIG_SYSVIPC_SYSCTL=y | ||
130 | # CONFIG_POSIX_MQUEUE is not set | ||
131 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
132 | # CONFIG_TASKSTATS is not set | ||
133 | -# CONFIG_UTS_NS is not set | ||
134 | +# CONFIG_USER_NS is not set | ||
135 | # CONFIG_AUDIT is not set | ||
136 | CONFIG_IKCONFIG=y | ||
137 | CONFIG_IKCONFIG_PROC=y | ||
138 | @@ -71,34 +66,27 @@ CONFIG_FUTEX=y | ||
139 | CONFIG_ANON_INODES=y | ||
140 | CONFIG_EPOLL=y | ||
141 | CONFIG_SIGNALFD=y | ||
142 | -CONFIG_TIMERFD=y | ||
143 | CONFIG_EVENTFD=y | ||
144 | CONFIG_SHMEM=y | ||
145 | CONFIG_VM_EVENT_COUNTERS=y | ||
146 | -CONFIG_SLAB=y | ||
147 | -# CONFIG_SLUB is not set | ||
148 | +CONFIG_SLUB_DEBUG=y | ||
149 | +# CONFIG_SLAB is not set | ||
150 | +CONFIG_SLUB=y | ||
151 | # CONFIG_SLOB is not set | ||
152 | CONFIG_RT_MUTEXES=y | ||
153 | # CONFIG_TINY_SHMEM is not set | ||
154 | CONFIG_BASE_SMALL=0 | ||
155 | - | ||
156 | -# | ||
157 | -# Loadable module support | ||
158 | -# | ||
159 | CONFIG_MODULES=y | ||
160 | CONFIG_MODULE_UNLOAD=y | ||
161 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
162 | # CONFIG_MODVERSIONS is not set | ||
163 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
164 | CONFIG_KMOD=y | ||
165 | - | ||
166 | -# | ||
167 | -# Block layer | ||
168 | -# | ||
169 | CONFIG_BLOCK=y | ||
170 | # CONFIG_LBD is not set | ||
171 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
172 | # CONFIG_LSF is not set | ||
173 | +# CONFIG_BLK_DEV_BSG is not set | ||
174 | |||
175 | # | ||
176 | # IO Schedulers | ||
177 | @@ -139,6 +127,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
178 | # CONFIG_ARCH_L7200 is not set | ||
179 | # CONFIG_ARCH_KS8695 is not set | ||
180 | # CONFIG_ARCH_NS9XXX is not set | ||
181 | +# CONFIG_ARCH_MXC is not set | ||
182 | # CONFIG_ARCH_PNX4008 is not set | ||
183 | CONFIG_ARCH_PXA=y | ||
184 | # CONFIG_ARCH_RPC is not set | ||
185 | @@ -160,6 +149,15 @@ CONFIG_ARCH_PXA=y | ||
186 | # CONFIG_MACH_TRIZEPS4 is not set | ||
187 | CONFIG_MACH_EM_X270=y | ||
188 | CONFIG_PXA27x=y | ||
189 | +CONFIG_PXA_PWR_I2C=y | ||
190 | + | ||
191 | +# | ||
192 | +# Boot options | ||
193 | +# | ||
194 | + | ||
195 | +# | ||
196 | +# Power management | ||
197 | +# | ||
198 | |||
199 | # | ||
200 | # Processor Type | ||
201 | @@ -185,6 +183,7 @@ CONFIG_XSCALE_PMU=y | ||
202 | # | ||
203 | # Bus support | ||
204 | # | ||
205 | +# CONFIG_PCI_SYSCALL is not set | ||
206 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
207 | |||
208 | # | ||
209 | @@ -196,8 +195,9 @@ CONFIG_XSCALE_PMU=y | ||
210 | # Kernel Features | ||
211 | # | ||
212 | # CONFIG_TICK_ONESHOT is not set | ||
213 | +# CONFIG_NO_HZ is not set | ||
214 | +# CONFIG_HIGH_RES_TIMERS is not set | ||
215 | # CONFIG_PREEMPT is not set | ||
216 | -# CONFIG_NO_IDLE_HZ is not set | ||
217 | CONFIG_HZ=100 | ||
218 | CONFIG_AEABI=y | ||
219 | CONFIG_OABI_COMPAT=y | ||
220 | @@ -212,6 +212,8 @@ CONFIG_FLAT_NODE_MEM_MAP=y | ||
221 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
222 | # CONFIG_RESOURCES_64BIT is not set | ||
223 | CONFIG_ZONE_DMA_FLAG=1 | ||
224 | +CONFIG_BOUNCE=y | ||
225 | +CONFIG_VIRT_TO_BUS=y | ||
226 | CONFIG_ALIGNMENT_TRAP=y | ||
227 | |||
228 | # | ||
229 | @@ -219,11 +221,28 @@ CONFIG_ALIGNMENT_TRAP=y | ||
230 | # | ||
231 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
232 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
233 | -CONFIG_CMDLINE="" | ||
234 | +CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=jffs2 console=ttyS0,115200" | ||
235 | # CONFIG_XIP_KERNEL is not set | ||
236 | # CONFIG_KEXEC is not set | ||
237 | |||
238 | # | ||
239 | +# CPU Frequency scaling | ||
240 | +# | ||
241 | +CONFIG_CPU_FREQ=y | ||
242 | +CONFIG_CPU_FREQ_TABLE=y | ||
243 | +# CONFIG_CPU_FREQ_DEBUG is not set | ||
244 | +CONFIG_CPU_FREQ_STAT=y | ||
245 | +# CONFIG_CPU_FREQ_STAT_DETAILS is not set | ||
246 | +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y | ||
247 | +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set | ||
248 | +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
249 | +CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||
250 | +CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||
251 | +CONFIG_CPU_FREQ_GOV_ONDEMAND=m | ||
252 | +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m | ||
253 | +CONFIG_CPU_FREQ_PXA=y | ||
254 | + | ||
255 | +# | ||
256 | # Floating point emulation | ||
257 | # | ||
258 | |||
259 | @@ -238,8 +257,8 @@ CONFIG_FPE_NWFPE=y | ||
260 | # Userspace binary formats | ||
261 | # | ||
262 | CONFIG_BINFMT_ELF=y | ||
263 | -# CONFIG_BINFMT_AOUT is not set | ||
264 | -# CONFIG_BINFMT_MISC is not set | ||
265 | +CONFIG_BINFMT_AOUT=m | ||
266 | +CONFIG_BINFMT_MISC=m | ||
267 | |||
268 | # | ||
269 | # Power management options | ||
270 | @@ -247,8 +266,10 @@ CONFIG_BINFMT_ELF=y | ||
271 | CONFIG_PM=y | ||
272 | CONFIG_PM_LEGACY=y | ||
273 | # CONFIG_PM_DEBUG is not set | ||
274 | -# CONFIG_PM_SYSFS_DEPRECATED is not set | ||
275 | -CONFIG_APM_EMULATION=m | ||
276 | +CONFIG_PM_SLEEP=y | ||
277 | +CONFIG_SUSPEND_UP_POSSIBLE=y | ||
278 | +CONFIG_SUSPEND=y | ||
279 | +CONFIG_APM_EMULATION=y | ||
280 | |||
281 | # | ||
282 | # Networking | ||
283 | @@ -316,6 +337,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | ||
284 | # QoS and/or fair queueing | ||
285 | # | ||
286 | # CONFIG_NET_SCHED is not set | ||
287 | +CONFIG_NET_SCH_FIFO=y | ||
288 | |||
289 | # | ||
290 | # Network testing | ||
291 | @@ -350,9 +372,12 @@ CONFIG_BT_HCIBFUSB=m | ||
292 | # | ||
293 | # Wireless | ||
294 | # | ||
295 | -# CONFIG_CFG80211 is not set | ||
296 | -# CONFIG_WIRELESS_EXT is not set | ||
297 | -# CONFIG_MAC80211 is not set | ||
298 | +CONFIG_CFG80211=m | ||
299 | +CONFIG_WIRELESS_EXT=y | ||
300 | +CONFIG_MAC80211=m | ||
301 | +# CONFIG_MAC80211_LEDS is not set | ||
302 | +CONFIG_MAC80211_DEBUGFS=y | ||
303 | +# CONFIG_MAC80211_DEBUG is not set | ||
304 | CONFIG_IEEE80211=m | ||
305 | # CONFIG_IEEE80211_DEBUG is not set | ||
306 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
307 | @@ -360,6 +385,7 @@ CONFIG_IEEE80211_CRYPT_CCMP=m | ||
308 | # CONFIG_IEEE80211_CRYPT_TKIP is not set | ||
309 | # CONFIG_IEEE80211_SOFTMAC is not set | ||
310 | # CONFIG_RFKILL is not set | ||
311 | +# CONFIG_NET_9P is not set | ||
312 | |||
313 | # | ||
314 | # Device Drivers | ||
315 | @@ -374,10 +400,6 @@ CONFIG_FW_LOADER=y | ||
316 | # CONFIG_DEBUG_DRIVER is not set | ||
317 | # CONFIG_DEBUG_DEVRES is not set | ||
318 | # CONFIG_SYS_HYPERVISOR is not set | ||
319 | - | ||
320 | -# | ||
321 | -# Connector - unified userspace <-> kernelspace linker | ||
322 | -# | ||
323 | # CONFIG_CONNECTOR is not set | ||
324 | CONFIG_MTD=y | ||
325 | # CONFIG_MTD_DEBUG is not set | ||
326 | @@ -402,11 +424,10 @@ CONFIG_MTD_BLOCK=y | ||
327 | # | ||
328 | # RAM/ROM/Flash chip drivers | ||
329 | # | ||
330 | -# CONFIG_MTD_CFI is not set | ||
331 | -# CONFIG_MTD_JEDECPROBE is not set | ||
332 | -# CONFIG_MTD_CFI_NOSWAP is not set | ||
333 | -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set | ||
334 | -# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set | ||
335 | +CONFIG_MTD_CFI=y | ||
336 | +CONFIG_MTD_JEDECPROBE=y | ||
337 | +CONFIG_MTD_GEN_PROBE=y | ||
338 | +# CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
339 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
340 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
341 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
342 | @@ -417,14 +438,25 @@ CONFIG_MTD_CFI_I1=y | ||
343 | CONFIG_MTD_CFI_I2=y | ||
344 | # CONFIG_MTD_CFI_I4 is not set | ||
345 | # CONFIG_MTD_CFI_I8 is not set | ||
346 | +CONFIG_MTD_CFI_INTELEXT=y | ||
347 | +CONFIG_MTD_CFI_AMDSTD=y | ||
348 | +CONFIG_MTD_CFI_STAA=y | ||
349 | +CONFIG_MTD_CFI_UTIL=y | ||
350 | # CONFIG_MTD_RAM is not set | ||
351 | # CONFIG_MTD_ROM is not set | ||
352 | # CONFIG_MTD_ABSENT is not set | ||
353 | +# CONFIG_MTD_XIP is not set | ||
354 | |||
355 | # | ||
356 | # Mapping drivers for chip access | ||
357 | # | ||
358 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
359 | +CONFIG_MTD_PHYSMAP=y | ||
360 | +CONFIG_MTD_PHYSMAP_START=0x0 | ||
361 | +CONFIG_MTD_PHYSMAP_LEN=0x100000 | ||
362 | +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
363 | +# CONFIG_MTD_ARM_INTEGRATOR is not set | ||
364 | +# CONFIG_MTD_IMPA7 is not set | ||
365 | # CONFIG_MTD_SHARP_SL is not set | ||
366 | # CONFIG_MTD_PLATRAM is not set | ||
367 | |||
368 | @@ -457,21 +489,17 @@ CONFIG_MTD_NAND_PLATFORM=y | ||
369 | # | ||
370 | # UBI - Unsorted block images | ||
371 | # | ||
372 | -# CONFIG_MTD_UBI is not set | ||
373 | +CONFIG_MTD_UBI=m | ||
374 | +CONFIG_MTD_UBI_WL_THRESHOLD=4096 | ||
375 | +CONFIG_MTD_UBI_BEB_RESERVE=1 | ||
376 | +CONFIG_MTD_UBI_GLUEBI=y | ||
377 | |||
378 | # | ||
379 | -# Parallel port support | ||
380 | +# UBI debugging options | ||
381 | # | ||
382 | +# CONFIG_MTD_UBI_DEBUG is not set | ||
383 | # CONFIG_PARPORT is not set | ||
384 | - | ||
385 | -# | ||
386 | -# Plug and Play support | ||
387 | -# | ||
388 | -# CONFIG_PNPACPI is not set | ||
389 | - | ||
390 | -# | ||
391 | -# Block devices | ||
392 | -# | ||
393 | +CONFIG_BLK_DEV=y | ||
394 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
395 | CONFIG_BLK_DEV_LOOP=y | ||
396 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
397 | @@ -490,6 +518,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
398 | # | ||
399 | # CONFIG_RAID_ATTRS is not set | ||
400 | CONFIG_SCSI=y | ||
401 | +CONFIG_SCSI_DMA=y | ||
402 | # CONFIG_SCSI_TGT is not set | ||
403 | # CONFIG_SCSI_NETLINK is not set | ||
404 | # CONFIG_SCSI_PROC_FS is not set | ||
405 | @@ -519,36 +548,23 @@ CONFIG_SCSI_WAIT_SCAN=m | ||
406 | # CONFIG_SCSI_SPI_ATTRS is not set | ||
407 | # CONFIG_SCSI_FC_ATTRS is not set | ||
408 | # CONFIG_SCSI_ISCSI_ATTRS is not set | ||
409 | -# CONFIG_SCSI_SAS_ATTRS is not set | ||
410 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
411 | - | ||
412 | -# | ||
413 | -# SCSI low-level drivers | ||
414 | -# | ||
415 | +CONFIG_SCSI_LOWLEVEL=y | ||
416 | # CONFIG_ISCSI_TCP is not set | ||
417 | # CONFIG_SCSI_DEBUG is not set | ||
418 | # CONFIG_ATA is not set | ||
419 | - | ||
420 | -# | ||
421 | -# Multi-device support (RAID and LVM) | ||
422 | -# | ||
423 | # CONFIG_MD is not set | ||
424 | - | ||
425 | -# | ||
426 | -# Network device support | ||
427 | -# | ||
428 | CONFIG_NETDEVICES=y | ||
429 | +# CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
430 | # CONFIG_DUMMY is not set | ||
431 | # CONFIG_BONDING is not set | ||
432 | +# CONFIG_MACVLAN is not set | ||
433 | # CONFIG_EQUALIZER is not set | ||
434 | # CONFIG_TUN is not set | ||
435 | # CONFIG_PHYLIB is not set | ||
436 | - | ||
437 | -# | ||
438 | -# Ethernet (10 or 100Mbit) | ||
439 | -# | ||
440 | CONFIG_NET_ETHERNET=y | ||
441 | CONFIG_MII=y | ||
442 | +# CONFIG_AX88796 is not set | ||
443 | # CONFIG_SMC91X is not set | ||
444 | CONFIG_DM9000=y | ||
445 | # CONFIG_SMC911X is not set | ||
446 | @@ -571,16 +587,22 @@ CONFIG_DM9000=y | ||
447 | # CONFIG_USB_USBNET_MII is not set | ||
448 | # CONFIG_USB_USBNET is not set | ||
449 | # CONFIG_WAN is not set | ||
450 | -# CONFIG_PPP is not set | ||
451 | +CONFIG_PPP=m | ||
452 | +# CONFIG_PPP_MULTILINK is not set | ||
453 | +# CONFIG_PPP_FILTER is not set | ||
454 | +CONFIG_PPP_ASYNC=m | ||
455 | +CONFIG_PPP_SYNC_TTY=m | ||
456 | +CONFIG_PPP_DEFLATE=m | ||
457 | +CONFIG_PPP_BSDCOMP=m | ||
458 | +CONFIG_PPP_MPPE=m | ||
459 | +# CONFIG_PPPOE is not set | ||
460 | +CONFIG_PPPOL2TP=m | ||
461 | # CONFIG_SLIP is not set | ||
462 | +CONFIG_SLHC=m | ||
463 | # CONFIG_SHAPER is not set | ||
464 | # CONFIG_NETCONSOLE is not set | ||
465 | # CONFIG_NETPOLL is not set | ||
466 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
467 | - | ||
468 | -# | ||
469 | -# ISDN subsystem | ||
470 | -# | ||
471 | # CONFIG_ISDN is not set | ||
472 | |||
473 | # | ||
474 | @@ -612,16 +634,21 @@ CONFIG_INPUT_KEYBOARD=y | ||
475 | # CONFIG_KEYBOARD_XTKBD is not set | ||
476 | # CONFIG_KEYBOARD_NEWTON is not set | ||
477 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
478 | -CONFIG_KEYBOARD_PXA27x=m | ||
479 | +CONFIG_KEYBOARD_PXA27x=y | ||
480 | # CONFIG_KEYBOARD_GPIO is not set | ||
481 | # CONFIG_INPUT_MOUSE is not set | ||
482 | # CONFIG_INPUT_JOYSTICK is not set | ||
483 | # CONFIG_INPUT_TABLET is not set | ||
484 | CONFIG_INPUT_TOUCHSCREEN=y | ||
485 | +# CONFIG_TOUCHSCREEN_FUJITSU is not set | ||
486 | # CONFIG_TOUCHSCREEN_GUNZE is not set | ||
487 | # CONFIG_TOUCHSCREEN_ELO is not set | ||
488 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | ||
489 | # CONFIG_TOUCHSCREEN_MK712 is not set | ||
490 | +CONFIG_TOUCHSCREEN_WM97XX=y | ||
491 | +# CONFIG_TOUCHSCREEN_WM9705 is not set | ||
492 | +CONFIG_TOUCHSCREEN_WM9712=y | ||
493 | +# CONFIG_TOUCHSCREEN_WM9713 is not set | ||
494 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | ||
495 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | ||
496 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | ||
497 | @@ -660,58 +687,91 @@ CONFIG_SERIAL_PXA_CONSOLE=y | ||
498 | CONFIG_SERIAL_CORE=y | ||
499 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
500 | CONFIG_UNIX98_PTYS=y | ||
501 | -CONFIG_LEGACY_PTYS=y | ||
502 | -CONFIG_LEGACY_PTY_COUNT=256 | ||
503 | - | ||
504 | -# | ||
505 | -# IPMI | ||
506 | -# | ||
507 | +# CONFIG_LEGACY_PTYS is not set | ||
508 | # CONFIG_IPMI_HANDLER is not set | ||
509 | # CONFIG_WATCHDOG is not set | ||
510 | CONFIG_HW_RANDOM=m | ||
511 | # CONFIG_NVRAM is not set | ||
512 | # CONFIG_R3964 is not set | ||
513 | # CONFIG_RAW_DRIVER is not set | ||
514 | +# CONFIG_TCG_TPM is not set | ||
515 | +CONFIG_I2C=y | ||
516 | +CONFIG_I2C_BOARDINFO=y | ||
517 | +# CONFIG_I2C_CHARDEV is not set | ||
518 | |||
519 | # | ||
520 | -# TPM devices | ||
521 | +# I2C Algorithms | ||
522 | # | ||
523 | -# CONFIG_TCG_TPM is not set | ||
524 | -# CONFIG_I2C is not set | ||
525 | +# CONFIG_I2C_ALGOBIT is not set | ||
526 | +# CONFIG_I2C_ALGOPCF is not set | ||
527 | +# CONFIG_I2C_ALGOPCA is not set | ||
528 | |||
529 | # | ||
530 | -# SPI support | ||
531 | +# I2C Hardware Bus support | ||
532 | # | ||
533 | -# CONFIG_SPI is not set | ||
534 | -# CONFIG_SPI_MASTER is not set | ||
535 | +# CONFIG_I2C_GPIO is not set | ||
536 | +CONFIG_I2C_PXA=y | ||
537 | +# CONFIG_I2C_PXA_SLAVE is not set | ||
538 | +# CONFIG_I2C_OCORES is not set | ||
539 | +# CONFIG_I2C_PARPORT_LIGHT is not set | ||
540 | +# CONFIG_I2C_SIMTEC is not set | ||
541 | +# CONFIG_I2C_TAOS_EVM is not set | ||
542 | +# CONFIG_I2C_STUB is not set | ||
543 | +# CONFIG_I2C_TINY_USB is not set | ||
544 | |||
545 | # | ||
546 | -# Dallas's 1-wire bus | ||
547 | +# Miscellaneous I2C Chip support | ||
548 | # | ||
549 | -# CONFIG_W1 is not set | ||
550 | -# CONFIG_HWMON is not set | ||
551 | +# CONFIG_SENSORS_DS1337 is not set | ||
552 | +# CONFIG_SENSORS_DS1374 is not set | ||
553 | +# CONFIG_DS1682 is not set | ||
554 | +# CONFIG_SENSORS_EEPROM is not set | ||
555 | +# CONFIG_SENSORS_PCF8574 is not set | ||
556 | +# CONFIG_SENSORS_PCA9539 is not set | ||
557 | +# CONFIG_SENSORS_PCF8591 is not set | ||
558 | +# CONFIG_SENSORS_MAX6875 is not set | ||
559 | +# CONFIG_SENSORS_TSL2550 is not set | ||
560 | +CONFIG_DA9030=y | ||
561 | +# CONFIG_I2C_DEBUG_CORE is not set | ||
562 | +# CONFIG_I2C_DEBUG_ALGO is not set | ||
563 | +# CONFIG_I2C_DEBUG_BUS is not set | ||
564 | +# CONFIG_I2C_DEBUG_CHIP is not set | ||
565 | |||
566 | # | ||
567 | -# Misc devices | ||
568 | +# SPI support | ||
569 | # | ||
570 | +# CONFIG_SPI is not set | ||
571 | +# CONFIG_SPI_MASTER is not set | ||
572 | +# CONFIG_W1 is not set | ||
573 | +CONFIG_POWER_SUPPLY=y | ||
574 | +# CONFIG_POWER_SUPPLY_DEBUG is not set | ||
575 | +# CONFIG_PDA_POWER is not set | ||
576 | +CONFIG_APM_POWER=y | ||
577 | +# CONFIG_BATTERY_DS2760 is not set | ||
578 | +# CONFIG_BATTERY_EM_X270 is not set | ||
579 | +# CONFIG_HWMON is not set | ||
580 | +CONFIG_MISC_DEVICES=y | ||
581 | +# CONFIG_EEPROM_93CX6 is not set | ||
582 | |||
583 | # | ||
584 | # Multifunction device drivers | ||
585 | # | ||
586 | # CONFIG_MFD_SM501 is not set | ||
587 | - | ||
588 | -# | ||
589 | -# LED devices | ||
590 | -# | ||
591 | -# CONFIG_NEW_LEDS is not set | ||
592 | +CONFIG_NEW_LEDS=y | ||
593 | +CONFIG_LEDS_CLASS=m | ||
594 | |||
595 | # | ||
596 | # LED drivers | ||
597 | # | ||
598 | +CONFIG_LEDS_GPIO=m | ||
599 | +CONFIG_LEDS_EM_X270=m | ||
600 | |||
601 | # | ||
602 | # LED Triggers | ||
603 | # | ||
604 | +CONFIG_LEDS_TRIGGERS=y | ||
605 | +CONFIG_LEDS_TRIGGER_TIMER=m | ||
606 | +CONFIG_LEDS_TRIGGER_HEARTBEAT=m | ||
607 | |||
608 | # | ||
609 | # Multimedia devices | ||
610 | @@ -723,13 +783,17 @@ CONFIG_HW_RANDOM=m | ||
611 | # | ||
612 | # Graphics support | ||
613 | # | ||
614 | -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
615 | +CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
616 | +CONFIG_LCD_CLASS_DEVICE=y | ||
617 | +CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
618 | +CONFIG_BACKLIGHT_CORGI=y | ||
619 | |||
620 | # | ||
621 | # Display device support | ||
622 | # | ||
623 | # CONFIG_DISPLAY_SUPPORT is not set | ||
624 | # CONFIG_VGASTATE is not set | ||
625 | +CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
626 | CONFIG_FB=y | ||
627 | # CONFIG_FIRMWARE_EDID is not set | ||
628 | # CONFIG_FB_DDC is not set | ||
629 | @@ -752,7 +816,7 @@ CONFIG_FB_DEFERRED_IO=y | ||
630 | # | ||
631 | # CONFIG_FB_S1D13XXX is not set | ||
632 | CONFIG_FB_PXA=y | ||
633 | -# CONFIG_FB_PXA_PARAMETERS is not set | ||
634 | +CONFIG_FB_PXA_PARAMETERS=y | ||
635 | # CONFIG_FB_MBX is not set | ||
636 | # CONFIG_FB_VIRTUAL is not set | ||
637 | |||
638 | @@ -762,6 +826,7 @@ CONFIG_FB_PXA=y | ||
639 | # CONFIG_VGA_CONSOLE is not set | ||
640 | CONFIG_DUMMY_CONSOLE=y | ||
641 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
642 | +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
643 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
644 | # CONFIG_FONTS is not set | ||
645 | CONFIG_FONT_8x8=y | ||
646 | @@ -774,18 +839,18 @@ CONFIG_LOGO_LINUX_CLUT224=y | ||
647 | # | ||
648 | # Sound | ||
649 | # | ||
650 | -CONFIG_SOUND=m | ||
651 | +CONFIG_SOUND=y | ||
652 | |||
653 | # | ||
654 | # Advanced Linux Sound Architecture | ||
655 | # | ||
656 | -CONFIG_SND=m | ||
657 | -CONFIG_SND_TIMER=m | ||
658 | -CONFIG_SND_PCM=m | ||
659 | +CONFIG_SND=y | ||
660 | +CONFIG_SND_TIMER=y | ||
661 | +CONFIG_SND_PCM=y | ||
662 | # CONFIG_SND_SEQUENCER is not set | ||
663 | CONFIG_SND_OSSEMUL=y | ||
664 | -CONFIG_SND_MIXER_OSS=m | ||
665 | -CONFIG_SND_PCM_OSS=m | ||
666 | +CONFIG_SND_MIXER_OSS=y | ||
667 | +CONFIG_SND_PCM_OSS=y | ||
668 | CONFIG_SND_PCM_OSS_PLUGINS=y | ||
669 | # CONFIG_SND_DYNAMIC_MINORS is not set | ||
670 | CONFIG_SND_SUPPORT_OLD_API=y | ||
671 | @@ -817,17 +882,23 @@ CONFIG_SND_PXA2XX_AC97=m | ||
672 | # | ||
673 | # System on Chip audio support | ||
674 | # | ||
675 | -# CONFIG_SND_SOC is not set | ||
676 | +CONFIG_SND_SOC_AC97_BUS=y | ||
677 | +CONFIG_SND_SOC=y | ||
678 | +CONFIG_SND_PXA2XX_SOC=y | ||
679 | +CONFIG_SND_PXA2XX_SOC_AC97=y | ||
680 | +CONFIG_SND_PXA2XX_SOC_EM_X270=y | ||
681 | |||
682 | # | ||
683 | -# Open Sound System | ||
684 | +# SoC Audio support for SuperH | ||
685 | # | ||
686 | -# CONFIG_SOUND_PRIME is not set | ||
687 | -CONFIG_AC97_BUS=m | ||
688 | +CONFIG_SND_SOC_WM9712=y | ||
689 | |||
690 | # | ||
691 | -# HID Devices | ||
692 | +# Open Sound System | ||
693 | # | ||
694 | +# CONFIG_SOUND_PRIME is not set | ||
695 | +CONFIG_AC97_BUS=y | ||
696 | +CONFIG_HID_SUPPORT=y | ||
697 | CONFIG_HID=y | ||
698 | # CONFIG_HID_DEBUG is not set | ||
699 | |||
700 | @@ -838,10 +909,7 @@ CONFIG_USB_HID=y | ||
701 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
702 | # CONFIG_HID_FF is not set | ||
703 | # CONFIG_USB_HIDDEV is not set | ||
704 | - | ||
705 | -# | ||
706 | -# USB support | ||
707 | -# | ||
708 | +CONFIG_USB_SUPPORT=y | ||
709 | CONFIG_USB_ARCH_HAS_HCD=y | ||
710 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
711 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
712 | @@ -855,6 +923,7 @@ CONFIG_USB_DEVICEFS=y | ||
713 | # CONFIG_USB_DEVICE_CLASS is not set | ||
714 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
715 | # CONFIG_USB_SUSPEND is not set | ||
716 | +# CONFIG_USB_PERSIST is not set | ||
717 | # CONFIG_USB_OTG is not set | ||
718 | |||
719 | # | ||
720 | @@ -866,12 +935,13 @@ CONFIG_USB_OHCI_HCD=y | ||
721 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
722 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
723 | # CONFIG_USB_SL811_HCD is not set | ||
724 | +# CONFIG_USB_R8A66597_HCD is not set | ||
725 | |||
726 | # | ||
727 | # USB Device Class drivers | ||
728 | # | ||
729 | -# CONFIG_USB_ACM is not set | ||
730 | -# CONFIG_USB_PRINTER is not set | ||
731 | +CONFIG_USB_ACM=m | ||
732 | +CONFIG_USB_PRINTER=m | ||
733 | |||
734 | # | ||
735 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
736 | @@ -896,8 +966,8 @@ CONFIG_USB_STORAGE=y | ||
737 | # | ||
738 | # USB Imaging devices | ||
739 | # | ||
740 | -# CONFIG_USB_MDC800 is not set | ||
741 | -# CONFIG_USB_MICROTEK is not set | ||
742 | +CONFIG_USB_MDC800=m | ||
743 | +CONFIG_USB_MICROTEK=m | ||
744 | # CONFIG_USB_MON is not set | ||
745 | |||
746 | # | ||
747 | @@ -940,25 +1010,25 @@ CONFIG_USB_STORAGE=y | ||
748 | # USB Gadget Support | ||
749 | # | ||
750 | # CONFIG_USB_GADGET is not set | ||
751 | -CONFIG_MMC=m | ||
752 | +CONFIG_MMC=y | ||
753 | # CONFIG_MMC_DEBUG is not set | ||
754 | -# CONFIG_MMC_UNSAFE_RESUME is not set | ||
755 | +CONFIG_MMC_UNSAFE_RESUME=y | ||
756 | |||
757 | # | ||
758 | # MMC/SD Card Drivers | ||
759 | # | ||
760 | -CONFIG_MMC_BLOCK=m | ||
761 | +CONFIG_MMC_BLOCK=y | ||
762 | +CONFIG_MMC_BLOCK_BOUNCE=y | ||
763 | |||
764 | # | ||
765 | # MMC/SD Host Controller Drivers | ||
766 | # | ||
767 | -CONFIG_MMC_PXA=m | ||
768 | - | ||
769 | -# | ||
770 | -# Real Time Clock | ||
771 | -# | ||
772 | +CONFIG_MMC_PXA=y | ||
773 | CONFIG_RTC_LIB=y | ||
774 | -CONFIG_RTC_CLASS=m | ||
775 | +CONFIG_RTC_CLASS=y | ||
776 | +CONFIG_RTC_HCTOSYS=y | ||
777 | +CONFIG_RTC_HCTOSYS_DEVICE="rtc1" | ||
778 | +# CONFIG_RTC_DEBUG is not set | ||
779 | |||
780 | # | ||
781 | # RTC interfaces | ||
782 | @@ -972,6 +1042,15 @@ CONFIG_RTC_INTF_DEV=y | ||
783 | # | ||
784 | # I2C RTC drivers | ||
785 | # | ||
786 | +# CONFIG_RTC_DRV_DS1307 is not set | ||
787 | +# CONFIG_RTC_DRV_DS1672 is not set | ||
788 | +# CONFIG_RTC_DRV_MAX6900 is not set | ||
789 | +# CONFIG_RTC_DRV_RS5C372 is not set | ||
790 | +# CONFIG_RTC_DRV_ISL1208 is not set | ||
791 | +# CONFIG_RTC_DRV_X1205 is not set | ||
792 | +# CONFIG_RTC_DRV_PCF8563 is not set | ||
793 | +# CONFIG_RTC_DRV_PCF8583 is not set | ||
794 | +# CONFIG_RTC_DRV_M41T80 is not set | ||
795 | |||
796 | # | ||
797 | # SPI RTC drivers | ||
798 | @@ -982,14 +1061,29 @@ CONFIG_RTC_INTF_DEV=y | ||
799 | # | ||
800 | # CONFIG_RTC_DRV_CMOS is not set | ||
801 | # CONFIG_RTC_DRV_DS1553 is not set | ||
802 | +# CONFIG_RTC_DRV_STK17TA8 is not set | ||
803 | # CONFIG_RTC_DRV_DS1742 is not set | ||
804 | # CONFIG_RTC_DRV_M48T86 is not set | ||
805 | -CONFIG_RTC_DRV_V3020=m | ||
806 | +# CONFIG_RTC_DRV_M48T59 is not set | ||
807 | +CONFIG_RTC_DRV_V3020=y | ||
808 | |||
809 | # | ||
810 | # on-CPU RTC drivers | ||
811 | # | ||
812 | -CONFIG_RTC_DRV_SA1100=m | ||
813 | +CONFIG_RTC_DRV_SA1100=y | ||
814 | + | ||
815 | +# | ||
816 | +# DMA Engine support | ||
817 | +# | ||
818 | +# CONFIG_DMA_ENGINE is not set | ||
819 | + | ||
820 | +# | ||
821 | +# DMA Clients | ||
822 | +# | ||
823 | + | ||
824 | +# | ||
825 | +# DMA Devices | ||
826 | +# | ||
827 | |||
828 | # | ||
829 | # File systems | ||
830 | @@ -1098,7 +1192,6 @@ CONFIG_SMB_FS=y | ||
831 | # CONFIG_NCP_FS is not set | ||
832 | # CONFIG_CODA_FS is not set | ||
833 | # CONFIG_AFS_FS is not set | ||
834 | -# CONFIG_9P_FS is not set | ||
835 | |||
836 | # | ||
837 | # Partition Types | ||
838 | @@ -1167,20 +1260,22 @@ CONFIG_NLS_UTF8=y | ||
839 | CONFIG_ENABLE_MUST_CHECK=y | ||
840 | CONFIG_MAGIC_SYSRQ=y | ||
841 | # CONFIG_UNUSED_SYMBOLS is not set | ||
842 | -# CONFIG_DEBUG_FS is not set | ||
843 | +CONFIG_DEBUG_FS=y | ||
844 | # CONFIG_HEADERS_CHECK is not set | ||
845 | CONFIG_DEBUG_KERNEL=y | ||
846 | # CONFIG_DEBUG_SHIRQ is not set | ||
847 | # CONFIG_DETECT_SOFTLOCKUP is not set | ||
848 | +CONFIG_SCHED_DEBUG=y | ||
849 | # CONFIG_SCHEDSTATS is not set | ||
850 | # CONFIG_TIMER_STATS is not set | ||
851 | -# CONFIG_DEBUG_SLAB is not set | ||
852 | +# CONFIG_SLUB_DEBUG_ON is not set | ||
853 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
854 | # CONFIG_RT_MUTEX_TESTER is not set | ||
855 | # CONFIG_DEBUG_SPINLOCK is not set | ||
856 | # CONFIG_DEBUG_MUTEXES is not set | ||
857 | # CONFIG_DEBUG_LOCK_ALLOC is not set | ||
858 | # CONFIG_PROVE_LOCKING is not set | ||
859 | +# CONFIG_LOCK_STAT is not set | ||
860 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
861 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
862 | # CONFIG_DEBUG_KOBJECT is not set | ||
863 | @@ -1202,10 +1297,6 @@ CONFIG_DEBUG_LL=y | ||
864 | # | ||
865 | # CONFIG_KEYS is not set | ||
866 | # CONFIG_SECURITY is not set | ||
867 | - | ||
868 | -# | ||
869 | -# Cryptographic options | ||
870 | -# | ||
871 | CONFIG_CRYPTO=y | ||
872 | CONFIG_CRYPTO_ALGAPI=m | ||
873 | CONFIG_CRYPTO_BLKCIPHER=m | ||
874 | @@ -1215,7 +1306,7 @@ CONFIG_CRYPTO_MANAGER=m | ||
875 | # CONFIG_CRYPTO_NULL is not set | ||
876 | # CONFIG_CRYPTO_MD4 is not set | ||
877 | # CONFIG_CRYPTO_MD5 is not set | ||
878 | -# CONFIG_CRYPTO_SHA1 is not set | ||
879 | +CONFIG_CRYPTO_SHA1=m | ||
880 | # CONFIG_CRYPTO_SHA256 is not set | ||
881 | # CONFIG_CRYPTO_SHA512 is not set | ||
882 | # CONFIG_CRYPTO_WP512 is not set | ||
883 | @@ -1243,19 +1334,17 @@ CONFIG_CRYPTO_ARC4=m | ||
884 | # CONFIG_CRYPTO_CRC32C is not set | ||
885 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
886 | # CONFIG_CRYPTO_TEST is not set | ||
887 | - | ||
888 | -# | ||
889 | -# Hardware crypto devices | ||
890 | -# | ||
891 | +CONFIG_CRYPTO_HW=y | ||
892 | |||
893 | # | ||
894 | # Library routines | ||
895 | # | ||
896 | CONFIG_BITREVERSE=y | ||
897 | -# CONFIG_CRC_CCITT is not set | ||
898 | +CONFIG_CRC_CCITT=m | ||
899 | # CONFIG_CRC16 is not set | ||
900 | # CONFIG_CRC_ITU_T is not set | ||
901 | CONFIG_CRC32=y | ||
902 | +# CONFIG_CRC7 is not set | ||
903 | # CONFIG_LIBCRC32C is not set | ||
904 | CONFIG_ZLIB_INFLATE=y | ||
905 | CONFIG_ZLIB_DEFLATE=y | ||
906 | diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig | ||
907 | index 5ebec6d..2957cb9 100644 | ||
908 | --- a/arch/arm/mach-pxa/Kconfig | ||
909 | +++ b/arch/arm/mach-pxa/Kconfig | ||
910 | @@ -148,4 +148,12 @@ config PXA_SSP | ||
911 | tristate | ||
912 | help | ||
913 | Enable support for PXA2xx SSP ports | ||
914 | + | ||
915 | +config PXA_PWR_I2C | ||
916 | + bool "Simple Power I2C interface" | ||
917 | + depends on PXA27x | ||
918 | + help | ||
919 | + Enable support for PXA27x Power I2C interface. This driver | ||
920 | + enables very simple blocking access to Power I2C, which | ||
921 | + might be useful for early access to Power Management ICs. | ||
922 | endif | ||
923 | diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile | ||
924 | index 7d6ab5c..2d7a431 100644 | ||
925 | --- a/arch/arm/mach-pxa/Makefile | ||
926 | +++ b/arch/arm/mach-pxa/Makefile | ||
927 | @@ -18,7 +18,7 @@ obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o sp | ||
928 | obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o | ||
929 | obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o | ||
930 | obj-$(CONFIG_MACH_TOSA) += tosa.o | ||
931 | -obj-$(CONFIG_MACH_EM_X270) += em-x270.o | ||
932 | +obj-$(CONFIG_MACH_EM_X270) += em-x270.o em-x270-pm.o em-x270-lcd.o em-x270-devices.o | ||
933 | |||
934 | # Support for blinky lights | ||
935 | led-y := leds.o | ||
936 | @@ -29,9 +29,16 @@ led-$(CONFIG_MACH_TRIZEPS4) += leds-trizeps4.o | ||
937 | |||
938 | obj-$(CONFIG_LEDS) += $(led-y) | ||
939 | |||
940 | +# CPU Frequency scaling | ||
941 | +obj-$(CONFIG_CPU_FREQ_PXA) += cpu-pxa.o | ||
942 | + | ||
943 | # Misc features | ||
944 | obj-$(CONFIG_PM) += pm.o sleep.o | ||
945 | obj-$(CONFIG_PXA_SSP) += ssp.o | ||
946 | +obj-$(CONFIG_PXA_PWR_I2C) += pwr-i2c.o | ||
947 | + | ||
948 | +#obj-m += da9030_asm.o | ||
949 | +#da9030_asm-y += da9030.o da9030_c.o | ||
950 | |||
951 | ifeq ($(CONFIG_PXA27x),y) | ||
952 | obj-$(CONFIG_PM) += standby.o | ||
953 | diff --git a/arch/arm/mach-pxa/cpu-pxa.c b/arch/arm/mach-pxa/cpu-pxa.c | ||
954 | new file mode 100644 | ||
955 | index 0000000..7fa9703 | ||
956 | --- /dev/null | ||
957 | +++ b/arch/arm/mach-pxa/cpu-pxa.c | ||
958 | @@ -0,0 +1,442 @@ | ||
959 | +/* | ||
960 | + * linux/arch/arm/mach-pxa/cpu-pxa.c | ||
961 | + * | ||
962 | + * Copyright (C) 2002,2003 Intrinsyc Software | ||
963 | + * | ||
964 | + * This program is free software; you can redistribute it and/or modify | ||
965 | + * it under the terms of the GNU General Public License as published by | ||
966 | + * the Free Software Foundation; either version 2 of the License, or | ||
967 | + * (at your option) any later version. | ||
968 | + * | ||
969 | + * This program is distributed in the hope that it will be useful, | ||
970 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
971 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
972 | + * GNU General Public License for more details. | ||
973 | + * | ||
974 | + * You should have received a copy of the GNU General Public License | ||
975 | + * along with this program; if not, write to the Free Software | ||
976 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
977 | + * | ||
978 | + * History: | ||
979 | + * 31-Jul-2002 : Initial version [FB] | ||
980 | + * 29-Jan-2003 : added PXA255 support [FB] | ||
981 | + * 20-Apr-2003 : ported to v2.5 (Dustin McIntire, Sensoria Corp.) | ||
982 | + * 11-Jan-2006 : v2.6, support for PXA27x processor up to 624MHz (Bill Reese, Hewlett Packard) | ||
983 | + * | ||
984 | + * Note: | ||
985 | + * This driver may change the memory bus clock rate, but will not do any | ||
986 | + * platform specific access timing changes... for example if you have flash | ||
987 | + * memory connected to CS0, you will need to register a platform specific | ||
988 | + * notifier which will adjust the memory access strobes to maintain a | ||
989 | + * minimum strobe width. | ||
990 | + * | ||
991 | + */ | ||
992 | + | ||
993 | +#include <linux/kernel.h> | ||
994 | +#include <linux/module.h> | ||
995 | +#include <linux/sched.h> | ||
996 | +#include <linux/init.h> | ||
997 | +#include <linux/cpufreq.h> | ||
998 | + | ||
999 | +#include <asm/hardware.h> | ||
1000 | + | ||
1001 | +#include <asm/arch/pxa-regs.h> | ||
1002 | + | ||
1003 | +/* | ||
1004 | + * This comes from generic.h in this directory. | ||
1005 | + */ | ||
1006 | +extern unsigned int get_clk_frequency_khz(int info); | ||
1007 | + | ||
1008 | +#define DEBUG 0 | ||
1009 | + | ||
1010 | +#ifdef DEBUG | ||
1011 | + static unsigned int freq_debug = DEBUG; | ||
1012 | + module_param(freq_debug, int, 0644); | ||
1013 | + MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); | ||
1014 | +#else | ||
1015 | + #define freq_debug 0 | ||
1016 | +#endif | ||
1017 | + | ||
1018 | +typedef struct | ||
1019 | +{ | ||
1020 | + unsigned int khz; /* CPU frequency */ | ||
1021 | + unsigned int membus; /* memory bus frequency */ | ||
1022 | + unsigned int cccr; /* new CCLKCFG setting */ | ||
1023 | + unsigned int div2; /* alter memory controller settings to divide by 2 */ | ||
1024 | + unsigned int cclkcfg; /* new CCLKCFG setting */ | ||
1025 | +} pxa_freqs_t; | ||
1026 | + | ||
1027 | +/* Define the refresh period in mSec for the SDRAM and the number of rows */ | ||
1028 | +#define SDRAM_TREF 64 /* standard 64ms SDRAM */ | ||
1029 | +#if defined(CONFIG_MACH_H4700) || defined(CONFIG_ARCH_H2200) || defined(CONFIG_MACH_MAGICIAN) | ||
1030 | +#define SDRAM_ROWS 8192 /* hx4700 uses 2 64Mb DRAMs, 8912 rows */ | ||
1031 | +#else | ||
1032 | +#define SDRAM_ROWS 4096 /* 64MB=8192 32MB=4096 */ | ||
1033 | +#endif | ||
1034 | +#define MDREFR_DRI(x) (((x*SDRAM_TREF/SDRAM_ROWS - 31)/32)) | ||
1035 | + | ||
1036 | +#define CCLKCFG_TURBO 0x1 | ||
1037 | +#define CCLKCFG_FCS 0x2 | ||
1038 | +#define CCLKCFG_HALFTURBO 0x4 | ||
1039 | +#define CCLKCFG_FASTBUS 0x8 | ||
1040 | +#ifdef CONFIG_ARCH_H5400 | ||
1041 | +/* H5400's SAMCOP chip does not like when K2DB2 touched */ | ||
1042 | +#define MDREFR_DB2_MASK (MDREFR_K1DB2) | ||
1043 | +#else | ||
1044 | +#define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2) | ||
1045 | +#endif | ||
1046 | +#define MDREFR_DRI_MASK 0xFFF | ||
1047 | +#define PXA25x_CCLKCFG CCLKCFG_TURBO | CCLKCFG_FCS | ||
1048 | + | ||
1049 | +/* | ||
1050 | + * For the PXA27x: | ||
1051 | + * Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG. | ||
1052 | + * | ||
1053 | + * A = 0 => memory controller clock from table 3-7, | ||
1054 | + * A = 1 => memory controller clock = system bus clock | ||
1055 | + * Run mode frequency = 13 MHz * L | ||
1056 | + * Turbo mode frequency = 13 MHz * L * N | ||
1057 | + * System bus frequency = 13 MHz * L / (B + 1) | ||
1058 | + * System initialized by bootldr to: | ||
1059 | + * | ||
1060 | + * In CCCR: | ||
1061 | + * A = 1 | ||
1062 | + * L = 16 oscillator to run mode ratio | ||
1063 | + * 2N = 6 2 * (turbo mode to run mode ratio) | ||
1064 | + * | ||
1065 | + * In CCLKCFG: | ||
1066 | + * B = 1 Fast bus mode | ||
1067 | + * HT = 0 Half-Turbo mode | ||
1068 | + * T = 1 Turbo mode | ||
1069 | + * | ||
1070 | + * For now, just support some of the combinations in table 3-7 of | ||
1071 | + * PXA27x Processor Family Developer's Manual to simplify frequency | ||
1072 | + * change sequences. | ||
1073 | + * | ||
1074 | + * Specify 2N in the PXA27x_CCCR macro, not N! | ||
1075 | + */ | ||
1076 | +#define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L) | ||
1077 | +#define PXA27x_CCLKCFG(B, HT, T) (B << 3 | HT << 2 | CCLKCFG_FCS | T) | ||
1078 | + | ||
1079 | +#define PXA25x_CCCR(L, M, N) (L << 0 | M << 5 | N << 7) | ||
1080 | + | ||
1081 | +/* | ||
1082 | + * Valid frequency assignments | ||
1083 | + */ | ||
1084 | +static pxa_freqs_t pxa2xx_freqs[] = | ||
1085 | +{ | ||
1086 | + /* CPU MEMBUS CCCR DIV2 */ | ||
1087 | +#if defined(CONFIG_PXA25x) | ||
1088 | +#if defined(CONFIG_PXA25x_ALTERNATE_FREQS) | ||
1089 | + { 99500, 99500, PXA25x_CCCR(1, 1, 2), 1, PXA25x_CCLKCFG}, /* run=99, turbo= 99, PXbus=50, SDRAM=50 */ | ||
1090 | + {199100, 99500, PXA25x_CCCR(1, 1, 4), 0, PXA25x_CCLKCFG}, /* run=99, turbo=199, PXbus=50, SDRAM=99 */ | ||
1091 | + {298500, 99500, PXA25x_CCCR(1, 1, 6), 0, PXA25x_CCLKCFG}, /* run=99, turbo=287, PXbus=50, SDRAM=99 */ | ||
1092 | + {298600, 99500, PXA25x_CCCR(1, 2, 3), 0, PXA25x_CCLKCFG}, /* run=199, turbo=287, PXbus=99, SDRAM=99 */ | ||
1093 | + {398100, 99500, PXA25x_CCCR(1, 2, 4), 0, PXA25x_CCLKCFG} /* run=199, turbo=398, PXbus=99, SDRAM=99 */ | ||
1094 | +#else | ||
1095 | + { 99500, 99500, PXA25x_CCCR(1, 1, 2), 1, PXA25x_CCLKCFG}, /* run= 99, turbo= 99, PXbus=50, SDRAM=50 */ | ||
1096 | + {132700, 132700, PXA25x_CCCR(3, 1, 2), 1, PXA25x_CCLKCFG}, /* run=133, turbo=133, PXbus=66, SDRAM=66 */ | ||
1097 | + {199100, 99500, PXA25x_CCCR(1, 2, 2), 0, PXA25x_CCLKCFG}, /* run=199, turbo=199, PXbus=99, SDRAM=99 */ | ||
1098 | + {265400, 132700, PXA25x_CCCR(3, 2, 2), 1, PXA25x_CCLKCFG}, /* run=265, turbo=265, PXbus=133, SDRAM=66 */ | ||
1099 | + {331800, 165900, PXA25x_CCCR(5, 2, 2), 1, PXA25x_CCLKCFG}, /* run=331, turbo=331, PXbus=166, SDRAM=83 */ | ||
1100 | + {398100, 99500, PXA25x_CCCR(1, 3, 2), 0, PXA25x_CCLKCFG} /* run=398, turbo=398, PXbus=196, SDRAM=99 */ | ||
1101 | +#endif | ||
1102 | +#elif defined(CONFIG_PXA27x) | ||
1103 | + {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, PXA27x_CCLKCFG(1, 0, 1)}, | ||
1104 | + {156000, 104000, PXA27x_CCCR(1, 8, 6), 0, PXA27x_CCLKCFG(1, 1, 1)}, | ||
1105 | + {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, PXA27x_CCLKCFG(0, 0, 1)}, | ||
1106 | + {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, PXA27x_CCLKCFG(1, 0, 1)}, | ||
1107 | + {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, PXA27x_CCLKCFG(1, 0, 1)}, | ||
1108 | + {520000, 208000, PXA27x_CCCR(1, 16, 5), 1, PXA27x_CCLKCFG(1, 0, 1)}, | ||
1109 | +/* {624000, 208000, PXA27x_CCCR(1, 16, 6), 1, PXA27x_CCLKCFG(1, 0, 1)} */ | ||
1110 | +#endif | ||
1111 | +}; | ||
1112 | +#define NUM_FREQS (sizeof(pxa2xx_freqs)/sizeof(pxa_freqs_t)) | ||
1113 | + | ||
1114 | +static struct cpufreq_frequency_table pxa2xx_freq_table[NUM_FREQS+1]; | ||
1115 | + | ||
1116 | +/* Return the memory clock rate for a given cpu frequency. */ | ||
1117 | +int pxa_cpufreq_memclk(int cpu_khz) | ||
1118 | +{ | ||
1119 | + int i; | ||
1120 | + int freq_mem = 0; | ||
1121 | + | ||
1122 | + for (i = 0; i < NUM_FREQS; i++) { | ||
1123 | + if (pxa2xx_freqs[i].khz == cpu_khz) { | ||
1124 | + freq_mem = pxa2xx_freqs[i].membus; | ||
1125 | + break; | ||
1126 | + } | ||
1127 | + } | ||
1128 | + | ||
1129 | + return freq_mem; | ||
1130 | +} | ||
1131 | +EXPORT_SYMBOL(pxa_cpufreq_memclk); | ||
1132 | + | ||
1133 | + | ||
1134 | +/* find a valid frequency point */ | ||
1135 | +static int pxa_verify_policy(struct cpufreq_policy *policy) | ||
1136 | +{ | ||
1137 | + int ret; | ||
1138 | + | ||
1139 | + ret=cpufreq_frequency_table_verify(policy, pxa2xx_freq_table); | ||
1140 | + | ||
1141 | + if(freq_debug) { | ||
1142 | + printk("Verified CPU policy: %dKhz min to %dKhz max\n", | ||
1143 | + policy->min, policy->max); | ||
1144 | + } | ||
1145 | + | ||
1146 | + return ret; | ||
1147 | +} | ||
1148 | + | ||
1149 | +static int pxa_set_target(struct cpufreq_policy *policy, | ||
1150 | + unsigned int target_freq, | ||
1151 | + unsigned int relation) | ||
1152 | +{ | ||
1153 | + int idx; | ||
1154 | + cpumask_t cpus_allowed, allowedcpuset; | ||
1155 | + int cpu = policy->cpu; | ||
1156 | + struct cpufreq_freqs freqs; | ||
1157 | + unsigned long flags; | ||
1158 | + unsigned int unused; | ||
1159 | + unsigned int preset_mdrefr, postset_mdrefr, cclkcfg; | ||
1160 | + | ||
1161 | + if(freq_debug) { | ||
1162 | + printk ("CPU PXA: target freq %d\n", target_freq); | ||
1163 | + printk ("CPU PXA: relation %d\n", relation); | ||
1164 | + } | ||
1165 | + | ||
1166 | + /* | ||
1167 | + * Save this threads cpus_allowed mask. | ||
1168 | + */ | ||
1169 | + cpus_allowed = current->cpus_allowed; | ||
1170 | + | ||
1171 | + /* | ||
1172 | + * Bind to the specified CPU. When this call returns, | ||
1173 | + * we should be running on the right CPU. | ||
1174 | + */ | ||
1175 | + cpus_clear (allowedcpuset); | ||
1176 | + cpu_set (cpu, allowedcpuset); | ||
1177 | + set_cpus_allowed(current, allowedcpuset); | ||
1178 | + BUG_ON(cpu != smp_processor_id()); | ||
1179 | + | ||
1180 | + /* Lookup the next frequency */ | ||
1181 | + if (cpufreq_frequency_table_target(policy, pxa2xx_freq_table, | ||
1182 | + target_freq, relation, &idx)) { | ||
1183 | + return -EINVAL; | ||
1184 | + } | ||
1185 | + | ||
1186 | + freqs.old = policy->cur; | ||
1187 | + freqs.new = pxa2xx_freqs[idx].khz; | ||
1188 | + freqs.cpu = policy->cpu; | ||
1189 | + if(freq_debug) { | ||
1190 | + printk(KERN_INFO "Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", | ||
1191 | + freqs.new/1000, (pxa2xx_freqs[idx].div2) ? | ||
1192 | + (pxa2xx_freqs[idx].membus/2000) : | ||
1193 | + (pxa2xx_freqs[idx].membus/1000)); | ||
1194 | + } | ||
1195 | + | ||
1196 | + /* | ||
1197 | + * Tell everyone what we're about to do... | ||
1198 | + * you should add a notify client with any platform specific | ||
1199 | + * Vcc changing capability | ||
1200 | + */ | ||
1201 | + cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
1202 | + | ||
1203 | + /* Calculate the next MDREFR. If we're slowing down the SDRAM clock | ||
1204 | + * we need to preset the smaller DRI before the change. If we're speeding | ||
1205 | + * up we need to set the larger DRI value after the change. | ||
1206 | + */ | ||
1207 | + preset_mdrefr = postset_mdrefr = MDREFR; | ||
1208 | + if((MDREFR & MDREFR_DRI_MASK) > MDREFR_DRI(pxa2xx_freqs[idx].membus)) { | ||
1209 | + preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK) | | ||
1210 | + MDREFR_DRI(pxa2xx_freqs[idx].membus); | ||
1211 | + } | ||
1212 | + postset_mdrefr = (postset_mdrefr & ~MDREFR_DRI_MASK) | | ||
1213 | + MDREFR_DRI(pxa2xx_freqs[idx].membus); | ||
1214 | + | ||
1215 | + /* If we're dividing the memory clock by two for the SDRAM clock, this | ||
1216 | + * must be set prior to the change. Clearing the divide must be done | ||
1217 | + * after the change. | ||
1218 | + */ | ||
1219 | + if(pxa2xx_freqs[idx].div2) { | ||
1220 | + /* | ||
1221 | + * Potentially speeding up memory clock, so slow down the memory | ||
1222 | + * before speeding up the clock. | ||
1223 | + */ | ||
1224 | + preset_mdrefr |= MDREFR_DB2_MASK | MDREFR_K0DB4; | ||
1225 | + preset_mdrefr &= ~MDREFR_K0DB2; | ||
1226 | + | ||
1227 | + postset_mdrefr |= MDREFR_DB2_MASK | MDREFR_K0DB4; | ||
1228 | + postset_mdrefr &= ~MDREFR_K0DB2; | ||
1229 | + } else { | ||
1230 | + /* | ||
1231 | + * Potentially slowing down memory clock. Wait until after the change | ||
1232 | + * to speed up the memory. | ||
1233 | + */ | ||
1234 | + postset_mdrefr &= ~MDREFR_DB2_MASK; | ||
1235 | + postset_mdrefr &= ~MDREFR_K0DB4; | ||
1236 | + postset_mdrefr |= MDREFR_K0DB2; | ||
1237 | + } | ||
1238 | + | ||
1239 | + cclkcfg = pxa2xx_freqs[idx].cclkcfg; | ||
1240 | + | ||
1241 | + if (freq_debug) { | ||
1242 | + printk (KERN_INFO "CPU PXA writing 0x%08x to CCCR\n", | ||
1243 | + pxa2xx_freqs[idx].cccr); | ||
1244 | + printk (KERN_INFO "CPU PXA writing 0x%08x to CCLKCFG\n", | ||
1245 | + pxa2xx_freqs[idx].cclkcfg); | ||
1246 | + printk (KERN_INFO "CPU PXA writing 0x%08x to MDREFR before change\n", | ||
1247 | + preset_mdrefr); | ||
1248 | + printk (KERN_INFO "CPU PXA writing 0x%08x to MDREFR after change\n", | ||
1249 | + postset_mdrefr); | ||
1250 | + } | ||
1251 | + | ||
1252 | + local_irq_save(flags); | ||
1253 | + | ||
1254 | + /* Set new the CCCR */ | ||
1255 | + CCCR = pxa2xx_freqs[idx].cccr; | ||
1256 | + | ||
1257 | + /* | ||
1258 | + * Should really set both of PMCR[xIDAE] while changing the core frequency | ||
1259 | + */ | ||
1260 | + | ||
1261 | + /* | ||
1262 | + * TODO: On the PXA27x: If we're setting half-turbo mode and changing the | ||
1263 | + * core frequency at the same time we must split it up into two operations. | ||
1264 | + * The current values in the pxa2xx_freqs table don't do this, so the code | ||
1265 | + * is unimplemented. | ||
1266 | + */ | ||
1267 | + | ||
1268 | + __asm__ __volatile__(" \ | ||
1269 | + ldr r4, [%1] ; /* load MDREFR */ \ | ||
1270 | + b 2f ; \ | ||
1271 | + .align 5 ; \ | ||
1272 | +1: \ | ||
1273 | + str %3, [%1] ; /* preset the MDREFR */ \ | ||
1274 | + mcr p14, 0, %2, c6, c0, 0 ; /* set CCLKCFG[FCS] */ \ | ||
1275 | + str %4, [%1] ; /* postset the MDREFR */ \ | ||
1276 | + \ | ||
1277 | + b 3f ; \ | ||
1278 | +2: b 1b ; \ | ||
1279 | +3: nop ; \ | ||
1280 | + " | ||
1281 | + : "=&r" (unused) | ||
1282 | + : "r" (&MDREFR), "r" (cclkcfg), \ | ||
1283 | + "r" (preset_mdrefr), "r" (postset_mdrefr) | ||
1284 | + : "r4", "r5"); | ||
1285 | + local_irq_restore(flags); | ||
1286 | + | ||
1287 | + if (freq_debug) { | ||
1288 | + printk (KERN_INFO "CPU PXA Frequency change successful\n"); | ||
1289 | + printk (KERN_INFO "CPU PXA new CCSR 0x%08x\n", CCSR); | ||
1290 | + } | ||
1291 | + | ||
1292 | + /* | ||
1293 | + * Restore the CPUs allowed mask. | ||
1294 | + */ | ||
1295 | + set_cpus_allowed(current, cpus_allowed); | ||
1296 | + | ||
1297 | + /* | ||
1298 | + * Tell everyone what we've just done... | ||
1299 | + * you should add a notify client with any platform specific | ||
1300 | + * SDRAM refresh timer adjustments | ||
1301 | + */ | ||
1302 | + cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
1303 | + | ||
1304 | + return 0; | ||
1305 | +} | ||
1306 | + | ||
1307 | +static int pxa_cpufreq_init(struct cpufreq_policy *policy) | ||
1308 | +{ | ||
1309 | + cpumask_t cpus_allowed, allowedcpuset; | ||
1310 | + unsigned int cpu = policy->cpu; | ||
1311 | + int i; | ||
1312 | + unsigned int cclkcfg; | ||
1313 | + | ||
1314 | + cpus_allowed = current->cpus_allowed; | ||
1315 | + | ||
1316 | + cpus_clear (allowedcpuset); | ||
1317 | + cpu_set (cpu, allowedcpuset); | ||
1318 | + set_cpus_allowed(current, allowedcpuset); | ||
1319 | + BUG_ON(cpu != smp_processor_id()); | ||
1320 | + | ||
1321 | + /* set default governor and cpuinfo */ | ||
1322 | + policy->governor = CPUFREQ_DEFAULT_GOVERNOR; | ||
1323 | + policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ | ||
1324 | + policy->cur = get_clk_frequency_khz(0); /* current freq */ | ||
1325 | + | ||
1326 | + /* Generate the cpufreq_frequency_table struct */ | ||
1327 | + for(i=0;i<NUM_FREQS;i++) { | ||
1328 | + pxa2xx_freq_table[i].frequency = pxa2xx_freqs[i].khz; | ||
1329 | + pxa2xx_freq_table[i].index = i; | ||
1330 | + } | ||
1331 | + pxa2xx_freq_table[i].frequency = CPUFREQ_TABLE_END; | ||
1332 | + | ||
1333 | + /* | ||
1334 | + * Set the policy's minimum and maximum frequencies from the tables | ||
1335 | + * just constructed. This sets cpuinfo.mxx_freq, min and max. | ||
1336 | + */ | ||
1337 | + cpufreq_frequency_table_cpuinfo (policy, pxa2xx_freq_table); | ||
1338 | + | ||
1339 | + set_cpus_allowed(current, cpus_allowed); | ||
1340 | + printk(KERN_INFO "PXA CPU frequency change support initialized\n"); | ||
1341 | + | ||
1342 | + if (freq_debug) { | ||
1343 | + printk (KERN_INFO "PXA CPU initial CCCR 0x%08x\n", CCCR); | ||
1344 | + asm | ||
1345 | + ( | ||
1346 | + "mrc p14, 0, %0, c6, c0, 0 ; /* read CCLKCFG from CP14 */ " | ||
1347 | + : "=r" (cclkcfg) : | ||
1348 | + ); | ||
1349 | + printk ("PXA CPU initial CCLKCFG 0x%08x\n", cclkcfg); | ||
1350 | + printk ("PXA CPU initial MDREFR 0x%08x\n", MDREFR); | ||
1351 | + } | ||
1352 | + | ||
1353 | + return 0; | ||
1354 | +} | ||
1355 | + | ||
1356 | +static unsigned int pxa_cpufreq_get(unsigned int cpu) | ||
1357 | +{ | ||
1358 | + cpumask_t cpumask_saved; | ||
1359 | + unsigned int cur_freq; | ||
1360 | + | ||
1361 | + cpumask_saved = current->cpus_allowed; | ||
1362 | + set_cpus_allowed(current, cpumask_of_cpu(cpu)); | ||
1363 | + BUG_ON(cpu != smp_processor_id()); | ||
1364 | + | ||
1365 | + cur_freq = get_clk_frequency_khz(0); | ||
1366 | + | ||
1367 | + set_cpus_allowed(current, cpumask_saved); | ||
1368 | + | ||
1369 | + return cur_freq; | ||
1370 | +} | ||
1371 | + | ||
1372 | +static struct cpufreq_driver pxa_cpufreq_driver = { | ||
1373 | + .verify = pxa_verify_policy, | ||
1374 | + .target = pxa_set_target, | ||
1375 | + .init = pxa_cpufreq_init, | ||
1376 | + .get = pxa_cpufreq_get, | ||
1377 | +#if defined(CONFIG_PXA25x) | ||
1378 | + .name = "PXA25x", | ||
1379 | +#elif defined(CONFIG_PXA27x) | ||
1380 | + .name = "PXA27x", | ||
1381 | +#endif | ||
1382 | +}; | ||
1383 | + | ||
1384 | +static int __init pxa_cpu_init(void) | ||
1385 | +{ | ||
1386 | + return cpufreq_register_driver(&pxa_cpufreq_driver); | ||
1387 | +} | ||
1388 | + | ||
1389 | +static void __exit pxa_cpu_exit(void) | ||
1390 | +{ | ||
1391 | + cpufreq_unregister_driver(&pxa_cpufreq_driver); | ||
1392 | +} | ||
1393 | + | ||
1394 | + | ||
1395 | +MODULE_AUTHOR ("Intrinsyc Software Inc."); | ||
1396 | +MODULE_DESCRIPTION ("CPU frequency changing driver for the PXA architecture"); | ||
1397 | +MODULE_LICENSE("GPL"); | ||
1398 | +module_init(pxa_cpu_init); | ||
1399 | +module_exit(pxa_cpu_exit); | ||
1400 | + | ||
1401 | diff --git a/arch/arm/mach-pxa/em-x270-devices.c b/arch/arm/mach-pxa/em-x270-devices.c | ||
1402 | new file mode 100644 | ||
1403 | index 0000000..d142930 | ||
1404 | --- /dev/null | ||
1405 | +++ b/arch/arm/mach-pxa/em-x270-devices.c | ||
1406 | @@ -0,0 +1,331 @@ | ||
1407 | +/* | ||
1408 | + * Support for CompuLab EM-X270 platfrom specific device | ||
1409 | + * initialization, and per-device power management functions. | ||
1410 | + * | ||
1411 | + * Copyright (C) 2007 CompuLab, Ltd. | ||
1412 | + * Author: Mike Rapoport <mike@compulab.co.il> | ||
1413 | + * | ||
1414 | + * This program is free software; you can redistribute it and/or modify | ||
1415 | + * it under the terms of the GNU General Public License version 2 as | ||
1416 | + * published by the Free Software Foundation. | ||
1417 | + */ | ||
1418 | + | ||
1419 | +#include <linux/module.h> | ||
1420 | +#include <linux/platform_device.h> | ||
1421 | +#include <linux/sysfs.h> | ||
1422 | +#include <linux/ctype.h> | ||
1423 | +#include <linux/delay.h> | ||
1424 | +#include <linux/da9030.h> | ||
1425 | +#include <linux/interrupt.h> | ||
1426 | +#include <linux/irq.h> | ||
1427 | + | ||
1428 | +#include "../../../drivers/i2c/chips/da9030.h" | ||
1429 | + | ||
1430 | +#include <asm/arch/hardware.h> | ||
1431 | +#include <asm/arch/pxa-regs.h> | ||
1432 | + | ||
1433 | +struct em_x270_dev_data { | ||
1434 | + int (*is_on)(struct device *dev); | ||
1435 | + int (*set_on)(struct device *dev, int on); | ||
1436 | + int (*get_opts)(struct device *dev, | ||
1437 | + struct device_attribute *attr, | ||
1438 | + char *buf); | ||
1439 | + int (*set_opts)(struct device *dev, int opts); | ||
1440 | +}; | ||
1441 | + | ||
1442 | +static void em_x270_dev_release(struct device * dev) | ||
1443 | +{ | ||
1444 | + | ||
1445 | +} | ||
1446 | + | ||
1447 | +static ssize_t em_x270_dev_pm_show(struct device *dev, | ||
1448 | + struct device_attribute *attr, | ||
1449 | + char *buf) | ||
1450 | +{ | ||
1451 | + struct em_x270_dev_data *pm_data = dev->platform_data; | ||
1452 | + int is_on = pm_data->is_on(dev); | ||
1453 | + | ||
1454 | + return sprintf(buf, "%d\n", is_on); | ||
1455 | +} | ||
1456 | + | ||
1457 | +static ssize_t em_x270_dev_pm_store(struct device *dev, | ||
1458 | + struct device_attribute *attr, | ||
1459 | + const char *buf, size_t count) | ||
1460 | +{ | ||
1461 | + char *endp; | ||
1462 | + int on = simple_strtoul(buf, &endp, 0); | ||
1463 | + size_t size = endp - buf; | ||
1464 | + struct em_x270_dev_data *pm_data = dev->platform_data; | ||
1465 | + | ||
1466 | + pr_info("%s: %s\n", __FUNCTION__, buf); | ||
1467 | + | ||
1468 | + if (*endp && isspace(*endp)) | ||
1469 | + size++; | ||
1470 | + if (size != count) | ||
1471 | + return -EINVAL; | ||
1472 | + | ||
1473 | + pm_data->set_on(dev, on); | ||
1474 | + | ||
1475 | + return count; | ||
1476 | +} | ||
1477 | + | ||
1478 | +static DEVICE_ATTR(pwr_on, S_IWUSR | S_IRUGO, | ||
1479 | + em_x270_dev_pm_show, em_x270_dev_pm_store); | ||
1480 | + | ||
1481 | +static int gprs_is_on(struct device *dev) | ||
1482 | +{ | ||
1483 | + return !!(pxa_gpio_get_value(20)); | ||
1484 | +} | ||
1485 | + | ||
1486 | +static int gprs_set_on(struct device *dev, int on) | ||
1487 | +{ | ||
1488 | + pr_info("%s: on = %d\n", __FUNCTION__, on); | ||
1489 | + if (on) { | ||
1490 | + pxa_gpio_mode(20 | GPIO_OUT | GPIO_DFLT_HIGH); | ||
1491 | + mdelay(500); | ||
1492 | + pxa_gpio_set_value(82, 0); | ||
1493 | + mdelay(500); | ||
1494 | + pxa_gpio_mode(82 | GPIO_OUT | GPIO_DFLT_HIGH); | ||
1495 | + mdelay(1000); | ||
1496 | + pxa_gpio_set_value(82, 0); | ||
1497 | + } | ||
1498 | + else { | ||
1499 | + pxa_gpio_set_value(20, 0); | ||
1500 | + pxa_gpio_mode(20 | GPIO_OUT); | ||
1501 | + } | ||
1502 | + | ||
1503 | + return 0; | ||
1504 | +} | ||
1505 | + | ||
1506 | +static struct em_x270_dev_data em_x270_gprs_data = { | ||
1507 | + .is_on = gprs_is_on, | ||
1508 | + .set_on = gprs_set_on, | ||
1509 | +}; | ||
1510 | + | ||
1511 | +static struct platform_device em_x270_gprs = { | ||
1512 | + .name = "gprs", | ||
1513 | + .id = -1, | ||
1514 | + .dev = { | ||
1515 | + .platform_data = &em_x270_gprs_data, | ||
1516 | + .release = em_x270_dev_release, | ||
1517 | + }, | ||
1518 | +}; | ||
1519 | + | ||
1520 | +static int is_wlan_on; | ||
1521 | + | ||
1522 | +static int wlan_is_on(struct device *dev) | ||
1523 | +{ | ||
1524 | + return is_wlan_on; | ||
1525 | +} | ||
1526 | + | ||
1527 | +static int wlan_set_on(struct device *dev, int on) | ||
1528 | +{ | ||
1529 | + if (on) { | ||
1530 | + /* WLAN power-up sequence */ | ||
1531 | + /* Mask LDO17 and LDO19 tolerance events */ | ||
1532 | + da9030_set_reg(IRQ_MASK_C, | ||
1533 | + IRQ_MASK_C_LDO19 | IRQ_MASK_C_LDO17); | ||
1534 | + | ||
1535 | + /* Force I2C control over LDO17, LDO19 */ | ||
1536 | + da9030_set_reg(SLEEP_CONTROL, | ||
1537 | + APP_SLEEP_CTL_BYPASS_LDO19 | | ||
1538 | + APP_SLEEP_CTL_BYPASS_LDO17); | ||
1539 | + | ||
1540 | + /* Turn off LDO17 and LDO19 */ | ||
1541 | + da9030_set_reg(REG_CONTROL_1_17, | ||
1542 | + RC1_LDO16_EN | RC1_LDO15_EN | | ||
1543 | + RC1_LDO11_EN | RC1_LDO10_EN | RC1_BUCK2_EN); | ||
1544 | + da9030_set_reg(REG_CONTROL_2_18, RC2_SIMCP_EN | RC2_LDO18_EN); | ||
1545 | + | ||
1546 | + /* Set LDO17 voltage to 3V (VCC_WLAN_IO) */ | ||
1547 | + da9030_set_reg(LDO_17_SIMCP0, LDO_17_SIMCP0_LDO17_3V); | ||
1548 | + mdelay(200); | ||
1549 | + | ||
1550 | + /* Turn WLAN RF power on */ | ||
1551 | + pxa_gpio_mode(115 | GPIO_OUT | GPIO_DFLT_HIGH); | ||
1552 | + | ||
1553 | + /* Turn LDO17 on */ | ||
1554 | + da9030_set_reg(REG_CONTROL_1_17, | ||
1555 | + RC1_LDO17_EN| RC1_LDO16_EN | RC1_LDO15_EN | | ||
1556 | + RC1_LDO11_EN | RC1_LDO10_EN | RC1_BUCK2_EN); | ||
1557 | + mdelay(200); | ||
1558 | + | ||
1559 | + /* Turn on LDO19 */ | ||
1560 | + da9030_set_reg(REG_CONTROL_2_18, | ||
1561 | + RC2_SIMCP_EN | RC2_LDO18_EN | RC2_LDO19_EN); | ||
1562 | + | ||
1563 | + } | ||
1564 | + else { | ||
1565 | + /* FIXME: implement BGW shutdown */ | ||
1566 | + } | ||
1567 | + is_wlan_on = on; | ||
1568 | + | ||
1569 | + return 0; | ||
1570 | +} | ||
1571 | + | ||
1572 | +static struct em_x270_dev_data em_x270_wlan_data = { | ||
1573 | + .is_on = wlan_is_on, | ||
1574 | + .set_on = wlan_set_on, | ||
1575 | +}; | ||
1576 | + | ||
1577 | +static struct platform_device em_x270_wlan = { | ||
1578 | + .name = "wlan", | ||
1579 | + .id = -1, | ||
1580 | + .dev = { | ||
1581 | + .platform_data = &em_x270_wlan_data, | ||
1582 | + .release = em_x270_dev_release, | ||
1583 | + }, | ||
1584 | +}; | ||
1585 | + | ||
1586 | +static int gps_is_on(struct device *dev) | ||
1587 | +{ | ||
1588 | + int val = da9030_get_reg(REG_CONTROL_1_97); | ||
1589 | + return !!(val & RC3_LDO3_EN); | ||
1590 | +} | ||
1591 | + | ||
1592 | +static int gps_set_on(struct device *dev, int on) | ||
1593 | +{ | ||
1594 | + int val = da9030_get_reg(REG_CONTROL_1_97); | ||
1595 | + | ||
1596 | + if (on) | ||
1597 | + val |= RC3_LDO3_EN; | ||
1598 | + else | ||
1599 | + val &= ~RC3_LDO3_EN; | ||
1600 | + da9030_set_reg(REG_CONTROL_1_97, val); | ||
1601 | + | ||
1602 | + return 0; | ||
1603 | +} | ||
1604 | + | ||
1605 | +static struct em_x270_dev_data em_x270_gps_data = { | ||
1606 | + .is_on = gps_is_on, | ||
1607 | + .set_on = gps_set_on, | ||
1608 | +}; | ||
1609 | + | ||
1610 | +static struct platform_device em_x270_gps = { | ||
1611 | + .name = "gps", | ||
1612 | + .id = -1, | ||
1613 | + .dev = { | ||
1614 | + .platform_data = &em_x270_gps_data, | ||
1615 | + .release = em_x270_dev_release, | ||
1616 | + }, | ||
1617 | +}; | ||
1618 | + | ||
1619 | +static int usb_mode; | ||
1620 | +static int usb_host_is_on(struct device *dev) | ||
1621 | +{ | ||
1622 | + return usb_mode; | ||
1623 | +} | ||
1624 | + | ||
1625 | +static int usb_host_set_on(struct device *dev, int on) | ||
1626 | +{ | ||
1627 | + if (on) { | ||
1628 | + da9030_set_reg(MISC_CONTROLB, MISCB_SESSION_VALID_ENABLE); | ||
1629 | + da9030_set_reg(USBPUMP, | ||
1630 | + USB_PUMP_EN_USBVEP | | ||
1631 | + USB_PUMP_EN_USBVE | | ||
1632 | + USB_PUMP_USBVE); | ||
1633 | + | ||
1634 | + /* enable port 2 transiever */ | ||
1635 | + UP2OCR = UP2OCR_HXS | UP2OCR_HXOE; | ||
1636 | + usb_mode = 1; | ||
1637 | + } | ||
1638 | + else { | ||
1639 | + UP2OCR = UP2OCR_DPPUE | UP2OCR_DPPUBE | UP2OCR_HXOE; | ||
1640 | + da9030_set_reg(USBPUMP, | ||
1641 | + USB_PUMP_EN_USBVEP | USB_PUMP_EN_USBVE); | ||
1642 | + usb_mode = 0; | ||
1643 | + } | ||
1644 | + | ||
1645 | + return 0; | ||
1646 | +} | ||
1647 | + | ||
1648 | +static struct em_x270_dev_data em_x270_usb_host_data = { | ||
1649 | + .is_on = usb_host_is_on, | ||
1650 | + .set_on = usb_host_set_on, | ||
1651 | +}; | ||
1652 | + | ||
1653 | +static struct platform_device em_x270_usb_host = { | ||
1654 | + .name = "usb_host", | ||
1655 | + .id = -1, | ||
1656 | + .dev = { | ||
1657 | + .platform_data = &em_x270_usb_host_data, | ||
1658 | + .release = em_x270_dev_release, | ||
1659 | + }, | ||
1660 | +}; | ||
1661 | + | ||
1662 | +static struct platform_device *em_x270_devices[] = { | ||
1663 | + &em_x270_gprs, | ||
1664 | + &em_x270_wlan, | ||
1665 | + &em_x270_gps, | ||
1666 | + &em_x270_usb_host, | ||
1667 | +}; | ||
1668 | + | ||
1669 | +static struct work_struct usb_work; | ||
1670 | +static void usb_worker(struct work_struct *work) | ||
1671 | +{ | ||
1672 | + usb_host_set_on(NULL, !pxa_gpio_get_value(21)); | ||
1673 | +} | ||
1674 | + | ||
1675 | +static irqreturn_t usb_irq_handler(int irq, void *regs) | ||
1676 | +{ | ||
1677 | + schedule_work(&usb_work); | ||
1678 | + | ||
1679 | + pr_info("%s\n", __FUNCTION__); | ||
1680 | + return IRQ_HANDLED; | ||
1681 | +} | ||
1682 | + | ||
1683 | +static int em_x270_devices_init(void) | ||
1684 | +{ | ||
1685 | + int i, ret; | ||
1686 | + | ||
1687 | + for (i = 0; i < ARRAY_SIZE(em_x270_devices); i++ ) { | ||
1688 | + ret = platform_device_register(em_x270_devices[i]); | ||
1689 | + if (ret) { | ||
1690 | + dev_dbg(&em_x270_devices[i]->dev, | ||
1691 | + "Registration failed: %d\n", ret); | ||
1692 | + continue; | ||
1693 | + } | ||
1694 | + | ||
1695 | + ret = device_create_file(&em_x270_devices[i]->dev, | ||
1696 | + &dev_attr_pwr_on); | ||
1697 | + if (ret) { | ||
1698 | + dev_dbg(&em_x270_devices[i]->dev, | ||
1699 | + "PWR_ON attribute failed: %d\n", ret); | ||
1700 | + } | ||
1701 | + | ||
1702 | + dev_dbg(&em_x270_devices[i]->dev, | ||
1703 | + "Registered PWR ON attribute\n"); | ||
1704 | + } | ||
1705 | + | ||
1706 | + /* setup USB detection irq */ | ||
1707 | + INIT_WORK(&usb_work, usb_worker); | ||
1708 | + set_irq_type(IRQ_GPIO(21), IRQT_BOTHEDGE); | ||
1709 | + ret = request_irq(IRQ_GPIO(21), usb_irq_handler, IRQF_DISABLED, | ||
1710 | + "usb detect", 0); | ||
1711 | + if (ret) { | ||
1712 | + pr_info("USB device detection disabled\n"); | ||
1713 | + } | ||
1714 | + else { | ||
1715 | + schedule_work(&usb_work); | ||
1716 | + } | ||
1717 | + | ||
1718 | + return 0; | ||
1719 | +} | ||
1720 | + | ||
1721 | +static void em_x270_devices_exit(void) | ||
1722 | +{ | ||
1723 | + int i; | ||
1724 | + | ||
1725 | + for (i = 0; i < ARRAY_SIZE(em_x270_devices); i++ ) { | ||
1726 | + device_remove_file(&em_x270_devices[i]->dev, | ||
1727 | + &dev_attr_pwr_on); | ||
1728 | + platform_device_unregister(em_x270_devices[i]); | ||
1729 | + } | ||
1730 | +} | ||
1731 | + | ||
1732 | +late_initcall(em_x270_devices_init); | ||
1733 | +module_exit(em_x270_devices_exit); | ||
1734 | + | ||
1735 | +MODULE_AUTHOR("Mike Rapoport"); | ||
1736 | +MODULE_DESCRIPTION("Support for platfrom specific device attributes for EM-X270"); | ||
1737 | +MODULE_LICENSE("GPL"); | ||
1738 | diff --git a/arch/arm/mach-pxa/em-x270-lcd.c b/arch/arm/mach-pxa/em-x270-lcd.c | ||
1739 | new file mode 100644 | ||
1740 | index 0000000..437efe1 | ||
1741 | --- /dev/null | ||
1742 | +++ b/arch/arm/mach-pxa/em-x270-lcd.c | ||
1743 | @@ -0,0 +1,223 @@ | ||
1744 | +/* | ||
1745 | + * LCD initialization and backlight managemnet for EM-X270 | ||
1746 | + * | ||
1747 | + * Copyright (C) 2007 CompuLab, Ltd. | ||
1748 | + * Author: Igor Vaisbein <igor@compulab.co.il> | ||
1749 | + * | ||
1750 | + * This program is free software; you can redistribute it and/or modify | ||
1751 | + * it under the terms of the GNU General Public License version 2 as | ||
1752 | + * published by the Free Software Foundation. | ||
1753 | + * | ||
1754 | + */ | ||
1755 | + | ||
1756 | +#include <linux/module.h> | ||
1757 | +#include <linux/platform_device.h> | ||
1758 | +#include <linux/da9030.h> | ||
1759 | +#include <linux/delay.h> | ||
1760 | + | ||
1761 | +#include <asm/arch/hardware.h> | ||
1762 | +#include <asm/arch/pxa-regs.h> | ||
1763 | +#include <asm/arch/sharpsl.h> | ||
1764 | +#include <asm/arch/ssp.h> | ||
1765 | + | ||
1766 | +#include "devices.h" | ||
1767 | + | ||
1768 | +#define GPIO87_nPCE_2 87 /* Card Enable for Card Space (PXA27x) */ | ||
1769 | +#define GPIO87_nPCE_2_MD (87 | GPIO_ALT_FN_1_IN) | ||
1770 | +#define GPIO87_USB3_1_MD (87 | GPIO_ALT_FN_3_IN) | ||
1771 | +#define GPIO87_SSPTXD2_MD (87 | GPIO_ALT_FN_1_OUT) | ||
1772 | +#define GPIO87_SSFRM2_MD (87 | GPIO_ALT_FN_3_OUT) | ||
1773 | + | ||
1774 | +#define LCCR4 __REG(0x44000010) | ||
1775 | + | ||
1776 | +#define TD035STEE1_LCD_ID 0x2008 | ||
1777 | + | ||
1778 | +static void em_x270_set_bl_intensity(int intensity) | ||
1779 | +{ | ||
1780 | + da9030_set_wled((intensity != 0), intensity); | ||
1781 | +} | ||
1782 | + | ||
1783 | +struct corgibl_machinfo em_x270_bl_machinfo = { | ||
1784 | + .max_intensity = 0x7, | ||
1785 | + .default_intensity = 0x3, | ||
1786 | + .limit_mask = 0x1, | ||
1787 | + .set_bl_intensity = em_x270_set_bl_intensity, | ||
1788 | +}; | ||
1789 | + | ||
1790 | +static void em_x270_bl_release(struct device * dev) | ||
1791 | +{ | ||
1792 | + | ||
1793 | +} | ||
1794 | + | ||
1795 | +static struct platform_device em_x270_bl = { | ||
1796 | + .name = "corgi-bl", | ||
1797 | + .dev = { | ||
1798 | + .release = em_x270_bl_release, | ||
1799 | + .parent = &pxa_device_fb.dev, | ||
1800 | + .platform_data = &em_x270_bl_machinfo, | ||
1801 | + }, | ||
1802 | + .id = -1, | ||
1803 | +}; | ||
1804 | + | ||
1805 | +/* | ||
1806 | + * Helper functions to access LCD throuhg SPI interface | ||
1807 | + */ | ||
1808 | +static void set_ssp_9bit(void) | ||
1809 | +{ | ||
1810 | + int temp; | ||
1811 | + SSCR0 = 0xFF208; | ||
1812 | + SSCR0 = 0xFF288; | ||
1813 | + SSCR1 = 0x40000018; | ||
1814 | + | ||
1815 | + while (SSSR & 0x8) | ||
1816 | + temp = SSDR; | ||
1817 | +} | ||
1818 | + | ||
1819 | +static void set_ssp_18bit(void) | ||
1820 | +{ | ||
1821 | + int temp; | ||
1822 | + SSCR0 = 0x1FF201; | ||
1823 | + SSCR0 = 0x1FF281; | ||
1824 | + SSCR1 = 0x40000018; | ||
1825 | + while (SSSR & 0x8) | ||
1826 | + temp = SSDR; | ||
1827 | +} | ||
1828 | + | ||
1829 | +static void set_ssp_rcv(void) | ||
1830 | +{ | ||
1831 | + int temp; | ||
1832 | + SSCR0 = 0x1FF20F; | ||
1833 | + SSCR0 = 0x1FF28F; | ||
1834 | + SSCR1 = 0x40000018; | ||
1835 | + while (SSSR & 0x8) | ||
1836 | + temp = SSDR; | ||
1837 | +} | ||
1838 | + | ||
1839 | +static void send_ssp_9bit(unsigned int value) | ||
1840 | +{ | ||
1841 | + int temp; | ||
1842 | + SSDR = (value); | ||
1843 | + | ||
1844 | + asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); | ||
1845 | + | ||
1846 | + if (!(SSSR & 0x4)) | ||
1847 | + while ((SSSR & 0xf00) == 0) | ||
1848 | + ; | ||
1849 | + | ||
1850 | + while ((SSSR & 0xf00) != 0) | ||
1851 | + ; | ||
1852 | + while (SSSR & 0x10) | ||
1853 | + ; | ||
1854 | + while (SSSR & 0x8) | ||
1855 | + temp = SSDR; | ||
1856 | +} | ||
1857 | + | ||
1858 | +static void send_ssp_18bit(unsigned int value) | ||
1859 | +{ | ||
1860 | + int temp; | ||
1861 | + SSDR = (value); | ||
1862 | + | ||
1863 | + asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); | ||
1864 | + | ||
1865 | + if (!(SSSR & 0x4)) | ||
1866 | + while ((SSSR & 0xf00) == 0) | ||
1867 | + ; | ||
1868 | + | ||
1869 | + while ((SSSR & 0xf00) != 0) | ||
1870 | + ; | ||
1871 | + while (SSSR & 0x10) | ||
1872 | + ; | ||
1873 | + while (SSSR & 0x8) | ||
1874 | + temp = SSDR; | ||
1875 | +} | ||
1876 | + | ||
1877 | +static unsigned int rcv_ssp_18bit(void) | ||
1878 | +{ | ||
1879 | + SSDR = ((0x04) << 23); | ||
1880 | + asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); | ||
1881 | + if (!(SSSR & 0x4)) | ||
1882 | + while ((SSSR & 0xf00) == 0) | ||
1883 | + ; | ||
1884 | + while ((SSSR & 0xf00) != 0) | ||
1885 | + ; | ||
1886 | + while (SSSR & 0x10) | ||
1887 | + ; | ||
1888 | + return SSDR; | ||
1889 | +} | ||
1890 | + | ||
1891 | +/* LCD init sequence */ | ||
1892 | +int em_x270_lcd_detect(void) | ||
1893 | +{ | ||
1894 | + unsigned int data; | ||
1895 | + | ||
1896 | + /* Reset the LCD module */ | ||
1897 | + pxa_gpio_mode(GPIO87_nPCE_2 | GPIO_OUT); | ||
1898 | + GPCR(GPIO87_nPCE_2) |= GPIO_bit(GPIO87_nPCE_2); | ||
1899 | + mdelay(75); | ||
1900 | + GPSR(GPIO87_nPCE_2) |= GPIO_bit(GPIO87_nPCE_2); | ||
1901 | + mdelay(70); | ||
1902 | + | ||
1903 | + /* TD035STEE1 LCD_SSP initialization commands */ | ||
1904 | + set_ssp_9bit(); | ||
1905 | + send_ssp_9bit(0x000); | ||
1906 | + mdelay(5); | ||
1907 | + | ||
1908 | + send_ssp_9bit(0x000); | ||
1909 | + mdelay(5); | ||
1910 | + | ||
1911 | + send_ssp_9bit(0x000); | ||
1912 | + mdelay(5); | ||
1913 | + | ||
1914 | + set_ssp_18bit(); | ||
1915 | + send_ssp_18bit(0x17980); | ||
1916 | + mdelay(5); | ||
1917 | + | ||
1918 | + send_ssp_18bit(0x17F10); | ||
1919 | + mdelay(5); | ||
1920 | + | ||
1921 | + set_ssp_9bit(); | ||
1922 | + send_ssp_9bit(0x011); | ||
1923 | + mdelay(50); | ||
1924 | + | ||
1925 | + send_ssp_9bit(0x029); | ||
1926 | + mdelay(10); | ||
1927 | + | ||
1928 | + set_ssp_rcv(); | ||
1929 | + | ||
1930 | + /* Check for LCD ID, to enable the back-light */ | ||
1931 | + data = rcv_ssp_18bit(); | ||
1932 | + | ||
1933 | + if ((data & 0xFFFF) != TD035STEE1_LCD_ID) | ||
1934 | + return -ENODEV; | ||
1935 | + | ||
1936 | + /* enable backlight */ | ||
1937 | + da9030_set_wled(1, 2); | ||
1938 | + return 0; | ||
1939 | +} | ||
1940 | + | ||
1941 | +static int em_x270_lcd_init(void) | ||
1942 | +{ | ||
1943 | + int ret; | ||
1944 | + pr_debug("%s\n", __FUNCTION__); | ||
1945 | + ret = em_x270_lcd_detect(); | ||
1946 | + if (ret) | ||
1947 | + return ret; | ||
1948 | + | ||
1949 | + /* make sure we keep LCCR4 with PCD=0 */ | ||
1950 | + LCCR4 = 0x0; | ||
1951 | + | ||
1952 | + return platform_device_register(&em_x270_bl); | ||
1953 | +} | ||
1954 | + | ||
1955 | +static void em_x270_lcd_exit(void) | ||
1956 | +{ | ||
1957 | + pr_debug("%s\n", __FUNCTION__); | ||
1958 | + platform_device_unregister(&em_x270_bl); | ||
1959 | +} | ||
1960 | + | ||
1961 | +late_initcall(em_x270_lcd_init); | ||
1962 | +module_exit(em_x270_lcd_exit); | ||
1963 | + | ||
1964 | +MODULE_DESCRIPTION("EM-X270 backlight and LCD initialization driver"); | ||
1965 | +MODULE_AUTHOR("Mike Rapoport"); | ||
1966 | +MODULE_LICENSE("GPL"); | ||
1967 | diff --git a/arch/arm/mach-pxa/em-x270-pm.c b/arch/arm/mach-pxa/em-x270-pm.c | ||
1968 | new file mode 100644 | ||
1969 | index 0000000..55ba4cd | ||
1970 | --- /dev/null | ||
1971 | +++ b/arch/arm/mach-pxa/em-x270-pm.c | ||
1972 | @@ -0,0 +1,892 @@ | ||
1973 | +/* | ||
1974 | + * Support for CompuLab EM-X270 platform power management | ||
1975 | + * | ||
1976 | + * Copyright (C) 2007 CompuLab, Ltd. | ||
1977 | + * Author: Mike Rapoport <mike@compulab.co.il> | ||
1978 | + * | ||
1979 | + * This program is free software; you can redistribute it and/or modify | ||
1980 | + * it under the terms of the GNU General Public License version 2 as | ||
1981 | + * published by the Free Software Foundation. | ||
1982 | + */ | ||
1983 | + | ||
1984 | +#include <linux/kernel.h> | ||
1985 | +#include <linux/init.h> | ||
1986 | +#include <linux/module.h> | ||
1987 | +#include <linux/sysfs.h> | ||
1988 | +#include <linux/pm.h> | ||
1989 | +#include <linux/da9030.h> | ||
1990 | +#include <linux/interrupt.h> | ||
1991 | +#include <linux/irq.h> | ||
1992 | +#include <linux/delay.h> | ||
1993 | +#include <linux/ctype.h> | ||
1994 | + | ||
1995 | +#include <linux/apm-emulation.h> | ||
1996 | +#include <linux/platform_device.h> | ||
1997 | +#include <linux/power_supply.h> | ||
1998 | + | ||
1999 | +#include <linux/debugfs.h> | ||
2000 | +#include <linux/seq_file.h> | ||
2001 | + | ||
2002 | +#include "../../../drivers/i2c/chips/da9030.h" | ||
2003 | + | ||
2004 | +#include <asm/arch/pm.h> | ||
2005 | +#include <asm/arch/hardware.h> | ||
2006 | +#include <asm/arch/pxa-regs.h> | ||
2007 | +#include <asm/arch/pwr-i2c.h> | ||
2008 | + | ||
2009 | +#define DA9030_ADDR 0x92 | ||
2010 | + | ||
2011 | +#define EM_X270_BATCHK_TIME_SUSPEND (10*60) /* 10 min */ | ||
2012 | + | ||
2013 | +#define VOLTAGE_MAX_DESIGN 4200000 /* 4.2V in uV */ | ||
2014 | +#define VOLTAGE_MIN_DESIGN 3000000 /* 3V in uV */ | ||
2015 | + | ||
2016 | +#define REG2VOLT(x) ((((x) * 2650) >> 8) + 2650) | ||
2017 | +#define VOLT2REG(x) ((((x) - 2650) << 8) / 2650) | ||
2018 | + | ||
2019 | +#define REG2CURR(x) ((((x) * 24000) >> 8) / 15) | ||
2020 | + | ||
2021 | +#define VCHARGE_MIN_THRESHOLD VOLT2REG(3200) | ||
2022 | +#define VCHARGE_MAX_THRESHOLD VOLT2REG(5500) | ||
2023 | + | ||
2024 | +#define VBAT_LOW_THRESHOLD VOLT2REG(3600) | ||
2025 | +#define VBAT_CRIT_THRESHOLD VOLT2REG(3400) | ||
2026 | + | ||
2027 | +#define VBAT_CHARGE_START VOLT2REG(4100) | ||
2028 | +#define VBAT_CHARGE_STOP VOLT2REG(4200) | ||
2029 | +#define VBAT_CHARGE_RESTART VOLT2REG(4000) | ||
2030 | + | ||
2031 | +#define TBAT_LOW_THRESHOLD 197 /* 0oC */ | ||
2032 | +#define TBAT_HIGH_THRESHOLD 78 /* 45oC */ | ||
2033 | +#define TBAT_RESUME_THRESHOLD 100 /* 35oC */ | ||
2034 | + | ||
2035 | +struct em_x270_charger; | ||
2036 | + | ||
2037 | +struct em_x270_charger_ops { | ||
2038 | + void (*get_status)(struct em_x270_charger *charger); | ||
2039 | + void (*set_charge)(struct em_x270_charger *charger, int on); | ||
2040 | + | ||
2041 | + s32 (*da9030_get_reg)(u32 reg); | ||
2042 | + s32 (*da9030_set_reg)(u32 reg, u8 val); | ||
2043 | +}; | ||
2044 | + | ||
2045 | +struct em_x270_charger { | ||
2046 | + struct device *dev; | ||
2047 | + | ||
2048 | + struct power_supply bat; | ||
2049 | + struct da9030_adc_res adc; | ||
2050 | + struct delayed_work work; | ||
2051 | + | ||
2052 | + int interval; | ||
2053 | + | ||
2054 | + int da9030_status; | ||
2055 | + int da9030_fault; | ||
2056 | + int mA; | ||
2057 | + int mV; | ||
2058 | + int is_on; | ||
2059 | + | ||
2060 | + struct em_x270_charger_ops *ops; | ||
2061 | + | ||
2062 | +#ifdef CONFIG_DEBUG_FS | ||
2063 | + struct dentry *debug_file; | ||
2064 | +#endif | ||
2065 | +}; | ||
2066 | + | ||
2067 | +static struct em_x270_charger *the_charger; | ||
2068 | + | ||
2069 | +static unsigned short tbat_readings[] = { | ||
2070 | + 300, 244, 200, 178, 163, 152, 144, 137, 131, | ||
2071 | + 126, 122, 118, 114, 111, 108, 105, 103, 101, | ||
2072 | + 98, 96, 94, 93, 91, 89, 88, 86, 85, | ||
2073 | + 83, 82, 81, 79, 78, 77, 76, 75, 74, | ||
2074 | + 73, 72, 71, 70, 69, 68, 67, 67, 66, | ||
2075 | + 65, 64, 63, 63, 62, 61, 60, 60, 59, | ||
2076 | + 58, 58, 57, 57, 56, 55, 55, 54, 53, | ||
2077 | + 53, 52, 52, 51, 51, 50, 50, 49, 49, | ||
2078 | + 48, 48, 47, 47, 46, 46, 45, 45, 44, | ||
2079 | + 44, 43, 43, 42, 42, 41, 41, 41, 40, | ||
2080 | + 40, 39, 39, 38, 38, 38, 37, 37, 36, | ||
2081 | + 36, 35, 35, 35, 34, 34, 34, 33, 33, | ||
2082 | + 32, 32, 32, 31, 31, 30, 30, 30, 29, | ||
2083 | + 29, 29, 28, 28, 28, 27, 27, 26, 26, | ||
2084 | + 26, 25, 25, 25, 24, 24, 24, 23, 23, | ||
2085 | + 23, 22, 22, 21, 21, 21, 20, 20, 20, | ||
2086 | + 19, 19, 19, 18, 18, 18, 17, 17, 17, | ||
2087 | + 16, 16, 16, 15, 15, 14, 14, 14, 13, | ||
2088 | + 13, 13, 12, 12, 12, 11, 11, 11, 10, | ||
2089 | + 10, 10, 9, 9, 8, 8, 8, 7, 7, | ||
2090 | + 7, 6, 6, 5, 5, 5, 4, 4, 3, | ||
2091 | + 3, 3, 2, 2, 1, 1, 1, 0, 0, | ||
2092 | + -1, -1, -1, -2, -2, -3, -3, -4, -4, | ||
2093 | + -5, -5, -6, -6, -6, -7, -7, -8, -9, | ||
2094 | + -9, -10, -10, -11, -11, -12, -12, -13, -14, | ||
2095 | + -14, -15, -16, -16, -17, -18, -18, -19, -20, | ||
2096 | + -21, -21, -22, -23, -24, -25, -26, -27, -28, | ||
2097 | + -30, -31, -32, -34, -35, -37, -39, -41, -44, | ||
2098 | + -47, -50, -56, -64, | ||
2099 | +}; | ||
2100 | + | ||
2101 | +static inline int usb_host_on(void) | ||
2102 | +{ | ||
2103 | + return !pxa_gpio_get_value(21); | ||
2104 | +} | ||
2105 | + | ||
2106 | +#ifdef CONFIG_DEBUG_FS | ||
2107 | + | ||
2108 | +static int debug_show(struct seq_file *s, void *data) | ||
2109 | +{ | ||
2110 | + struct em_x270_charger *charger = s->private; | ||
2111 | + | ||
2112 | + seq_printf(s, "charger is %s\n", charger->is_on ? "on" : "off"); | ||
2113 | + if (charger->da9030_status & CHRG_CHARGER_ENABLE) { | ||
2114 | + seq_printf(s, "iset = %dmA, vset = %dmV\n", | ||
2115 | + charger->mA, charger->mV); | ||
2116 | + } | ||
2117 | + | ||
2118 | + seq_printf(s, "vbat_res = %d (%dmV)\n", | ||
2119 | + charger->adc.vbat_res, REG2VOLT(charger->adc.vbat_res)); | ||
2120 | + seq_printf(s, "vbatmin_res = %d (%dmV)\n", | ||
2121 | + charger->adc.vbatmin_res, | ||
2122 | + REG2VOLT(charger->adc.vbatmin_res)); | ||
2123 | + seq_printf(s, "vbatmintxon = %d (%dmV)\n", | ||
2124 | + charger->adc.vbatmintxon, | ||
2125 | + REG2VOLT(charger->adc.vbatmintxon)); | ||
2126 | + seq_printf(s, "ichmax_res = %d (%dmA)\n", | ||
2127 | + charger->adc.ichmax_res, | ||
2128 | + REG2CURR(charger->adc.ichmax_res)); | ||
2129 | + seq_printf(s, "ichmin_res = %d (%dmA)\n", | ||
2130 | + charger->adc.ichmin_res, | ||
2131 | + REG2CURR(charger->adc.ichmin_res)); | ||
2132 | + seq_printf(s, "ichaverage_res = %d (%dmA)\n", | ||
2133 | + charger->adc.ichaverage_res, | ||
2134 | + REG2CURR(charger->adc.ichaverage_res)); | ||
2135 | + seq_printf(s, "vchmax_res = %d (%dmV)\n", | ||
2136 | + charger->adc.vchmax_res, | ||
2137 | + REG2VOLT(charger->adc.vchmax_res)); | ||
2138 | + seq_printf(s, "vchmin_res = %d (%dmV)\n", | ||
2139 | + charger->adc.vchmin_res, | ||
2140 | + REG2VOLT(charger->adc.vchmin_res)); | ||
2141 | + seq_printf(s, "tbat_res = %d (%doC)\n", charger->adc.tbat_res, | ||
2142 | + tbat_readings[charger->adc.tbat_res]); | ||
2143 | + seq_printf(s, "adc_in4_res = %d\n", charger->adc.adc_in4_res); | ||
2144 | + seq_printf(s, "adc_in5_res = %d\n", charger->adc.adc_in5_res); | ||
2145 | + | ||
2146 | + return 0; | ||
2147 | +} | ||
2148 | + | ||
2149 | +static int debug_open(struct inode *inode, struct file *file) | ||
2150 | +{ | ||
2151 | + return single_open(file, debug_show, inode->i_private); | ||
2152 | +} | ||
2153 | + | ||
2154 | +static const struct file_operations debug_fops = { | ||
2155 | + .open = debug_open, | ||
2156 | + .read = seq_read, | ||
2157 | + .llseek = seq_lseek, | ||
2158 | + .release = single_release, | ||
2159 | +}; | ||
2160 | + | ||
2161 | +static struct dentry* em_x270_create_debugfs(struct em_x270_charger *charger) | ||
2162 | +{ | ||
2163 | + charger->debug_file = debugfs_create_file("charger", 0666, 0, charger, | ||
2164 | + &debug_fops); | ||
2165 | + return charger->debug_file; | ||
2166 | +} | ||
2167 | + | ||
2168 | +static void em_x270_remove_debugfs(struct em_x270_charger *charger) | ||
2169 | +{ | ||
2170 | + debugfs_remove(charger->debug_file); | ||
2171 | +} | ||
2172 | +#else | ||
2173 | +#define em_x270_create_debugfs(x) NULL | ||
2174 | +#define em_x270_remove_debugfs(x) do {} while(0) | ||
2175 | +#endif | ||
2176 | + | ||
2177 | +/*********************************************************************/ | ||
2178 | +/* DA9030 access functions for suspend/resume */ | ||
2179 | +#define DA_ADDR 0x49 | ||
2180 | +static inline s32 __da9030_get_reg(u32 reg) | ||
2181 | +{ | ||
2182 | + pr_info("%s: reg = %d\n", __FUNCTION__, reg); | ||
2183 | + return pxa_pwr_i2c_reg_read(DA_ADDR, reg); | ||
2184 | +} | ||
2185 | + | ||
2186 | +static inline s32 __da9030_set_reg(u32 reg, u8 val) | ||
2187 | +{ | ||
2188 | + pr_info("%s: reg = %d, val = %d\n", __FUNCTION__, reg, val); | ||
2189 | + return pxa_pwr_i2c_reg_write(DA_ADDR, reg, val); | ||
2190 | +} | ||
2191 | + | ||
2192 | +/*********************************************************************/ | ||
2193 | +/* helpers for charger state monnitor. Different version for stready | ||
2194 | + * state and suspended system | ||
2195 | + */ | ||
2196 | +static void em_x270_get_charger_status(struct em_x270_charger *charger) | ||
2197 | +{ | ||
2198 | + da9030_get_charger(&charger->is_on, &charger->mA, &charger->mV); | ||
2199 | + da9030_read_adc(&charger->adc); | ||
2200 | + charger->da9030_status = da9030_get_status(); | ||
2201 | + charger->da9030_fault = da9030_get_fault_log(); | ||
2202 | +} | ||
2203 | + | ||
2204 | +static void em_x270_set_charge(struct em_x270_charger *charger, int on) | ||
2205 | +{ | ||
2206 | + if (on) { | ||
2207 | + pr_debug("%s: enabling charger\n", __FUNCTION__); | ||
2208 | + da9030_set_thresholds(TBAT_HIGH_THRESHOLD, | ||
2209 | + TBAT_RESUME_THRESHOLD, | ||
2210 | + TBAT_LOW_THRESHOLD, | ||
2211 | + VBAT_LOW_THRESHOLD); | ||
2212 | + da9030_set_reg(CCTR_CONTROL, CCTR_SET_8MIN); | ||
2213 | + da9030_set_charger(1, 1000, 4200); | ||
2214 | + da9030_set_led(3, 1, 0, 0, 0); | ||
2215 | + charger->is_on = 1; | ||
2216 | + } | ||
2217 | + else { | ||
2218 | + /* disable charger */ | ||
2219 | + pr_debug("%s: disabling charger\n", __FUNCTION__); | ||
2220 | + da9030_set_charger(0, 0, 0); | ||
2221 | + da9030_set_led(3, 0, 0, 0, 0); | ||
2222 | + charger->is_on = 0; | ||
2223 | + } | ||
2224 | +} | ||
2225 | + | ||
2226 | +static void em_x270_get_charger_status_suspend(struct em_x270_charger *charger) | ||
2227 | +{ | ||
2228 | + s32 val; | ||
2229 | + | ||
2230 | + val = __da9030_get_reg(CHARGE_CONTROL); | ||
2231 | + charger->is_on = (val & CHRG_CHARGER_ENABLE) ? 1 : 0; | ||
2232 | + charger->mA = ((val >> 3) & 0xf) * 100; | ||
2233 | + charger->mV = (val & 0x7) * 50 + 4000; | ||
2234 | + | ||
2235 | + charger->adc.vbat_res = __da9030_get_reg(VBAT_RES); | ||
2236 | + charger->adc.vchmax_res = __da9030_get_reg(VCHMAX_RES); | ||
2237 | + charger->adc.vchmin_res = __da9030_get_reg(VCHMIN_RES); | ||
2238 | + charger->adc.tbat_res = __da9030_get_reg(TBAT_RES); | ||
2239 | + | ||
2240 | + charger->da9030_status = __da9030_get_reg(STATUS); | ||
2241 | + charger->da9030_fault = __da9030_get_reg(FAULT_LOG); | ||
2242 | +} | ||
2243 | + | ||
2244 | +static void em_x270_set_charge_suspend(struct em_x270_charger *charger, int on) | ||
2245 | +{ | ||
2246 | + if (on) { | ||
2247 | + u8 val = 0; | ||
2248 | + int mA = 1000; | ||
2249 | + int mV = 4200; | ||
2250 | + | ||
2251 | + pr_debug("%s: enabling charger\n", __FUNCTION__); | ||
2252 | + val = CHRG_CHARGER_ENABLE; | ||
2253 | + val |= (mA / 100) << 3; | ||
2254 | + val |= (mV - 4000) / 50; | ||
2255 | + | ||
2256 | + __da9030_set_reg(CCTR_CONTROL, CCTR_SET_8MIN); | ||
2257 | + __da9030_set_reg(VBATMON, VBAT_LOW_THRESHOLD); | ||
2258 | + __da9030_set_reg(CHARGE_CONTROL, val); | ||
2259 | + charger->is_on = 1; | ||
2260 | + } | ||
2261 | + else { | ||
2262 | + /* disable charger */ | ||
2263 | + pr_debug("%s: disabling charger\n", __FUNCTION__); | ||
2264 | + __da9030_set_reg(CHARGE_CONTROL, 0); | ||
2265 | + charger->is_on = 0; | ||
2266 | + } | ||
2267 | +} | ||
2268 | + | ||
2269 | +static struct em_x270_charger_ops em_x270_charger_ops = { | ||
2270 | + .get_status = em_x270_get_charger_status, | ||
2271 | + .set_charge = em_x270_set_charge, | ||
2272 | + .da9030_get_reg = da9030_get_reg, | ||
2273 | + .da9030_set_reg = da9030_set_reg, | ||
2274 | +}; | ||
2275 | + | ||
2276 | +static struct em_x270_charger_ops em_x270_charger_ops_suspend = { | ||
2277 | + .get_status = em_x270_get_charger_status_suspend, | ||
2278 | + .set_charge = em_x270_set_charge_suspend, | ||
2279 | + .da9030_get_reg = __da9030_get_reg, | ||
2280 | + .da9030_set_reg = __da9030_set_reg, | ||
2281 | +}; | ||
2282 | + | ||
2283 | +/*********************************************************************/ | ||
2284 | +/* charging state machine */ | ||
2285 | +static void em_x270_check_charger_state(struct em_x270_charger *charger) | ||
2286 | +{ | ||
2287 | + charger->ops->get_status(charger); | ||
2288 | + | ||
2289 | +/* we wake or boot with external power on */ | ||
2290 | + if (!charger->is_on) { | ||
2291 | + if ((charger->da9030_status & STATUS_CHDET) && | ||
2292 | + (!usb_host_on()) && | ||
2293 | + (charger->adc.vbat_res < VBAT_CHARGE_START)) { | ||
2294 | + pr_debug("%s: vbat_res <= 4100\n", __FUNCTION__); | ||
2295 | + charger->ops->set_charge(charger, 1); | ||
2296 | + } | ||
2297 | + } | ||
2298 | + else { | ||
2299 | + if (charger->adc.vbat_res >= VBAT_CHARGE_STOP) { | ||
2300 | + pr_debug("%s: vbat_res >= 4200\n", __FUNCTION__); | ||
2301 | + charger->ops->set_charge(charger, 0); | ||
2302 | + charger->ops->da9030_set_reg(VBATMON, | ||
2303 | + VBAT_CHARGE_RESTART); | ||
2304 | + } | ||
2305 | + else if (charger->adc.vbat_res > VBAT_LOW_THRESHOLD) { | ||
2306 | + /* we are charging and passed LOW_THRESH, | ||
2307 | + so upate DA9030 VBAT threshold | ||
2308 | + */ | ||
2309 | + pr_debug("%s: vbat_res >= %d\n", __FUNCTION__, | ||
2310 | + REG2VOLT(VBAT_LOW_THRESHOLD)); | ||
2311 | + charger->ops->da9030_set_reg(VBATMON, | ||
2312 | + VBAT_LOW_THRESHOLD); | ||
2313 | + } | ||
2314 | + if (charger->adc.vchmax_res > VCHARGE_MAX_THRESHOLD || | ||
2315 | + charger->adc.vchmin_res < VCHARGE_MIN_THRESHOLD || | ||
2316 | + /* Tempreture readings are negative */ | ||
2317 | + charger->adc.tbat_res < TBAT_HIGH_THRESHOLD || | ||
2318 | + charger->adc.tbat_res > TBAT_LOW_THRESHOLD ) { | ||
2319 | + /* disable charger */ | ||
2320 | + pr_info("%s: thresholds fail\n", __FUNCTION__); | ||
2321 | + charger->ops->set_charge(charger, 0); | ||
2322 | + } | ||
2323 | + } | ||
2324 | +} | ||
2325 | + | ||
2326 | +static void em_x270_charging_monitor(struct work_struct *work) | ||
2327 | +{ | ||
2328 | + struct em_x270_charger *charger; | ||
2329 | + | ||
2330 | + charger = container_of(work, struct em_x270_charger, work.work); | ||
2331 | + | ||
2332 | + em_x270_check_charger_state(charger); | ||
2333 | + | ||
2334 | + /* reschedule for the next time */ | ||
2335 | + schedule_delayed_work(&charger->work, charger->interval); | ||
2336 | +} | ||
2337 | + | ||
2338 | +void em_x270_battery_release(struct device * dev) | ||
2339 | +{ | ||
2340 | +} | ||
2341 | + | ||
2342 | +struct em_x270_battery_thresh { | ||
2343 | + int voltage; | ||
2344 | + int percentage; | ||
2345 | +}; | ||
2346 | + | ||
2347 | +static struct em_x270_battery_thresh vbat_ranges[] = { | ||
2348 | + { 150, 100}, | ||
2349 | + { 149, 99}, | ||
2350 | + { 148, 98}, | ||
2351 | + { 147, 98}, | ||
2352 | + { 146, 97}, | ||
2353 | + { 145, 96}, | ||
2354 | + { 144, 96}, | ||
2355 | + { 143, 95}, | ||
2356 | + { 142, 94}, | ||
2357 | + { 141, 93}, | ||
2358 | + { 140, 92}, | ||
2359 | + { 139, 91}, | ||
2360 | + { 138, 90}, | ||
2361 | + { 137, 90}, | ||
2362 | + { 136, 89}, | ||
2363 | + { 135, 88}, | ||
2364 | + { 134, 88}, | ||
2365 | + { 133, 87}, | ||
2366 | + { 132, 86}, | ||
2367 | + { 131, 85}, | ||
2368 | + { 130, 83}, | ||
2369 | + { 129, 82}, | ||
2370 | + { 128, 81}, | ||
2371 | + { 127, 81}, | ||
2372 | + { 126, 80}, | ||
2373 | + { 125, 75}, | ||
2374 | + { 124, 74}, | ||
2375 | + { 123, 73}, | ||
2376 | + { 122, 70}, | ||
2377 | + { 121, 66}, | ||
2378 | + { 120, 65}, | ||
2379 | + { 119, 64}, | ||
2380 | + { 118, 64}, | ||
2381 | + { 117, 63}, | ||
2382 | + { 116, 59}, | ||
2383 | + { 115, 58}, | ||
2384 | + { 114, 57}, | ||
2385 | + { 113, 57}, | ||
2386 | + { 112, 56}, | ||
2387 | + { 111, 50}, | ||
2388 | + { 110, 49}, | ||
2389 | + { 109, 49}, | ||
2390 | + { 108, 48}, | ||
2391 | + { 107, 48}, | ||
2392 | + { 106, 33}, | ||
2393 | + { 105, 32}, | ||
2394 | + { 104, 32}, | ||
2395 | + { 103, 32}, | ||
2396 | + { 102, 31}, | ||
2397 | + { 101, 16}, | ||
2398 | + { 100, 15}, | ||
2399 | + { 99, 15}, | ||
2400 | + { 98, 15}, | ||
2401 | + { 97, 10}, | ||
2402 | + { 96, 9}, | ||
2403 | + { 95, 7}, | ||
2404 | + { 94, 3}, | ||
2405 | + { 93, 0}, | ||
2406 | +}; | ||
2407 | + | ||
2408 | +static enum power_supply_property em_x270_bat_props[] = { | ||
2409 | + POWER_SUPPLY_PROP_STATUS, | ||
2410 | + POWER_SUPPLY_PROP_HEALTH, | ||
2411 | + POWER_SUPPLY_PROP_TECHNOLOGY, | ||
2412 | + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, | ||
2413 | + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, | ||
2414 | + POWER_SUPPLY_PROP_VOLTAGE_NOW, | ||
2415 | + POWER_SUPPLY_PROP_CURRENT_AVG, | ||
2416 | + POWER_SUPPLY_PROP_CAPACITY, /* in percents! */ | ||
2417 | + POWER_SUPPLY_PROP_TEMP, | ||
2418 | + POWER_SUPPLY_PROP_MANUFACTURER, | ||
2419 | + POWER_SUPPLY_PROP_MODEL_NAME, | ||
2420 | +}; | ||
2421 | + | ||
2422 | +static void em_x270_bat_check_status(struct em_x270_charger *charger, | ||
2423 | + union power_supply_propval *val) | ||
2424 | +{ | ||
2425 | + /* FIXME: below code is very crude approximation of actual | ||
2426 | + states, we need to take into account voltage and current | ||
2427 | + measurements to determine actual charger state */ | ||
2428 | + if (charger->da9030_status & STATUS_CHDET) { | ||
2429 | + if (!usb_host_on()) { | ||
2430 | + if (charger->is_on) { | ||
2431 | + val->intval = POWER_SUPPLY_STATUS_CHARGING; | ||
2432 | + } | ||
2433 | + else { | ||
2434 | + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; | ||
2435 | + } | ||
2436 | + } | ||
2437 | + } | ||
2438 | + else { | ||
2439 | + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; | ||
2440 | + } | ||
2441 | +} | ||
2442 | + | ||
2443 | +static void em_x270_bat_check_health(struct em_x270_charger *charger, | ||
2444 | + union power_supply_propval *val) | ||
2445 | +{ | ||
2446 | + if (charger->da9030_fault & FAULT_LOG_OVER_TEMP) { | ||
2447 | + val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; | ||
2448 | + } | ||
2449 | + else if (charger->da9030_fault & FAULT_LOG_VBAT_OVER) { | ||
2450 | + val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; | ||
2451 | + } | ||
2452 | + else { | ||
2453 | + val->intval = POWER_SUPPLY_HEALTH_GOOD; | ||
2454 | + } | ||
2455 | +} | ||
2456 | + | ||
2457 | +static int vbat_interpolate(int reg) | ||
2458 | +{ | ||
2459 | + int i; | ||
2460 | + | ||
2461 | + for (i = 0; i < ARRAY_SIZE(vbat_ranges); i++ ) | ||
2462 | + if (vbat_ranges[i].voltage == reg) { | ||
2463 | + pr_debug("%s: voltage = %d, percentage = %d\n", | ||
2464 | + __FUNCTION__, vbat_ranges[i].voltage, | ||
2465 | + vbat_ranges[i].percentage); | ||
2466 | + return vbat_ranges[i].percentage; | ||
2467 | + } | ||
2468 | + | ||
2469 | + return 0; | ||
2470 | +} | ||
2471 | + | ||
2472 | +static int em_x270_bat_get_property(struct power_supply *psy, | ||
2473 | + enum power_supply_property psp, | ||
2474 | + union power_supply_propval *val) | ||
2475 | +{ | ||
2476 | + u32 reg; | ||
2477 | + struct em_x270_charger *charger; | ||
2478 | + charger = container_of(psy, struct em_x270_charger, bat); | ||
2479 | + | ||
2480 | + switch(psp) { | ||
2481 | + case POWER_SUPPLY_PROP_STATUS: | ||
2482 | + em_x270_bat_check_status(charger, val); | ||
2483 | + break; | ||
2484 | + case POWER_SUPPLY_PROP_HEALTH: | ||
2485 | + em_x270_bat_check_health(charger, val); | ||
2486 | + break; | ||
2487 | + case POWER_SUPPLY_PROP_TECHNOLOGY: | ||
2488 | + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; | ||
2489 | + break; | ||
2490 | + case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: | ||
2491 | + val->intval = VOLTAGE_MAX_DESIGN; | ||
2492 | + break; | ||
2493 | + case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: | ||
2494 | + val->intval = VOLTAGE_MIN_DESIGN; | ||
2495 | + break; | ||
2496 | + case POWER_SUPPLY_PROP_VOLTAGE_NOW: | ||
2497 | + reg = charger->adc.vbat_res; | ||
2498 | + /* V = (reg / 256) * 2.65 + 2.65 (V) */ | ||
2499 | + val->intval = ((reg * 2650000) >> 8) + 2650000; | ||
2500 | + break; | ||
2501 | + case POWER_SUPPLY_PROP_CURRENT_AVG: | ||
2502 | + reg = charger->adc.ichaverage_res; | ||
2503 | + val->intval = reg; /* reg */ | ||
2504 | + break; | ||
2505 | + case POWER_SUPPLY_PROP_CAPACITY: | ||
2506 | + reg = charger->adc.vbat_res; | ||
2507 | + val->intval = vbat_interpolate(reg); | ||
2508 | + break; | ||
2509 | + case POWER_SUPPLY_PROP_TEMP: | ||
2510 | + reg = charger->adc.tbat_res; | ||
2511 | + val->intval = tbat_readings[reg]; | ||
2512 | + break; | ||
2513 | + case POWER_SUPPLY_PROP_MANUFACTURER: | ||
2514 | + val->strval = "MaxPower"; | ||
2515 | + pr_debug("%s: MFG = %s\n", __FUNCTION__, val->strval); | ||
2516 | + break; | ||
2517 | + case POWER_SUPPLY_PROP_MODEL_NAME: | ||
2518 | + val->strval = "LP555597P6H-FPS"; | ||
2519 | + pr_debug("%s: MODEL = %s\n", __FUNCTION__, val->strval); | ||
2520 | + break; | ||
2521 | + default: break; | ||
2522 | + } | ||
2523 | + | ||
2524 | + return 0; | ||
2525 | +} | ||
2526 | + | ||
2527 | +static void em_x270_setup_battery(struct power_supply *bat) | ||
2528 | +{ | ||
2529 | + bat->name = "em-x270-battery"; | ||
2530 | + bat->type = POWER_SUPPLY_TYPE_BATTERY; | ||
2531 | + bat->properties = em_x270_bat_props; | ||
2532 | + bat->num_properties = ARRAY_SIZE(em_x270_bat_props); | ||
2533 | + bat->get_property = em_x270_bat_get_property; | ||
2534 | + bat->use_for_apm = 1; | ||
2535 | +}; | ||
2536 | + | ||
2537 | +static void em_x270_chiover_callback(int event, void *_charger) | ||
2538 | +{ | ||
2539 | + /* disable charger */ | ||
2540 | + struct em_x270_charger *charger = _charger; | ||
2541 | +/* pr_info("%s\n", __FUNCTION__); */ | ||
2542 | + em_x270_set_charge(charger, 0); | ||
2543 | +} | ||
2544 | + | ||
2545 | +static void em_x270_tbat_callback(int event, void *_charger) | ||
2546 | +{ | ||
2547 | + /* disable charger */ | ||
2548 | + struct em_x270_charger *charger = _charger; | ||
2549 | +/* pr_info("%s\n", __FUNCTION__); */ | ||
2550 | + em_x270_set_charge(charger, 0); | ||
2551 | +} | ||
2552 | + | ||
2553 | +static void em_x270_vbat_callback(int event, void *_charger) | ||
2554 | +{ | ||
2555 | + struct em_x270_charger *charger = _charger; | ||
2556 | + da9030_read_adc(&charger->adc); | ||
2557 | + | ||
2558 | + if (!charger->is_on) { | ||
2559 | + if (charger->adc.vbat_res < VBAT_LOW_THRESHOLD) { | ||
2560 | + /* set VBAT threshold for critical */ | ||
2561 | + da9030_set_reg(VBATMON, VBAT_CRIT_THRESHOLD); | ||
2562 | + da9030_set_reg(VBATMON_1, VBAT_CRIT_THRESHOLD); | ||
2563 | + apm_queue_event(APM_LOW_BATTERY); | ||
2564 | + } | ||
2565 | + else if (charger->adc.vbat_res < VBAT_CRIT_THRESHOLD) { | ||
2566 | + /* notify the system of battery critical */ | ||
2567 | + apm_queue_event(APM_CRITICAL_SUSPEND); | ||
2568 | + } | ||
2569 | + } | ||
2570 | +} | ||
2571 | + | ||
2572 | +static void em_x270_chdet_callback(int event, void *_charger) | ||
2573 | +{ | ||
2574 | + struct em_x270_charger *charger = _charger; | ||
2575 | + int status = da9030_get_status(); | ||
2576 | + pr_info("%s\n", __FUNCTION__); | ||
2577 | + | ||
2578 | +/* em_x270_check_charger_state(charger); */ | ||
2579 | + | ||
2580 | + /* check if we have "real" charger or our own USB pump */ | ||
2581 | + if (!usb_host_on()) | ||
2582 | + em_x270_set_charge(charger, !!(status & CHRG_CHARGER_ENABLE)); | ||
2583 | +} | ||
2584 | + | ||
2585 | +static int em_x270_battery_probe(struct platform_device *pdev) | ||
2586 | +{ | ||
2587 | + struct em_x270_charger *charger; | ||
2588 | + | ||
2589 | + pr_debug("%s\n", __FUNCTION__); | ||
2590 | + charger = kzalloc(sizeof(*charger), GFP_KERNEL); | ||
2591 | + if (charger == NULL) { | ||
2592 | + return -ENOMEM; | ||
2593 | + } | ||
2594 | + | ||
2595 | + the_charger = charger; | ||
2596 | + | ||
2597 | + charger->dev = &pdev->dev; | ||
2598 | + | ||
2599 | + charger->ops = &em_x270_charger_ops; | ||
2600 | + | ||
2601 | + charger->interval = 10 * HZ; /* 10 seconds between monotor runs */ | ||
2602 | + em_x270_setup_battery(&charger->bat); | ||
2603 | + | ||
2604 | + platform_set_drvdata(pdev, charger); | ||
2605 | + | ||
2606 | + da9030_enable_adc(); | ||
2607 | + | ||
2608 | + INIT_DELAYED_WORK(&charger->work, em_x270_charging_monitor); | ||
2609 | + schedule_delayed_work(&charger->work, charger->interval); | ||
2610 | + | ||
2611 | + charger->debug_file = em_x270_create_debugfs(charger); | ||
2612 | + | ||
2613 | + em_x270_setup_battery(&charger->bat); | ||
2614 | + | ||
2615 | + da9030_register_callback(DA9030_IRQ_CHDET, | ||
2616 | + em_x270_chdet_callback, | ||
2617 | + charger); | ||
2618 | + da9030_register_callback(DA9030_IRQ_VBATMON, | ||
2619 | + em_x270_vbat_callback, | ||
2620 | + charger); | ||
2621 | + | ||
2622 | + /* critical condition events */ | ||
2623 | + da9030_register_callback(DA9030_IRQ_CHIOVER, | ||
2624 | + em_x270_chiover_callback, | ||
2625 | + charger); | ||
2626 | + da9030_register_callback(DA9030_IRQ_TBAT, | ||
2627 | + em_x270_tbat_callback, | ||
2628 | + charger); | ||
2629 | + | ||
2630 | + da9030_set_thresholds(TBAT_HIGH_THRESHOLD, | ||
2631 | + TBAT_RESUME_THRESHOLD, | ||
2632 | + TBAT_LOW_THRESHOLD, | ||
2633 | + VBAT_LOW_THRESHOLD); | ||
2634 | + | ||
2635 | + power_supply_register(&pdev->dev, &charger->bat); | ||
2636 | + | ||
2637 | + return 0; | ||
2638 | +} | ||
2639 | + | ||
2640 | +static int em_x270_battery_remove(struct platform_device *dev) | ||
2641 | +{ | ||
2642 | + struct em_x270_charger *charger = platform_get_drvdata(dev); | ||
2643 | + | ||
2644 | + pr_debug("%s\n", __FUNCTION__); | ||
2645 | + em_x270_remove_debugfs(charger); | ||
2646 | + cancel_delayed_work(&charger->work); | ||
2647 | + power_supply_unregister(&charger->bat); | ||
2648 | + | ||
2649 | + kfree(charger); | ||
2650 | + the_charger = NULL; | ||
2651 | + | ||
2652 | + return 0; | ||
2653 | +} | ||
2654 | + | ||
2655 | +static int em_x270_battery_suspend(struct platform_device *pdev, | ||
2656 | + pm_message_t state) | ||
2657 | +{ | ||
2658 | + pr_info("%s\n", __FUNCTION__); | ||
2659 | + da9030_set_reg(REG_CONTROL_1_97, RC3_BUCK_EN | RC3_LDO6_EN); | ||
2660 | + da9030_set_reg(REG_CONTROL_2_98, 0); | ||
2661 | + da9030_set_reg(REG_CONTROL_2_18,RC2_LDO18_EN); | ||
2662 | + da9030_set_reg(REG_CONTROL_1_17, | ||
2663 | + RC1_LDO16_EN | RC1_LDO15_EN | RC1_BUCK2_EN); | ||
2664 | + da9030_set_reg(WLED_CONTROL, 0); | ||
2665 | + | ||
2666 | + da9030_set_reg(LED_1_CONTROL, 0); | ||
2667 | + da9030_set_reg(LED_4_CONTROL, 0); | ||
2668 | + | ||
2669 | + return 0; | ||
2670 | +} | ||
2671 | + | ||
2672 | +extern int em_x270_lcd_detect(void); | ||
2673 | +static int em_x270_battery_resume(struct platform_device *pdev) | ||
2674 | +{ | ||
2675 | + pr_info("%s\n", __FUNCTION__); | ||
2676 | + | ||
2677 | + da9030_set_reg(LED_1_CONTROL, 0xff); | ||
2678 | + da9030_set_reg(LED_4_CONTROL, 0xff); | ||
2679 | + | ||
2680 | + da9030_set_reg(REG_CONTROL_1_97, | ||
2681 | + RC3_BUCK_EN | RC3_LDO1_EN | RC3_LDO2_EN | | ||
2682 | + RC3_LDO3_EN | RC3_LDO6_EN | RC3_LDO7_EN); | ||
2683 | + da9030_set_reg(REG_CONTROL_2_98, | ||
2684 | + RC4_SIMCP_ENABLE | RC4_LDO11_EN | | ||
2685 | + RC4_LDO9_EN | RC4_LDO8_EN); | ||
2686 | + da9030_set_reg(REG_CONTROL_2_18, | ||
2687 | + RC2_SIMCP_EN | RC2_LDO18_EN | RC2_LDO19_EN); | ||
2688 | + da9030_set_reg(REG_CONTROL_1_17, | ||
2689 | + RC1_LDO17_EN| RC1_LDO16_EN | RC1_LDO15_EN | | ||
2690 | + RC1_LDO11_EN | RC1_LDO10_EN | RC1_BUCK2_EN); | ||
2691 | + | ||
2692 | + if (em_x270_lcd_detect() != 0) | ||
2693 | + pr_info("%s: LCD resume failed\n", __FUNCTION__); | ||
2694 | + | ||
2695 | + return 0; | ||
2696 | +} | ||
2697 | + | ||
2698 | +static struct platform_driver em_x270_battery_driver = { | ||
2699 | + .driver = { | ||
2700 | + .name = "em-x270-battery", | ||
2701 | + .owner = THIS_MODULE, | ||
2702 | + }, | ||
2703 | + .probe = em_x270_battery_probe, | ||
2704 | + .remove = em_x270_battery_remove, | ||
2705 | + | ||
2706 | + .suspend_late = em_x270_battery_suspend, | ||
2707 | + .resume_early = em_x270_battery_resume, | ||
2708 | +}; | ||
2709 | + | ||
2710 | +/**************************************************************************/ | ||
2711 | +/* global patform power management */ | ||
2712 | +/**************************************************************************/ | ||
2713 | +/* suspend/resume button */ | ||
2714 | +static irqreturn_t em_x270_suspend_irq(int irq, void *data) | ||
2715 | +{ | ||
2716 | + apm_queue_event(APM_USER_SUSPEND); | ||
2717 | + return IRQ_HANDLED; | ||
2718 | +} | ||
2719 | + | ||
2720 | +static void em_x270_goto_sleep(suspend_state_t state, | ||
2721 | + unsigned long alarm_time, | ||
2722 | + unsigned int alarm_enable) | ||
2723 | +{ | ||
2724 | + pr_info("%s\n", __FUNCTION__); | ||
2725 | + | ||
2726 | + the_charger->ops = &em_x270_charger_ops_suspend; | ||
2727 | + | ||
2728 | + RTSR &= RTSR_ALE; | ||
2729 | + RTAR = RCNR + EM_X270_BATCHK_TIME_SUSPEND; | ||
2730 | + | ||
2731 | + pxa_pm_enter(state); | ||
2732 | +} | ||
2733 | + | ||
2734 | +static int em_x270_enter_suspend(unsigned long alarm_time, | ||
2735 | + unsigned int alarm_enable) | ||
2736 | +{ | ||
2737 | + s32 status = 0; | ||
2738 | + s32 event_a, event_b; | ||
2739 | + int ret; | ||
2740 | + int retry = 10; | ||
2741 | + pr_info("%s\n", __FUNCTION__); | ||
2742 | + | ||
2743 | + /* make sure power I2C state is consistent */ | ||
2744 | + PWRICR &= ~ICR_IUE; | ||
2745 | + | ||
2746 | + if ((PEDR & PWER_GPIO1)) { | ||
2747 | + /* button pressed */ | ||
2748 | + /* clear pending event to avoid interrupt*/ | ||
2749 | + PEDR &= ~PWER_GPIO1; | ||
2750 | + GEDR0 &= ~GPIO_bit(1); | ||
2751 | + | ||
2752 | + ret = 0; | ||
2753 | + } | ||
2754 | + else if ((PEDR & PWER_RTC)) { | ||
2755 | + PEDR &= ~PWER_RTC; | ||
2756 | + pr_debug("%s: timer alarm\n", __FUNCTION__); | ||
2757 | + em_x270_check_charger_state(the_charger); | ||
2758 | + ret = 1; | ||
2759 | + } | ||
2760 | + else if ((PEDR & PWER_GPIO0)) { | ||
2761 | + PEDR &= ~PWER_GPIO0; | ||
2762 | + GEDR0 &= ~GPIO_bit(0); | ||
2763 | + | ||
2764 | + /* we woke up because of DA9030 event */ | ||
2765 | + do { | ||
2766 | + status = the_charger->ops->da9030_get_reg(STATUS); | ||
2767 | + udelay(1000); | ||
2768 | + } while (status < 0 && retry--); | ||
2769 | + | ||
2770 | + the_charger->da9030_status = status; | ||
2771 | + event_a = the_charger->ops->da9030_get_reg(EVENT_A); | ||
2772 | + event_b = the_charger->ops->da9030_get_reg(EVENT_B); | ||
2773 | + | ||
2774 | + pr_info("%s: DA9030 wakeup: status: %x, ev_a: %x, ev_b: %x\n", | ||
2775 | + __FUNCTION__, the_charger->da9030_status, | ||
2776 | + event_a, event_b); | ||
2777 | + | ||
2778 | +/* if ((the_charger->da9030_status & STATUS_CHDET)) { */ | ||
2779 | + if (event_a & EVENT_A_CHDET) { | ||
2780 | + pr_info("%s: EVENT_A_CHDET\n", __FUNCTION__); | ||
2781 | + em_x270_check_charger_state(the_charger); | ||
2782 | + } | ||
2783 | + else { | ||
2784 | + pr_info("%s: What the hell?\n", __FUNCTION__); | ||
2785 | + } | ||
2786 | + | ||
2787 | + ret = 1; | ||
2788 | + } | ||
2789 | + else { | ||
2790 | + /* wake up is not DA9030, so continue and let battery | ||
2791 | + driver check the charger state */ | ||
2792 | + ret = 0; | ||
2793 | + } | ||
2794 | + | ||
2795 | + /* get back to sleep */ | ||
2796 | + if (ret) | ||
2797 | + em_x270_goto_sleep(PM_SUSPEND_MEM, alarm_time, alarm_enable); | ||
2798 | + | ||
2799 | + return ret; | ||
2800 | +} | ||
2801 | + | ||
2802 | +static int em_x270_pm_enter(suspend_state_t state) | ||
2803 | +{ | ||
2804 | + unsigned long alarm_time = RTAR; | ||
2805 | + unsigned int alarm_status = ((RTSR & RTSR_ALE) != 0); | ||
2806 | + | ||
2807 | + /* pre-suspend */ | ||
2808 | + pr_info("suspending emma\n"); | ||
2809 | + pxa_gpio_mode(38 | GPIO_OUT | GPIO_DFLT_HIGH); | ||
2810 | + | ||
2811 | + em_x270_goto_sleep(state, alarm_time, alarm_status); | ||
2812 | + | ||
2813 | + /* check if we were resumed because of charger events */ | ||
2814 | + while (em_x270_enter_suspend(alarm_time, alarm_status)) | ||
2815 | + {} | ||
2816 | + | ||
2817 | + /* make sure power I2C state is consistent */ | ||
2818 | + PWRICR &= ~ICR_IUE; | ||
2819 | + | ||
2820 | + /* resume */ | ||
2821 | + pr_info("emma is resumed\n"); | ||
2822 | + the_charger->ops = &em_x270_charger_ops; | ||
2823 | + | ||
2824 | + return 0; | ||
2825 | +} | ||
2826 | + | ||
2827 | +static struct pm_ops em_x270_pm_ops = { | ||
2828 | + .enter = em_x270_pm_enter, | ||
2829 | + .valid = pm_valid_only_mem, | ||
2830 | +}; | ||
2831 | + | ||
2832 | +static int em_x270_pm_init(void) | ||
2833 | +{ | ||
2834 | + int ret; | ||
2835 | + pm_set_ops(&em_x270_pm_ops); | ||
2836 | + | ||
2837 | + set_irq_type(IRQ_GPIO(1), IRQT_RISING); | ||
2838 | + | ||
2839 | + ret = platform_driver_register(&em_x270_battery_driver); | ||
2840 | + if (ret) | ||
2841 | + return ret; | ||
2842 | + | ||
2843 | + ret = request_irq(IRQ_GPIO(1), em_x270_suspend_irq, IRQF_DISABLED, | ||
2844 | + "suspend button", 0); | ||
2845 | + if (ret) { | ||
2846 | + platform_driver_unregister(&em_x270_battery_driver); | ||
2847 | + } | ||
2848 | + | ||
2849 | + return ret; | ||
2850 | +} | ||
2851 | + | ||
2852 | +static void em_x270_pm_exit(void) | ||
2853 | +{ | ||
2854 | + free_irq(IRQ_GPIO(1), em_x270_suspend_irq); | ||
2855 | + platform_driver_unregister(&em_x270_battery_driver); | ||
2856 | +} | ||
2857 | + | ||
2858 | +/* make sure I2C is already running */ | ||
2859 | +late_initcall(em_x270_pm_init); | ||
2860 | +module_exit(em_x270_pm_exit); | ||
2861 | + | ||
2862 | +MODULE_DESCRIPTION("EM-X270 power manager"); | ||
2863 | +MODULE_AUTHOR("Mike Rapoport"); | ||
2864 | +MODULE_LICENSE("GPL"); | ||
2865 | diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c | ||
2866 | index 3d0ad50..402d792 100644 | ||
2867 | --- a/arch/arm/mach-pxa/em-x270.c | ||
2868 | +++ b/arch/arm/mach-pxa/em-x270.c | ||
2869 | @@ -18,20 +18,26 @@ | ||
2870 | #include <linux/mtd/nand.h> | ||
2871 | #include <linux/mtd/partitions.h> | ||
2872 | |||
2873 | -#include <asm/mach-types.h> | ||
2874 | +#include <linux/i2c.h> | ||
2875 | +#include <linux/input.h> | ||
2876 | |||
2877 | +#include <asm/mach-types.h> | ||
2878 | #include <asm/mach/arch.h> | ||
2879 | |||
2880 | #include <asm/arch/pxa-regs.h> | ||
2881 | #include <asm/arch/pxafb.h> | ||
2882 | #include <asm/arch/ohci.h> | ||
2883 | #include <asm/arch/mmc.h> | ||
2884 | +#include <asm/arch/pxa27x_keyboard.h> | ||
2885 | #include <asm/arch/bitfield.h> | ||
2886 | |||
2887 | +#include <asm/arch/udc.h> | ||
2888 | + | ||
2889 | +#include <asm/arch/sharpsl.h> | ||
2890 | + | ||
2891 | #include "generic.h" | ||
2892 | |||
2893 | /* GPIO IRQ usage */ | ||
2894 | -#define EM_X270_MMC_PD (105) | ||
2895 | #define EM_X270_ETHIRQ IRQ_GPIO(41) | ||
2896 | #define EM_X270_MMC_IRQ IRQ_GPIO(13) | ||
2897 | |||
2898 | @@ -213,6 +219,68 @@ static struct platform_device em_x270_nand = { | ||
2899 | } | ||
2900 | }; | ||
2901 | |||
2902 | +/* DA9030 */ | ||
2903 | +static struct i2c_board_info em_x270_pmic_info = { | ||
2904 | + .driver_name = "da9030", | ||
2905 | + .type = "pmic", | ||
2906 | + .addr = 0x49, | ||
2907 | + .irq = IRQ_GPIO(0), | ||
2908 | +}; | ||
2909 | + | ||
2910 | +/* Keypad */ | ||
2911 | +/* The Demo KeyPad has the following mapping: | ||
2912 | + * (0,0) (1,2) (2,1) | ||
2913 | + * (0,2) (1,1) (2,0) | ||
2914 | + * (0,1) (1,0) (2,2) | ||
2915 | + */ | ||
2916 | +static struct pxa27x_keyboard_platform_data em_x270_kbd = { | ||
2917 | + .nr_rows = 3, | ||
2918 | + .nr_cols = 3, | ||
2919 | + .keycodes = { | ||
2920 | + { /* row 0 */ | ||
2921 | + -1, | ||
2922 | + -1, | ||
2923 | + KEY_LEFT, | ||
2924 | + }, | ||
2925 | + { /* row 1 */ | ||
2926 | + KEY_UP, | ||
2927 | + KEY_ENTER, | ||
2928 | + KEY_DOWN | ||
2929 | + }, | ||
2930 | + { /* row 2 */ | ||
2931 | + KEY_RIGHT, | ||
2932 | + -1, | ||
2933 | + -1 | ||
2934 | + }, | ||
2935 | + }, | ||
2936 | + .gpio_modes = { | ||
2937 | + (100 | GPIO_ALT_FN_1_IN), | ||
2938 | + (101 | GPIO_ALT_FN_1_IN), | ||
2939 | + (102 | GPIO_ALT_FN_1_IN), | ||
2940 | + (103 | GPIO_ALT_FN_2_OUT), | ||
2941 | + (104 | GPIO_ALT_FN_2_OUT), | ||
2942 | + (105 | GPIO_ALT_FN_2_OUT), | ||
2943 | + }, | ||
2944 | +}; | ||
2945 | + | ||
2946 | +static struct platform_device em_x270_pxa_keypad = { | ||
2947 | + .name = "pxa27x-keyboard", | ||
2948 | + .id = -1, | ||
2949 | + .dev = { | ||
2950 | + .platform_data = &em_x270_kbd, | ||
2951 | + }, | ||
2952 | +}; | ||
2953 | + | ||
2954 | +static struct platform_device em_x270_battery_device = { | ||
2955 | + .name = "em-x270-battery", | ||
2956 | + .id = -1, | ||
2957 | +}; | ||
2958 | + | ||
2959 | +static struct platform_device em_x270_led_device = { | ||
2960 | + .name = "em-x270-led", | ||
2961 | + .id = -1, | ||
2962 | +}; | ||
2963 | + | ||
2964 | /* platform devices */ | ||
2965 | static struct platform_device *platform_devices[] __initdata = { | ||
2966 | &em_x270_dm9k, | ||
2967 | @@ -220,6 +288,9 @@ static struct platform_device *platform_devices[] __initdata = { | ||
2968 | &em_x270_ts, | ||
2969 | &em_x270_rtc, | ||
2970 | &em_x270_nand, | ||
2971 | + &em_x270_pxa_keypad, | ||
2972 | + &em_x270_battery_device, | ||
2973 | + &em_x270_led_device, | ||
2974 | }; | ||
2975 | |||
2976 | |||
2977 | @@ -241,6 +312,33 @@ static struct pxaohci_platform_data em_x270_ohci_platform_data = { | ||
2978 | .init = em_x270_ohci_init, | ||
2979 | }; | ||
2980 | |||
2981 | +/* | ||
2982 | + * USB Client (Gadget/UDC) | ||
2983 | + */ | ||
2984 | +static void em_x270_udc_command(int cmd) | ||
2985 | +{ | ||
2986 | + switch(cmd) { | ||
2987 | + case PXA2XX_UDC_CMD_CONNECT: | ||
2988 | + UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; | ||
2989 | + break; | ||
2990 | + case PXA2XX_UDC_CMD_DISCONNECT: | ||
2991 | +/* UP2OCR = UP2OCR_HXS | UP2OCR_HXOE; */ | ||
2992 | + //UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; | ||
2993 | + break; | ||
2994 | + } | ||
2995 | +} | ||
2996 | + | ||
2997 | +static int em_x270_udc_detect(void) | ||
2998 | +{ | ||
2999 | + return 1; | ||
3000 | +} | ||
3001 | + | ||
3002 | +static struct pxa2xx_udc_mach_info em_x270_udc_info __initdata = { | ||
3003 | + .udc_is_connected = em_x270_udc_detect, | ||
3004 | + .udc_command = em_x270_udc_command, | ||
3005 | +}; | ||
3006 | + | ||
3007 | + | ||
3008 | |||
3009 | static int em_x270_mci_init(struct device *dev, | ||
3010 | irq_handler_t em_x270_detect_int, | ||
3011 | @@ -256,9 +354,6 @@ static int em_x270_mci_init(struct device *dev, | ||
3012 | pxa_gpio_mode(GPIO110_MMCDAT2_MD); | ||
3013 | pxa_gpio_mode(GPIO111_MMCDAT3_MD); | ||
3014 | |||
3015 | - /* EM-X270 uses GPIO13 as SD power enable */ | ||
3016 | - pxa_gpio_mode(EM_X270_MMC_PD | GPIO_OUT); | ||
3017 | - | ||
3018 | err = request_irq(EM_X270_MMC_IRQ, em_x270_detect_int, | ||
3019 | IRQF_DISABLED | IRQF_TRIGGER_FALLING, | ||
3020 | "MMC card detect", data); | ||
3021 | @@ -313,12 +408,19 @@ static struct pxafb_mach_info em_x270_lcd = { | ||
3022 | .num_modes = 1, | ||
3023 | .cmap_inverse = 0, | ||
3024 | .cmap_static = 0, | ||
3025 | - .lccr0 = LCCR0_PAS, | ||
3026 | - .lccr3 = LCCR3_PixClkDiv(0x01) | LCCR3_Acb(0xff), | ||
3027 | + | ||
3028 | + .lccr0 = LCCR0_Act, | ||
3029 | + .lccr3 = LCCR3_PixFlEdg, | ||
3030 | }; | ||
3031 | |||
3032 | static void __init em_x270_init(void) | ||
3033 | { | ||
3034 | + /* register PMIC */ | ||
3035 | + i2c_register_board_info(1, &em_x270_pmic_info, 1); | ||
3036 | + | ||
3037 | + /* setup DA9030 irq */ | ||
3038 | + set_irq_type(IRQ_GPIO(0), IRQT_FALLING); | ||
3039 | + | ||
3040 | /* setup LCD */ | ||
3041 | set_pxa_fb_info(&em_x270_lcd); | ||
3042 | |||
3043 | @@ -329,6 +431,8 @@ static void __init em_x270_init(void) | ||
3044 | pxa_set_mci_info(&em_x270_mci_platform_data); | ||
3045 | pxa_set_ohci_info(&em_x270_ohci_platform_data); | ||
3046 | |||
3047 | + pxa_set_udc_info(&em_x270_udc_info); | ||
3048 | + | ||
3049 | /* setup STUART GPIOs */ | ||
3050 | pxa_gpio_mode(GPIO46_STRXD_MD); | ||
3051 | pxa_gpio_mode(GPIO47_STTXD_MD); | ||
3052 | @@ -341,9 +445,16 @@ static void __init em_x270_init(void) | ||
3053 | |||
3054 | /* Setup interrupt for dm9000 */ | ||
3055 | set_irq_type(EM_X270_ETHIRQ, IRQT_RISING); | ||
3056 | + | ||
3057 | + PCFR = 0x6; | ||
3058 | + PSLR = 0xff400000; | ||
3059 | + PMCR = 0x00000005; | ||
3060 | + PWER = 0x80000003; | ||
3061 | + PFER = 0x00000003; | ||
3062 | + PRER = 0x00000000; | ||
3063 | } | ||
3064 | |||
3065 | -MACHINE_START(EM_X270, "Compulab EM-x270") | ||
3066 | +MACHINE_START(EM_X270, "Compulab EM-X270") | ||
3067 | .boot_params = 0xa0000100, | ||
3068 | .phys_io = 0x40000000, | ||
3069 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||
3070 | diff --git a/arch/arm/mach-pxa/pwr-i2c.c b/arch/arm/mach-pxa/pwr-i2c.c | ||
3071 | new file mode 100644 | ||
3072 | index 0000000..8a501c4 | ||
3073 | --- /dev/null | ||
3074 | +++ b/arch/arm/mach-pxa/pwr-i2c.c | ||
3075 | @@ -0,0 +1,539 @@ | ||
3076 | +/* | ||
3077 | + * (C) Copyrihgt 2007 CompuLab, Ltd. | ||
3078 | + * Mike Rapoport <mike@compulab.co.il> | ||
3079 | + * Adaptation of U-Boot I2C driver for PXA. | ||
3080 | + * | ||
3081 | + * (C) Copyright 2000 | ||
3082 | + * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it | ||
3083 | + * | ||
3084 | + * (C) Copyright 2000 Sysgo Real-Time Solutions, GmbH <www.elinos.com> | ||
3085 | + * Marius Groeger <mgroeger@sysgo.de> | ||
3086 | + * | ||
3087 | + * (C) Copyright 2003 Pengutronix e.K. | ||
3088 | + * Robert Schwebel <r.schwebel@pengutronix.de> | ||
3089 | + * | ||
3090 | + * See file CREDITS for list of people who contributed to this | ||
3091 | + * project. | ||
3092 | + * | ||
3093 | + * This program is free software; you can redistribute it and/or | ||
3094 | + * modify it under the terms of the GNU General Public License as | ||
3095 | + * published by the Free Software Foundation; either version 2 of | ||
3096 | + * the License, or (at your option) any later version. | ||
3097 | + * | ||
3098 | + * This program is distributed in the hope that it will be useful, | ||
3099 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
3100 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
3101 | + * GNU General Public License for more details. | ||
3102 | + * | ||
3103 | + * You should have received a copy of the GNU General Public License | ||
3104 | + * along with this program; if not, write to the Free Software | ||
3105 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
3106 | + * MA 02111-1307 USA | ||
3107 | + * | ||
3108 | + * Back ported to the 8xx platform (from the 8260 platform) by | ||
3109 | + * Murray.Jensen@cmst.csiro.au, 27-Jan-01. | ||
3110 | + */ | ||
3111 | + | ||
3112 | +/* #define DEBUG */ | ||
3113 | + | ||
3114 | +#include <linux/kernel.h> | ||
3115 | +#include <linux/delay.h> | ||
3116 | +#include <linux/module.h> | ||
3117 | +#include <linux/jiffies.h> | ||
3118 | + | ||
3119 | +#include <asm/arch/hardware.h> | ||
3120 | +#include <asm/arch/pxa-regs.h> | ||
3121 | +#include <asm/arch/pwr-i2c.h> | ||
3122 | + | ||
3123 | +#define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE) | ||
3124 | +#define I2C_ISR_INIT 0x7FF | ||
3125 | + | ||
3126 | +/* Shall the current transfer have a start/stop condition? */ | ||
3127 | +#define I2C_COND_NORMAL 0 | ||
3128 | +#define I2C_COND_START 1 | ||
3129 | +#define I2C_COND_STOP 2 | ||
3130 | + | ||
3131 | +/* Shall the current transfer be ack/nacked or being waited for it? */ | ||
3132 | +#define I2C_ACKNAK_WAITACK 1 | ||
3133 | +#define I2C_ACKNAK_SENDACK 2 | ||
3134 | +#define I2C_ACKNAK_SENDNAK 4 | ||
3135 | + | ||
3136 | +/* Specify who shall transfer the data (master or slave) */ | ||
3137 | +#define I2C_READ 0 | ||
3138 | +#define I2C_WRITE 1 | ||
3139 | + | ||
3140 | +/* All transfers are described by this data structure */ | ||
3141 | +struct i2c_msg { | ||
3142 | + u8 condition; | ||
3143 | + u8 acknack; | ||
3144 | + u8 direction; | ||
3145 | + u8 data; | ||
3146 | +}; | ||
3147 | + | ||
3148 | +/** | ||
3149 | + * pxa_pwr_i2c_transfer: - reset the host controller | ||
3150 | + * | ||
3151 | + */ | ||
3152 | +/* static void pxa_pwr_i2c_reset(void) */ | ||
3153 | +/* { */ | ||
3154 | +/* int i; */ | ||
3155 | + | ||
3156 | +/* /\* CKEN |= CKEN_PWRI2C; *\/ */ | ||
3157 | +/* /\* PWRICR |= PCFR_PI2C_EN; *\/ */ | ||
3158 | + | ||
3159 | +/* /\* /\\* delay 250ms *\\/ *\/ */ | ||
3160 | +/* /\* for (i = 0; i < 250; i++) *\/ */ | ||
3161 | +/* /\* udelay(1000); *\/ */ | ||
3162 | + | ||
3163 | +/* /\* PWRICR &= ~(ICR_MA | ICR_START | ICR_STOP); *\/ */ | ||
3164 | +/* /\* PWRICR |= ICR_UR; *\/ */ | ||
3165 | +/* /\* PWRISR = 0x7ff; *\/ */ | ||
3166 | + | ||
3167 | +/* /\* PWRICR &= ~ICR_UR; *\/ */ | ||
3168 | +/* /\* PWRICR = ICR_GCD | ICR_SCLE; *\/ */ | ||
3169 | +/* /\* PWRICR |= ICR_IUE; *\/ */ | ||
3170 | +/* /\* PWRICR |= 0x8000; *\/ */ | ||
3171 | + | ||
3172 | +/* /\* udelay(1000); *\/ */ | ||
3173 | + | ||
3174 | +/* return; */ | ||
3175 | + | ||
3176 | +/* PWRICR &= ~ICR_IUE; /\* disable unit *\/ */ | ||
3177 | +/* PWRICR |= ICR_UR; /\* reset the unit *\/ */ | ||
3178 | +/* udelay(100); */ | ||
3179 | +/* PWRICR &= ~ICR_IUE; /\* disable unit *\/ */ | ||
3180 | + | ||
3181 | +/* CKEN |= CKEN_PWRI2C; */ | ||
3182 | +/* PCFR |= PCFR_PI2C_EN; */ | ||
3183 | + | ||
3184 | +/* PWRICR = I2C_ICR_INIT; /\* set control register values *\/ */ | ||
3185 | +/* PWRISR = I2C_ISR_INIT; /\* set clear interrupt bits *\/ */ | ||
3186 | +/* PWRICR |= ICR_IUE; /\* enable unit *\/ */ | ||
3187 | +/* udelay(100); */ | ||
3188 | +/* } */ | ||
3189 | + | ||
3190 | +static void pwr_i2c_abort() | ||
3191 | +{ | ||
3192 | + unsigned long timeout = 250000; | ||
3193 | + unsigned long time = 0; | ||
3194 | + | ||
3195 | + while ((time < timeout) && (PWRIBMR & 0x1) == 0) { | ||
3196 | + unsigned long icr = PWRICR; | ||
3197 | + | ||
3198 | + icr &= ~ICR_START; | ||
3199 | + icr |= ICR_ACKNAK | ICR_STOP | ICR_TB; | ||
3200 | + | ||
3201 | + PWRICR = icr; | ||
3202 | + | ||
3203 | + udelay(1000); | ||
3204 | + time += 1000; | ||
3205 | + } | ||
3206 | + | ||
3207 | + PWRICR &= ~(ICR_MA | ICR_START | ICR_STOP); | ||
3208 | +} | ||
3209 | + | ||
3210 | +static void pxa_pwr_i2c_reset(void) | ||
3211 | +{ | ||
3212 | + pr_debug("Resetting I2C Controller Unit\n"); | ||
3213 | + | ||
3214 | + /* abort any transfer currently under way */ | ||
3215 | + pwr_i2c_abort(); | ||
3216 | + | ||
3217 | + /* reset according to 9.8 */ | ||
3218 | + PWRICR = ICR_UR; | ||
3219 | + PWRISR = I2C_ISR_INIT; | ||
3220 | + PWRISR &= ~ICR_UR; | ||
3221 | + | ||
3222 | + /* set control register values */ | ||
3223 | + PWRICR = I2C_ICR_INIT; | ||
3224 | + | ||
3225 | + /* enable unit */ | ||
3226 | + PWRICR |= ICR_IUE; | ||
3227 | + udelay(100); | ||
3228 | + | ||
3229 | +/* CKEN |= CKEN_PWRI2C; */ | ||
3230 | +/* PCFR |= PCFR_PI2C_EN; */ | ||
3231 | +} | ||
3232 | + | ||
3233 | +/** | ||
3234 | + * i2c_isr_set_cleared: - wait until certain bits of the I2C status register | ||
3235 | + * are set and cleared | ||
3236 | + * | ||
3237 | + * @return: 1 in case of success, 0 means timeout (no match within 10 ms). | ||
3238 | + */ | ||
3239 | +static int pxa_pwr_i2c_isr_set_cleared(unsigned long set_mask, | ||
3240 | + unsigned long cleared_mask) | ||
3241 | +{ | ||
3242 | + int timeout = 10000; | ||
3243 | + | ||
3244 | + while (((PWRISR & set_mask) != set_mask) | ||
3245 | + || ((PWRISR & cleared_mask) != 0)) { | ||
3246 | + udelay(10); | ||
3247 | + if (timeout-- < 0) | ||
3248 | + return 0; | ||
3249 | + } | ||
3250 | + | ||
3251 | + return 1; | ||
3252 | +} | ||
3253 | + | ||
3254 | +/** | ||
3255 | + * pxa_pwr_i2c_transfer: - Transfer one byte over the i2c bus | ||
3256 | + * | ||
3257 | + * This function can tranfer a byte over the i2c bus in both directions. | ||
3258 | + * It is used by the public API functions. | ||
3259 | + * | ||
3260 | + * @return: 0: transfer successful | ||
3261 | + * -EINVAL: message is empty | ||
3262 | + * -ETIMEDOUT: transmit timeout | ||
3263 | + * -E: ACK missing | ||
3264 | + * -ETIMEDOUT: receive timeout | ||
3265 | + * -EINVAL: illegal parameters | ||
3266 | + * -EBUSY: bus is busy and couldn't be aquired | ||
3267 | + */ | ||
3268 | +int pxa_pwr_i2c_transfer(struct i2c_msg *msg) | ||
3269 | +{ | ||
3270 | + int ret; | ||
3271 | + | ||
3272 | + if (!msg) | ||
3273 | + goto transfer_error_msg_empty; | ||
3274 | + | ||
3275 | + switch (msg->direction) { | ||
3276 | + case I2C_WRITE: | ||
3277 | + /* check if bus is not busy */ | ||
3278 | +/* if (!pxa_pwr_i2c_isr_set_cleared(0, (ISR_IBB | ISR_UB))) */ | ||
3279 | +/* goto transfer_error_bus_busy; */ | ||
3280 | + | ||
3281 | + /* start transmission */ | ||
3282 | + PWRICR &= ~ICR_START; | ||
3283 | + PWRICR &= ~ICR_STOP; | ||
3284 | + PWRIDBR = msg->data; | ||
3285 | + if (msg->condition == I2C_COND_START) | ||
3286 | + PWRICR |= ICR_START; | ||
3287 | + if (msg->condition == I2C_COND_STOP) | ||
3288 | + PWRICR |= ICR_STOP; | ||
3289 | + if (msg->acknack == I2C_ACKNAK_SENDNAK) | ||
3290 | + PWRICR |= ICR_ACKNAK; | ||
3291 | + if (msg->acknack == I2C_ACKNAK_SENDACK) | ||
3292 | + PWRICR &= ~ICR_ACKNAK; | ||
3293 | + PWRICR &= ~ICR_ALDIE; | ||
3294 | + PWRICR |= ICR_TB; | ||
3295 | + | ||
3296 | + /* transmit register empty? */ | ||
3297 | + if (!pxa_pwr_i2c_isr_set_cleared(ISR_ITE, 0)) | ||
3298 | + goto transfer_error_transmit_timeout; | ||
3299 | + | ||
3300 | + /* clear 'transmit empty' state */ | ||
3301 | + PWRISR |= ISR_ITE; | ||
3302 | + | ||
3303 | + /* wait for ACK from slave */ | ||
3304 | + if (msg->acknack == I2C_ACKNAK_WAITACK) | ||
3305 | + if (!pxa_pwr_i2c_isr_set_cleared(0, ISR_ACKNAK)) | ||
3306 | + goto transfer_error_ack_missing; | ||
3307 | + break; | ||
3308 | + case I2C_READ: | ||
3309 | + /* check if bus is not busy */ | ||
3310 | +/* if (!pxa_pwr_i2c_isr_set_cleared(0, ISR_IBB)) */ | ||
3311 | +/* goto transfer_error_bus_busy; */ | ||
3312 | + | ||
3313 | + /* start receive */ | ||
3314 | + PWRICR &= ~ICR_START; | ||
3315 | + PWRICR &= ~ICR_STOP; | ||
3316 | + if (msg->condition == I2C_COND_START) | ||
3317 | + PWRICR |= ICR_START; | ||
3318 | + if (msg->condition == I2C_COND_STOP) | ||
3319 | + PWRICR |= ICR_STOP; | ||
3320 | + if (msg->acknack == I2C_ACKNAK_SENDNAK) | ||
3321 | + PWRICR |= ICR_ACKNAK; | ||
3322 | + if (msg->acknack == I2C_ACKNAK_SENDACK) | ||
3323 | + PWRICR &= ~ICR_ACKNAK; | ||
3324 | + PWRICR &= ~ICR_ALDIE; | ||
3325 | + PWRICR |= ICR_TB; | ||
3326 | + | ||
3327 | + /* receive register full? */ | ||
3328 | + if (!pxa_pwr_i2c_isr_set_cleared(ISR_IRF, 0)) | ||
3329 | + goto transfer_error_receive_timeout; | ||
3330 | + | ||
3331 | + msg->data = PWRIDBR; | ||
3332 | + | ||
3333 | + /* clear 'receive empty' state */ | ||
3334 | + PWRISR |= ISR_IRF; | ||
3335 | + | ||
3336 | + break; | ||
3337 | + default: | ||
3338 | + goto transfer_error_illegal_param; | ||
3339 | + | ||
3340 | + } | ||
3341 | + | ||
3342 | + return 0; | ||
3343 | + | ||
3344 | +transfer_error_msg_empty: | ||
3345 | + pr_debug("%s: error: 'msg' is empty\n", __FUNCTION__); | ||
3346 | + ret = -1; | ||
3347 | + goto i2c_transfer_finish; | ||
3348 | + | ||
3349 | +transfer_error_transmit_timeout: | ||
3350 | + pr_debug("%s: error: transmit timeout\n", __FUNCTION__); | ||
3351 | + ret = -2; | ||
3352 | + goto i2c_transfer_finish; | ||
3353 | + | ||
3354 | +transfer_error_ack_missing: | ||
3355 | + pr_debug("%s: error: ACK missing\n", __FUNCTION__); | ||
3356 | + ret = -3; | ||
3357 | + goto i2c_transfer_finish; | ||
3358 | + | ||
3359 | +transfer_error_receive_timeout: | ||
3360 | + pr_debug("%s: error: receive timeout\n", __FUNCTION__); | ||
3361 | + ret = -4; | ||
3362 | + goto i2c_transfer_finish; | ||
3363 | + | ||
3364 | +transfer_error_illegal_param: | ||
3365 | + pr_debug("%s: error: illegal parameters\n", __FUNCTION__); | ||
3366 | + ret = -5; | ||
3367 | + goto i2c_transfer_finish; | ||
3368 | + | ||
3369 | +transfer_error_bus_busy: | ||
3370 | + pr_debug("%s: error: bus is busy\n", __FUNCTION__); | ||
3371 | + ret = -6; | ||
3372 | + goto i2c_transfer_finish; | ||
3373 | + | ||
3374 | +i2c_transfer_finish: | ||
3375 | + pr_debug("%s: ISR: 0x%04x\n", __FUNCTION__, ISR); | ||
3376 | + return ret; | ||
3377 | +} | ||
3378 | + | ||
3379 | +/* ------------------------------------------------------------------------ */ | ||
3380 | +/* API Functions */ | ||
3381 | +/* ------------------------------------------------------------------------ */ | ||
3382 | +/** | ||
3383 | + * i2c_probe: - Test if a chip answers for a given i2c address | ||
3384 | + * | ||
3385 | + * @chip: address of the chip which is searched for | ||
3386 | + * @return: 0 if a chip was found, -1 otherwhise | ||
3387 | + */ | ||
3388 | +int pxa_pwr_i2c_probe(u8 chip) | ||
3389 | +{ | ||
3390 | + struct i2c_msg msg; | ||
3391 | + int ret; | ||
3392 | + | ||
3393 | + pxa_pwr_i2c_reset(); | ||
3394 | + | ||
3395 | + msg.condition = I2C_COND_START; | ||
3396 | + msg.acknack = I2C_ACKNAK_WAITACK; | ||
3397 | + msg.direction = I2C_WRITE; | ||
3398 | + msg.data = (chip << 1) + 1; | ||
3399 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3400 | + return ret; | ||
3401 | + | ||
3402 | + msg.condition = I2C_COND_STOP; | ||
3403 | + msg.acknack = I2C_ACKNAK_SENDNAK; | ||
3404 | + msg.direction = I2C_READ; | ||
3405 | + msg.data = 0x00; | ||
3406 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3407 | + return ret; | ||
3408 | + | ||
3409 | + return 0; | ||
3410 | +} | ||
3411 | + | ||
3412 | +/** | ||
3413 | + * i2c_read: - Read multiple bytes from an i2c device | ||
3414 | + * | ||
3415 | + * The higher level routines take into account that this function is only | ||
3416 | + * called with len < page length of the device (see configuration file) | ||
3417 | + * | ||
3418 | + * @chip: address of the chip which is to be read | ||
3419 | + * @addr: i2c data address within the chip | ||
3420 | + * @alen: length of the i2c data address (1..2 bytes) | ||
3421 | + * @buffer: where to write the data | ||
3422 | + * @len: how much byte do we want to read | ||
3423 | + * @return: 0 in case of success | ||
3424 | + */ | ||
3425 | +int pxa_pwr_i2c_read(u8 chip, uint addr, int alen, u8 * buffer, int len) | ||
3426 | +{ | ||
3427 | + struct i2c_msg msg; | ||
3428 | + u8 addr_bytes[3]; /* lowest...highest byte of data address */ | ||
3429 | + int ret; | ||
3430 | + | ||
3431 | + pr_debug("%s(chip=0x%02x, addr=0x%02x, alen=0x%02x, len=0x%02x)\n", | ||
3432 | + __FUNCTION__, chip, addr, alen, len); | ||
3433 | + | ||
3434 | + pxa_pwr_i2c_reset(); | ||
3435 | + | ||
3436 | + /* dummy chip address write */ | ||
3437 | + pr_debug("%s: dummy chip address write\n", __FUNCTION__); | ||
3438 | + msg.condition = I2C_COND_START; | ||
3439 | + msg.acknack = I2C_ACKNAK_WAITACK; | ||
3440 | + msg.direction = I2C_WRITE; | ||
3441 | + msg.data = (chip << 1); | ||
3442 | + msg.data &= 0xFE; | ||
3443 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3444 | + return ret; | ||
3445 | + | ||
3446 | + /* | ||
3447 | + * send memory address bytes; | ||
3448 | + * alen defines how much bytes we have to send. | ||
3449 | + */ | ||
3450 | + /*addr &= ((1 << CFG_EEPROM_PAGE_WRITE_BITS)-1); */ | ||
3451 | + addr_bytes[0] = (u8) ((addr >> 0) & 0x000000FF); | ||
3452 | + addr_bytes[1] = (u8) ((addr >> 8) & 0x000000FF); | ||
3453 | + addr_bytes[2] = (u8) ((addr >> 16) & 0x000000FF); | ||
3454 | + | ||
3455 | + while (--alen >= 0) { | ||
3456 | + pr_debug("%s: send memory word address byte %1d\n", | ||
3457 | + __FUNCTION__, alen); | ||
3458 | + msg.condition = I2C_COND_NORMAL; | ||
3459 | + msg.acknack = I2C_ACKNAK_WAITACK; | ||
3460 | + msg.direction = I2C_WRITE; | ||
3461 | + msg.data = addr_bytes[alen]; | ||
3462 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3463 | + return ret; | ||
3464 | + } | ||
3465 | + | ||
3466 | + /* start read sequence */ | ||
3467 | + pr_debug("%s: start read sequence\n", __FUNCTION__); | ||
3468 | + msg.condition = I2C_COND_START; | ||
3469 | + msg.acknack = I2C_ACKNAK_WAITACK; | ||
3470 | + msg.direction = I2C_WRITE; | ||
3471 | + msg.data = (chip << 1); | ||
3472 | + msg.data |= 0x01; | ||
3473 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3474 | + return ret; | ||
3475 | + | ||
3476 | + /* read bytes; send NACK at last byte */ | ||
3477 | + while (len--) { | ||
3478 | + if (len == 0) { | ||
3479 | + msg.condition = I2C_COND_STOP; | ||
3480 | + msg.acknack = I2C_ACKNAK_SENDNAK; | ||
3481 | + } else { | ||
3482 | + msg.condition = I2C_COND_NORMAL; | ||
3483 | + msg.acknack = I2C_ACKNAK_SENDACK; | ||
3484 | + } | ||
3485 | + | ||
3486 | + msg.direction = I2C_READ; | ||
3487 | + msg.data = 0x00; | ||
3488 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3489 | + return ret; | ||
3490 | + | ||
3491 | + *buffer = msg.data; | ||
3492 | + pr_debug("%s: reading byte (0x%08x)=0x%02x\n", | ||
3493 | + __FUNCTION__, (unsigned int)buffer, *buffer); | ||
3494 | + buffer++; | ||
3495 | + } | ||
3496 | + | ||
3497 | + pxa_pwr_i2c_reset(); | ||
3498 | + return 0; | ||
3499 | +} | ||
3500 | + | ||
3501 | +/** | ||
3502 | + * i2c_write: - Write multiple bytes to an i2c device | ||
3503 | + * | ||
3504 | + * The higher level routines take into account that this function is only | ||
3505 | + * called with len < page length of the device (see configuration file) | ||
3506 | + * | ||
3507 | + * @chip: address of the chip which is to be written | ||
3508 | + * @addr: i2c data address within the chip | ||
3509 | + * @alen: length of the i2c data address (1..2 bytes) | ||
3510 | + * @buffer: where to find the data to be written | ||
3511 | + * @len: how much byte do we want to read | ||
3512 | + * @return: 0 in case of success | ||
3513 | + */ | ||
3514 | +int pxa_pwr_i2c_write(u8 chip, uint addr, int alen, u8 * buffer, int len) | ||
3515 | +{ | ||
3516 | + struct i2c_msg msg; | ||
3517 | + u8 addr_bytes[3]; /* lowest...highest byte of data address */ | ||
3518 | + int ret; | ||
3519 | + | ||
3520 | + pr_debug("%s(chip=0x%02x, addr=0x%02x, alen=0x%02x, len=0x%02x)\n", | ||
3521 | + __FUNCTION__, chip, addr, alen, len); | ||
3522 | + | ||
3523 | + pxa_pwr_i2c_reset(); | ||
3524 | + | ||
3525 | + /* chip address write */ | ||
3526 | + pr_debug("%s: chip address write\n", __FUNCTION__); | ||
3527 | + msg.condition = I2C_COND_START; | ||
3528 | + msg.acknack = I2C_ACKNAK_WAITACK; | ||
3529 | + msg.direction = I2C_WRITE; | ||
3530 | + msg.data = (chip << 1); | ||
3531 | + msg.data &= 0xFE; | ||
3532 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3533 | + return ret; | ||
3534 | + | ||
3535 | + /* | ||
3536 | + * send memory address bytes; | ||
3537 | + * alen defines how much bytes we have to send. | ||
3538 | + */ | ||
3539 | + addr_bytes[0] = (u8) ((addr >> 0) & 0x000000FF); | ||
3540 | + addr_bytes[1] = (u8) ((addr >> 8) & 0x000000FF); | ||
3541 | + addr_bytes[2] = (u8) ((addr >> 16) & 0x000000FF); | ||
3542 | + | ||
3543 | + while (--alen >= 0) { | ||
3544 | + pr_debug("%s: send memory word address\n", __FUNCTION__); | ||
3545 | + msg.condition = I2C_COND_NORMAL; | ||
3546 | + msg.acknack = I2C_ACKNAK_WAITACK; | ||
3547 | + msg.direction = I2C_WRITE; | ||
3548 | + msg.data = addr_bytes[alen]; | ||
3549 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3550 | + return ret; | ||
3551 | + } | ||
3552 | + | ||
3553 | + /* write bytes; send NACK at last byte */ | ||
3554 | + while (len--) { | ||
3555 | + pr_debug("%s: writing byte (0x%08x)=0x%02x\n", | ||
3556 | + __FUNCTION__, (unsigned int)buffer, *buffer); | ||
3557 | + | ||
3558 | + if (len == 0) | ||
3559 | + msg.condition = I2C_COND_STOP; | ||
3560 | + else | ||
3561 | + msg.condition = I2C_COND_NORMAL; | ||
3562 | + | ||
3563 | + msg.acknack = I2C_ACKNAK_WAITACK; | ||
3564 | + msg.direction = I2C_WRITE; | ||
3565 | + msg.data = *(buffer++); | ||
3566 | + | ||
3567 | + if ((ret = pxa_pwr_i2c_transfer(&msg))) | ||
3568 | + return ret; | ||
3569 | + } | ||
3570 | + | ||
3571 | + pxa_pwr_i2c_reset(); | ||
3572 | + return 0; | ||
3573 | +} | ||
3574 | + | ||
3575 | +/** | ||
3576 | + * pxa_pwr_i2c_reg_read: - Read single byte from an i2c device | ||
3577 | + * | ||
3578 | + * @chip: address of the chip which is to be read | ||
3579 | + * @reg: i2c data address within the chip | ||
3580 | + * @return: data in case of success, negative error code otherwise | ||
3581 | + */ | ||
3582 | +s32 pxa_pwr_i2c_reg_read(u8 chip, u8 reg) | ||
3583 | +{ | ||
3584 | + char buf; | ||
3585 | + int ret; | ||
3586 | + | ||
3587 | + pr_debug("%s(chip=0x%02x, reg=0x%02x)\n", __FUNCTION__, chip, reg); | ||
3588 | + ret = pxa_pwr_i2c_read(chip, reg, 1, &buf, 1); | ||
3589 | + if (ret == 0) | ||
3590 | + ret = buf; | ||
3591 | + | ||
3592 | + return ret; | ||
3593 | +} | ||
3594 | + | ||
3595 | +/** | ||
3596 | + * pxa_pwr_i2c_reg_write: - Write multiple bytes to an i2c device | ||
3597 | + * | ||
3598 | + * The higher level routines take into account that this function is only | ||
3599 | + * called with len < page length of the device (see configuration file) | ||
3600 | + * | ||
3601 | + * @chip: address of the chip which is to be written | ||
3602 | + * @reg: i2c data address within the chip | ||
3603 | + * @return: 0 in case of success, negative error code otherwise | ||
3604 | + */ | ||
3605 | +s32 pxa_pwr_i2c_reg_write(u8 chip, u8 reg, u8 val) | ||
3606 | +{ | ||
3607 | + pr_debug("%s(chip=0x%02x, reg=0x%02x, val=0x%02x)\n", | ||
3608 | + __FUNCTION__, chip, reg, val); | ||
3609 | + return pxa_pwr_i2c_write(chip, reg, 1, &val, 1); | ||
3610 | +} | ||
3611 | + | ||
3612 | +MODULE_DESCRIPTION("PXA Power I2C"); | ||
3613 | +MODULE_AUTHOR("Mike Rapoport"); | ||
3614 | +MODULE_LICENSE("GPL"); | ||
3615 | diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c | ||
3616 | index 203371a..36b695f 100644 | ||
3617 | --- a/arch/arm/mach-pxa/pxa27x.c | ||
3618 | +++ b/arch/arm/mach-pxa/pxa27x.c | ||
3619 | @@ -243,7 +243,11 @@ void pxa27x_cpu_pm_enter(suspend_state_t state) | ||
3620 | case PM_SUSPEND_MEM: | ||
3621 | /* set resume return address */ | ||
3622 | PSPR = virt_to_phys(pxa_cpu_resume); | ||
3623 | - pxa27x_cpu_suspend(PWRMODE_SLEEP); | ||
3624 | +#ifdef CONFIG_MACH_EM_X270 | ||
3625 | + pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP); | ||
3626 | +#else | ||
3627 | + pxa27x_cpu_suspend(PWRMODE_SLEEP); | ||
3628 | +#endif | ||
3629 | break; | ||
3630 | } | ||
3631 | } | ||
3632 | diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c | ||
3633 | index bae47e1..a16e532 100644 | ||
3634 | --- a/arch/arm/mach-pxa/spitz.c | ||
3635 | +++ b/arch/arm/mach-pxa/spitz.c | ||
3636 | @@ -349,6 +349,32 @@ static struct pxamci_platform_data spitz_mci_platform_data = { | ||
3637 | |||
3638 | |||
3639 | /* | ||
3640 | + * USB Client (Gadget/UDC) | ||
3641 | + */ | ||
3642 | +static void spitz_udc_command(int cmd) | ||
3643 | +{ | ||
3644 | + switch(cmd) { | ||
3645 | + case PXA2XX_UDC_CMD_CONNECT: | ||
3646 | + UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; | ||
3647 | + break; | ||
3648 | + case PXA2XX_UDC_CMD_DISCONNECT: | ||
3649 | + //UP2OCR = UP2OCR_HXOE | UP2OCR_DMPUE | UP2OCR_DMPUBE; | ||
3650 | + break; | ||
3651 | + } | ||
3652 | +} | ||
3653 | + | ||
3654 | +static int spitz_udc_detect(void) | ||
3655 | +{ | ||
3656 | + return 1; | ||
3657 | +} | ||
3658 | + | ||
3659 | +static struct pxa2xx_udc_mach_info spitz_udc_info __initdata = { | ||
3660 | + .udc_is_connected = spitz_udc_detect, | ||
3661 | + .udc_command = spitz_udc_command, | ||
3662 | +}; | ||
3663 | + | ||
3664 | + | ||
3665 | +/* | ||
3666 | * USB Host (OHCI) | ||
3667 | */ | ||
3668 | static int spitz_ohci_init(struct device *dev) | ||
3669 | @@ -499,6 +525,7 @@ static void __init common_init(void) | ||
3670 | pxa_gpio_mode(SPITZ_GPIO_HSYNC | GPIO_IN); | ||
3671 | |||
3672 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
3673 | + pxa_set_udc_info(&spitz_udc_info); | ||
3674 | pxa_set_mci_info(&spitz_mci_platform_data); | ||
3675 | pxa_set_ohci_info(&spitz_ohci_platform_data); | ||
3676 | pxa_set_ficp_info(&spitz_ficp_platform_data); | ||
3677 | diff --git a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig | ||
3678 | index 2e1c24f..f80f2b1 100644 | ||
3679 | --- a/drivers/i2c/chips/Kconfig | ||
3680 | +++ b/drivers/i2c/chips/Kconfig | ||
3681 | @@ -163,4 +163,17 @@ config MENELAUS | ||
3682 | and other features that are often used in portable devices like | ||
3683 | cell phones and PDAs. | ||
3684 | |||
3685 | +config DA9030 | ||
3686 | + tristate "Dialog Semiconductor DA9030 power management chip" | ||
3687 | + depends on EXPERIMENTAL && EMBEDDED | ||
3688 | + help | ||
3689 | + If you say yes here you get support for the Dialog | ||
3690 | + Semiconductor DA9030 power management chip. | ||
3691 | + This includes voltage regulators, lithium ion/polymer battery | ||
3692 | + charging, and other features that are often used in portable | ||
3693 | + devices like PDAs, cell phones and cameras. | ||
3694 | + | ||
3695 | + This driver can also be built as a module. If so, the module | ||
3696 | + will be called da9030. | ||
3697 | + | ||
3698 | endmenu | ||
3699 | diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile | ||
3700 | index ca924e1..69f545c 100644 | ||
3701 | --- a/drivers/i2c/chips/Makefile | ||
3702 | +++ b/drivers/i2c/chips/Makefile | ||
3703 | @@ -15,6 +15,7 @@ obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o | ||
3704 | obj-$(CONFIG_TPS65010) += tps65010.o | ||
3705 | obj-$(CONFIG_MENELAUS) += menelaus.o | ||
3706 | obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o | ||
3707 | +obj-$(CONFIG_DA9030) += da9030.o | ||
3708 | |||
3709 | ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) | ||
3710 | EXTRA_CFLAGS += -DDEBUG | ||
3711 | diff --git a/drivers/i2c/chips/da9030.c b/drivers/i2c/chips/da9030.c | ||
3712 | new file mode 100644 | ||
3713 | index 0000000..9791272 | ||
3714 | --- /dev/null | ||
3715 | +++ b/drivers/i2c/chips/da9030.c | ||
3716 | @@ -0,0 +1,1213 @@ | ||
3717 | +/* | ||
3718 | + * Dialog Semiconductor DA9030 power management IC driver | ||
3719 | + * | ||
3720 | + * Copyright (C) 2007 Compulab, Ltd. | ||
3721 | + * Mike Rapoport <mike@compulab.co.il> | ||
3722 | + * | ||
3723 | + * Some parts based on menelaus.c: | ||
3724 | + * Copyright (C) 2004 Texas Instruments, Inc. | ||
3725 | + * Copyright (C) 2005, 2006 Nokia Corporation | ||
3726 | + * | ||
3727 | + * This file is subject to the terms and conditions of the GNU General Public | ||
3728 | + * License. See the file COPYING in the main directory of this archive for | ||
3729 | + * more details. | ||
3730 | + */ | ||
3731 | + | ||
3732 | +#include <linux/module.h> | ||
3733 | +#include <linux/ctype.h> | ||
3734 | +#include <linux/uaccess.h> | ||
3735 | +#include <linux/i2c.h> | ||
3736 | +#include <linux/irq.h> | ||
3737 | +#include <linux/interrupt.h> | ||
3738 | +#include <linux/da9030.h> | ||
3739 | +#include <linux/kernel_stat.h> | ||
3740 | +#include <linux/random.h> | ||
3741 | +#include <linux/mutex.h> | ||
3742 | + | ||
3743 | +#include <linux/debugfs.h> | ||
3744 | +#include <linux/seq_file.h> | ||
3745 | + | ||
3746 | +#include "da9030.h" | ||
3747 | + | ||
3748 | +#define DRIVER_NAME "da9030" | ||
3749 | + | ||
3750 | +static unsigned short normal_i2c[] = { 0x49, I2C_CLIENT_END }; | ||
3751 | + | ||
3752 | +I2C_CLIENT_INSMOD; | ||
3753 | + | ||
3754 | +struct da9030 { | ||
3755 | + struct mutex lock; | ||
3756 | + struct i2c_client *client; | ||
3757 | + | ||
3758 | + struct work_struct event_work; | ||
3759 | + | ||
3760 | + /* there are 24 interrupts */ | ||
3761 | + void (*callbacks[24])(int event, void *data); | ||
3762 | + void *callbacks_data[24]; | ||
3763 | + | ||
3764 | + struct dentry *debug_file; | ||
3765 | +}; | ||
3766 | + | ||
3767 | +/* I hardly believe there can be more than 1 such chip in the system, | ||
3768 | + so keeping its global instance won't really hurt */ | ||
3769 | +static struct da9030 *the_da9030; | ||
3770 | + | ||
3771 | +unsigned char defined_regs[] = { | ||
3772 | + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, | ||
3773 | + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, | ||
3774 | + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, | ||
3775 | + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, | ||
3776 | + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, | ||
3777 | + 0x50, 0x51, | ||
3778 | + 0x60, 0x61, 0x62, 0x63, | ||
3779 | + 0x80, 0x81, | ||
3780 | + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, | ||
3781 | + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, | ||
3782 | + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, | ||
3783 | +}; | ||
3784 | + | ||
3785 | +static inline int is_reg_valid(u32 reg) | ||
3786 | +{ | ||
3787 | + int i; | ||
3788 | + for (i = 0; i < ARRAY_SIZE(defined_regs); i++) | ||
3789 | + if (reg == defined_regs[i]) | ||
3790 | + return 1; | ||
3791 | + | ||
3792 | + return 0; | ||
3793 | +} | ||
3794 | + | ||
3795 | +s32 da9030_get_reg(u32 reg) | ||
3796 | +{ | ||
3797 | + if (!is_reg_valid(reg)) | ||
3798 | + return -EINVAL; | ||
3799 | + | ||
3800 | + return i2c_smbus_read_byte_data(the_da9030->client, reg); | ||
3801 | +} | ||
3802 | +EXPORT_SYMBOL(da9030_get_reg); | ||
3803 | + | ||
3804 | +s32 da9030_set_reg(u32 reg, u8 val) | ||
3805 | +{ | ||
3806 | + if (!is_reg_valid(reg)) | ||
3807 | + return -EINVAL; | ||
3808 | + | ||
3809 | + return i2c_smbus_write_byte_data(the_da9030->client, reg, val); | ||
3810 | +} | ||
3811 | +EXPORT_SYMBOL(da9030_set_reg); | ||
3812 | + | ||
3813 | +static s32 da9030_update_reg_bits(u32 reg, int bits, int shift, int val) | ||
3814 | +{ | ||
3815 | + int ret; | ||
3816 | + int new_val; | ||
3817 | + | ||
3818 | + mutex_lock(&the_da9030->lock); | ||
3819 | + ret = da9030_get_reg(reg); | ||
3820 | + if (ret < 0) | ||
3821 | + goto out; | ||
3822 | + | ||
3823 | + new_val = reg & ~(((1 << bits) - 1) << shift); | ||
3824 | + new_val |= (val << shift); | ||
3825 | + | ||
3826 | + ret = da9030_set_reg(reg, new_val); | ||
3827 | + mutex_unlock(&the_da9030->lock); | ||
3828 | + | ||
3829 | +out: | ||
3830 | + return ret; | ||
3831 | +} | ||
3832 | + | ||
3833 | +int da9030_get_status(void) | ||
3834 | +{ | ||
3835 | + s32 ret; | ||
3836 | + | ||
3837 | + mutex_lock(&the_da9030->lock); | ||
3838 | + ret = da9030_get_reg(STATUS); | ||
3839 | + mutex_unlock(&the_da9030->lock); | ||
3840 | + | ||
3841 | + return ret; | ||
3842 | +} | ||
3843 | +EXPORT_SYMBOL(da9030_get_status); | ||
3844 | + | ||
3845 | +int da9030_get_fault_log(void) | ||
3846 | +{ | ||
3847 | + s32 ret; | ||
3848 | + | ||
3849 | + mutex_lock(&the_da9030->lock); | ||
3850 | + ret = da9030_get_reg(FAULT_LOG); | ||
3851 | + mutex_unlock(&the_da9030->lock); | ||
3852 | + | ||
3853 | + return ret; | ||
3854 | +} | ||
3855 | +EXPORT_SYMBOL(da9030_get_fault_log); | ||
3856 | + | ||
3857 | +void da9030_read_adc(struct da9030_adc_res *adc) | ||
3858 | +{ | ||
3859 | + mutex_lock(&the_da9030->lock); | ||
3860 | + | ||
3861 | + adc->vbat_res = da9030_get_reg(VBAT_RES); | ||
3862 | + adc->vbatmin_res = da9030_get_reg(VBATMIN_RES); | ||
3863 | + adc->vbatmintxon = da9030_get_reg(VBATMINTXON_RES); | ||
3864 | + adc->ichmax_res = da9030_get_reg(ICHMAX_RES); | ||
3865 | + adc->ichmin_res = da9030_get_reg(ICHMIN_RES); | ||
3866 | + adc->ichaverage_res = da9030_get_reg(ICHAVERAGE_RES); | ||
3867 | + adc->vchmax_res = da9030_get_reg(VCHMAX_RES); | ||
3868 | + adc->vchmin_res = da9030_get_reg(VCHMIN_RES); | ||
3869 | + adc->tbat_res = da9030_get_reg(TBAT_RES); | ||
3870 | + adc->adc_in4_res = da9030_get_reg(ADC_IN4_RES); | ||
3871 | + adc->adc_in5_res = da9030_get_reg(ADC_IN5_RES); | ||
3872 | + | ||
3873 | + mutex_unlock(&the_da9030->lock); | ||
3874 | +} | ||
3875 | +EXPORT_SYMBOL(da9030_read_adc); | ||
3876 | + | ||
3877 | +void da9030_enable_adc(void) | ||
3878 | +{ | ||
3879 | + /* enable automatic A/D measurements */ | ||
3880 | + mutex_lock(&the_da9030->lock); | ||
3881 | + | ||
3882 | + da9030_set_reg(ADC_MAN_CONTROL, | ||
3883 | + ADC_LDO_INT_ENABLE | ADC_TBATREF_ENABLE); | ||
3884 | + da9030_set_reg(ADC_MAN_CONTROL_1, | ||
3885 | + ADC_LDO_INT_ENABLE | ADC_TBATREF_ENABLE); | ||
3886 | + da9030_set_reg(ADC_AUTO_CONTROL_1, | ||
3887 | + ADC_TBAT_ENABLE | ADC_VBAT_IN_TXON | ADC_VCH_ENABLE | | ||
3888 | + ADC_ICH_ENABLE | ADC_VBAT_ENABLE | | ||
3889 | + ADC_AUTO_SLEEP_ENABLE); | ||
3890 | + da9030_set_reg(ADC_AUTO_CONTROL, | ||
3891 | + ADC_TBAT_ENABLE | ADC_VBAT_IN_TXON | ADC_VCH_ENABLE | | ||
3892 | + ADC_ICH_ENABLE | ADC_VBAT_ENABLE | | ||
3893 | + ADC_AUTO_SLEEP_ENABLE); | ||
3894 | + | ||
3895 | + mutex_unlock(&the_da9030->lock); | ||
3896 | +} | ||
3897 | +EXPORT_SYMBOL(da9030_enable_adc); | ||
3898 | + | ||
3899 | +void da9030_set_wled(int on, unsigned int brightness) | ||
3900 | +{ | ||
3901 | + u8 val; | ||
3902 | + | ||
3903 | + mutex_lock(&the_da9030->lock); | ||
3904 | + | ||
3905 | + if (on) | ||
3906 | + val = WLED_CP_ENABLE | (brightness & 0x7); | ||
3907 | + else | ||
3908 | + val = da9030_get_reg(WLED_CONTROL) & ~WLED_CP_ENABLE; | ||
3909 | + | ||
3910 | + da9030_set_reg(WLED_CONTROL, val); | ||
3911 | + | ||
3912 | + mutex_unlock(&the_da9030->lock); | ||
3913 | +} | ||
3914 | +EXPORT_SYMBOL(da9030_set_wled); | ||
3915 | + | ||
3916 | +int da9030_set_charger(int on, unsigned int mA, unsigned int mV) | ||
3917 | +{ | ||
3918 | + int ret; | ||
3919 | + u8 val = 0; | ||
3920 | + if (on) { | ||
3921 | + if (mA >= 1500 || mV < 4000 || mV > 4350) | ||
3922 | + return -EINVAL; | ||
3923 | + | ||
3924 | + val = CHRG_CHARGER_ENABLE; | ||
3925 | + val |= (mA / 100) << 3; | ||
3926 | + val |= (mV - 4000) / 50; | ||
3927 | + } | ||
3928 | + | ||
3929 | + mutex_lock(&the_da9030->lock); | ||
3930 | + ret = da9030_set_reg(CHARGE_CONTROL, val); | ||
3931 | + mutex_unlock(&the_da9030->lock); | ||
3932 | + | ||
3933 | + return ret; | ||
3934 | +} | ||
3935 | +EXPORT_SYMBOL(da9030_set_charger); | ||
3936 | + | ||
3937 | +void da9030_get_charger(int *on, unsigned int *mA, unsigned int *mV) | ||
3938 | +{ | ||
3939 | + s32 val; | ||
3940 | + | ||
3941 | + mutex_lock(&the_da9030->lock); | ||
3942 | + | ||
3943 | + val = da9030_get_reg(CHARGE_CONTROL); | ||
3944 | + | ||
3945 | + mutex_unlock(&the_da9030->lock); | ||
3946 | + | ||
3947 | + if (on) | ||
3948 | + *on = (val & CHRG_CHARGER_ENABLE) ? 1 : 0; | ||
3949 | + | ||
3950 | + if (mA) | ||
3951 | + *mA = ((val >> 3) & 0xf) * 100; | ||
3952 | + | ||
3953 | + if (mV) | ||
3954 | + *mV = (val & 0x7) * 50 + 4000; | ||
3955 | +} | ||
3956 | +EXPORT_SYMBOL(da9030_get_charger); | ||
3957 | + | ||
3958 | +int da9030_set_led(int led, int on, | ||
3959 | + enum da9030_led_rate rate, | ||
3960 | + enum da9030_led_duty_cycle duty, | ||
3961 | + enum da9030_led_pwm_chop pwm_chop) | ||
3962 | +{ | ||
3963 | + int reg; | ||
3964 | + int ret; | ||
3965 | + | ||
3966 | + u8 val = 0; | ||
3967 | + | ||
3968 | + if (led > 4) | ||
3969 | + return -EINVAL; | ||
3970 | + | ||
3971 | + reg = LED_1_CONTROL + led; | ||
3972 | + if (on) { | ||
3973 | + val = LED_ENABLE; | ||
3974 | + val |= (rate & 0x3) << 5; | ||
3975 | + val |= (duty & 0x3) << 3; | ||
3976 | + val |= (pwm_chop & 0x7); | ||
3977 | + } | ||
3978 | + | ||
3979 | + mutex_lock(&the_da9030->lock); | ||
3980 | + ret = da9030_set_reg(reg, val); | ||
3981 | + mutex_unlock(&the_da9030->lock); | ||
3982 | + | ||
3983 | + return ret; | ||
3984 | +} | ||
3985 | +EXPORT_SYMBOL(da9030_set_led); | ||
3986 | + | ||
3987 | +void da9030_set_thresholds(unsigned int tbathighp, unsigned int tbathighn, | ||
3988 | + unsigned int tbatlow, unsigned int vbatmon) | ||
3989 | +{ | ||
3990 | + mutex_lock(&the_da9030->lock); | ||
3991 | + | ||
3992 | + da9030_set_reg(TBATHIGHP, tbathighp); | ||
3993 | + da9030_set_reg(TBATHIGHN, tbathighn); | ||
3994 | + da9030_set_reg(TBATLOW, tbatlow); | ||
3995 | + da9030_set_reg(VBATMONTXON, vbatmon); | ||
3996 | + da9030_set_reg(VBATMON, vbatmon); | ||
3997 | + | ||
3998 | + da9030_set_reg(TBATHIGHP_1, tbathighp); | ||
3999 | + da9030_set_reg(TBATHIGHN_1, tbathighn); | ||
4000 | + da9030_set_reg(TBATLOW_1, tbatlow); | ||
4001 | + da9030_set_reg(VBATMONTXMON_1, vbatmon); | ||
4002 | + da9030_set_reg(VBATMON_1, vbatmon); | ||
4003 | + | ||
4004 | + mutex_unlock(&the_da9030->lock); | ||
4005 | +} | ||
4006 | +EXPORT_SYMBOL(da9030_set_thresholds); | ||
4007 | + | ||
4008 | +struct da9030_vtg_value { | ||
4009 | + u16 vtg; | ||
4010 | + u16 val; | ||
4011 | +}; | ||
4012 | + | ||
4013 | +struct da9030_vtg_value da9030_vtg_1V8_3V2[] = { | ||
4014 | + {1800, 0x0}, | ||
4015 | + {1900, 0x1}, | ||
4016 | + {2000, 0x2}, | ||
4017 | + {2100, 0x3}, | ||
4018 | + {2200, 0x4}, | ||
4019 | + {2300, 0x5}, | ||
4020 | + {2400, 0x6}, | ||
4021 | + {2500, 0x7}, | ||
4022 | + {2600, 0x8}, | ||
4023 | + {2700, 0x9}, | ||
4024 | + {2800, 0xa}, | ||
4025 | + {2900, 0xb}, | ||
4026 | + {3000, 0xc}, | ||
4027 | + {3100, 0xd}, | ||
4028 | + {3200, 0xe}, | ||
4029 | + {3200, 0xf}, | ||
4030 | +}; | ||
4031 | + | ||
4032 | +struct da9030_vtg_value da9030_vtg_1V1_2V65[] = { | ||
4033 | + {1100, 0x0}, | ||
4034 | + {1150, 0x1}, | ||
4035 | + {1200, 0x2}, | ||
4036 | + {1250, 0x3}, | ||
4037 | + {1300, 0x4}, | ||
4038 | + {1350, 0x5}, | ||
4039 | + {1400, 0x6}, | ||
4040 | + {1450, 0x7}, | ||
4041 | + {1500, 0x8}, | ||
4042 | + {1550, 0x9}, | ||
4043 | + {1600, 0xa}, | ||
4044 | + {1650, 0xb}, | ||
4045 | + {1700, 0xc}, | ||
4046 | + {1750, 0xd}, | ||
4047 | + {1800, 0xe}, | ||
4048 | + {1850, 0xf}, | ||
4049 | + {1900, 0x10}, | ||
4050 | + {1950, 0x11}, | ||
4051 | + {2000, 0x12}, | ||
4052 | + {2050, 0x13}, | ||
4053 | + {2100, 0x14}, | ||
4054 | + {2150, 0x15}, | ||
4055 | + {2200, 0x16}, | ||
4056 | + {2250, 0x17}, | ||
4057 | + {2300, 0x18}, | ||
4058 | + {2350, 0x19}, | ||
4059 | + {2400, 0x1a}, | ||
4060 | + {2450, 0x1b}, | ||
4061 | + {2500, 0x1c}, | ||
4062 | + {2550, 0x1d}, | ||
4063 | + {2600, 0x1e}, | ||
4064 | + {2650, 0x1f}, | ||
4065 | +}; | ||
4066 | + | ||
4067 | +struct da9030_vtg_value da9030_vtg_2V76_2V94[] = { | ||
4068 | + {2760, 0x7}, | ||
4069 | + {2790, 0x6}, | ||
4070 | + {2820, 0x5}, | ||
4071 | + {2850, 0x4}, | ||
4072 | + {2850, 0x3}, | ||
4073 | + {2880, 0x1}, | ||
4074 | + {2910, 0x2}, | ||
4075 | + {2940, 0x3}, | ||
4076 | +}; | ||
4077 | + | ||
4078 | +struct da9030_vtg_value da9030_vtg_0V85_1V625[] = { | ||
4079 | + {850, 0x0}, | ||
4080 | + {875, 0x1}, | ||
4081 | + {900, 0x2}, | ||
4082 | + {925, 0x3}, | ||
4083 | + {950, 0x4}, | ||
4084 | + {975, 0x5}, | ||
4085 | + {1000, 0x6}, | ||
4086 | + {1025, 0x7}, | ||
4087 | + {1050, 0x8}, | ||
4088 | + {1075, 0x9}, | ||
4089 | + {1100, 0xa}, | ||
4090 | + {1125, 0xb}, | ||
4091 | + {1150, 0xc}, | ||
4092 | + {1175, 0xd}, | ||
4093 | + {1200, 0xe}, | ||
4094 | + {1225, 0xf}, | ||
4095 | + {1250, 0x10}, | ||
4096 | + {1275, 0x11}, | ||
4097 | + {1300, 0x12}, | ||
4098 | + {1325, 0x13}, | ||
4099 | + {1350, 0x14}, | ||
4100 | + {1375, 0x15}, | ||
4101 | + {1400, 0x16}, | ||
4102 | + {1425, 0x17}, | ||
4103 | + {1450, 0x18}, | ||
4104 | + {1475, 0x19}, | ||
4105 | + {1500, 0x1a}, | ||
4106 | + {1525, 0x1b}, | ||
4107 | + {1550, 0x1c}, | ||
4108 | + {1575, 0x1d}, | ||
4109 | + {1600, 0x1e}, | ||
4110 | + {1625, 0x1f}, | ||
4111 | +}; | ||
4112 | + | ||
4113 | +struct ldo_param { | ||
4114 | + u8 reg; | ||
4115 | + u8 shift; | ||
4116 | + u8 bits; | ||
4117 | +}; | ||
4118 | + | ||
4119 | +struct da9030_ldo { | ||
4120 | + const char *name; | ||
4121 | + | ||
4122 | + struct ldo_param vtg; | ||
4123 | + struct ldo_param sleep; | ||
4124 | + struct ldo_param lock; | ||
4125 | + | ||
4126 | + /* several LDOs have two enable/disable bits */ | ||
4127 | + struct ldo_param enable[2]; | ||
4128 | + | ||
4129 | + struct da9030_vtg_value *values; | ||
4130 | + int values_count; | ||
4131 | +}; | ||
4132 | + | ||
4133 | +static struct da9030_ldo da9030_ldos[] = { | ||
4134 | + [0] = { | ||
4135 | + .name = "LDO1", | ||
4136 | + .vtg = { | ||
4137 | + .reg = LDO_1, | ||
4138 | + .shift = 0, | ||
4139 | + .bits = 5, | ||
4140 | + }, | ||
4141 | + .enable[0] = { | ||
4142 | + .reg = REG_CONTROL_1_97, | ||
4143 | + .shift = 1, | ||
4144 | + .bits = 1, | ||
4145 | + }, | ||
4146 | + .sleep = { | ||
4147 | + .reg = LDO_1, | ||
4148 | + .shift = 5, | ||
4149 | + .bits = 2, | ||
4150 | + }, | ||
4151 | + .lock = { | ||
4152 | + .reg = REG_SLEEP_CONTROL1, | ||
4153 | + .shift = 0, | ||
4154 | + .bits = 2, | ||
4155 | + }, | ||
4156 | + .values = da9030_vtg_1V8_3V2, | ||
4157 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4158 | + }, | ||
4159 | + [1] = { | ||
4160 | + .name = "LDO2", | ||
4161 | + .vtg = { | ||
4162 | + .reg = LDO_2_3, | ||
4163 | + .shift = 0, | ||
4164 | + .bits = 4, | ||
4165 | + }, | ||
4166 | + .enable[0] = { | ||
4167 | + .reg = REG_CONTROL_1_97, | ||
4168 | + .shift = 2, | ||
4169 | + .bits = 1, | ||
4170 | + }, | ||
4171 | + .sleep = { | ||
4172 | + .reg = REG_SLEEP_CONTROL1, | ||
4173 | + .shift = 2, | ||
4174 | + .bits = 2, | ||
4175 | + }, | ||
4176 | + .values = da9030_vtg_1V8_3V2, | ||
4177 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4178 | + }, | ||
4179 | + [2] = { | ||
4180 | + .name = "LDO3", | ||
4181 | + .vtg = { | ||
4182 | + .reg = LDO_2_3, | ||
4183 | + .shift = 4, | ||
4184 | + .bits = 4, | ||
4185 | + }, | ||
4186 | + .enable[0] = { | ||
4187 | + .reg = REG_CONTROL_1_97, | ||
4188 | + .shift = 3, | ||
4189 | + .bits = 1, | ||
4190 | + }, | ||
4191 | + .sleep = { | ||
4192 | + .reg = REG_SLEEP_CONTROL1, | ||
4193 | + .shift = 4, | ||
4194 | + .bits = 2, | ||
4195 | + }, | ||
4196 | + .values = da9030_vtg_1V8_3V2, | ||
4197 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4198 | + }, | ||
4199 | + [3] = { | ||
4200 | + .name = "LDO4", | ||
4201 | + .vtg = { | ||
4202 | + .reg = LDO_4_5, | ||
4203 | + .shift = 0, | ||
4204 | + .bits = 4, | ||
4205 | + }, | ||
4206 | + .enable[0] = { | ||
4207 | + .reg = REG_CONTROL_1_97, | ||
4208 | + .shift = 4, | ||
4209 | + .bits = 1, | ||
4210 | + }, | ||
4211 | + .sleep = { | ||
4212 | + .reg = REG_SLEEP_CONTROL1, | ||
4213 | + .shift = 6, | ||
4214 | + .bits = 2, | ||
4215 | + }, | ||
4216 | + .values = da9030_vtg_1V8_3V2, | ||
4217 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4218 | + }, | ||
4219 | + [4] = { | ||
4220 | + .name = "LDO5", | ||
4221 | + .vtg = { | ||
4222 | + .reg = LDO_4_5, | ||
4223 | + .shift = 4, | ||
4224 | + .bits = 4, | ||
4225 | + }, | ||
4226 | + .enable[0] = { | ||
4227 | + .reg = REG_CONTROL_1_97, | ||
4228 | + .shift = 5, | ||
4229 | + .bits = 1, | ||
4230 | + }, | ||
4231 | + .sleep = { | ||
4232 | + .reg = REG_SLEEP_CONTROL2, | ||
4233 | + .shift = 0, | ||
4234 | + .bits = 2, | ||
4235 | + }, | ||
4236 | + .values = da9030_vtg_1V8_3V2, | ||
4237 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4238 | + }, | ||
4239 | + [5] = { | ||
4240 | + .name = "LDO6", | ||
4241 | + .vtg = { | ||
4242 | + .reg = LDO_6_SIMCP, | ||
4243 | + .shift = 0, | ||
4244 | + .bits = 4, | ||
4245 | + }, | ||
4246 | + .enable[0] = { | ||
4247 | + .reg = REG_CONTROL_1_97, | ||
4248 | + .shift = 6, | ||
4249 | + .bits = 1, | ||
4250 | + }, | ||
4251 | + .sleep = { | ||
4252 | + .reg = 0, | ||
4253 | + .shift = 0, | ||
4254 | + .bits = 0, | ||
4255 | + }, | ||
4256 | + .values = da9030_vtg_1V8_3V2, | ||
4257 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4258 | + }, | ||
4259 | + [6] = { | ||
4260 | + .name = "LDO7", | ||
4261 | + .vtg = { | ||
4262 | + .reg = LDO_7_8, | ||
4263 | + .shift = 0, | ||
4264 | + .bits = 4, | ||
4265 | + }, | ||
4266 | + .enable[0] = { | ||
4267 | + .reg = REG_CONTROL_1_97, | ||
4268 | + .shift = 7, | ||
4269 | + .bits = 1, | ||
4270 | + }, | ||
4271 | + .sleep = { | ||
4272 | + .reg = REG_SLEEP_CONTROL2, | ||
4273 | + .shift = 2, | ||
4274 | + .bits = 2, | ||
4275 | + }, | ||
4276 | + .values = da9030_vtg_1V8_3V2, | ||
4277 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4278 | + }, | ||
4279 | + [7] = { | ||
4280 | + .name = "LDO8", | ||
4281 | + .vtg = { | ||
4282 | + .reg = LDO_7_8, | ||
4283 | + .shift = 4, | ||
4284 | + .bits = 4, | ||
4285 | + }, | ||
4286 | + .enable[0] = { | ||
4287 | + .reg = REG_CONTROL_2_98, | ||
4288 | + .shift = 0, | ||
4289 | + .bits = 1, | ||
4290 | + }, | ||
4291 | + .sleep = { | ||
4292 | + .reg = REG_SLEEP_CONTROL2, | ||
4293 | + .shift = 4, | ||
4294 | + .bits = 2, | ||
4295 | + }, | ||
4296 | + .values = da9030_vtg_1V8_3V2, | ||
4297 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4298 | + }, | ||
4299 | + [8] = { | ||
4300 | + .name = "LDO9", | ||
4301 | + .vtg = { | ||
4302 | + .reg = LDO_9_12, | ||
4303 | + .shift = 0, | ||
4304 | + .bits = 4, | ||
4305 | + }, | ||
4306 | + .enable[0] = { | ||
4307 | + .reg = REG_CONTROL_2_98, | ||
4308 | + .shift = 1, | ||
4309 | + .bits = 1, | ||
4310 | + }, | ||
4311 | + .sleep = { | ||
4312 | + .reg = REG_SLEEP_CONTROL2, | ||
4313 | + .shift = 6, | ||
4314 | + .bits = 2, | ||
4315 | + }, | ||
4316 | + .values = da9030_vtg_1V8_3V2, | ||
4317 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4318 | + }, | ||
4319 | + [9] = { | ||
4320 | + .name = "LDO10", | ||
4321 | + .vtg = { | ||
4322 | + .reg = LDO_10_11, | ||
4323 | + .shift = 0, | ||
4324 | + .bits = 4, | ||
4325 | + }, | ||
4326 | + .enable[0] = { | ||
4327 | + .reg = REG_CONTROL_1_17, | ||
4328 | + .shift = 1, | ||
4329 | + .bits = 1, | ||
4330 | + }, | ||
4331 | + .enable[1] = { | ||
4332 | + .reg = REG_CONTROL_2_98, | ||
4333 | + .shift = 2, | ||
4334 | + .bits = 1, | ||
4335 | + }, | ||
4336 | + .sleep = { | ||
4337 | + .reg = 0, | ||
4338 | + .shift = 0, | ||
4339 | + .bits = 0, | ||
4340 | + }, | ||
4341 | + .values = da9030_vtg_1V8_3V2, | ||
4342 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4343 | + }, | ||
4344 | + [10] = { | ||
4345 | + .name = "LDO11", | ||
4346 | + .vtg = { | ||
4347 | + .reg = LDO_10_11, | ||
4348 | + .shift = 4, | ||
4349 | + .bits = 4, | ||
4350 | + }, | ||
4351 | + .enable[0] = { | ||
4352 | + .reg = REG_CONTROL_1_17, | ||
4353 | + .shift = 2, | ||
4354 | + .bits = 1, | ||
4355 | + }, | ||
4356 | + .enable[1] = { | ||
4357 | + .reg = REG_CONTROL_2_98, | ||
4358 | + .shift = 3, | ||
4359 | + .bits = 1, | ||
4360 | + }, | ||
4361 | + .sleep = { | ||
4362 | + .reg = 0, | ||
4363 | + .shift = 0, | ||
4364 | + .bits = 0, | ||
4365 | + }, | ||
4366 | + .values = da9030_vtg_1V8_3V2, | ||
4367 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4368 | + }, | ||
4369 | + [11] = { | ||
4370 | + .name = "LDO12", | ||
4371 | + .vtg = { | ||
4372 | + .reg = LDO_9_12, | ||
4373 | + .shift = 4, | ||
4374 | + .bits = 4, | ||
4375 | + }, | ||
4376 | + .enable[0] = { | ||
4377 | + .reg = REG_CONTROL_2_98, | ||
4378 | + .shift = 4, | ||
4379 | + .bits = 1, | ||
4380 | + }, | ||
4381 | + .sleep = { | ||
4382 | + .reg = REG_SLEEP_CONTROL3, | ||
4383 | + .shift = 0, | ||
4384 | + .bits = 2, | ||
4385 | + }, | ||
4386 | + .values = da9030_vtg_1V8_3V2, | ||
4387 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4388 | + }, | ||
4389 | + [12] = { | ||
4390 | + .name = "LDO13", | ||
4391 | + .vtg = { | ||
4392 | + .reg = 0, | ||
4393 | + .shift = 0, | ||
4394 | + .bits = 0, | ||
4395 | + }, | ||
4396 | + .enable[0] = { | ||
4397 | + .reg = REG_CONTROL_1_17, | ||
4398 | + .shift = 3, | ||
4399 | + .bits = 1, | ||
4400 | + }, | ||
4401 | + .sleep = { | ||
4402 | + .reg = 0, | ||
4403 | + .shift = 0, | ||
4404 | + .bits = 0, | ||
4405 | + }, | ||
4406 | + .values = NULL, | ||
4407 | + .values_count = 0, | ||
4408 | + }, | ||
4409 | + [13] = { | ||
4410 | + .name = "LDO14", | ||
4411 | + .vtg = { | ||
4412 | + .reg = LDO_14_16, | ||
4413 | + .shift = 0, | ||
4414 | + .bits = 3, | ||
4415 | + }, | ||
4416 | + .enable[0] = { | ||
4417 | + .reg = REG_CONTROL_1_17, /* FIXME: or 2_98? */ | ||
4418 | + .shift = 4, | ||
4419 | + .bits = 1, | ||
4420 | + }, | ||
4421 | + .enable[1] = { | ||
4422 | + .reg = REG_CONTROL_2_98, /* FIXME: or 2_98? */ | ||
4423 | + .shift = 5, | ||
4424 | + .bits = 1, | ||
4425 | + }, | ||
4426 | + .sleep = { | ||
4427 | + .reg = 0, | ||
4428 | + .shift = 0, | ||
4429 | + .bits = 0, | ||
4430 | + }, | ||
4431 | + .values = da9030_vtg_2V76_2V94, | ||
4432 | + .values_count = ARRAY_SIZE(da9030_vtg_2V76_2V94), | ||
4433 | + }, | ||
4434 | + [14] = { | ||
4435 | + .name = "LDO15", | ||
4436 | + .vtg = { | ||
4437 | + .reg = LDO_15, | ||
4438 | + .shift = 0, | ||
4439 | + .bits = 5, | ||
4440 | + }, | ||
4441 | + .enable[0] = { | ||
4442 | + .reg = REG_CONTROL_1_17, | ||
4443 | + .shift = 5, | ||
4444 | + .bits = 1, | ||
4445 | + }, | ||
4446 | + .sleep = { | ||
4447 | + .reg = 0, | ||
4448 | + .shift = 0, | ||
4449 | + .bits = 0, | ||
4450 | + }, | ||
4451 | + .lock = { | ||
4452 | + .reg = LDO_15, | ||
4453 | + .shift = 5, | ||
4454 | + .bits = 3, | ||
4455 | + }, | ||
4456 | + .values = da9030_vtg_1V1_2V65, | ||
4457 | + .values_count = ARRAY_SIZE(da9030_vtg_1V1_2V65), | ||
4458 | + }, | ||
4459 | + [15] = { | ||
4460 | + .name = "LDO16", | ||
4461 | + .vtg = { | ||
4462 | + .reg = LDO_14_16, | ||
4463 | + .shift = 3, | ||
4464 | + .bits = 5, | ||
4465 | + }, | ||
4466 | + .enable[0] = { | ||
4467 | + .reg = REG_CONTROL_1_17, | ||
4468 | + .shift = 6, | ||
4469 | + .bits = 1, | ||
4470 | + }, | ||
4471 | + .sleep = { | ||
4472 | + .reg = 0, | ||
4473 | + .shift = 0, | ||
4474 | + .bits = 0, | ||
4475 | + }, | ||
4476 | + .values = da9030_vtg_1V1_2V65, | ||
4477 | + .values_count = ARRAY_SIZE(da9030_vtg_1V1_2V65), | ||
4478 | + }, | ||
4479 | + [16] = { | ||
4480 | + .name = "LDO17", | ||
4481 | + .vtg = { | ||
4482 | + .reg = LDO_17_SIMCP0, | ||
4483 | + .shift = 0, | ||
4484 | + .bits = 4, | ||
4485 | + }, | ||
4486 | + .enable[0] = { | ||
4487 | + .reg = REG_CONTROL_1_17, | ||
4488 | + .shift = 7, | ||
4489 | + .bits = 1, | ||
4490 | + }, | ||
4491 | + .sleep = { | ||
4492 | + .reg = 0, | ||
4493 | + .shift = 0, | ||
4494 | + .bits = 0, | ||
4495 | + }, | ||
4496 | + .values = da9030_vtg_1V8_3V2, | ||
4497 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4498 | + }, | ||
4499 | + [17] = { | ||
4500 | + .name = "LDO18", | ||
4501 | + .vtg = { | ||
4502 | + .reg = LDO_18_19, | ||
4503 | + .shift = 0, | ||
4504 | + .bits = 4, | ||
4505 | + }, | ||
4506 | + .enable[0] = { | ||
4507 | + .reg = REG_CONTROL_2_18, | ||
4508 | + .shift = 2, | ||
4509 | + .bits = 1, | ||
4510 | + }, | ||
4511 | + .sleep = { | ||
4512 | + .reg = 0, | ||
4513 | + .shift = 0, | ||
4514 | + .bits = 0, | ||
4515 | + }, | ||
4516 | + .values = da9030_vtg_1V8_3V2, | ||
4517 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4518 | + }, | ||
4519 | + [18] = { | ||
4520 | + .name = "LDO19", | ||
4521 | + .vtg = { | ||
4522 | + .reg = LDO_18_19, | ||
4523 | + .shift = 4, | ||
4524 | + .bits = 4, | ||
4525 | + }, | ||
4526 | + .enable[0] = { | ||
4527 | + .reg = REG_CONTROL_2_18, | ||
4528 | + .shift = 1, | ||
4529 | + .bits = 1, | ||
4530 | + }, | ||
4531 | + .sleep = { | ||
4532 | + .reg = 0, | ||
4533 | + .shift = 0, | ||
4534 | + .bits = 0, | ||
4535 | + }, | ||
4536 | + .values = da9030_vtg_1V8_3V2, | ||
4537 | + .values_count = ARRAY_SIZE(da9030_vtg_1V8_3V2), | ||
4538 | + }, | ||
4539 | +}; | ||
4540 | + | ||
4541 | +static int da9030_get_vtg_value(int vtg, const struct da9030_vtg_value *tbl, | ||
4542 | + int n) | ||
4543 | +{ | ||
4544 | + int i; | ||
4545 | + | ||
4546 | + for (i = 0; i < n; i++, tbl++) | ||
4547 | + if (tbl->vtg == vtg) | ||
4548 | + return tbl->val; | ||
4549 | + return -EINVAL; | ||
4550 | +} | ||
4551 | + | ||
4552 | +static int da9030_set_ldo_volt(struct da9030_ldo *ldo, unsigned int mV) | ||
4553 | +{ | ||
4554 | + int val; | ||
4555 | + | ||
4556 | + val = da9030_get_vtg_value(mV, ldo->values, ldo->values_count); | ||
4557 | + if (val < 0) | ||
4558 | + return val; | ||
4559 | + | ||
4560 | + return da9030_update_reg_bits(ldo->vtg.reg, ldo->vtg.bits, | ||
4561 | + ldo->vtg.shift, val); | ||
4562 | +} | ||
4563 | + | ||
4564 | +static int da9030_enable_ldo(struct da9030_ldo *ldo, int enable) | ||
4565 | +{ | ||
4566 | + int ret; | ||
4567 | + | ||
4568 | + ret = da9030_update_reg_bits(ldo->enable[0].reg, ldo->enable[1].bits, | ||
4569 | + ldo->enable[0].shift, enable); | ||
4570 | + | ||
4571 | + if (ret < 0) | ||
4572 | + return ret; | ||
4573 | + | ||
4574 | + if (unlikely(ldo->enable[1].reg != 0)) | ||
4575 | + ret = da9030_update_reg_bits(ldo->enable[1].reg, | ||
4576 | + ldo->enable[1].bits, | ||
4577 | + ldo->enable[1].shift, enable); | ||
4578 | + | ||
4579 | + return ret; | ||
4580 | +} | ||
4581 | + | ||
4582 | +static int da9030_set_ldo_sleep(struct da9030_ldo *ldo, | ||
4583 | + enum da9030_ldo_sleep_mode sleep_mode) | ||
4584 | +{ | ||
4585 | + return da9030_update_reg_bits(ldo->sleep.reg, ldo->sleep.bits, | ||
4586 | + ldo->sleep.shift, sleep_mode); | ||
4587 | +} | ||
4588 | + | ||
4589 | +int da9030_set_ldo(int ldo_num, int on, unsigned int mV, | ||
4590 | + enum da9030_ldo_sleep_mode sleep_mode) | ||
4591 | +{ | ||
4592 | + struct da9030_ldo *ldo; | ||
4593 | + int ret; | ||
4594 | + | ||
4595 | + if (ldo_num < 0 || ldo_num > ARRAY_SIZE(da9030_ldos)) | ||
4596 | + return -EINVAL; | ||
4597 | + | ||
4598 | + ldo = &da9030_ldos[ldo_num]; | ||
4599 | + | ||
4600 | + ret = da9030_set_ldo_volt(ldo, mV); | ||
4601 | + if (ret < 0) | ||
4602 | + return ret; | ||
4603 | + | ||
4604 | + ret = da9030_enable_ldo(ldo, on); | ||
4605 | + if (ret < 0) | ||
4606 | + return ret; | ||
4607 | + | ||
4608 | + ret = da9030_set_ldo_sleep(ldo, sleep_mode); | ||
4609 | + if (ret < 0) | ||
4610 | + return ret; | ||
4611 | + | ||
4612 | + return 0; | ||
4613 | +} | ||
4614 | +EXPORT_SYMBOL(da9030_set_ldo); | ||
4615 | + | ||
4616 | +int da9030_set_buck(int buck, int on, unsigned int mV, int flags) | ||
4617 | +{ | ||
4618 | + /* FIXME: implement */ | ||
4619 | + return 0; | ||
4620 | +} | ||
4621 | +EXPORT_SYMBOL(da9030_set_buck); | ||
4622 | + | ||
4623 | +static void da9030_disable_irq(unsigned int irq) | ||
4624 | +{ | ||
4625 | + int reg, val; | ||
4626 | + | ||
4627 | + if (irq < 8) { | ||
4628 | + reg = IRQ_MASK_A; | ||
4629 | + val = 1 << irq; | ||
4630 | + } else if (irq < 16) { | ||
4631 | + reg = IRQ_MASK_B; | ||
4632 | + val = 1 << (irq - 8); | ||
4633 | + } else { | ||
4634 | + reg = IRQ_MASK_C; | ||
4635 | + val = 1 << (irq - 16); | ||
4636 | + } | ||
4637 | + | ||
4638 | + i2c_smbus_write_byte_data( | ||
4639 | + the_da9030->client, reg, | ||
4640 | + i2c_smbus_read_byte_data(the_da9030->client, reg) | val); | ||
4641 | +} | ||
4642 | + | ||
4643 | +static void da9030_enable_irq(unsigned int irq) | ||
4644 | +{ | ||
4645 | + int reg, val; | ||
4646 | + | ||
4647 | + if (irq < 8) { | ||
4648 | + reg = IRQ_MASK_A; | ||
4649 | + val = 1 << irq; | ||
4650 | + } else if (irq < 16) { | ||
4651 | + reg = IRQ_MASK_B; | ||
4652 | + val = 1 << (irq - 8); | ||
4653 | + } else { | ||
4654 | + reg = IRQ_MASK_C; | ||
4655 | + val = 1 << (irq - 16); | ||
4656 | + } | ||
4657 | + | ||
4658 | + i2c_smbus_write_byte_data( | ||
4659 | + the_da9030->client, reg, | ||
4660 | + i2c_smbus_read_byte_data(the_da9030->client, reg) & ~val); | ||
4661 | +} | ||
4662 | + | ||
4663 | +int da9030_register_callback(int event, | ||
4664 | + void (*callback)(int event, void *data), | ||
4665 | + void *data) | ||
4666 | +{ | ||
4667 | + int ret; | ||
4668 | + | ||
4669 | + if (event < 0 || event > 23) | ||
4670 | + return -EINVAL; | ||
4671 | + | ||
4672 | + mutex_lock(&the_da9030->lock); | ||
4673 | + if (the_da9030->callbacks[event]) | ||
4674 | + ret = -EBUSY; | ||
4675 | + else { | ||
4676 | + the_da9030->callbacks[event] = callback; | ||
4677 | + the_da9030->callbacks_data[event] = data; | ||
4678 | + da9030_enable_irq(event); | ||
4679 | + ret = 0; | ||
4680 | + } | ||
4681 | + mutex_unlock(&the_da9030->lock); | ||
4682 | + | ||
4683 | + return ret; | ||
4684 | +} | ||
4685 | +EXPORT_SYMBOL(da9030_register_callback); | ||
4686 | + | ||
4687 | +void da9030_unregister_callback(int event) | ||
4688 | +{ | ||
4689 | + mutex_lock(&the_da9030->lock); | ||
4690 | + | ||
4691 | + da9030_disable_irq(event); | ||
4692 | + the_da9030->callbacks[event] = NULL; | ||
4693 | + the_da9030->callbacks_data[event] = 0; | ||
4694 | + | ||
4695 | + mutex_unlock(&the_da9030->lock); | ||
4696 | +} | ||
4697 | +EXPORT_SYMBOL(da9030_unregister_callback); | ||
4698 | + | ||
4699 | +#ifdef CONFIG_DEBUG_FS | ||
4700 | +#define MAX_BUF 256 | ||
4701 | + | ||
4702 | +static int da9030_debug_show(struct seq_file *s, void *data) | ||
4703 | +{ | ||
4704 | + int i, res = 0; | ||
4705 | + struct da9030 *da9030 = s->private; | ||
4706 | + struct i2c_client *client = da9030->client; | ||
4707 | + | ||
4708 | + seq_printf(s, "DA9030 state: da = %p, cl = %p, s->private = %p\n", | ||
4709 | + da9030, client, s->private); | ||
4710 | + | ||
4711 | + for (i = 0; i < ARRAY_SIZE(defined_regs); i++) { | ||
4712 | + res = i2c_smbus_read_byte_data(client, defined_regs[i]); | ||
4713 | + seq_printf(s, "%02x %x\n", defined_regs[i], res); | ||
4714 | + } | ||
4715 | + return 0; | ||
4716 | +} | ||
4717 | + | ||
4718 | +static int da9030_debug_open(struct inode *inode, struct file *file) | ||
4719 | +{ | ||
4720 | + return single_open(file, da9030_debug_show, inode->i_private); | ||
4721 | +} | ||
4722 | + | ||
4723 | +ssize_t da9030_debug_write(struct file *f, const char __user *buf, size_t len, | ||
4724 | + loff_t *off) | ||
4725 | +{ | ||
4726 | + char buffer[MAX_BUF]; | ||
4727 | + int reg, val; | ||
4728 | + char *endp; | ||
4729 | + struct da9030 *da9030 = ((struct seq_file *)f->private_data)->private; | ||
4730 | + struct i2c_client *client = da9030->client; | ||
4731 | + | ||
4732 | + if (len > MAX_BUF) { | ||
4733 | + printk(KERN_INFO "%s: large buffer\n", __FUNCTION__); | ||
4734 | + len = MAX_BUF; | ||
4735 | + } | ||
4736 | + | ||
4737 | + if (copy_from_user(buffer, buf, len)) { | ||
4738 | + printk(KERN_INFO "%s: copy_from_user failed\n", __FUNCTION__); | ||
4739 | + return -EFAULT; | ||
4740 | + } | ||
4741 | + buffer[len] = '\0'; | ||
4742 | + | ||
4743 | + reg = simple_strtoul(buffer, &endp, 0); | ||
4744 | + while (endp && isspace(*endp)) | ||
4745 | + endp++; | ||
4746 | + | ||
4747 | + val = simple_strtoul(endp, 0, 0); | ||
4748 | + | ||
4749 | + i2c_smbus_write_byte_data(client, reg, val); | ||
4750 | + | ||
4751 | + return len; | ||
4752 | +} | ||
4753 | + | ||
4754 | +static const struct file_operations debug_fops = { | ||
4755 | + .open = da9030_debug_open, | ||
4756 | + .read = seq_read, | ||
4757 | + .write = da9030_debug_write, | ||
4758 | + .llseek = seq_lseek, | ||
4759 | + .release = single_release, | ||
4760 | +}; | ||
4761 | + | ||
4762 | +static struct dentry *da9030_create_debugfs(struct da9030 *da9030) | ||
4763 | +{ | ||
4764 | + da9030->debug_file = debugfs_create_file("da9030", 0666, 0, da9030, | ||
4765 | + &debug_fops); | ||
4766 | + return da9030->debug_file; | ||
4767 | +} | ||
4768 | + | ||
4769 | +static void da9030_remove_debugfs(struct da9030 *da9030) | ||
4770 | +{ | ||
4771 | + debugfs_remove(da9030->debug_file); | ||
4772 | +} | ||
4773 | +#else | ||
4774 | +#define da9030_create_debugfs(x) NULL | ||
4775 | +#define da9030_remove_debugfs(x) do {} while (0) | ||
4776 | +#endif | ||
4777 | + | ||
4778 | +static irqreturn_t da9030_irq(int irq, void *_da9030) | ||
4779 | +{ | ||
4780 | + struct da9030 *da9030 = _da9030; | ||
4781 | + | ||
4782 | + (void)schedule_work(&da9030->event_work); | ||
4783 | + | ||
4784 | + return IRQ_HANDLED; | ||
4785 | +} | ||
4786 | + | ||
4787 | +static void da9030_irq_worker(struct work_struct *work) | ||
4788 | +{ | ||
4789 | + struct da9030 *da9030 = container_of(work, struct da9030, event_work); | ||
4790 | + void (*callback)(int event, void *data); | ||
4791 | + u32 pending = 0; | ||
4792 | + u32 mask = 0; | ||
4793 | + int i; | ||
4794 | + | ||
4795 | + while (1) { | ||
4796 | + pending = (i2c_smbus_read_byte_data(da9030->client, | ||
4797 | + EVENT_A)) | | ||
4798 | + ((i2c_smbus_read_byte_data(da9030->client, | ||
4799 | + EVENT_B)) << 8) | | ||
4800 | + ((i2c_smbus_read_byte_data(da9030->client, | ||
4801 | + EVENT_C)) << 16); | ||
4802 | + | ||
4803 | + mask = (i2c_smbus_read_byte_data(da9030->client, | ||
4804 | + IRQ_MASK_A)) | | ||
4805 | + ((i2c_smbus_read_byte_data(da9030->client, | ||
4806 | + IRQ_MASK_B)) << 8) | | ||
4807 | + ((i2c_smbus_read_byte_data(da9030->client, | ||
4808 | + IRQ_MASK_C)) << 16); | ||
4809 | + pending &= ~mask; | ||
4810 | + | ||
4811 | + if (!pending) | ||
4812 | + return; | ||
4813 | + | ||
4814 | + while (pending) { | ||
4815 | + i = __ffs(pending); | ||
4816 | + callback = da9030->callbacks[i]; | ||
4817 | + if (callback) | ||
4818 | + callback(i, da9030->callbacks_data[i]); | ||
4819 | + pending &= ~(1 << i); | ||
4820 | + } | ||
4821 | + } | ||
4822 | +} | ||
4823 | + | ||
4824 | +static inline void da9030_disable_interrupts(struct da9030 *da9030) | ||
4825 | +{ | ||
4826 | + /* clear pending interruts */ | ||
4827 | + (void)i2c_smbus_read_byte_data(da9030->client, EVENT_A); | ||
4828 | + (void)i2c_smbus_read_byte_data(da9030->client, EVENT_B); | ||
4829 | + (void)i2c_smbus_read_byte_data(da9030->client, EVENT_C); | ||
4830 | + | ||
4831 | + /* disable interrupts */ | ||
4832 | + i2c_smbus_write_byte_data(da9030->client, IRQ_MASK_A, 0xff); | ||
4833 | + i2c_smbus_write_byte_data(da9030->client, IRQ_MASK_B, 0xff); | ||
4834 | + i2c_smbus_write_byte_data(da9030->client, IRQ_MASK_C, 0xff); | ||
4835 | +} | ||
4836 | + | ||
4837 | +static int da9030_probe(struct i2c_client *client) | ||
4838 | +{ | ||
4839 | + int ret; | ||
4840 | + struct da9030 *da9030; | ||
4841 | + | ||
4842 | + if (the_da9030) { | ||
4843 | + dev_dbg(&client->dev, "only one %s for now\n", | ||
4844 | + DRIVER_NAME); | ||
4845 | + return -ENODEV; | ||
4846 | + } | ||
4847 | + | ||
4848 | + ret = i2c_smbus_read_byte_data(client, CHIP_ID); | ||
4849 | + | ||
4850 | + dev_info(&client->dev, "initialized chip revision %x\n", ret); | ||
4851 | + | ||
4852 | + da9030 = kzalloc(sizeof(struct da9030), GFP_KERNEL); | ||
4853 | + if (da9030 == NULL) { | ||
4854 | + dev_err(&client->dev, "insufficient memory\n"); | ||
4855 | + return -ENOMEM; | ||
4856 | + } | ||
4857 | + the_da9030 = da9030; | ||
4858 | + da9030->client = client; | ||
4859 | + | ||
4860 | + mutex_init(&the_da9030->lock); | ||
4861 | + | ||
4862 | + da9030_disable_interrupts(da9030); | ||
4863 | + INIT_WORK(&da9030->event_work, da9030_irq_worker); | ||
4864 | + | ||
4865 | + ret = request_irq(client->irq, da9030_irq, | ||
4866 | + IRQF_DISABLED, DRIVER_NAME, da9030); | ||
4867 | + | ||
4868 | + if (ret) { | ||
4869 | + kfree(da9030); | ||
4870 | + dev_err(&client->dev, | ||
4871 | + "failed to allocate irq %d\n", | ||
4872 | + client->irq); | ||
4873 | + return ret; | ||
4874 | + } | ||
4875 | + | ||
4876 | + i2c_set_clientdata(client, da9030); | ||
4877 | + | ||
4878 | + da9030->debug_file = da9030_create_debugfs(da9030); | ||
4879 | + | ||
4880 | + return 0; | ||
4881 | +} | ||
4882 | + | ||
4883 | +/* static int da9030_detach_adapter(struct i2c_adapter *a) */ | ||
4884 | +static int da9030_remove(struct i2c_client *client) | ||
4885 | +{ | ||
4886 | + struct da9030 *da9030 = i2c_get_clientdata(client); | ||
4887 | + | ||
4888 | + da9030_remove_debugfs(da9030); | ||
4889 | + | ||
4890 | + free_irq(da9030->client->irq, da9030); | ||
4891 | + kfree(da9030); | ||
4892 | + i2c_set_clientdata(client, NULL); | ||
4893 | + the_da9030 = NULL; | ||
4894 | + | ||
4895 | + return 0; | ||
4896 | +} | ||
4897 | + | ||
4898 | +static struct i2c_driver da9030_driver = { | ||
4899 | + .driver = { | ||
4900 | + .name = "da9030", | ||
4901 | + .owner = THIS_MODULE, | ||
4902 | + }, | ||
4903 | + | ||
4904 | + .probe = da9030_probe, | ||
4905 | + .remove = da9030_remove, | ||
4906 | +}; | ||
4907 | + | ||
4908 | +static int da9030_init(void) | ||
4909 | +{ | ||
4910 | + i2c_add_driver(&da9030_driver); | ||
4911 | + return 0; | ||
4912 | +} | ||
4913 | + | ||
4914 | +static void da9030_exit(void) | ||
4915 | +{ | ||
4916 | + i2c_del_driver(&da9030_driver); | ||
4917 | +} | ||
4918 | + | ||
4919 | +/* NOTE: this MUST be initialized before the other parts of the system | ||
4920 | + * that rely on it ... but after the i2c bus on which this relies. | ||
4921 | + * That is, much earlier than on PC-type systems, which don't often use | ||
4922 | + * I2C as a core system bus. | ||
4923 | + */ | ||
4924 | +subsys_initcall(da9030_init); | ||
4925 | +module_exit(da9030_exit); | ||
4926 | + | ||
4927 | +MODULE_DESCRIPTION("DA9030 power manager driver"); | ||
4928 | +MODULE_AUTHOR("Mike Rapoport, Compulab"); | ||
4929 | +MODULE_LICENSE("GPL"); | ||
4930 | diff --git a/drivers/i2c/chips/da9030.h b/drivers/i2c/chips/da9030.h | ||
4931 | new file mode 100644 | ||
4932 | index 0000000..4163156 | ||
4933 | --- /dev/null | ||
4934 | +++ b/drivers/i2c/chips/da9030.h | ||
4935 | @@ -0,0 +1,282 @@ | ||
4936 | +/* DA9030 Register definintions */ | ||
4937 | + | ||
4938 | +#define CHIP_ID 0x00 | ||
4939 | + | ||
4940 | +#define EVENT_A 0x01 | ||
4941 | +#define EVENT_A_CHIOVER (1 << 7) | ||
4942 | +#define EVENT_A_VBAT_MON_TXON (1 << 6) | ||
4943 | +#define EVENT_A_VBAT_MON (1 << 5) | ||
4944 | +#define EVENT_A_TBAT (1 << 4) | ||
4945 | +#define EVENT_A_CHDET (1 << 3) | ||
4946 | +#define EVENT_A_EXTON (1 << 2) | ||
4947 | +#define EVENT_A_PWREN1 (1 << 1) | ||
4948 | +#define EVENT_A_ONKEY_N (1 << 0) | ||
4949 | + | ||
4950 | +#define EVENT_B 0x02 | ||
4951 | +#define EVENT_B_WDOG_INT (1 << 7) | ||
4952 | +#define EVENT_B_SRP_DETECT (1 << 6) | ||
4953 | +#define EVENT_B_SESSION_VALID (1 << 5) | ||
4954 | +#define EVENT_B_VBUS_VALID_4_0 (1 << 4) | ||
4955 | +#define EVENT_B_VBUS_VALID_4_4 (1 << 3) | ||
4956 | +#define EVENT_B_ADC_READY (1 << 2) | ||
4957 | +#define EVENT_B_CCTO (1 << 1) | ||
4958 | +#define EVENT_B_TCTO (1 << 0) | ||
4959 | + | ||
4960 | +#define EVENT_C 0x03 | ||
4961 | +#define EVENT_C_ADC_IN5 (1 << 7) | ||
4962 | +#define EVENT_C_ADC_IN4 (1 << 6) | ||
4963 | +#define EVENT_C_BUCK2 (1 << 5) | ||
4964 | +#define EVENT_C_LDO19 (1 << 4) | ||
4965 | +#define EVENT_C_LDO18 (1 << 3) | ||
4966 | +#define EVENT_C_LDO17 (1 << 2) | ||
4967 | +#define EVENT_C_LDO16 (1 << 1) | ||
4968 | +#define EVENT_C_LDO15 (1 << 0) | ||
4969 | + | ||
4970 | +#define STATUS 0x04 | ||
4971 | +#define STATUS_MCLK_DETECT (1 << 7) | ||
4972 | +#define STATUS_VBAT_MON_TXON (1 << 6) | ||
4973 | +#define STATUS_VBAT_MON (1 << 5) | ||
4974 | +#define STATUS_TBAT (1 << 4) | ||
4975 | +#define STATUS_CHDET (1 << 3) | ||
4976 | +#define STATUS_EXTON (1 << 2) | ||
4977 | +#define STATUS_PWREN1 (1 << 1) | ||
4978 | +#define STATUS_ONKEY_N (1 << 0) | ||
4979 | + | ||
4980 | +#define IRQ_MASK_A 0x05 | ||
4981 | +#define IRQ_MASK_A_CHIOVER (1 << 7) | ||
4982 | +#define IRQ_MASK_A_VBAT_MON_TXON (1 << 6) | ||
4983 | +#define IRQ_MASK_A_VBAT_MON (1 << 5) | ||
4984 | +#define IRQ_MASK_A_TBAT (1 << 4) | ||
4985 | +#define IRQ_MASK_A_CHDET (1 << 3) | ||
4986 | +#define IRQ_MASK_A_EXTON (1 << 2) | ||
4987 | +#define IRQ_MASK_A_PWREN1 (1 << 1) | ||
4988 | +#define IRQ_MASK_A_ONKEY_N (1 << 0) | ||
4989 | + | ||
4990 | +#define IRQ_MASK_B 0x06 | ||
4991 | +#define IRQ_MASK_B_WDOG_INT (1 << 7) | ||
4992 | +#define IRQ_MASK_B_SRP_DETECT (1 << 6) | ||
4993 | +#define IRQ_MASK_B_SESSION_VALID (1 << 5) | ||
4994 | +#define IRQ_MASK_B_VBUS_VALID_4_0 (1 << 4) | ||
4995 | +#define IRQ_MASK_B_VBUS_VALID_4_4 (1 << 3) | ||
4996 | +#define IRQ_MASK_B_ADC_READY (1 << 2) | ||
4997 | +#define IRQ_MASK_B_CCTO (1 << 1) | ||
4998 | +#define IRQ_MASK_B_TCTO (1 << 0) | ||
4999 | + | ||
5000 | +#define IRQ_MASK_C 0x07 | ||
5001 | +#define IRQ_MASK_C_ADC_IN5 (1 << 7) | ||
5002 | +#define IRQ_MASK_C_ADC_IN4 (1 << 6) | ||
5003 | +#define IRQ_MASK_C_BUCK2 (1 << 5) | ||
5004 | +#define IRQ_MASK_C_LDO19 (1 << 4) | ||
5005 | +#define IRQ_MASK_C_LDO18 (1 << 3) | ||
5006 | +#define IRQ_MASK_C_LDO17 (1 << 2) | ||
5007 | +#define IRQ_MASK_C_LDO16 (1 << 1) | ||
5008 | +#define IRQ_MASK_C_LDO15 (1 << 0) | ||
5009 | + | ||
5010 | +#define SYS_CTRL_A 0x08 | ||
5011 | +#define SYS_CONTROL_A_SLEEP_N_PIN_ENABLE 0x1 | ||
5012 | +#define SYS_CONTROL_A_SHUT_DOWN (1<<1) | ||
5013 | +#define SYS_CONTROL_A_HWRES_ENABLE (1<<2) | ||
5014 | +#define SYS_CONTROL_A_WDOG_ACTION (1<<3) | ||
5015 | +#define SYS_CONTROL_A_WATCHDOG (1<<7) | ||
5016 | + | ||
5017 | +#define SYS_CONTROL_B 0x09 | ||
5018 | +#define SYS_CLTR_B_SLEEP_13MHZ_EN (1 << 4) | ||
5019 | +#define SYS_CLTR_B_AUTO_CLK_SWITCH (1 << 3) | ||
5020 | + | ||
5021 | +#define FAULT_LOG 0x0a | ||
5022 | +#define FAULT_LOG_OVER_TEMP (1 << 7) | ||
5023 | +#define FAULT_LOG_VBAT_OVER (1 << 4) | ||
5024 | + | ||
5025 | +#define LDO_10_11 0x10 | ||
5026 | +#define LDO_10_11_LDO10_3V (0xc) | ||
5027 | +#define LDO_10_11_LDO11_3V2 (0xe << 4) | ||
5028 | + | ||
5029 | +#define LDO_15 0x11 | ||
5030 | +#define LDO_14_16 0x12 | ||
5031 | +#define LDO_18_19 0x13 | ||
5032 | +#define LDO_18_19_LDO18_3V2 (0xe) | ||
5033 | + | ||
5034 | +#define LDO_17_SIMCP0 0x14 | ||
5035 | +#define LDO_17_SIMCP0_LDO17_3V 0x0F | ||
5036 | + | ||
5037 | +#define BUCK_2_DVC1 0x15 | ||
5038 | +#define BUCK_2_GO (1 << 7) | ||
5039 | +#define BUCK_2_SLEEP (1 << 6) | ||
5040 | +#define BUCK_2_TRIM_1V5 (0x1a) | ||
5041 | + | ||
5042 | +#define BUCK_2_DVC2 0x16 | ||
5043 | + | ||
5044 | +#define REG_CONTROL_1_17 0x17 | ||
5045 | +#define RC1_LDO17_EN (1 << 7) | ||
5046 | +#define RC1_LDO16_EN (1 << 6) | ||
5047 | +#define RC1_LDO15_EN (1 << 5) | ||
5048 | +#define RC1_LDO14_EN (1 << 4) | ||
5049 | +#define RC1_LDO13_EN (1 << 3) | ||
5050 | +#define RC1_LDO11_EN (1 << 2) | ||
5051 | +#define RC1_LDO10_EN (1 << 1) | ||
5052 | +#define RC1_BUCK2_EN (1 << 0) | ||
5053 | + | ||
5054 | +#define REG_CONTROL_2_18 0x18 | ||
5055 | +#define RC2_SIMCP_EN (1 << 6) | ||
5056 | +#define RC2_LDO19_EN (1 << 1) | ||
5057 | +#define RC2_LDO18_EN (1 << 0) | ||
5058 | + | ||
5059 | +#define REG_CONTROL_3_ | ||
5060 | + | ||
5061 | +#define USBPUMP 0x19 | ||
5062 | +#define USB_PUMP_EN_USBVEP (1 << 7) | ||
5063 | +#define USB_PUMP_EN_USBVE (1 << 6) | ||
5064 | +#define USB_PUMP_SPR_DETECT (1 << 5) | ||
5065 | +#define USB_PUMP_SESSION_VALID (1 << 4) | ||
5066 | +#define USB_PUMP_VBUS_VALID_4_0 (1 << 3) | ||
5067 | +#define USB_PUMP_VBUS_VALID_4_4 (1 << 2) | ||
5068 | +#define USB_PUMP_USBVEP (1 << 1) | ||
5069 | +#define USB_PUMP_USBVE (1 << 0) | ||
5070 | + | ||
5071 | +#define SLEEP_CONTROL 0x1a | ||
5072 | +#define APP_SLEEP_CTL_PWR_EN (1 << 7) | ||
5073 | +#define APP_SLEEP_CTL_SYS_EN (1 << 6) | ||
5074 | +#define APP_SLEEP_CTL_BYPASS_LDO19 (1 << 2) | ||
5075 | +#define APP_SLEEP_CTL_BYPASS_LDO18 (1 << 1) | ||
5076 | +#define APP_SLEEP_CTL_BYPASS_LDO17 (1 << 0) | ||
5077 | + | ||
5078 | +#define STARTUP_CONTROL 0x1b | ||
5079 | +#define STARTUP_CTL_LDO11_PWR_SYS (1 << 3) | ||
5080 | +#define STARTUP_CTL_LDO10_PWR_SYS (1 << 2) | ||
5081 | +#define STARTUP_CTL_LDO11_START (1 << 1) | ||
5082 | +#define STARTUP_CTL_LDO10_START (1 << 0) | ||
5083 | + | ||
5084 | +#define LED_1_CONTROL 0x20 | ||
5085 | +#define LED_2_CONTROL 0x21 | ||
5086 | +#define LED_3_CONTROL 0x22 | ||
5087 | +#define LED_4_CONTROL 0x23 | ||
5088 | +#define LEDPC_CONTROL 0x24 | ||
5089 | +#define LED_ENABLE (1 << 7) | ||
5090 | + | ||
5091 | +#define WLED_CONTROL 0x25 | ||
5092 | +#define WLED_CP_ENABLE (1 << 6) | ||
5093 | +#define WLED_ISET_10 (3) | ||
5094 | + | ||
5095 | +#define MISC_CONTROLA 0x26 | ||
5096 | +#define MISC_CONTROLB 0x27 | ||
5097 | +#define MISCB_SESSION_VALID_ENABLE (1 << 3) | ||
5098 | +#define MISCB_USB_INT_RISING (1 << 2) | ||
5099 | +#define MISCB_I2C_ADDRESS (1 << 1) | ||
5100 | +#define MISCB_STARTUP_SEQUENCE (1 << 0) | ||
5101 | + | ||
5102 | +#define CHARGE_CONTROL 0x28 | ||
5103 | +#define CHRG_CHARGER_ENABLE (1 << 7) | ||
5104 | + | ||
5105 | +#define CCTR_CONTROL 0x29 | ||
5106 | +#define CCTR_SET_8MIN 0x01 | ||
5107 | + | ||
5108 | +#define TCTR_CONTROL 0x2a | ||
5109 | +#define CHARGE_PULSE 0x2b | ||
5110 | + | ||
5111 | +#define ADC_MAN_CONTROL 0x30 | ||
5112 | + | ||
5113 | +#define ADC_AUTO_CONTROL 0x31 | ||
5114 | +#define ADC_IN5_EN (1 << 7) | ||
5115 | +#define ADC_IN4_EN (1 << 6) | ||
5116 | +#define ADC_TBAT_ENABLE (1 << 5) | ||
5117 | +#define ADC_VBAT_IN_TXON (1 << 4) | ||
5118 | +#define ADC_VCH_ENABLE (1 << 3) | ||
5119 | +#define ADC_ICH_ENABLE (1 << 2) | ||
5120 | +#define ADC_VBAT_ENABLE (1 << 1) | ||
5121 | +#define ADC_AUTO_SLEEP_ENABLE (1 << 0) | ||
5122 | + | ||
5123 | +#define VBATMON 0x32 | ||
5124 | +#define VBATMONTXON 0x33 | ||
5125 | +#define TBATHIGHP 0x34 | ||
5126 | +#define TBATHIGHN 0x35 | ||
5127 | +#define TBATLOW 0x36 | ||
5128 | +#define ADC_IN4_MIN 0x37 | ||
5129 | +#define ADC_IN4_MAX 0x38 | ||
5130 | +#define ADC_IN5_MIN 0x39 | ||
5131 | +#define ADC_IN5_MAX 0x3a | ||
5132 | + | ||
5133 | +#define VBAT_RES 0x41 | ||
5134 | +#define VBATMIN_RES 0x42 | ||
5135 | +#define VBATMINTXON 0x43 | ||
5136 | +#define ICHMAX_RES 0x44 | ||
5137 | +#define ICHMIN_RES 0x45 | ||
5138 | +#define ICHAVERAGE_RES 0x46 | ||
5139 | +#define VCHMAX_RES 0x47 | ||
5140 | +#define VCHMIN_RES 0x48 | ||
5141 | +#define TBAT_RES 0x49 | ||
5142 | +#define ADC_IN4_RES 0x4a | ||
5143 | +#define ADC_IN5_RES 0x4b | ||
5144 | + | ||
5145 | +#define LDO_1 0x90 | ||
5146 | +#define LDO_1_UNLOCK (0x5 << 5) | ||
5147 | +#define LDO_1_TRIM_3V (0x12) | ||
5148 | + | ||
5149 | +#define LDO_2_3 0x91 | ||
5150 | +#define LDO_2_3_LDO2_3V2 (0xe << 4) | ||
5151 | +#define LDO_2_3_LDO3_3V (0xc) | ||
5152 | + | ||
5153 | +#define LDO_4_5 0x92 | ||
5154 | +#define LDO_6_SIMCP 0x93 | ||
5155 | +#define LDO_6_SIMCP_LDO6_3V2 (0xe) | ||
5156 | + | ||
5157 | +#define LDO_7_8 0x94 | ||
5158 | +#define LDO_9_12 0x95 | ||
5159 | +#define BUCK 0x96 | ||
5160 | +#define REG_CONTROL_1_97 0x97 | ||
5161 | +#define RC3_LDO7_EN (1 << 7) | ||
5162 | +#define RC3_LDO6_EN (1 << 6) | ||
5163 | +#define RC3_LDO5_EN (1 << 5) | ||
5164 | +#define RC3_LDO4_EN (1 << 4) | ||
5165 | +#define RC3_LDO3_EN (1 << 3) | ||
5166 | +#define RC3_LDO2_EN (1 << 2) | ||
5167 | +#define RC3_LDO1_EN (1 << 1) | ||
5168 | +#define RC3_BUCK_EN (1 << 0) | ||
5169 | + | ||
5170 | +#define REG_CONTROL_2_98 0x98 | ||
5171 | +#define RC4_SLEEP (1 << 7) | ||
5172 | +#define RC4_SIMCP_ENABLE (1 << 6) | ||
5173 | +#define RC4_LDO14_EN (1 << 5) | ||
5174 | +#define RC4_LDO12_EN (1 << 4) | ||
5175 | +#define RC4_LDO11_EN (1 << 3) | ||
5176 | +#define RC4_LDO10_EN (1 << 2) | ||
5177 | +#define RC4_LDO9_EN (1 << 1) | ||
5178 | +#define RC4_LDO8_EN (1 << 0) | ||
5179 | + | ||
5180 | +#define REG_SLEEP_CONTROL1 0x99 | ||
5181 | +#define REG_SLEEP_CONTROL2 0x9a | ||
5182 | +#define REG_SLEEP_CONTROL3 0x9b | ||
5183 | + | ||
5184 | +#define ADC_MAN_CONTROL_1 0xa0 | ||
5185 | +#define ADC_DEBOUNCE_VBATMON_TXON (1 << 7) | ||
5186 | +#define ADC_DEBOUNCE_VBATMON (1 << 6) | ||
5187 | +#define ADC_TBATREF_ENABLE (1 << 5) | ||
5188 | +#define ADC_LDO_INT_ENABLE (1 << 4) | ||
5189 | +#define ADC_MAN_CONV (1 << 3) | ||
5190 | +#define ADC_MUX_VBAT (0) | ||
5191 | + | ||
5192 | +#define ADC_AUTO_CONTROL_1 0xa1 | ||
5193 | +#define ADC_IN5_EN (1 << 7) | ||
5194 | +#define ADC_IN4_EN (1 << 6) | ||
5195 | +#define ADC_TBAT_ENABLE (1 << 5) | ||
5196 | +#define ADC_VBAT_IN_TXON (1 << 4) | ||
5197 | +#define ADC_VCH_ENABLE (1 << 3) | ||
5198 | +#define ADC_ICH_ENABLE (1 << 2) | ||
5199 | +#define ADC_VBAT_ENABLE (1 << 1) | ||
5200 | +#define ADC_AUTO_SLEEP_ENABLE (1 << 0) | ||
5201 | + | ||
5202 | +#define VBATMON_1 0xa2 | ||
5203 | +#define VBATMONTXMON_1 0xa3 | ||
5204 | +#define TBATHIGHP_1 0xa4 | ||
5205 | +#define TBATHIGHN_1 0xa5 | ||
5206 | +#define TBATLOW_1 0xa6 | ||
5207 | +#define MAN_RES 0xb0 | ||
5208 | +#define VBAT_RES_1 0xb1 | ||
5209 | +#define VBATMIN_RES_1 0xb2 | ||
5210 | +#define VBATMINTXON_RES 0xb3 | ||
5211 | +#define ICHMAX_RES_1 0xb4 | ||
5212 | +#define ICHMIN_RES_1 0xb5 | ||
5213 | +#define ICHAVERAGE_RES_1 0xb6 | ||
5214 | +#define VCHMAX_RES_1 0xb7 | ||
5215 | +#define VCHMIN_RES_1 0xb8 | ||
5216 | +#define TBAT_RES_1 0xb9 | ||
5217 | +#define ADC_IN4_RES_1 0xba | ||
5218 | diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig | ||
5219 | index f929fcd..174ea2e 100644 | ||
5220 | --- a/drivers/input/touchscreen/Kconfig | ||
5221 | +++ b/drivers/input/touchscreen/Kconfig | ||
5222 | @@ -126,6 +126,49 @@ config TOUCHSCREEN_HP600 | ||
5223 | To compile this driver as a module, choose M here: the | ||
5224 | module will be called hp680_ts_input. | ||
5225 | |||
5226 | +config TOUCHSCREEN_WM97XX | ||
5227 | + tristate "Support for WM97xx AC97 touchscreen controllers" | ||
5228 | + depends AC97_BUS | ||
5229 | + | ||
5230 | +choice | ||
5231 | + prompt "WM97xx codec type" | ||
5232 | + depends TOUCHSCREEN_WM97XX | ||
5233 | + | ||
5234 | +config TOUCHSCREEN_WM9705 | ||
5235 | + bool "WM9705 Touchscreen interface support" | ||
5236 | + depends on TOUCHSCREEN_WM97XX | ||
5237 | + help | ||
5238 | + Say Y here if you have the wm9705 touchscreen. | ||
5239 | + | ||
5240 | + If unsure, say N. | ||
5241 | + | ||
5242 | + To compile this driver as a module, choose M here: the | ||
5243 | + module will be called wm9705. | ||
5244 | + | ||
5245 | +config TOUCHSCREEN_WM9712 | ||
5246 | + bool "WM9712 Touchscreen interface support" | ||
5247 | + depends on TOUCHSCREEN_WM97XX | ||
5248 | + help | ||
5249 | + Say Y here if you have the wm9712 touchscreen. | ||
5250 | + | ||
5251 | + If unsure, say N. | ||
5252 | + | ||
5253 | + To compile this driver as a module, choose M here: the | ||
5254 | + module will be called wm9712. | ||
5255 | + | ||
5256 | +config TOUCHSCREEN_WM9713 | ||
5257 | + bool "WM9713 Touchscreen interface support" | ||
5258 | + depends on TOUCHSCREEN_WM97XX | ||
5259 | + help | ||
5260 | + Say Y here if you have the wm9713 touchscreen. | ||
5261 | + | ||
5262 | + If unsure, say N. | ||
5263 | + | ||
5264 | + To compile this driver as a module, choose M here: the | ||
5265 | + module will be called wm9713. | ||
5266 | + | ||
5267 | +endchoice | ||
5268 | + | ||
5269 | config TOUCHSCREEN_PENMOUNT | ||
5270 | tristate "Penmount serial touchscreen" | ||
5271 | select SERIO | ||
5272 | diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile | ||
5273 | index 5de8933..3a059b1 100644 | ||
5274 | --- a/drivers/input/touchscreen/Makefile | ||
5275 | +++ b/drivers/input/touchscreen/Makefile | ||
5276 | @@ -3,6 +3,7 @@ | ||
5277 | # | ||
5278 | |||
5279 | # Each configuration option enables a list of files. | ||
5280 | +wm97xx-ts-objs := wm97xx-core.o | ||
5281 | |||
5282 | obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o | ||
5283 | obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o | ||
5284 | @@ -18,3 +19,16 @@ obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o | ||
5285 | obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o | ||
5286 | obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o | ||
5287 | obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o | ||
5288 | +obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o | ||
5289 | + | ||
5290 | +ifeq ($(CONFIG_TOUCHSCREEN_WM9713),y) | ||
5291 | +wm97xx-ts-objs += wm9713.o | ||
5292 | +endif | ||
5293 | + | ||
5294 | +ifeq ($(CONFIG_TOUCHSCREEN_WM9712),y) | ||
5295 | +wm97xx-ts-objs += wm9712.o | ||
5296 | +endif | ||
5297 | + | ||
5298 | +ifeq ($(CONFIG_TOUCHSCREEN_WM9705),y) | ||
5299 | +wm97xx-ts-objs += wm9705.o | ||
5300 | +endif | ||
5301 | diff --git a/drivers/input/touchscreen/wm9705.c b/drivers/input/touchscreen/wm9705.c | ||
5302 | new file mode 100644 | ||
5303 | index 0000000..1dae63d | ||
5304 | --- /dev/null | ||
5305 | +++ b/drivers/input/touchscreen/wm9705.c | ||
5306 | @@ -0,0 +1,360 @@ | ||
5307 | +/* | ||
5308 | + * wm9705.c -- Codec driver for Wolfson WM9705 AC97 Codec. | ||
5309 | + * | ||
5310 | + * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. | ||
5311 | + * Author: Liam Girdwood | ||
5312 | + * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
5313 | + * Parts Copyright : Ian Molton <spyro@f2s.com> | ||
5314 | + * Andrew Zabolotny <zap@homelink.ru> | ||
5315 | + * Russell King <rmk@arm.linux.org.uk> | ||
5316 | + * | ||
5317 | + * This program is free software; you can redistribute it and/or modify it | ||
5318 | + * under the terms of the GNU General Public License as published by the | ||
5319 | + * Free Software Foundation; either version 2 of the License, or (at your | ||
5320 | + * option) any later version. | ||
5321 | + * | ||
5322 | + * Revision history | ||
5323 | + * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> | ||
5324 | + * Added pre and post sample calls. | ||
5325 | + * | ||
5326 | + */ | ||
5327 | + | ||
5328 | +#include <linux/module.h> | ||
5329 | +#include <linux/moduleparam.h> | ||
5330 | +#include <linux/version.h> | ||
5331 | +#include <linux/kernel.h> | ||
5332 | +#include <linux/input.h> | ||
5333 | +#include <linux/delay.h> | ||
5334 | +#include <linux/bitops.h> | ||
5335 | +#include <linux/wm97xx.h> | ||
5336 | + | ||
5337 | +#define TS_NAME "wm97xx" | ||
5338 | +#define WM9705_VERSION "0.62" | ||
5339 | +#define DEFAULT_PRESSURE 0xb0c0 | ||
5340 | + | ||
5341 | +/* | ||
5342 | + * Debug | ||
5343 | + */ | ||
5344 | +#if 0 | ||
5345 | +#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) | ||
5346 | +#else | ||
5347 | +#define dbg(format, arg...) | ||
5348 | +#endif | ||
5349 | +#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) | ||
5350 | +#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) | ||
5351 | +#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) | ||
5352 | + | ||
5353 | +/* | ||
5354 | + * Module parameters | ||
5355 | + */ | ||
5356 | + | ||
5357 | +/* | ||
5358 | + * Set current used for pressure measurement. | ||
5359 | + * | ||
5360 | + * Set pil = 2 to use 400uA | ||
5361 | + * pil = 1 to use 200uA and | ||
5362 | + * pil = 0 to disable pressure measurement. | ||
5363 | + * | ||
5364 | + * This is used to increase the range of values returned by the adc | ||
5365 | + * when measureing touchpanel pressure. | ||
5366 | + */ | ||
5367 | +static int pil = 0; | ||
5368 | +module_param(pil, int, 0); | ||
5369 | +MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); | ||
5370 | + | ||
5371 | +/* | ||
5372 | + * Set threshold for pressure measurement. | ||
5373 | + * | ||
5374 | + * Pen down pressure below threshold is ignored. | ||
5375 | + */ | ||
5376 | +static int pressure = DEFAULT_PRESSURE & 0xfff; | ||
5377 | +module_param(pressure, int, 0); | ||
5378 | +MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); | ||
5379 | + | ||
5380 | +/* | ||
5381 | + * Set adc sample delay. | ||
5382 | + * | ||
5383 | + * For accurate touchpanel measurements, some settling time may be | ||
5384 | + * required between the switch matrix applying a voltage across the | ||
5385 | + * touchpanel plate and the ADC sampling the signal. | ||
5386 | + * | ||
5387 | + * This delay can be set by setting delay = n, where n is the array | ||
5388 | + * position of the delay in the array delay_table below. | ||
5389 | + * Long delays > 1ms are supported for completeness, but are not | ||
5390 | + * recommended. | ||
5391 | + */ | ||
5392 | +static int delay = 4; | ||
5393 | +module_param(delay, int, 0); | ||
5394 | +MODULE_PARM_DESC(delay, "Set adc sample delay."); | ||
5395 | + | ||
5396 | +/* | ||
5397 | + * Pen detect comparator threshold. | ||
5398 | + * | ||
5399 | + * 0 to Vmid in 15 steps, 0 = use zero power comparator with Vmid threshold | ||
5400 | + * i.e. 1 = Vmid/15 threshold | ||
5401 | + * 15 = Vmid/1 threshold | ||
5402 | + * | ||
5403 | + * Adjust this value if you are having problems with pen detect not | ||
5404 | + * detecting any down events. | ||
5405 | + */ | ||
5406 | +static int pdd = 8; | ||
5407 | +module_param(pdd, int, 0); | ||
5408 | +MODULE_PARM_DESC(pdd, "Set pen detect comparator threshold"); | ||
5409 | + | ||
5410 | +/* | ||
5411 | + * Set adc mask function. | ||
5412 | + * | ||
5413 | + * Sources of glitch noise, such as signals driving an LCD display, may feed | ||
5414 | + * through to the touch screen plates and affect measurement accuracy. In | ||
5415 | + * order to minimise this, a signal may be applied to the MASK pin to delay or | ||
5416 | + * synchronise the sampling. | ||
5417 | + * | ||
5418 | + * 0 = No delay or sync | ||
5419 | + * 1 = High on pin stops conversions | ||
5420 | + * 2 = Edge triggered, edge on pin delays conversion by delay param (above) | ||
5421 | + * 3 = Edge triggered, edge on pin starts conversion after delay param | ||
5422 | + */ | ||
5423 | +static int mask = 0; | ||
5424 | +module_param(mask, int, 0); | ||
5425 | +MODULE_PARM_DESC(mask, "Set adc mask function."); | ||
5426 | + | ||
5427 | +/* | ||
5428 | + * ADC sample delay times in uS | ||
5429 | + */ | ||
5430 | +static const int delay_table[] = { | ||
5431 | + 21, // 1 AC97 Link frames | ||
5432 | + 42, // 2 | ||
5433 | + 84, // 4 | ||
5434 | + 167, // 8 | ||
5435 | + 333, // 16 | ||
5436 | + 667, // 32 | ||
5437 | + 1000, // 48 | ||
5438 | + 1333, // 64 | ||
5439 | + 2000, // 96 | ||
5440 | + 2667, // 128 | ||
5441 | + 3333, // 160 | ||
5442 | + 4000, // 192 | ||
5443 | + 4667, // 224 | ||
5444 | + 5333, // 256 | ||
5445 | + 6000, // 288 | ||
5446 | + 0 // No delay, switch matrix always on | ||
5447 | +}; | ||
5448 | + | ||
5449 | +/* | ||
5450 | + * Delay after issuing a POLL command. | ||
5451 | + * | ||
5452 | + * The delay is 3 AC97 link frames + the touchpanel settling delay | ||
5453 | + */ | ||
5454 | +static inline void poll_delay(int d) | ||
5455 | +{ | ||
5456 | + udelay (3 * AC97_LINK_FRAME + delay_table [d]); | ||
5457 | +} | ||
5458 | + | ||
5459 | +/* | ||
5460 | + * set up the physical settings of the WM9705 | ||
5461 | + */ | ||
5462 | +static void init_wm9705_phy(struct wm97xx* wm) | ||
5463 | +{ | ||
5464 | + u16 dig1 = 0, dig2 = WM97XX_RPR; | ||
5465 | + | ||
5466 | + /* | ||
5467 | + * mute VIDEO and AUX as they share X and Y touchscreen | ||
5468 | + * inputs on the WM9705 | ||
5469 | + */ | ||
5470 | + wm97xx_reg_write(wm, AC97_AUX, 0x8000); | ||
5471 | + wm97xx_reg_write(wm, AC97_VIDEO, 0x8000); | ||
5472 | + | ||
5473 | + /* touchpanel pressure current*/ | ||
5474 | + if (pil == 2) { | ||
5475 | + dig2 |= WM9705_PIL; | ||
5476 | + dbg("setting pressure measurement current to 400uA."); | ||
5477 | + } else if (pil) | ||
5478 | + dbg("setting pressure measurement current to 200uA."); | ||
5479 | + if(!pil) | ||
5480 | + pressure = 0; | ||
5481 | + | ||
5482 | + /* polling mode sample settling delay */ | ||
5483 | + if (delay!=4) { | ||
5484 | + if (delay < 0 || delay > 15) { | ||
5485 | + dbg("supplied delay out of range."); | ||
5486 | + delay = 4; | ||
5487 | + } | ||
5488 | + } | ||
5489 | + dig1 &= 0xff0f; | ||
5490 | + dig1 |= WM97XX_DELAY(delay); | ||
5491 | + dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); | ||
5492 | + | ||
5493 | + /* WM9705 pdd */ | ||
5494 | + dig2 |= (pdd & 0x000f); | ||
5495 | + dbg("setting pdd to Vmid/%d", 1 - (pdd & 0x000f)); | ||
5496 | + | ||
5497 | + /* mask */ | ||
5498 | + dig2 |= ((mask & 0x3) << 4); | ||
5499 | + | ||
5500 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); | ||
5501 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); | ||
5502 | +} | ||
5503 | + | ||
5504 | +static int wm9705_digitiser_ioctl(struct wm97xx* wm, int cmd) | ||
5505 | +{ | ||
5506 | + switch(cmd) { | ||
5507 | + case WM97XX_DIG_START: | ||
5508 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] | WM97XX_PRP_DET_DIG); | ||
5509 | + wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ | ||
5510 | + break; | ||
5511 | + case WM97XX_DIG_STOP: | ||
5512 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] & ~WM97XX_PRP_DET_DIG); | ||
5513 | + break; | ||
5514 | + case WM97XX_AUX_PREPARE: | ||
5515 | + memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); | ||
5516 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); | ||
5517 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); | ||
5518 | + break; | ||
5519 | + case WM97XX_DIG_RESTORE: | ||
5520 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); | ||
5521 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); | ||
5522 | + break; | ||
5523 | + case WM97XX_PHY_INIT: | ||
5524 | + init_wm9705_phy(wm); | ||
5525 | + break; | ||
5526 | + default: | ||
5527 | + return -EINVAL; | ||
5528 | + } | ||
5529 | + return 0; | ||
5530 | +} | ||
5531 | + | ||
5532 | +static inline int is_pden (struct wm97xx* wm) | ||
5533 | +{ | ||
5534 | + return wm->dig[2] & WM9705_PDEN; | ||
5535 | +} | ||
5536 | + | ||
5537 | +/* | ||
5538 | + * Read a sample from the WM9705 adc in polling mode. | ||
5539 | + */ | ||
5540 | +static int wm9705_poll_sample (struct wm97xx* wm, int adcsel, int *sample) | ||
5541 | +{ | ||
5542 | + int timeout = 5 * delay; | ||
5543 | + | ||
5544 | + if (!wm->pen_probably_down) { | ||
5545 | + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
5546 | + if (!(data & WM97XX_PEN_DOWN)) | ||
5547 | + return RC_PENUP; | ||
5548 | + wm->pen_probably_down = 1; | ||
5549 | + } | ||
5550 | + | ||
5551 | + /* set up digitiser */ | ||
5552 | + if (adcsel & 0x8000) | ||
5553 | + adcsel = ((adcsel & 0x7fff) + 3) << 12; | ||
5554 | + | ||
5555 | + if (wm->mach_ops && wm->mach_ops->pre_sample) | ||
5556 | + wm->mach_ops->pre_sample(adcsel); | ||
5557 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); | ||
5558 | + | ||
5559 | + /* wait 3 AC97 time slots + delay for conversion */ | ||
5560 | + poll_delay (delay); | ||
5561 | + | ||
5562 | + /* wait for POLL to go low */ | ||
5563 | + while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { | ||
5564 | + udelay(AC97_LINK_FRAME); | ||
5565 | + timeout--; | ||
5566 | + } | ||
5567 | + | ||
5568 | + if (timeout <= 0) { | ||
5569 | + /* If PDEN is set, we can get a timeout when pen goes up */ | ||
5570 | + if (is_pden(wm)) | ||
5571 | + wm->pen_probably_down = 0; | ||
5572 | + else | ||
5573 | + dbg ("adc sample timeout"); | ||
5574 | + return RC_PENUP; | ||
5575 | + } | ||
5576 | + | ||
5577 | + *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
5578 | + if (wm->mach_ops && wm->mach_ops->post_sample) | ||
5579 | + wm->mach_ops->post_sample(adcsel); | ||
5580 | + | ||
5581 | + /* check we have correct sample */ | ||
5582 | + if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { | ||
5583 | + dbg ("adc wrong sample, read %x got %x", adcsel, | ||
5584 | + *sample & WM97XX_ADCSEL_MASK); | ||
5585 | + return RC_PENUP; | ||
5586 | + } | ||
5587 | + | ||
5588 | + if (!(*sample & WM97XX_PEN_DOWN)) { | ||
5589 | + wm->pen_probably_down = 0; | ||
5590 | + return RC_PENUP; | ||
5591 | + } | ||
5592 | + | ||
5593 | + return RC_VALID; | ||
5594 | +} | ||
5595 | + | ||
5596 | +/* | ||
5597 | + * Sample the WM9705 touchscreen in polling mode | ||
5598 | + */ | ||
5599 | +static int wm9705_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) | ||
5600 | +{ | ||
5601 | + int rc; | ||
5602 | + | ||
5603 | + if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) | ||
5604 | + return rc; | ||
5605 | + if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) | ||
5606 | + return rc; | ||
5607 | + if (pil) { | ||
5608 | + if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) | ||
5609 | + return rc; | ||
5610 | + } else | ||
5611 | + data->p = DEFAULT_PRESSURE; | ||
5612 | + | ||
5613 | + return RC_VALID; | ||
5614 | +} | ||
5615 | + | ||
5616 | +/* | ||
5617 | + * Enable WM9705 continuous mode, i.e. touch data is streamed across an AC97 slot | ||
5618 | + */ | ||
5619 | +static int wm9705_acc_enable (struct wm97xx* wm, int enable) | ||
5620 | +{ | ||
5621 | + u16 dig1, dig2; | ||
5622 | + int ret = 0; | ||
5623 | + | ||
5624 | + dig1 = wm->dig[1]; | ||
5625 | + dig2 = wm->dig[2]; | ||
5626 | + | ||
5627 | + if (enable) { | ||
5628 | + /* continous mode */ | ||
5629 | + if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) | ||
5630 | + return ret; | ||
5631 | + dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | | ||
5632 | + WM97XX_DELAY_MASK | WM97XX_SLT_MASK); | ||
5633 | + dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | | ||
5634 | + WM97XX_DELAY (delay) | | ||
5635 | + WM97XX_SLT (wm->acc_slot) | | ||
5636 | + WM97XX_RATE (wm->acc_rate); | ||
5637 | + if (pil) | ||
5638 | + dig1 |= WM97XX_ADCSEL_PRES; | ||
5639 | + dig2 |= WM9705_PDEN; | ||
5640 | + } else { | ||
5641 | + dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); | ||
5642 | + dig2 &= ~WM9705_PDEN; | ||
5643 | + if (wm->mach_ops->acc_shutdown) | ||
5644 | + wm->mach_ops->acc_shutdown(wm); | ||
5645 | + } | ||
5646 | + | ||
5647 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); | ||
5648 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); | ||
5649 | + return ret; | ||
5650 | +} | ||
5651 | + | ||
5652 | +struct wm97xx_codec_drv wm97xx_codec = { | ||
5653 | + .id = WM9705_ID2, | ||
5654 | + .name = "wm9705", | ||
5655 | + .poll_sample = wm9705_poll_sample, | ||
5656 | + .poll_touch = wm9705_poll_touch, | ||
5657 | + .acc_enable = wm9705_acc_enable, | ||
5658 | + .digitiser_ioctl = wm9705_digitiser_ioctl, | ||
5659 | +}; | ||
5660 | + | ||
5661 | +EXPORT_SYMBOL_GPL(wm97xx_codec); | ||
5662 | + | ||
5663 | +/* Module information */ | ||
5664 | +MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); | ||
5665 | +MODULE_DESCRIPTION("WM9705 Touch Screen Driver"); | ||
5666 | +MODULE_LICENSE("GPL"); | ||
5667 | diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c | ||
5668 | new file mode 100644 | ||
5669 | index 0000000..99433e9 | ||
5670 | --- /dev/null | ||
5671 | +++ b/drivers/input/touchscreen/wm9712.c | ||
5672 | @@ -0,0 +1,464 @@ | ||
5673 | +/* | ||
5674 | + * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. | ||
5675 | + * | ||
5676 | + * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. | ||
5677 | + * Author: Liam Girdwood | ||
5678 | + * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
5679 | + * Parts Copyright : Ian Molton <spyro@f2s.com> | ||
5680 | + * Andrew Zabolotny <zap@homelink.ru> | ||
5681 | + * Russell King <rmk@arm.linux.org.uk> | ||
5682 | + * | ||
5683 | + * This program is free software; you can redistribute it and/or modify it | ||
5684 | + * under the terms of the GNU General Public License as published by the | ||
5685 | + * Free Software Foundation; either version 2 of the License, or (at your | ||
5686 | + * option) any later version. | ||
5687 | + * | ||
5688 | + * Revision history | ||
5689 | + * 4th Jul 2005 Initial version. | ||
5690 | + * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> | ||
5691 | + * Added pre and post sample calls. | ||
5692 | + * | ||
5693 | + */ | ||
5694 | + | ||
5695 | +#include <linux/module.h> | ||
5696 | +#include <linux/moduleparam.h> | ||
5697 | +#include <linux/version.h> | ||
5698 | +#include <linux/kernel.h> | ||
5699 | +#include <linux/input.h> | ||
5700 | +#include <linux/delay.h> | ||
5701 | +#include <linux/bitops.h> | ||
5702 | +#include <linux/wm97xx.h> | ||
5703 | + | ||
5704 | +#define TS_NAME "wm97xx" | ||
5705 | +#define WM9712_VERSION "0.61" | ||
5706 | +#define DEFAULT_PRESSURE 0xb0c0 | ||
5707 | + | ||
5708 | +/* | ||
5709 | + * Debug | ||
5710 | + */ | ||
5711 | +#if 0 | ||
5712 | +#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) | ||
5713 | +#else | ||
5714 | +#define dbg(format, arg...) | ||
5715 | +#endif | ||
5716 | +#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) | ||
5717 | +#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) | ||
5718 | +#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) | ||
5719 | + | ||
5720 | +/* | ||
5721 | + * Module parameters | ||
5722 | + */ | ||
5723 | + | ||
5724 | +/* | ||
5725 | + * Set internal pull up for pen detect. | ||
5726 | + * | ||
5727 | + * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) | ||
5728 | + * i.e. pull up resistance = 64k Ohms / rpu. | ||
5729 | + * | ||
5730 | + * Adjust this value if you are having problems with pen detect not | ||
5731 | + * detecting any down event. | ||
5732 | + */ | ||
5733 | +static int rpu = 8; | ||
5734 | +module_param(rpu, int, 0); | ||
5735 | +MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); | ||
5736 | + | ||
5737 | +/* | ||
5738 | + * Set current used for pressure measurement. | ||
5739 | + * | ||
5740 | + * Set pil = 2 to use 400uA | ||
5741 | + * pil = 1 to use 200uA and | ||
5742 | + * pil = 0 to disable pressure measurement. | ||
5743 | + * | ||
5744 | + * This is used to increase the range of values returned by the adc | ||
5745 | + * when measureing touchpanel pressure. | ||
5746 | + */ | ||
5747 | +static int pil = 0; | ||
5748 | +module_param(pil, int, 0); | ||
5749 | +MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); | ||
5750 | + | ||
5751 | +/* | ||
5752 | + * Set threshold for pressure measurement. | ||
5753 | + * | ||
5754 | + * Pen down pressure below threshold is ignored. | ||
5755 | + */ | ||
5756 | +static int pressure = DEFAULT_PRESSURE & 0xfff; | ||
5757 | +module_param(pressure, int, 0); | ||
5758 | +MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); | ||
5759 | + | ||
5760 | +/* | ||
5761 | + * Set adc sample delay. | ||
5762 | + * | ||
5763 | + * For accurate touchpanel measurements, some settling time may be | ||
5764 | + * required between the switch matrix applying a voltage across the | ||
5765 | + * touchpanel plate and the ADC sampling the signal. | ||
5766 | + * | ||
5767 | + * This delay can be set by setting delay = n, where n is the array | ||
5768 | + * position of the delay in the array delay_table below. | ||
5769 | + * Long delays > 1ms are supported for completeness, but are not | ||
5770 | + * recommended. | ||
5771 | + */ | ||
5772 | +static int delay = 3; | ||
5773 | +module_param(delay, int, 0); | ||
5774 | +MODULE_PARM_DESC(delay, "Set adc sample delay."); | ||
5775 | + | ||
5776 | +/* | ||
5777 | + * Set five_wire = 1 to use a 5 wire touchscreen. | ||
5778 | + * | ||
5779 | + * NOTE: Five wire mode does not allow for readback of pressure. | ||
5780 | + */ | ||
5781 | +static int five_wire; | ||
5782 | +module_param(five_wire, int, 0); | ||
5783 | +MODULE_PARM_DESC(five_wire, "Set to '1' to use 5-wire touchscreen."); | ||
5784 | + | ||
5785 | +/* | ||
5786 | + * Set adc mask function. | ||
5787 | + * | ||
5788 | + * Sources of glitch noise, such as signals driving an LCD display, may feed | ||
5789 | + * through to the touch screen plates and affect measurement accuracy. In | ||
5790 | + * order to minimise this, a signal may be applied to the MASK pin to delay or | ||
5791 | + * synchronise the sampling. | ||
5792 | + * | ||
5793 | + * 0 = No delay or sync | ||
5794 | + * 1 = High on pin stops conversions | ||
5795 | + * 2 = Edge triggered, edge on pin delays conversion by delay param (above) | ||
5796 | + * 3 = Edge triggered, edge on pin starts conversion after delay param | ||
5797 | + */ | ||
5798 | +static int mask = 0; | ||
5799 | +module_param(mask, int, 0); | ||
5800 | +MODULE_PARM_DESC(mask, "Set adc mask function."); | ||
5801 | + | ||
5802 | +/* | ||
5803 | + * Coordinate Polling Enable. | ||
5804 | + * | ||
5805 | + * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together | ||
5806 | + * for every poll. | ||
5807 | + */ | ||
5808 | +static int coord = 0; | ||
5809 | +module_param(coord, int, 0); | ||
5810 | +MODULE_PARM_DESC(coord, "Polling coordinate mode"); | ||
5811 | + | ||
5812 | +/* | ||
5813 | + * ADC sample delay times in uS | ||
5814 | + */ | ||
5815 | +static const int delay_table[] = { | ||
5816 | + 21, // 1 AC97 Link frames | ||
5817 | + 42, // 2 | ||
5818 | + 84, // 4 | ||
5819 | + 167, // 8 | ||
5820 | + 333, // 16 | ||
5821 | + 667, // 32 | ||
5822 | + 1000, // 48 | ||
5823 | + 1333, // 64 | ||
5824 | + 2000, // 96 | ||
5825 | + 2667, // 128 | ||
5826 | + 3333, // 160 | ||
5827 | + 4000, // 192 | ||
5828 | + 4667, // 224 | ||
5829 | + 5333, // 256 | ||
5830 | + 6000, // 288 | ||
5831 | + 0 // No delay, switch matrix always on | ||
5832 | +}; | ||
5833 | + | ||
5834 | +/* | ||
5835 | + * Delay after issuing a POLL command. | ||
5836 | + * | ||
5837 | + * The delay is 3 AC97 link frames + the touchpanel settling delay | ||
5838 | + */ | ||
5839 | +static inline void poll_delay(int d) | ||
5840 | +{ | ||
5841 | + udelay (3 * AC97_LINK_FRAME + delay_table [d]); | ||
5842 | +} | ||
5843 | + | ||
5844 | +/* | ||
5845 | + * set up the physical settings of the WM9712 | ||
5846 | + */ | ||
5847 | +static void init_wm9712_phy(struct wm97xx* wm) | ||
5848 | +{ | ||
5849 | + u16 dig1 = 0; | ||
5850 | + u16 dig2 = WM97XX_RPR | WM9712_RPU(1); | ||
5851 | + | ||
5852 | + /* WM9712 rpu */ | ||
5853 | + if (rpu) { | ||
5854 | + dig2 &= 0xffc0; | ||
5855 | + dig2 |= WM9712_RPU(rpu); | ||
5856 | + dbg("setting pen detect pull-up to %d Ohms",64000 / rpu); | ||
5857 | + } | ||
5858 | + | ||
5859 | + /* touchpanel pressure current*/ | ||
5860 | + if (pil == 2) { | ||
5861 | + dig2 |= WM9712_PIL; | ||
5862 | + dbg("setting pressure measurement current to 400uA."); | ||
5863 | + } else if (pil) | ||
5864 | + dbg("setting pressure measurement current to 200uA."); | ||
5865 | + if(!pil) | ||
5866 | + pressure = 0; | ||
5867 | + | ||
5868 | + /* WM9712 five wire */ | ||
5869 | + if (five_wire) { | ||
5870 | + dig2 |= WM9712_45W; | ||
5871 | + dbg("setting 5-wire touchscreen mode."); | ||
5872 | + } | ||
5873 | + | ||
5874 | + /* polling mode sample settling delay */ | ||
5875 | + if (delay < 0 || delay > 15) { | ||
5876 | + dbg("supplied delay out of range."); | ||
5877 | + delay = 4; | ||
5878 | + } | ||
5879 | + dig1 &= 0xff0f; | ||
5880 | + dig1 |= WM97XX_DELAY(delay); | ||
5881 | + dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); | ||
5882 | + | ||
5883 | + /* mask */ | ||
5884 | + dig2 |= ((mask & 0x3) << 6); | ||
5885 | + if (mask) { | ||
5886 | + u16 reg; | ||
5887 | + /* Set GPIO4 as Mask Pin*/ | ||
5888 | + reg = wm97xx_reg_read(wm, AC97_MISC_AFE); | ||
5889 | + wm97xx_reg_write(wm, AC97_MISC_AFE, reg | WM97XX_GPIO_4); | ||
5890 | + reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); | ||
5891 | + wm97xx_reg_write(wm, AC97_GPIO_CFG, reg | WM97XX_GPIO_4); | ||
5892 | + } | ||
5893 | + | ||
5894 | + /* wait - coord mode */ | ||
5895 | + if(coord) | ||
5896 | + dig2 |= WM9712_WAIT; | ||
5897 | + | ||
5898 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); | ||
5899 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); | ||
5900 | +} | ||
5901 | + | ||
5902 | +static int wm9712_digitiser_ioctl(struct wm97xx* wm, int cmd) | ||
5903 | +{ | ||
5904 | + u16 dig2 = wm->dig[2]; | ||
5905 | + | ||
5906 | + switch(cmd) { | ||
5907 | + case WM97XX_DIG_START: | ||
5908 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 | WM97XX_PRP_DET_DIG); | ||
5909 | + wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ | ||
5910 | + break; | ||
5911 | + case WM97XX_DIG_STOP: | ||
5912 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 & ~WM97XX_PRP_DET_DIG); | ||
5913 | + break; | ||
5914 | + case WM97XX_AUX_PREPARE: | ||
5915 | + memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); | ||
5916 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); | ||
5917 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); | ||
5918 | + break; | ||
5919 | + case WM97XX_DIG_RESTORE: | ||
5920 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); | ||
5921 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); | ||
5922 | + break; | ||
5923 | + case WM97XX_PHY_INIT: | ||
5924 | + init_wm9712_phy(wm); | ||
5925 | + break; | ||
5926 | + default: | ||
5927 | + return -EINVAL; | ||
5928 | + } | ||
5929 | + return 0; | ||
5930 | +} | ||
5931 | + | ||
5932 | +static inline int is_pden (struct wm97xx* wm) | ||
5933 | +{ | ||
5934 | + return wm->dig[2] & WM9712_PDEN; | ||
5935 | +} | ||
5936 | + | ||
5937 | +/* | ||
5938 | + * Read a sample from the WM9712 adc in polling mode. | ||
5939 | + */ | ||
5940 | +static int wm9712_poll_sample (struct wm97xx* wm, int adcsel, int *sample) | ||
5941 | +{ | ||
5942 | + int timeout = 5 * delay; | ||
5943 | + | ||
5944 | + if (!wm->pen_probably_down) { | ||
5945 | + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
5946 | + if (!(data & WM97XX_PEN_DOWN)) | ||
5947 | + return RC_PENUP; | ||
5948 | + wm->pen_probably_down = 1; | ||
5949 | + } | ||
5950 | + | ||
5951 | + /* set up digitiser */ | ||
5952 | + if (adcsel & 0x8000) | ||
5953 | + adcsel = ((adcsel & 0x7fff) + 3) << 12; | ||
5954 | + | ||
5955 | + if (wm->mach_ops && wm->mach_ops->pre_sample) | ||
5956 | + wm->mach_ops->pre_sample(adcsel); | ||
5957 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); | ||
5958 | + | ||
5959 | + /* wait 3 AC97 time slots + delay for conversion */ | ||
5960 | + poll_delay (delay); | ||
5961 | + | ||
5962 | + /* wait for POLL to go low */ | ||
5963 | + while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { | ||
5964 | + udelay(AC97_LINK_FRAME); | ||
5965 | + timeout--; | ||
5966 | + } | ||
5967 | + | ||
5968 | + if (timeout <= 0) { | ||
5969 | + /* If PDEN is set, we can get a timeout when pen goes up */ | ||
5970 | + if (is_pden(wm)) | ||
5971 | + wm->pen_probably_down = 0; | ||
5972 | + else | ||
5973 | + dbg ("adc sample timeout"); | ||
5974 | + return RC_PENUP; | ||
5975 | + } | ||
5976 | + | ||
5977 | + *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
5978 | + if (wm->mach_ops && wm->mach_ops->post_sample) | ||
5979 | + wm->mach_ops->post_sample(adcsel); | ||
5980 | + | ||
5981 | + /* check we have correct sample */ | ||
5982 | + if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { | ||
5983 | + dbg ("adc wrong sample, read %x got %x", adcsel, | ||
5984 | + *sample & WM97XX_ADCSEL_MASK); | ||
5985 | + return RC_PENUP; | ||
5986 | + } | ||
5987 | + | ||
5988 | + if (!(*sample & WM97XX_PEN_DOWN)) { | ||
5989 | + wm->pen_probably_down = 0; | ||
5990 | + return RC_PENUP; | ||
5991 | + } | ||
5992 | + | ||
5993 | + return RC_VALID; | ||
5994 | +} | ||
5995 | + | ||
5996 | +/* | ||
5997 | + * Read a coord from the WM9712 adc in polling mode. | ||
5998 | + */ | ||
5999 | +static int wm9712_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) | ||
6000 | +{ | ||
6001 | + int timeout = 5 * delay; | ||
6002 | + | ||
6003 | + if (!wm->pen_probably_down) { | ||
6004 | + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6005 | + if (!(data & WM97XX_PEN_DOWN)) | ||
6006 | + return RC_PENUP; | ||
6007 | + wm->pen_probably_down = 1; | ||
6008 | + } | ||
6009 | + | ||
6010 | + /* set up digitiser */ | ||
6011 | + if (wm->mach_ops && wm->mach_ops->pre_sample) | ||
6012 | + wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); | ||
6013 | + | ||
6014 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, | ||
6015 | + WM97XX_COO | WM97XX_POLL | WM97XX_DELAY(delay)); | ||
6016 | + | ||
6017 | + /* wait 3 AC97 time slots + delay for conversion and read x */ | ||
6018 | + poll_delay(delay); | ||
6019 | + data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6020 | + /* wait for POLL to go low */ | ||
6021 | + while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { | ||
6022 | + udelay(AC97_LINK_FRAME); | ||
6023 | + timeout--; | ||
6024 | + } | ||
6025 | + | ||
6026 | + if (timeout <= 0) { | ||
6027 | + /* If PDEN is set, we can get a timeout when pen goes up */ | ||
6028 | + if (is_pden(wm)) | ||
6029 | + wm->pen_probably_down = 0; | ||
6030 | + else | ||
6031 | + dbg ("adc sample timeout"); | ||
6032 | + return RC_PENUP; | ||
6033 | + } | ||
6034 | + | ||
6035 | + /* read back y data */ | ||
6036 | + data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6037 | + if (pil) | ||
6038 | + data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6039 | + else | ||
6040 | + data->p = DEFAULT_PRESSURE; | ||
6041 | + | ||
6042 | + if (wm->mach_ops && wm->mach_ops->post_sample) | ||
6043 | + wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); | ||
6044 | + | ||
6045 | + /* check we have correct sample */ | ||
6046 | + if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) | ||
6047 | + goto err; | ||
6048 | + if(pil && !(data->p & WM97XX_ADCSEL_PRES)) | ||
6049 | + goto err; | ||
6050 | + | ||
6051 | + if (!(data->x & WM97XX_PEN_DOWN)) { | ||
6052 | + wm->pen_probably_down = 0; | ||
6053 | + return RC_PENUP; | ||
6054 | + } | ||
6055 | + return RC_VALID; | ||
6056 | +err: | ||
6057 | + return RC_PENUP; | ||
6058 | +} | ||
6059 | + | ||
6060 | +/* | ||
6061 | + * Sample the WM9712 touchscreen in polling mode | ||
6062 | + */ | ||
6063 | +static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) | ||
6064 | +{ | ||
6065 | + int rc; | ||
6066 | + | ||
6067 | + if(coord) { | ||
6068 | + if((rc = wm9712_poll_coord(wm, data)) != RC_VALID) | ||
6069 | + return rc; | ||
6070 | + } else { | ||
6071 | + if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) | ||
6072 | + return rc; | ||
6073 | + | ||
6074 | + if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) | ||
6075 | + return rc; | ||
6076 | + | ||
6077 | + if (pil && !five_wire) { | ||
6078 | + if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) | ||
6079 | + return rc; | ||
6080 | + } else | ||
6081 | + data->p = DEFAULT_PRESSURE; | ||
6082 | + } | ||
6083 | + return RC_VALID; | ||
6084 | +} | ||
6085 | + | ||
6086 | +/* | ||
6087 | + * Enable WM9712 continuous mode, i.e. touch data is streamed across an AC97 slot | ||
6088 | + */ | ||
6089 | +static int wm9712_acc_enable (struct wm97xx* wm, int enable) | ||
6090 | +{ | ||
6091 | + u16 dig1, dig2; | ||
6092 | + int ret = 0; | ||
6093 | + | ||
6094 | + dig1 = wm->dig[1]; | ||
6095 | + dig2 = wm->dig[2]; | ||
6096 | + | ||
6097 | + if (enable) { | ||
6098 | + /* continous mode */ | ||
6099 | + if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) | ||
6100 | + return ret; | ||
6101 | + dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | | ||
6102 | + WM97XX_DELAY_MASK | WM97XX_SLT_MASK); | ||
6103 | + dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | | ||
6104 | + WM97XX_DELAY (delay) | | ||
6105 | + WM97XX_SLT (wm->acc_slot) | | ||
6106 | + WM97XX_RATE (wm->acc_rate); | ||
6107 | + if (pil) | ||
6108 | + dig1 |= WM97XX_ADCSEL_PRES; | ||
6109 | + dig2 |= WM9712_PDEN; | ||
6110 | + } else { | ||
6111 | + dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); | ||
6112 | + dig2 &= ~WM9712_PDEN; | ||
6113 | + if (wm->mach_ops->acc_shutdown) | ||
6114 | + wm->mach_ops->acc_shutdown(wm); | ||
6115 | + } | ||
6116 | + | ||
6117 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); | ||
6118 | + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); | ||
6119 | + return 0; | ||
6120 | +} | ||
6121 | + | ||
6122 | +struct wm97xx_codec_drv wm97xx_codec = { | ||
6123 | + .id = WM9712_ID2, | ||
6124 | + .name = "wm9712", | ||
6125 | + .poll_sample = wm9712_poll_sample, | ||
6126 | + .poll_touch = wm9712_poll_touch, | ||
6127 | + .acc_enable = wm9712_acc_enable, | ||
6128 | + .digitiser_ioctl = wm9712_digitiser_ioctl, | ||
6129 | +}; | ||
6130 | + | ||
6131 | +EXPORT_SYMBOL_GPL(wm97xx_codec); | ||
6132 | + | ||
6133 | +/* Module information */ | ||
6134 | +MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); | ||
6135 | +MODULE_DESCRIPTION("WM9712 Touch Screen Driver"); | ||
6136 | +MODULE_LICENSE("GPL"); | ||
6137 | diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c | ||
6138 | new file mode 100644 | ||
6139 | index 0000000..42f5f30 | ||
6140 | --- /dev/null | ||
6141 | +++ b/drivers/input/touchscreen/wm9713.c | ||
6142 | @@ -0,0 +1,461 @@ | ||
6143 | +/* | ||
6144 | + * wm9713.c -- Codec touch driver for Wolfson WM9713 AC97 Codec. | ||
6145 | + * | ||
6146 | + * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. | ||
6147 | + * Author: Liam Girdwood | ||
6148 | + * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
6149 | + * Parts Copyright : Ian Molton <spyro@f2s.com> | ||
6150 | + * Andrew Zabolotny <zap@homelink.ru> | ||
6151 | + * Russell King <rmk@arm.linux.org.uk> | ||
6152 | + * | ||
6153 | + * This program is free software; you can redistribute it and/or modify it | ||
6154 | + * under the terms of the GNU General Public License as published by the | ||
6155 | + * Free Software Foundation; either version 2 of the License, or (at your | ||
6156 | + * option) any later version. | ||
6157 | + * | ||
6158 | + * Revision history | ||
6159 | + * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> | ||
6160 | + * Added pre and post sample calls. | ||
6161 | + * | ||
6162 | + */ | ||
6163 | + | ||
6164 | +#include <linux/module.h> | ||
6165 | +#include <linux/moduleparam.h> | ||
6166 | +#include <linux/version.h> | ||
6167 | +#include <linux/kernel.h> | ||
6168 | +#include <linux/input.h> | ||
6169 | +#include <linux/delay.h> | ||
6170 | +#include <linux/bitops.h> | ||
6171 | +#include <linux/wm97xx.h> | ||
6172 | + | ||
6173 | +#define TS_NAME "wm97xx" | ||
6174 | +#define WM9713_VERSION "0.53" | ||
6175 | +#define DEFAULT_PRESSURE 0xb0c0 | ||
6176 | + | ||
6177 | +/* | ||
6178 | + * Debug | ||
6179 | + */ | ||
6180 | +#if 0 | ||
6181 | +#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) | ||
6182 | +#else | ||
6183 | +#define dbg(format, arg...) | ||
6184 | +#endif | ||
6185 | +#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) | ||
6186 | +#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) | ||
6187 | +#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) | ||
6188 | + | ||
6189 | +/* | ||
6190 | + * Module parameters | ||
6191 | + */ | ||
6192 | + | ||
6193 | +/* | ||
6194 | + * Set internal pull up for pen detect. | ||
6195 | + * | ||
6196 | + * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) | ||
6197 | + * i.e. pull up resistance = 64k Ohms / rpu. | ||
6198 | + * | ||
6199 | + * Adjust this value if you are having problems with pen detect not | ||
6200 | + * detecting any down event. | ||
6201 | + */ | ||
6202 | +static int rpu = 8; | ||
6203 | +module_param(rpu, int, 0); | ||
6204 | +MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); | ||
6205 | + | ||
6206 | +/* | ||
6207 | + * Set current used for pressure measurement. | ||
6208 | + * | ||
6209 | + * Set pil = 2 to use 400uA | ||
6210 | + * pil = 1 to use 200uA and | ||
6211 | + * pil = 0 to disable pressure measurement. | ||
6212 | + * | ||
6213 | + * This is used to increase the range of values returned by the adc | ||
6214 | + * when measureing touchpanel pressure. | ||
6215 | + */ | ||
6216 | +static int pil = 0; | ||
6217 | +module_param(pil, int, 0); | ||
6218 | +MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); | ||
6219 | + | ||
6220 | +/* | ||
6221 | + * Set threshold for pressure measurement. | ||
6222 | + * | ||
6223 | + * Pen down pressure below threshold is ignored. | ||
6224 | + */ | ||
6225 | +static int pressure = DEFAULT_PRESSURE & 0xfff; | ||
6226 | +module_param(pressure, int, 0); | ||
6227 | +MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); | ||
6228 | + | ||
6229 | +/* | ||
6230 | + * Set adc sample delay. | ||
6231 | + * | ||
6232 | + * For accurate touchpanel measurements, some settling time may be | ||
6233 | + * required between the switch matrix applying a voltage across the | ||
6234 | + * touchpanel plate and the ADC sampling the signal. | ||
6235 | + * | ||
6236 | + * This delay can be set by setting delay = n, where n is the array | ||
6237 | + * position of the delay in the array delay_table below. | ||
6238 | + * Long delays > 1ms are supported for completeness, but are not | ||
6239 | + * recommended. | ||
6240 | + */ | ||
6241 | +static int delay = 4; | ||
6242 | +module_param(delay, int, 0); | ||
6243 | +MODULE_PARM_DESC(delay, "Set adc sample delay."); | ||
6244 | + | ||
6245 | +/* | ||
6246 | + * Set adc mask function. | ||
6247 | + * | ||
6248 | + * Sources of glitch noise, such as signals driving an LCD display, may feed | ||
6249 | + * through to the touch screen plates and affect measurement accuracy. In | ||
6250 | + * order to minimise this, a signal may be applied to the MASK pin to delay or | ||
6251 | + * synchronise the sampling. | ||
6252 | + * | ||
6253 | + * 0 = No delay or sync | ||
6254 | + * 1 = High on pin stops conversions | ||
6255 | + * 2 = Edge triggered, edge on pin delays conversion by delay param (above) | ||
6256 | + * 3 = Edge triggered, edge on pin starts conversion after delay param | ||
6257 | + */ | ||
6258 | +static int mask = 0; | ||
6259 | +module_param(mask, int, 0); | ||
6260 | +MODULE_PARM_DESC(mask, "Set adc mask function."); | ||
6261 | + | ||
6262 | +/* | ||
6263 | + * Coordinate Polling Enable. | ||
6264 | + * | ||
6265 | + * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together | ||
6266 | + * for every poll. | ||
6267 | + */ | ||
6268 | +static int coord = 0; | ||
6269 | +module_param(coord, int, 0); | ||
6270 | +MODULE_PARM_DESC(coord, "Polling coordinate mode"); | ||
6271 | + | ||
6272 | +/* | ||
6273 | + * ADC sample delay times in uS | ||
6274 | + */ | ||
6275 | +static const int delay_table[] = { | ||
6276 | + 21, // 1 AC97 Link frames | ||
6277 | + 42, // 2 | ||
6278 | + 84, // 4 | ||
6279 | + 167, // 8 | ||
6280 | + 333, // 16 | ||
6281 | + 667, // 32 | ||
6282 | + 1000, // 48 | ||
6283 | + 1333, // 64 | ||
6284 | + 2000, // 96 | ||
6285 | + 2667, // 128 | ||
6286 | + 3333, // 160 | ||
6287 | + 4000, // 192 | ||
6288 | + 4667, // 224 | ||
6289 | + 5333, // 256 | ||
6290 | + 6000, // 288 | ||
6291 | + 0 // No delay, switch matrix always on | ||
6292 | +}; | ||
6293 | + | ||
6294 | +/* | ||
6295 | + * Delay after issuing a POLL command. | ||
6296 | + * | ||
6297 | + * The delay is 3 AC97 link frames + the touchpanel settling delay | ||
6298 | + */ | ||
6299 | +static inline void poll_delay(int d) | ||
6300 | +{ | ||
6301 | + udelay (3 * AC97_LINK_FRAME + delay_table [d]); | ||
6302 | +} | ||
6303 | + | ||
6304 | +/* | ||
6305 | + * set up the physical settings of the WM9713 | ||
6306 | + */ | ||
6307 | +static void init_wm9713_phy(struct wm97xx* wm) | ||
6308 | +{ | ||
6309 | + u16 dig1 = 0, dig2, dig3; | ||
6310 | + | ||
6311 | + /* default values */ | ||
6312 | + dig2 = WM97XX_DELAY(4) | WM97XX_SLT(5); | ||
6313 | + dig3= WM9712_RPU(1); | ||
6314 | + | ||
6315 | + /* rpu */ | ||
6316 | + if (rpu) { | ||
6317 | + dig3 &= 0xffc0; | ||
6318 | + dig3 |= WM9712_RPU(rpu); | ||
6319 | + info("setting pen detect pull-up to %d Ohms",64000 / rpu); | ||
6320 | + } | ||
6321 | + | ||
6322 | + /* touchpanel pressure */ | ||
6323 | + if (pil == 2) { | ||
6324 | + dig3 |= WM9712_PIL; | ||
6325 | + info("setting pressure measurement current to 400uA."); | ||
6326 | + } else if (pil) | ||
6327 | + info ("setting pressure measurement current to 200uA."); | ||
6328 | + if(!pil) | ||
6329 | + pressure = 0; | ||
6330 | + | ||
6331 | + /* sample settling delay */ | ||
6332 | + if (delay < 0 || delay > 15) { | ||
6333 | + info ("supplied delay out of range."); | ||
6334 | + delay = 4; | ||
6335 | + info("setting adc sample delay to %d u Secs.", delay_table[delay]); | ||
6336 | + } | ||
6337 | + dig2 &= 0xff0f; | ||
6338 | + dig2 |= WM97XX_DELAY(delay); | ||
6339 | + | ||
6340 | + /* mask */ | ||
6341 | + dig3 |= ((mask & 0x3) << 4); | ||
6342 | + if(coord) | ||
6343 | + dig3 |= WM9713_WAIT; | ||
6344 | + | ||
6345 | + wm->misc = wm97xx_reg_read(wm, 0x5a); | ||
6346 | + | ||
6347 | + wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); | ||
6348 | + wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); | ||
6349 | + wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); | ||
6350 | + wm97xx_reg_write(wm, AC97_GPIO_STICKY, 0x0); | ||
6351 | +} | ||
6352 | + | ||
6353 | +static int wm9713_digitiser_ioctl(struct wm97xx* wm, int cmd) | ||
6354 | +{ | ||
6355 | + u16 val = 0; | ||
6356 | + | ||
6357 | + switch(cmd){ | ||
6358 | + case WM97XX_DIG_START: | ||
6359 | + val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); | ||
6360 | + wm97xx_reg_write(wm, AC97_EXTENDED_MID, val & 0x7fff); | ||
6361 | + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] | WM97XX_PRP_DET_DIG); | ||
6362 | + wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ | ||
6363 | + break; | ||
6364 | + case WM97XX_DIG_STOP: | ||
6365 | + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] & ~WM97XX_PRP_DET_DIG); | ||
6366 | + val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); | ||
6367 | + wm97xx_reg_write(wm, AC97_EXTENDED_MID, val | 0x8000); | ||
6368 | + break; | ||
6369 | + case WM97XX_AUX_PREPARE: | ||
6370 | + memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); | ||
6371 | + wm97xx_reg_write(wm, AC97_WM9713_DIG1, 0); | ||
6372 | + wm97xx_reg_write(wm, AC97_WM9713_DIG2, 0); | ||
6373 | + wm97xx_reg_write(wm, AC97_WM9713_DIG3, WM97XX_PRP_DET_DIG); | ||
6374 | + break; | ||
6375 | + case WM97XX_DIG_RESTORE: | ||
6376 | + wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig_save[0]); | ||
6377 | + wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig_save[1]); | ||
6378 | + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig_save[2]); | ||
6379 | + break; | ||
6380 | + case WM97XX_PHY_INIT: | ||
6381 | + init_wm9713_phy(wm); | ||
6382 | + break; | ||
6383 | + default: | ||
6384 | + return -EINVAL; | ||
6385 | + } | ||
6386 | + return 0; | ||
6387 | +} | ||
6388 | + | ||
6389 | +static inline int is_pden (struct wm97xx* wm) | ||
6390 | +{ | ||
6391 | + return wm->dig[2] & WM9713_PDEN; | ||
6392 | +} | ||
6393 | + | ||
6394 | +/* | ||
6395 | + * Read a sample from the WM9713 adc in polling mode. | ||
6396 | + */ | ||
6397 | +static int wm9713_poll_sample (struct wm97xx* wm, int adcsel, int *sample) | ||
6398 | +{ | ||
6399 | + u16 dig1; | ||
6400 | + int timeout = 5 * delay; | ||
6401 | + | ||
6402 | + if (!wm->pen_probably_down) { | ||
6403 | + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6404 | + if (!(data & WM97XX_PEN_DOWN)) | ||
6405 | + return RC_PENUP; | ||
6406 | + wm->pen_probably_down = 1; | ||
6407 | + } | ||
6408 | + | ||
6409 | + /* set up digitiser */ | ||
6410 | + if (adcsel & 0x8000) | ||
6411 | + adcsel = 1 << ((adcsel & 0x7fff) + 3); | ||
6412 | + | ||
6413 | + dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); | ||
6414 | + dig1 &= ~WM9713_ADCSEL_MASK; | ||
6415 | + | ||
6416 | + if (wm->mach_ops && wm->mach_ops->pre_sample) | ||
6417 | + wm->mach_ops->pre_sample(adcsel); | ||
6418 | + wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | adcsel |WM9713_POLL); | ||
6419 | + | ||
6420 | + /* wait 3 AC97 time slots + delay for conversion */ | ||
6421 | + poll_delay(delay); | ||
6422 | + | ||
6423 | + /* wait for POLL to go low */ | ||
6424 | + while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { | ||
6425 | + udelay(AC97_LINK_FRAME); | ||
6426 | + timeout--; | ||
6427 | + } | ||
6428 | + | ||
6429 | + if (timeout <= 0) { | ||
6430 | + /* If PDEN is set, we can get a timeout when pen goes up */ | ||
6431 | + if (is_pden(wm)) | ||
6432 | + wm->pen_probably_down = 0; | ||
6433 | + else | ||
6434 | + dbg ("adc sample timeout"); | ||
6435 | + return RC_PENUP; | ||
6436 | + } | ||
6437 | + | ||
6438 | + *sample =wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6439 | + if (wm->mach_ops && wm->mach_ops->post_sample) | ||
6440 | + wm->mach_ops->post_sample(adcsel); | ||
6441 | + | ||
6442 | + /* check we have correct sample */ | ||
6443 | + if ((*sample & WM97XX_ADCSRC_MASK) != ffs(adcsel >> 1) << 12) { | ||
6444 | + dbg ("adc wrong sample, read %x got %x", adcsel, | ||
6445 | + *sample & WM97XX_ADCSRC_MASK); | ||
6446 | + return RC_PENUP; | ||
6447 | + } | ||
6448 | + | ||
6449 | + if (!(*sample & WM97XX_PEN_DOWN)) { | ||
6450 | + wm->pen_probably_down = 0; | ||
6451 | + return RC_PENUP; | ||
6452 | + } | ||
6453 | + | ||
6454 | + return RC_VALID; | ||
6455 | +} | ||
6456 | + | ||
6457 | +/* | ||
6458 | + * Read a coordinate from the WM9713 adc in polling mode. | ||
6459 | + */ | ||
6460 | +static int wm9713_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) | ||
6461 | +{ | ||
6462 | + u16 dig1; | ||
6463 | + int timeout = 5 * delay; | ||
6464 | + | ||
6465 | + if (!wm->pen_probably_down) { | ||
6466 | + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6467 | + if (!(data & WM97XX_PEN_DOWN)) | ||
6468 | + return RC_PENUP; | ||
6469 | + wm->pen_probably_down = 1; | ||
6470 | + } | ||
6471 | + | ||
6472 | + /* set up digitiser */ | ||
6473 | + dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); | ||
6474 | + dig1 &= ~WM9713_ADCSEL_MASK; | ||
6475 | + if(pil) | ||
6476 | + dig1 |= WM97XX_ADCSEL_PRES; | ||
6477 | + | ||
6478 | + if (wm->mach_ops && wm->mach_ops->pre_sample) | ||
6479 | + wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); | ||
6480 | + wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | WM9713_POLL | WM9713_COO); | ||
6481 | + | ||
6482 | + /* wait 3 AC97 time slots + delay for conversion */ | ||
6483 | + poll_delay(delay); | ||
6484 | + data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6485 | + /* wait for POLL to go low */ | ||
6486 | + while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { | ||
6487 | + udelay(AC97_LINK_FRAME); | ||
6488 | + timeout--; | ||
6489 | + } | ||
6490 | + | ||
6491 | + if (timeout <= 0) { | ||
6492 | + /* If PDEN is set, we can get a timeout when pen goes up */ | ||
6493 | + if (is_pden(wm)) | ||
6494 | + wm->pen_probably_down = 0; | ||
6495 | + else | ||
6496 | + dbg ("adc sample timeout"); | ||
6497 | + return RC_PENUP; | ||
6498 | + } | ||
6499 | + | ||
6500 | + /* read back data */ | ||
6501 | + data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6502 | + if (pil) | ||
6503 | + data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); | ||
6504 | + else | ||
6505 | + data->p = DEFAULT_PRESSURE; | ||
6506 | + | ||
6507 | + if (wm->mach_ops && wm->mach_ops->post_sample) | ||
6508 | + wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); | ||
6509 | + | ||
6510 | + /* check we have correct sample */ | ||
6511 | + if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) | ||
6512 | + goto err; | ||
6513 | + if(pil && !(data->p & WM97XX_ADCSEL_PRES)) | ||
6514 | + goto err; | ||
6515 | + | ||
6516 | + if (!(data->x & WM97XX_PEN_DOWN)) { | ||
6517 | + wm->pen_probably_down = 0; | ||
6518 | + return RC_PENUP; | ||
6519 | + } | ||
6520 | + return RC_VALID; | ||
6521 | +err: | ||
6522 | + return RC_PENUP; | ||
6523 | +} | ||
6524 | + | ||
6525 | +/* | ||
6526 | + * Sample the WM9713 touchscreen in polling mode | ||
6527 | + */ | ||
6528 | +static int wm9713_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) | ||
6529 | +{ | ||
6530 | + int rc; | ||
6531 | + | ||
6532 | + if(coord) { | ||
6533 | + if((rc = wm9713_poll_coord(wm, data)) != RC_VALID) | ||
6534 | + return rc; | ||
6535 | + } else { | ||
6536 | + if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_X, &data->x)) != RC_VALID) | ||
6537 | + return rc; | ||
6538 | + if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_Y, &data->y)) != RC_VALID) | ||
6539 | + return rc; | ||
6540 | + if (pil) { | ||
6541 | + if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_PRES, &data->p)) != RC_VALID) | ||
6542 | + return rc; | ||
6543 | + } else | ||
6544 | + data->p = DEFAULT_PRESSURE; | ||
6545 | + } | ||
6546 | + return RC_VALID; | ||
6547 | +} | ||
6548 | + | ||
6549 | +/* | ||
6550 | + * Enable WM9713 continuous mode, i.e. touch data is streamed across an AC97 slot | ||
6551 | + */ | ||
6552 | +static int wm9713_acc_enable (struct wm97xx* wm, int enable) | ||
6553 | +{ | ||
6554 | + u16 dig1, dig2, dig3; | ||
6555 | + int ret = 0; | ||
6556 | + | ||
6557 | + dig1 = wm->dig[0]; | ||
6558 | + dig2 = wm->dig[1]; | ||
6559 | + dig3 = wm->dig[2]; | ||
6560 | + | ||
6561 | + if (enable) { | ||
6562 | + /* continous mode */ | ||
6563 | + if (wm->mach_ops->acc_startup && | ||
6564 | + (ret = wm->mach_ops->acc_startup(wm)) < 0) | ||
6565 | + return ret; | ||
6566 | + | ||
6567 | + dig1 &= ~WM9713_ADCSEL_MASK; | ||
6568 | + dig1 |= WM9713_CTC | WM9713_COO | WM9713_ADCSEL_X | WM9713_ADCSEL_Y; | ||
6569 | + if (pil) | ||
6570 | + dig1 |= WM9713_ADCSEL_PRES; | ||
6571 | + dig2 &= ~(WM97XX_DELAY_MASK | WM97XX_SLT_MASK | WM97XX_CM_RATE_MASK); | ||
6572 | + dig2 |= WM97XX_SLEN | WM97XX_DELAY (delay) | | ||
6573 | + WM97XX_SLT (wm->acc_slot) | WM97XX_RATE (wm->acc_rate); | ||
6574 | + dig3 |= WM9713_PDEN; | ||
6575 | + } else { | ||
6576 | + dig1 &= ~(WM9713_CTC | WM9713_COO); | ||
6577 | + dig2 &= ~WM97XX_SLEN; | ||
6578 | + dig3 &= ~WM9713_PDEN; | ||
6579 | + if (wm->mach_ops->acc_shutdown) | ||
6580 | + wm->mach_ops->acc_shutdown(wm); | ||
6581 | + } | ||
6582 | + | ||
6583 | + wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); | ||
6584 | + wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); | ||
6585 | + wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); | ||
6586 | + return ret; | ||
6587 | +} | ||
6588 | + | ||
6589 | +struct wm97xx_codec_drv wm97xx_codec = { | ||
6590 | + .id = WM9713_ID2, | ||
6591 | + .name = "wm9713", | ||
6592 | + .poll_sample = wm9713_poll_sample, | ||
6593 | + .poll_touch = wm9713_poll_touch, | ||
6594 | + .acc_enable = wm9713_acc_enable, | ||
6595 | + .digitiser_ioctl = wm9713_digitiser_ioctl, | ||
6596 | +}; | ||
6597 | + | ||
6598 | +EXPORT_SYMBOL_GPL(wm97xx_codec); | ||
6599 | + | ||
6600 | +/* Module information */ | ||
6601 | +MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); | ||
6602 | +MODULE_DESCRIPTION("WM9713 Touch Screen Driver"); | ||
6603 | +MODULE_LICENSE("GPL"); | ||
6604 | diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c | ||
6605 | new file mode 100644 | ||
6606 | index 0000000..87179d2 | ||
6607 | --- /dev/null | ||
6608 | +++ b/drivers/input/touchscreen/wm97xx-core.c | ||
6609 | @@ -0,0 +1,859 @@ | ||
6610 | +/* | ||
6611 | + * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 | ||
6612 | + * and WM9713 AC97 Codecs. | ||
6613 | + * | ||
6614 | + * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. | ||
6615 | + * Author: Liam Girdwood | ||
6616 | + * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com | ||
6617 | + * Parts Copyright : Ian Molton <spyro@f2s.com> | ||
6618 | + * Andrew Zabolotny <zap@homelink.ru> | ||
6619 | + * Russell King <rmk@arm.linux.org.uk> | ||
6620 | + * | ||
6621 | + * This program is free software; you can redistribute it and/or modify it | ||
6622 | + * under the terms of the GNU General Public License as published by the | ||
6623 | + * Free Software Foundation; either version 2 of the License, or (at your | ||
6624 | + * option) any later version. | ||
6625 | + * | ||
6626 | + * Notes: | ||
6627 | + * | ||
6628 | + * Features: | ||
6629 | + * - supports WM9705, WM9712, WM9713 | ||
6630 | + * - polling mode | ||
6631 | + * - continuous mode (arch-dependent) | ||
6632 | + * - adjustable rpu/dpp settings | ||
6633 | + * - adjustable pressure current | ||
6634 | + * - adjustable sample settle delay | ||
6635 | + * - 4 and 5 wire touchscreens (5 wire is WM9712 only) | ||
6636 | + * - pen down detection | ||
6637 | + * - battery monitor | ||
6638 | + * - sample AUX adc's | ||
6639 | + * - power management | ||
6640 | + * - codec GPIO | ||
6641 | + * - codec event notification | ||
6642 | + * Todo | ||
6643 | + * - Support for async sampling control for noisy LCD's. | ||
6644 | + * | ||
6645 | + * Revision history | ||
6646 | + * 7th May 2003 Initial version. | ||
6647 | + * 6th June 2003 Added non module support and AC97 registration. | ||
6648 | + * 18th June 2003 Added AUX adc sampling. | ||
6649 | + * 23rd June 2003 Did some minimal reformatting, fixed a couple of | ||
6650 | + * codec_mutexing bugs and noted a race to fix. | ||
6651 | + * 24th June 2003 Added power management and fixed race condition. | ||
6652 | + * 10th July 2003 Changed to a misc device. | ||
6653 | + * 31st July 2003 Moved TS_EVENT and TS_CAL to wm97xx.h | ||
6654 | + * 8th Aug 2003 Added option for read() calling wm97xx_sample_touch() | ||
6655 | + * because some ac97_read/ac_97_write call schedule() | ||
6656 | + * 7th Nov 2003 Added Input touch event interface, stanley.cai@intel.com | ||
6657 | + * 13th Nov 2003 Removed h3600 touch interface, added interrupt based | ||
6658 | + * pen down notification and implemented continous mode | ||
6659 | + * on XScale arch. | ||
6660 | + * 16th Nov 2003 Ian Molton <spyro@f2s.com> | ||
6661 | + * Modified so that it suits the new 2.6 driver model. | ||
6662 | + * 25th Jan 2004 Andrew Zabolotny <zap@homelink.ru> | ||
6663 | + * Implemented IRQ-driven pen down detection, implemented | ||
6664 | + * the private API meant to be exposed to platform-specific | ||
6665 | + * drivers, reorganized the driver so that it supports | ||
6666 | + * an arbitrary number of devices. | ||
6667 | + * 1st Feb 2004 Moved continuous mode handling to a separate | ||
6668 | + * architecture-dependent file. For now only PXA | ||
6669 | + * built-in AC97 controller is supported (pxa-ac97-wm97xx.c). | ||
6670 | + * 11th Feb 2004 Reduced CPU usage by keeping a cached copy of both | ||
6671 | + * digitizer registers instead of reading them every time. | ||
6672 | + * A reorganization of the whole code for better | ||
6673 | + * error handling. | ||
6674 | + * 17th Apr 2004 Added BMON support. | ||
6675 | + * 17th Nov 2004 Added codec GPIO, codec event handling (real and virtual | ||
6676 | + * GPIOs) and 2.6 power management. | ||
6677 | + * 29th Nov 2004 Added WM9713 support. | ||
6678 | + * 4th Jul 2005 Moved codec specific code out to seperate files. | ||
6679 | + * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> | ||
6680 | + * Added bus interface. | ||
6681 | + */ | ||
6682 | + | ||
6683 | +#include <linux/module.h> | ||
6684 | +#include <linux/moduleparam.h> | ||
6685 | +#include <linux/version.h> | ||
6686 | +#include <linux/kernel.h> | ||
6687 | +#include <linux/init.h> | ||
6688 | +#include <linux/delay.h> | ||
6689 | +#include <linux/string.h> | ||
6690 | +#include <linux/proc_fs.h> | ||
6691 | +#include <linux/pm.h> | ||
6692 | +#include <linux/interrupt.h> | ||
6693 | +#include <linux/bitops.h> | ||
6694 | +#include <linux/workqueue.h> | ||
6695 | +#include <linux/device.h> | ||
6696 | +#include <linux/freezer.h> | ||
6697 | +#include <linux/wm97xx.h> | ||
6698 | +#include <asm/uaccess.h> | ||
6699 | +#include <asm/io.h> | ||
6700 | + | ||
6701 | +#include <asm/arch/irqs.h> | ||
6702 | + | ||
6703 | +#define TS_NAME "wm97xx" | ||
6704 | +#define WM_CORE_VERSION "0.64" | ||
6705 | +#define DEFAULT_PRESSURE 0xb0c0 | ||
6706 | + | ||
6707 | + | ||
6708 | +/* | ||
6709 | + * Touchscreen absolute values | ||
6710 | + * | ||
6711 | + * These parameters are used to help the input layer discard out of | ||
6712 | + * range readings and reduce jitter etc. | ||
6713 | + * | ||
6714 | + * o min, max:- indicate the min and max values your touch screen returns | ||
6715 | + * o fuzz:- use a higher number to reduce jitter | ||
6716 | + * | ||
6717 | + * The default values correspond to Mainstone II in QVGA mode | ||
6718 | + * | ||
6719 | + * Please read | ||
6720 | + * Documentation/input/input-programming.txt for more details. | ||
6721 | + */ | ||
6722 | + | ||
6723 | +static int abs_x[3] = {350,3900,5}; | ||
6724 | +module_param_array(abs_x, int, NULL, 0); | ||
6725 | +MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); | ||
6726 | + | ||
6727 | +static int abs_y[3] = {320,3750,40}; | ||
6728 | +module_param_array(abs_y, int, NULL, 0); | ||
6729 | +MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); | ||
6730 | + | ||
6731 | +static int abs_p[3] = {0,150,4}; | ||
6732 | +module_param_array(abs_p, int, NULL, 0); | ||
6733 | +MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz"); | ||
6734 | + | ||
6735 | +/* | ||
6736 | + * Debug | ||
6737 | + */ | ||
6738 | +#if 0 | ||
6739 | +#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) | ||
6740 | +#else | ||
6741 | +#define dbg(format, arg...) | ||
6742 | +#endif | ||
6743 | +#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) | ||
6744 | +#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) | ||
6745 | +#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) | ||
6746 | + | ||
6747 | +/* | ||
6748 | + * wm97xx IO access, all IO locking done by AC97 layer | ||
6749 | + */ | ||
6750 | +int wm97xx_reg_read(struct wm97xx *wm, u16 reg) | ||
6751 | +{ | ||
6752 | + if (wm->ac97) | ||
6753 | + return wm->ac97->bus->ops->read(wm->ac97, reg); | ||
6754 | + else | ||
6755 | + return -1; | ||
6756 | +} | ||
6757 | +EXPORT_SYMBOL_GPL(wm97xx_reg_read); | ||
6758 | + | ||
6759 | +void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val) | ||
6760 | +{ | ||
6761 | + /* cache digitiser registers */ | ||
6762 | + if(reg >= AC97_WM9713_DIG1 && reg <= AC97_WM9713_DIG3) | ||
6763 | + wm->dig[(reg - AC97_WM9713_DIG1) >> 1] = val; | ||
6764 | + | ||
6765 | + /* cache gpio regs */ | ||
6766 | + if(reg >= AC97_GPIO_CFG && reg <= AC97_MISC_AFE) | ||
6767 | + wm->gpio[(reg - AC97_GPIO_CFG) >> 1] = val; | ||
6768 | + | ||
6769 | + /* wm9713 irq reg */ | ||
6770 | + if(reg == 0x5a) | ||
6771 | + wm->misc = val; | ||
6772 | + | ||
6773 | + if (wm->ac97) | ||
6774 | + wm->ac97->bus->ops->write(wm->ac97, reg, val); | ||
6775 | +} | ||
6776 | +EXPORT_SYMBOL_GPL(wm97xx_reg_write); | ||
6777 | + | ||
6778 | +/** | ||
6779 | + * wm97xx_read_aux_adc - Read the aux adc. | ||
6780 | + * @wm: wm97xx device. | ||
6781 | + * @adcsel: codec ADC to be read | ||
6782 | + * | ||
6783 | + * Reads the selected AUX ADC. | ||
6784 | + */ | ||
6785 | + | ||
6786 | +int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel) | ||
6787 | +{ | ||
6788 | + int power_adc = 0, auxval; | ||
6789 | + u16 power = 0; | ||
6790 | + | ||
6791 | + /* get codec */ | ||
6792 | + mutex_lock(&wm->codec_mutex); | ||
6793 | + | ||
6794 | + /* When the touchscreen is not in use, we may have to power up the AUX ADC | ||
6795 | + * before we can use sample the AUX inputs-> | ||
6796 | + */ | ||
6797 | + if (wm->id == WM9713_ID2 && | ||
6798 | + (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) { | ||
6799 | + power_adc = 1; | ||
6800 | + wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff); | ||
6801 | + } | ||
6802 | + | ||
6803 | + /* Prepare the codec for AUX reading */ | ||
6804 | + wm->codec->digitiser_ioctl(wm, WM97XX_AUX_PREPARE); | ||
6805 | + | ||
6806 | + /* Turn polling mode on to read AUX ADC */ | ||
6807 | + wm->pen_probably_down = 1; | ||
6808 | + wm->codec->poll_sample(wm, adcsel, &auxval); | ||
6809 | + | ||
6810 | + if (power_adc) | ||
6811 | + wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000); | ||
6812 | + | ||
6813 | + wm->codec->digitiser_ioctl(wm, WM97XX_DIG_RESTORE); | ||
6814 | + | ||
6815 | + wm->pen_probably_down = 0; | ||
6816 | + | ||
6817 | + mutex_unlock(&wm->codec_mutex); | ||
6818 | + return auxval & 0xfff; | ||
6819 | +} | ||
6820 | +EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc); | ||
6821 | + | ||
6822 | +/** | ||
6823 | + * wm97xx_get_gpio - Get the status of a codec GPIO. | ||
6824 | + * @wm: wm97xx device. | ||
6825 | + * @gpio: gpio | ||
6826 | + * | ||
6827 | + * Get the status of a codec GPIO pin | ||
6828 | + */ | ||
6829 | + | ||
6830 | +wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio) | ||
6831 | +{ | ||
6832 | + u16 status; | ||
6833 | + wm97xx_gpio_status_t ret; | ||
6834 | + | ||
6835 | + mutex_lock(&wm->codec_mutex); | ||
6836 | + status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
6837 | + | ||
6838 | + if (status & gpio) | ||
6839 | + ret = WM97XX_GPIO_HIGH; | ||
6840 | + else | ||
6841 | + ret = WM97XX_GPIO_LOW; | ||
6842 | + | ||
6843 | + mutex_unlock(&wm->codec_mutex); | ||
6844 | + return ret; | ||
6845 | +} | ||
6846 | +EXPORT_SYMBOL_GPL(wm97xx_get_gpio); | ||
6847 | + | ||
6848 | +/** | ||
6849 | + * wm97xx_set_gpio - Set the status of a codec GPIO. | ||
6850 | + * @wm: wm97xx device. | ||
6851 | + * @gpio: gpio | ||
6852 | + * | ||
6853 | + * | ||
6854 | + * Set the status of a codec GPIO pin | ||
6855 | + */ | ||
6856 | + | ||
6857 | +void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, | ||
6858 | + wm97xx_gpio_status_t status) | ||
6859 | +{ | ||
6860 | + u16 reg; | ||
6861 | + | ||
6862 | + mutex_lock(&wm->codec_mutex); | ||
6863 | + reg = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
6864 | + | ||
6865 | + if (status & WM97XX_GPIO_HIGH) | ||
6866 | + reg |= gpio; | ||
6867 | + else | ||
6868 | + reg &= ~gpio; | ||
6869 | + | ||
6870 | + if (wm->id == WM9712_ID2) | ||
6871 | + wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg << 1); | ||
6872 | + else | ||
6873 | + wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg); | ||
6874 | + mutex_unlock(&wm->codec_mutex); | ||
6875 | +} | ||
6876 | +EXPORT_SYMBOL_GPL(wm97xx_set_gpio); | ||
6877 | + | ||
6878 | +/* | ||
6879 | + * Codec GPIO pin configuration, this set's pin direction, polarity, | ||
6880 | + * stickyness and wake up. | ||
6881 | + */ | ||
6882 | +void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, wm97xx_gpio_dir_t dir, | ||
6883 | + wm97xx_gpio_pol_t pol, wm97xx_gpio_sticky_t sticky, | ||
6884 | + wm97xx_gpio_wake_t wake) | ||
6885 | +{ | ||
6886 | + u16 reg; | ||
6887 | + | ||
6888 | + mutex_lock(&wm->codec_mutex); | ||
6889 | + reg = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); | ||
6890 | + | ||
6891 | + if (pol == WM97XX_GPIO_POL_HIGH) | ||
6892 | + reg |= gpio; | ||
6893 | + else | ||
6894 | + reg &= ~gpio; | ||
6895 | + | ||
6896 | + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, reg); | ||
6897 | + reg = wm97xx_reg_read(wm, AC97_GPIO_STICKY); | ||
6898 | + | ||
6899 | + if (sticky == WM97XX_GPIO_STICKY) | ||
6900 | + reg |= gpio; | ||
6901 | + else | ||
6902 | + reg &= ~gpio; | ||
6903 | + | ||
6904 | + wm97xx_reg_write(wm, AC97_GPIO_STICKY, reg); | ||
6905 | + reg = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); | ||
6906 | + | ||
6907 | + if (wake == WM97XX_GPIO_WAKE) | ||
6908 | + reg |= gpio; | ||
6909 | + else | ||
6910 | + reg &= ~gpio; | ||
6911 | + | ||
6912 | + wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, reg); | ||
6913 | + reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); | ||
6914 | + | ||
6915 | + if (dir == WM97XX_GPIO_IN) | ||
6916 | + reg |= gpio; | ||
6917 | + else | ||
6918 | + reg &= ~gpio; | ||
6919 | + | ||
6920 | + wm97xx_reg_write(wm, AC97_GPIO_CFG, reg); | ||
6921 | + mutex_unlock(&wm->codec_mutex); | ||
6922 | +} | ||
6923 | +EXPORT_SYMBOL_GPL(wm97xx_config_gpio); | ||
6924 | + | ||
6925 | +/* | ||
6926 | + * Handle a pen down interrupt. | ||
6927 | + */ | ||
6928 | +static void wm97xx_pen_irq_worker(struct work_struct *w) | ||
6929 | +{ | ||
6930 | +/* struct wm97xx *wm = (struct wm97xx *) ptr; */ | ||
6931 | + struct wm97xx *wm = container_of(w, struct wm97xx, pen_event_work); | ||
6932 | + | ||
6933 | + /* do we need to enable the touch panel reader */ | ||
6934 | + if (wm->id == WM9705_ID2) { | ||
6935 | + if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & WM97XX_PEN_DOWN) | ||
6936 | + wm->pen_is_down = 1; | ||
6937 | + else | ||
6938 | + wm->pen_is_down = 0; | ||
6939 | + wake_up_interruptible(&wm->pen_irq_wait); | ||
6940 | + } else { | ||
6941 | + u16 status, pol; | ||
6942 | + mutex_lock(&wm->codec_mutex); | ||
6943 | + status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
6944 | + pol = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); | ||
6945 | + | ||
6946 | + if (WM97XX_GPIO_13 & pol & status) { | ||
6947 | + wm->pen_is_down = 1; | ||
6948 | + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol & ~WM97XX_GPIO_13); | ||
6949 | + } else { | ||
6950 | + wm->pen_is_down = 0; | ||
6951 | + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol | WM97XX_GPIO_13); | ||
6952 | + } | ||
6953 | + | ||
6954 | + if (wm->id == WM9712_ID2) | ||
6955 | + wm97xx_reg_write(wm, AC97_GPIO_STATUS, (status & ~WM97XX_GPIO_13) << 1); | ||
6956 | + else | ||
6957 | + wm97xx_reg_write(wm, AC97_GPIO_STATUS, status & ~WM97XX_GPIO_13); | ||
6958 | + mutex_unlock(&wm->codec_mutex); | ||
6959 | + wake_up_interruptible(&wm->pen_irq_wait); | ||
6960 | + } | ||
6961 | + | ||
6962 | + if (!wm->pen_is_down && wm->mach_ops && wm->mach_ops->acc_enabled) | ||
6963 | + wm->mach_ops->acc_pen_up(wm); | ||
6964 | + enable_irq(wm->pen_irq); | ||
6965 | +} | ||
6966 | + | ||
6967 | +/* | ||
6968 | + * Codec PENDOWN irq handler | ||
6969 | + * | ||
6970 | + * We have to disable the codec interrupt in the handler because it can | ||
6971 | + * take upto 1ms to clear the interrupt source. The interrupt is then enabled | ||
6972 | + * again in the slow handler when the source has been cleared. | ||
6973 | + */ | ||
6974 | +static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id) | ||
6975 | +{ | ||
6976 | + struct wm97xx *wm = (struct wm97xx *) dev_id; | ||
6977 | + disable_irq(wm->pen_irq); | ||
6978 | + queue_work(wm->pen_irq_workq, &wm->pen_event_work); | ||
6979 | + return IRQ_HANDLED; | ||
6980 | +} | ||
6981 | + | ||
6982 | +/* | ||
6983 | + * initialise pen IRQ handler and workqueue | ||
6984 | + */ | ||
6985 | +static int wm97xx_init_pen_irq(struct wm97xx *wm) | ||
6986 | +{ | ||
6987 | + u16 reg; | ||
6988 | + | ||
6989 | + INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker/* , wm */); | ||
6990 | + if ((wm->pen_irq_workq = | ||
6991 | + create_singlethread_workqueue("kwm97pen")) == NULL) { | ||
6992 | + err("could not create pen irq work queue"); | ||
6993 | + wm->pen_irq = 0; | ||
6994 | + return -EINVAL; | ||
6995 | + } | ||
6996 | + | ||
6997 | + | ||
6998 | + wm->pen_irq = IRQ_GPIO(90); | ||
6999 | + if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, SA_SHIRQ, "wm97xx-pen", wm)) { | ||
7000 | + err("could not register codec pen down interrupt, will poll for pen down"); | ||
7001 | + destroy_workqueue(wm->pen_irq_workq); | ||
7002 | + wm->pen_irq = 0; | ||
7003 | + return -EINVAL; | ||
7004 | + } | ||
7005 | + | ||
7006 | + /* enable PEN down on wm9712/13 */ | ||
7007 | + if (wm->id != WM9705_ID2) { | ||
7008 | + reg = wm97xx_reg_read(wm, AC97_MISC_AFE); | ||
7009 | + wm97xx_reg_write(wm, AC97_MISC_AFE, reg & 0xfffb); | ||
7010 | + reg = wm97xx_reg_read(wm, 0x5a); | ||
7011 | + wm97xx_reg_write(wm, 0x5a, reg & ~0x0001); | ||
7012 | + } | ||
7013 | + | ||
7014 | + return 0; | ||
7015 | +} | ||
7016 | + | ||
7017 | +/* Private struct for communication between struct wm97xx_tshread | ||
7018 | + * and wm97xx_read_samples */ | ||
7019 | +struct ts_state { | ||
7020 | + int sleep_time; | ||
7021 | + int min_sleep_time; | ||
7022 | +}; | ||
7023 | + | ||
7024 | +static int wm97xx_read_samples(struct wm97xx *wm, struct ts_state *state) | ||
7025 | +{ | ||
7026 | + struct wm97xx_data data; | ||
7027 | + int rc; | ||
7028 | + | ||
7029 | + mutex_lock(&wm->codec_mutex); | ||
7030 | + | ||
7031 | + if (wm->mach_ops && wm->mach_ops->acc_enabled) | ||
7032 | + rc = wm->mach_ops->acc_pen_down(wm); | ||
7033 | + else | ||
7034 | + rc = wm->codec->poll_touch(wm, &data); | ||
7035 | + | ||
7036 | + if (rc & RC_PENUP) { | ||
7037 | + if (wm->pen_is_down) { | ||
7038 | + wm->pen_is_down = 0; | ||
7039 | + dbg("pen up"); | ||
7040 | + input_report_abs(wm->input_dev, ABS_PRESSURE, 0); | ||
7041 | + input_sync(wm->input_dev); | ||
7042 | + } else if (!(rc & RC_AGAIN)) { | ||
7043 | + /* We need high frequency updates only while pen is down, | ||
7044 | + * the user never will be able to touch screen faster than | ||
7045 | + * a few times per second... On the other hand, when the | ||
7046 | + * user is actively working with the touchscreen we don't | ||
7047 | + * want to lose the quick response. So we will slowly | ||
7048 | + * increase sleep time after the pen is up and quicky | ||
7049 | + * restore it to ~one task switch when pen is down again. | ||
7050 | + */ | ||
7051 | + if (state->sleep_time < HZ / 10) | ||
7052 | + state->sleep_time++; | ||
7053 | + } | ||
7054 | + | ||
7055 | + } else if (rc & RC_VALID) { | ||
7056 | + dbg("pen down: x=%x:%d, y=%x:%d, pressure=%x:%d\n", | ||
7057 | + data.x >> 12, data.x & 0xfff, data.y >> 12, | ||
7058 | + data.y & 0xfff, data.p >> 12, data.p & 0xfff); | ||
7059 | + input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff); | ||
7060 | + input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff); | ||
7061 | + input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff); | ||
7062 | + input_sync(wm->input_dev); | ||
7063 | + wm->pen_is_down = 1; | ||
7064 | + state->sleep_time = state->min_sleep_time; | ||
7065 | + } else if (rc & RC_PENDOWN) { | ||
7066 | + dbg("pen down"); | ||
7067 | + wm->pen_is_down = 1; | ||
7068 | + state->sleep_time = state->min_sleep_time; | ||
7069 | + } | ||
7070 | + | ||
7071 | + mutex_unlock(&wm->codec_mutex); | ||
7072 | + return rc; | ||
7073 | +} | ||
7074 | + | ||
7075 | +/* | ||
7076 | +* The touchscreen sample reader thread. | ||
7077 | +*/ | ||
7078 | +static int wm97xx_ts_read(void *data) | ||
7079 | +{ | ||
7080 | + int rc; | ||
7081 | + struct ts_state state; | ||
7082 | + struct wm97xx *wm = (struct wm97xx *) data; | ||
7083 | + | ||
7084 | + /* set up thread context */ | ||
7085 | + wm->ts_task = current; | ||
7086 | + daemonize("kwm97xxts"); | ||
7087 | + | ||
7088 | + if (wm->codec == NULL) { | ||
7089 | + wm->ts_task = NULL; | ||
7090 | + printk(KERN_ERR "codec is NULL, bailing\n"); | ||
7091 | + } | ||
7092 | + | ||
7093 | + complete(&wm->ts_init); | ||
7094 | + wm->pen_is_down = 0; | ||
7095 | + state.min_sleep_time = HZ >= 100 ? HZ / 100 : 1; | ||
7096 | + if (state.min_sleep_time < 1) | ||
7097 | + state.min_sleep_time = 1; | ||
7098 | + state.sleep_time = state.min_sleep_time; | ||
7099 | + | ||
7100 | + /* touch reader loop */ | ||
7101 | + while (wm->ts_task) { | ||
7102 | + do { | ||
7103 | + try_to_freeze(); | ||
7104 | + rc = wm97xx_read_samples(wm, &state); | ||
7105 | + } while (rc & RC_AGAIN); | ||
7106 | + if (!wm->pen_is_down && wm->pen_irq) { | ||
7107 | + /* Nice, we don't have to poll for pen down event */ | ||
7108 | + wait_event_interruptible(wm->pen_irq_wait, wm->pen_is_down); | ||
7109 | + } else { | ||
7110 | + set_task_state(current, TASK_INTERRUPTIBLE); | ||
7111 | + schedule_timeout(state.sleep_time); | ||
7112 | + } | ||
7113 | + } | ||
7114 | + complete_and_exit(&wm->ts_exit, 0); | ||
7115 | +} | ||
7116 | + | ||
7117 | +/** | ||
7118 | + * wm97xx_ts_input_open - Open the touch screen input device. | ||
7119 | + * @idev: Input device to be opened. | ||
7120 | + * | ||
7121 | + * Called by the input sub system to open a wm97xx touchscreen device. | ||
7122 | + * Starts the touchscreen thread and touch digitiser. | ||
7123 | + */ | ||
7124 | +static int wm97xx_ts_input_open(struct input_dev *idev) | ||
7125 | +{ | ||
7126 | + int ret = 0; | ||
7127 | + struct wm97xx *wm = (struct wm97xx *) idev->private; | ||
7128 | + | ||
7129 | + mutex_lock(&wm->codec_mutex); | ||
7130 | + /* first time opened ? */ | ||
7131 | + if (wm->ts_use_count++ == 0) { | ||
7132 | + /* start touchscreen thread */ | ||
7133 | + init_completion(&wm->ts_init); | ||
7134 | + init_completion(&wm->ts_exit); | ||
7135 | + ret = kernel_thread(wm97xx_ts_read, wm, CLONE_KERNEL); | ||
7136 | + | ||
7137 | + if (ret >= 0) { | ||
7138 | + wait_for_completion(&wm->ts_init); | ||
7139 | + if (wm->ts_task == NULL) | ||
7140 | + ret = -EINVAL; | ||
7141 | + } else { | ||
7142 | + mutex_unlock(&wm->codec_mutex); | ||
7143 | + return ret; | ||
7144 | + } | ||
7145 | + | ||
7146 | + /* start digitiser */ | ||
7147 | + if (wm->mach_ops && wm->mach_ops->acc_enabled) | ||
7148 | + wm->codec->acc_enable(wm, 1); | ||
7149 | + wm->codec->digitiser_ioctl(wm, WM97XX_DIG_START); | ||
7150 | + | ||
7151 | + /* init pen down/up irq handling */ | ||
7152 | + if (wm->pen_irq) { | ||
7153 | + wm97xx_init_pen_irq(wm); | ||
7154 | + | ||
7155 | + if (wm->pen_irq == 0) { | ||
7156 | + /* we failed to get an irq for pen down events, | ||
7157 | + * so we resort to polling. kickstart the reader */ | ||
7158 | + wm->pen_is_down = 1; | ||
7159 | + wake_up_interruptible(&wm->pen_irq_wait); | ||
7160 | + } | ||
7161 | + } | ||
7162 | + } | ||
7163 | + | ||
7164 | + mutex_unlock(&wm->codec_mutex); | ||
7165 | + return 0; | ||
7166 | +} | ||
7167 | + | ||
7168 | +/** | ||
7169 | + * wm97xx_ts_input_close - Close the touch screen input device. | ||
7170 | + * @idev: Input device to be closed. | ||
7171 | + * | ||
7172 | + * Called by the input sub system to close a wm97xx touchscreen device. | ||
7173 | + * Kills the touchscreen thread and stops the touch digitiser. | ||
7174 | + */ | ||
7175 | + | ||
7176 | +static void wm97xx_ts_input_close(struct input_dev *idev) | ||
7177 | +{ | ||
7178 | + struct wm97xx *wm = (struct wm97xx *) idev->private; | ||
7179 | + | ||
7180 | + mutex_lock(&wm->codec_mutex); | ||
7181 | + if (--wm->ts_use_count == 0) { | ||
7182 | + /* destroy workqueues and free irqs */ | ||
7183 | + if (wm->pen_irq) { | ||
7184 | + free_irq(wm->pen_irq, wm); | ||
7185 | + destroy_workqueue(wm->pen_irq_workq); | ||
7186 | + } | ||
7187 | + | ||
7188 | + /* kill thread */ | ||
7189 | + if (wm->ts_task) { | ||
7190 | + wm->ts_task = NULL; | ||
7191 | + wm->pen_is_down = 1; | ||
7192 | + mutex_unlock(&wm->codec_mutex); | ||
7193 | + wake_up_interruptible(&wm->pen_irq_wait); | ||
7194 | + wait_for_completion(&wm->ts_exit); | ||
7195 | + wm->pen_is_down = 0; | ||
7196 | + mutex_lock(&wm->codec_mutex); | ||
7197 | + } | ||
7198 | + | ||
7199 | + /* stop digitiser */ | ||
7200 | + wm->codec->digitiser_ioctl(wm, WM97XX_DIG_STOP); | ||
7201 | + if (wm->mach_ops && wm->mach_ops->acc_enabled) | ||
7202 | + wm->codec->acc_enable(wm, 0); | ||
7203 | + } | ||
7204 | + mutex_unlock(&wm->codec_mutex); | ||
7205 | +} | ||
7206 | + | ||
7207 | +/* | ||
7208 | + * Bus interface to allow for client drivers codec access | ||
7209 | + * e.g. battery monitor | ||
7210 | + */ | ||
7211 | +static int wm97xx_bus_match(struct device *dev, struct device_driver *drv) | ||
7212 | +{ | ||
7213 | + return !(strcmp(dev->bus_id,drv->name)); | ||
7214 | +} | ||
7215 | + | ||
7216 | +/* | ||
7217 | + * The AC97 audio driver will do all the Codec suspend and resume | ||
7218 | + * tasks. This is just for anything machine specific or extra. | ||
7219 | + */ | ||
7220 | +static int wm97xx_bus_suspend(struct device *dev, pm_message_t state) | ||
7221 | +{ | ||
7222 | + int ret = 0; | ||
7223 | + | ||
7224 | + if (dev->driver && dev->driver->suspend) | ||
7225 | + ret = dev->driver->suspend(dev, state); | ||
7226 | + | ||
7227 | + return ret; | ||
7228 | +} | ||
7229 | + | ||
7230 | +static int wm97xx_bus_resume(struct device *dev) | ||
7231 | +{ | ||
7232 | + int ret = 0; | ||
7233 | + | ||
7234 | + if (dev->driver && dev->driver->resume) | ||
7235 | + ret = dev->driver->resume(dev); | ||
7236 | + | ||
7237 | + return ret; | ||
7238 | +} | ||
7239 | + | ||
7240 | +struct bus_type wm97xx_bus_type = { | ||
7241 | + .name = "wm97xx", | ||
7242 | + .match = wm97xx_bus_match, | ||
7243 | + .suspend = wm97xx_bus_suspend, | ||
7244 | + .resume = wm97xx_bus_resume, | ||
7245 | +}; | ||
7246 | +EXPORT_SYMBOL_GPL(wm97xx_bus_type); | ||
7247 | + | ||
7248 | +static void wm97xx_release(struct device *dev) | ||
7249 | +{ | ||
7250 | + kfree(dev); | ||
7251 | +} | ||
7252 | + | ||
7253 | +static int wm97xx_probe(struct device *dev) | ||
7254 | +{ | ||
7255 | + struct wm97xx* wm; | ||
7256 | + int ret = 0, id = 0; | ||
7257 | + | ||
7258 | + if (!(wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL))) | ||
7259 | + return -ENOMEM; | ||
7260 | + mutex_init(&wm->codec_mutex); | ||
7261 | + | ||
7262 | + init_waitqueue_head(&wm->pen_irq_wait); | ||
7263 | + wm->dev = dev; | ||
7264 | + dev->driver_data = wm; | ||
7265 | + wm->ac97 = to_ac97_t(dev); | ||
7266 | + | ||
7267 | + /* check that we have a supported codec */ | ||
7268 | + if ((id = wm97xx_reg_read(wm, AC97_VENDOR_ID1)) != WM97XX_ID1) { | ||
7269 | + err("could not find a wm97xx, found a %x instead\n", id); | ||
7270 | + kfree(wm); | ||
7271 | + return -ENODEV; | ||
7272 | + } | ||
7273 | + | ||
7274 | + wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2); | ||
7275 | + if(wm->id != wm97xx_codec.id) { | ||
7276 | + err("could not find a the selected codec, please build for wm97%2x", wm->id & 0xff); | ||
7277 | + kfree(wm); | ||
7278 | + return -ENODEV; | ||
7279 | + } | ||
7280 | + | ||
7281 | + if((wm->input_dev = input_allocate_device()) == NULL) { | ||
7282 | + kfree(wm); | ||
7283 | + return -ENOMEM; | ||
7284 | + } | ||
7285 | + | ||
7286 | + /* set up touch configuration */ | ||
7287 | + info("detected a wm97%2x codec", wm->id & 0xff); | ||
7288 | + wm->input_dev->name = "wm97xx touchscreen"; | ||
7289 | + wm->input_dev->open = wm97xx_ts_input_open; | ||
7290 | + wm->input_dev->close = wm97xx_ts_input_close; | ||
7291 | + set_bit(EV_ABS, wm->input_dev->evbit); | ||
7292 | + set_bit(ABS_X, wm->input_dev->absbit); | ||
7293 | + set_bit(ABS_Y, wm->input_dev->absbit); | ||
7294 | + set_bit(ABS_PRESSURE, wm->input_dev->absbit); | ||
7295 | + wm->input_dev->absmax[ABS_X] = abs_x[1]; | ||
7296 | + wm->input_dev->absmax[ABS_Y] = abs_y[1]; | ||
7297 | + wm->input_dev->absmax[ABS_PRESSURE] = abs_p[1]; | ||
7298 | + wm->input_dev->absmin[ABS_X] = abs_x[0]; | ||
7299 | + wm->input_dev->absmin[ABS_Y] = abs_y[0]; | ||
7300 | + wm->input_dev->absmin[ABS_PRESSURE] = abs_p[0]; | ||
7301 | + wm->input_dev->absfuzz[ABS_X] = abs_x[2]; | ||
7302 | + wm->input_dev->absfuzz[ABS_Y] = abs_y[2]; | ||
7303 | + wm->input_dev->absfuzz[ABS_PRESSURE] = abs_p[2]; | ||
7304 | + wm->input_dev->private = wm; | ||
7305 | + wm->codec = &wm97xx_codec; | ||
7306 | + if((ret = input_register_device(wm->input_dev)) < 0) { | ||
7307 | + kfree(wm); | ||
7308 | + return -ENOMEM; | ||
7309 | + } | ||
7310 | + | ||
7311 | + /* set up physical characteristics */ | ||
7312 | + wm->codec->digitiser_ioctl(wm, WM97XX_PHY_INIT); | ||
7313 | + | ||
7314 | + /* load gpio cache */ | ||
7315 | + wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); | ||
7316 | + wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); | ||
7317 | + wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); | ||
7318 | + wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); | ||
7319 | + wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
7320 | + wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); | ||
7321 | + | ||
7322 | + /* register our battery device */ | ||
7323 | + if (!(wm->battery_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { | ||
7324 | + ret = -ENOMEM; | ||
7325 | + goto batt_err; | ||
7326 | + } | ||
7327 | + wm->battery_dev->bus = &wm97xx_bus_type; | ||
7328 | + strcpy(wm->battery_dev->bus_id,"wm97xx-battery"); | ||
7329 | + wm->battery_dev->driver_data = wm; | ||
7330 | + wm->battery_dev->parent = dev; | ||
7331 | + wm->battery_dev->release = wm97xx_release; | ||
7332 | + if((ret = device_register(wm->battery_dev)) < 0) | ||
7333 | + goto batt_reg_err; | ||
7334 | + | ||
7335 | + /* register our extended touch device (for machine specific extensions) */ | ||
7336 | + if (!(wm->touch_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { | ||
7337 | + ret = -ENOMEM; | ||
7338 | + goto touch_err; | ||
7339 | + } | ||
7340 | + wm->touch_dev->bus = &wm97xx_bus_type; | ||
7341 | + strcpy(wm->touch_dev->bus_id,"wm97xx-touchscreen"); | ||
7342 | + wm->touch_dev->driver_data = wm; | ||
7343 | + wm->touch_dev->parent = dev; | ||
7344 | + wm->touch_dev->release = wm97xx_release; | ||
7345 | + if((ret = device_register(wm->touch_dev)) < 0) | ||
7346 | + goto touch_reg_err; | ||
7347 | + | ||
7348 | + return ret; | ||
7349 | + | ||
7350 | +touch_reg_err: | ||
7351 | + kfree(wm->touch_dev); | ||
7352 | +touch_err: | ||
7353 | + device_unregister(wm->battery_dev); | ||
7354 | +batt_reg_err: | ||
7355 | + kfree(wm->battery_dev); | ||
7356 | +batt_err: | ||
7357 | + input_unregister_device(wm->input_dev); | ||
7358 | + kfree(wm); | ||
7359 | + return ret; | ||
7360 | +} | ||
7361 | + | ||
7362 | +static int wm97xx_remove(struct device *dev) | ||
7363 | +{ | ||
7364 | + struct wm97xx *wm = dev_get_drvdata(dev); | ||
7365 | + | ||
7366 | + /* Stop touch reader thread */ | ||
7367 | + if (wm->ts_task) { | ||
7368 | + wm->ts_task = NULL; | ||
7369 | + wm->pen_is_down = 1; | ||
7370 | + wake_up_interruptible(&wm->pen_irq_wait); | ||
7371 | + wait_for_completion(&wm->ts_exit); | ||
7372 | + } | ||
7373 | + device_unregister(wm->battery_dev); | ||
7374 | + device_unregister(wm->touch_dev); | ||
7375 | + input_unregister_device(wm->input_dev); | ||
7376 | + | ||
7377 | + kfree(wm); | ||
7378 | + return 0; | ||
7379 | +} | ||
7380 | + | ||
7381 | +#ifdef CONFIG_PM | ||
7382 | +int wm97xx_resume(struct device* dev) | ||
7383 | +{ | ||
7384 | + struct wm97xx *wm = dev_get_drvdata(dev); | ||
7385 | + | ||
7386 | + /* restore digitiser and gpio's */ | ||
7387 | + if(wm->id == WM9713_ID2) { | ||
7388 | + wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]); | ||
7389 | + wm97xx_reg_write(wm, 0x5a, wm->misc); | ||
7390 | + if(wm->ts_use_count) { | ||
7391 | + u16 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff; | ||
7392 | + wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); | ||
7393 | + } | ||
7394 | + } | ||
7395 | + | ||
7396 | + wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]); | ||
7397 | + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2]); | ||
7398 | + | ||
7399 | + wm97xx_reg_write(wm, AC97_GPIO_CFG, wm->gpio[0]); | ||
7400 | + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, wm->gpio[1]); | ||
7401 | + wm97xx_reg_write(wm, AC97_GPIO_STICKY, wm->gpio[2]); | ||
7402 | + wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, wm->gpio[3]); | ||
7403 | + wm97xx_reg_write(wm, AC97_GPIO_STATUS, wm->gpio[4]); | ||
7404 | + wm97xx_reg_write(wm, AC97_MISC_AFE, wm->gpio[5]); | ||
7405 | + | ||
7406 | + return 0; | ||
7407 | +} | ||
7408 | + | ||
7409 | +#else | ||
7410 | +#define wm97xx_resume NULL | ||
7411 | +#endif | ||
7412 | + | ||
7413 | +/* | ||
7414 | + * Machine specific operations | ||
7415 | + */ | ||
7416 | +int wm97xx_register_mach_ops(struct wm97xx *wm, struct wm97xx_mach_ops *mach_ops) | ||
7417 | +{ | ||
7418 | + mutex_lock(&wm->codec_mutex); | ||
7419 | + if(wm->mach_ops) { | ||
7420 | + mutex_unlock(&wm->codec_mutex); | ||
7421 | + return -EINVAL; | ||
7422 | + } | ||
7423 | + wm->mach_ops = mach_ops; | ||
7424 | + mutex_unlock(&wm->codec_mutex); | ||
7425 | + return 0; | ||
7426 | +} | ||
7427 | +EXPORT_SYMBOL_GPL(wm97xx_register_mach_ops); | ||
7428 | + | ||
7429 | +void wm97xx_unregister_mach_ops(struct wm97xx *wm) | ||
7430 | +{ | ||
7431 | + mutex_lock(&wm->codec_mutex); | ||
7432 | + wm->mach_ops = NULL; | ||
7433 | + mutex_unlock(&wm->codec_mutex); | ||
7434 | +} | ||
7435 | +EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops); | ||
7436 | + | ||
7437 | +static struct device_driver wm97xx_driver = { | ||
7438 | + .name = "ac97", | ||
7439 | + .bus = &ac97_bus_type, | ||
7440 | + .owner = THIS_MODULE, | ||
7441 | + .probe = wm97xx_probe, | ||
7442 | + .remove = wm97xx_remove, | ||
7443 | + .resume = wm97xx_resume, | ||
7444 | +}; | ||
7445 | + | ||
7446 | +static int __init wm97xx_init(void) | ||
7447 | +{ | ||
7448 | + int ret; | ||
7449 | + | ||
7450 | + info("version %s liam.girdwood@wolfsonmicro.com", WM_CORE_VERSION); | ||
7451 | + if((ret = bus_register(&wm97xx_bus_type)) < 0) | ||
7452 | + return ret; | ||
7453 | + return driver_register(&wm97xx_driver); | ||
7454 | +} | ||
7455 | + | ||
7456 | +static void __exit wm97xx_exit(void) | ||
7457 | +{ | ||
7458 | + driver_unregister(&wm97xx_driver); | ||
7459 | + bus_unregister(&wm97xx_bus_type); | ||
7460 | +} | ||
7461 | + | ||
7462 | +module_init(wm97xx_init); | ||
7463 | +module_exit(wm97xx_exit); | ||
7464 | + | ||
7465 | +/* Module information */ | ||
7466 | +MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); | ||
7467 | +MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver"); | ||
7468 | +MODULE_LICENSE("GPL"); | ||
7469 | diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig | ||
7470 | index 4468cb3..01b4828 100644 | ||
7471 | --- a/drivers/leds/Kconfig | ||
7472 | +++ b/drivers/leds/Kconfig | ||
7473 | @@ -101,6 +101,12 @@ config LEDS_GPIO | ||
7474 | outputs. To be useful the particular board must have LEDs | ||
7475 | and they must be connected to the GPIO lines. | ||
7476 | |||
7477 | +config LEDS_EM_X270 | ||
7478 | + tristate "LED Support for the CompuLab EM-X270" | ||
7479 | + depends on LEDS_CLASS && MACH_EM_X270 | ||
7480 | + help | ||
7481 | + This option enables support for the LEDs on CompuLab EM-X270. | ||
7482 | + | ||
7483 | comment "LED Triggers" | ||
7484 | |||
7485 | config LEDS_TRIGGERS | ||
7486 | diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile | ||
7487 | index f8995c9..6d3941e 100644 | ||
7488 | --- a/drivers/leds/Makefile | ||
7489 | +++ b/drivers/leds/Makefile | ||
7490 | @@ -17,6 +17,7 @@ obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o | ||
7491 | obj-$(CONFIG_LEDS_H1940) += leds-h1940.o | ||
7492 | obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o | ||
7493 | obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o | ||
7494 | +obj-$(CONFIG_LEDS_EM_X270) += leds-em-x270.o | ||
7495 | |||
7496 | # LED Triggers | ||
7497 | obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o | ||
7498 | diff --git a/drivers/leds/leds-em-x270.c b/drivers/leds/leds-em-x270.c | ||
7499 | new file mode 100644 | ||
7500 | index 0000000..485e7da | ||
7501 | --- /dev/null | ||
7502 | +++ b/drivers/leds/leds-em-x270.c | ||
7503 | @@ -0,0 +1,99 @@ | ||
7504 | +/* | ||
7505 | + * LED Triggers Core | ||
7506 | + * | ||
7507 | + * Copyright 2007 CompuLab, Ltd. | ||
7508 | + * Author: Mike Rapoport <mike@compulab.co.il> | ||
7509 | + * | ||
7510 | + * Based on Corgi leds driver: | ||
7511 | + * Copyright 2005-2006 Openedhand Ltd. | ||
7512 | + * Author: Richard Purdie <rpurdie@openedhand.com> | ||
7513 | + * | ||
7514 | + * This program is free software; you can redistribute it and/or modify | ||
7515 | + * it under the terms of the GNU General Public License version 2 as | ||
7516 | + * published by the Free Software Foundation. | ||
7517 | + * | ||
7518 | + */ | ||
7519 | + | ||
7520 | +#include <linux/kernel.h> | ||
7521 | +#include <linux/init.h> | ||
7522 | +#include <linux/platform_device.h> | ||
7523 | +#include <linux/leds.h> | ||
7524 | +#include <linux/da9030.h> | ||
7525 | + | ||
7526 | +static void em_x270_led_orange_set(struct led_classdev *led_cdev, | ||
7527 | + enum led_brightness value) | ||
7528 | +{ | ||
7529 | + int on = 1; | ||
7530 | + int pwm_chop = 0; | ||
7531 | + | ||
7532 | + pr_info("%s: value = %d\n", __FUNCTION__, value); | ||
7533 | + if (value == LED_OFF) | ||
7534 | + on = 0; | ||
7535 | + else if (value == LED_HALF) | ||
7536 | + pwm_chop = 4; | ||
7537 | + | ||
7538 | + da9030_set_led(3, on, 0, 0, pwm_chop); | ||
7539 | +} | ||
7540 | + | ||
7541 | +static struct led_classdev em_x270_orange_led = { | ||
7542 | + .name = "em_x270:orange", | ||
7543 | + .default_trigger = "em-x270-battery.0-charging-or-full", | ||
7544 | + .brightness_set = em_x270_led_orange_set, | ||
7545 | +}; | ||
7546 | + | ||
7547 | +#ifdef CONFIG_PM | ||
7548 | +static int em_x270_led_suspend(struct platform_device *dev, pm_message_t state) | ||
7549 | +{ | ||
7550 | +#ifdef CONFIG_LEDS_TRIGGERS | ||
7551 | + if (em_x270_orange_led.trigger && strcmp(em_x270_orange_led.trigger->name, "em-x270-battery-charging-or-full")) | ||
7552 | +#endif | ||
7553 | + led_classdev_suspend(&em_x270_orange_led); | ||
7554 | + return 0; | ||
7555 | +} | ||
7556 | + | ||
7557 | +static int em_x270_led_resume(struct platform_device *dev) | ||
7558 | +{ | ||
7559 | + led_classdev_resume(&em_x270_orange_led); | ||
7560 | + return 0; | ||
7561 | +} | ||
7562 | +#endif | ||
7563 | + | ||
7564 | +static int em_x270_led_probe(struct platform_device *pdev) | ||
7565 | +{ | ||
7566 | + return led_classdev_register(&pdev->dev, &em_x270_orange_led); | ||
7567 | +} | ||
7568 | + | ||
7569 | +static int em_x270_led_remove(struct platform_device *pdev) | ||
7570 | +{ | ||
7571 | + led_classdev_unregister(&em_x270_orange_led); | ||
7572 | + return 0; | ||
7573 | +} | ||
7574 | + | ||
7575 | +static struct platform_driver em_x270_led_driver = { | ||
7576 | + .probe = em_x270_led_probe, | ||
7577 | + .remove = em_x270_led_remove, | ||
7578 | +#ifdef CONFIG_PM | ||
7579 | + .suspend = em_x270_led_suspend, | ||
7580 | + .resume = em_x270_led_resume, | ||
7581 | +#endif | ||
7582 | + .driver = { | ||
7583 | + .name = "em-x270-led", | ||
7584 | + }, | ||
7585 | +}; | ||
7586 | + | ||
7587 | +static int __init em_x270_led_init(void) | ||
7588 | +{ | ||
7589 | + return platform_driver_register(&em_x270_led_driver); | ||
7590 | +} | ||
7591 | + | ||
7592 | +static void __exit em_x270_led_exit(void) | ||
7593 | +{ | ||
7594 | + platform_driver_unregister(&em_x270_led_driver); | ||
7595 | +} | ||
7596 | + | ||
7597 | +module_init(em_x270_led_init); | ||
7598 | +module_exit(em_x270_led_exit); | ||
7599 | + | ||
7600 | +MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>"); | ||
7601 | +MODULE_DESCRIPTION("EX-X270 LED driver"); | ||
7602 | +MODULE_LICENSE("GPL"); | ||
7603 | diff --git a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c | ||
7604 | index 58e561e..7050e71 100644 | ||
7605 | --- a/drivers/mtd/chips/jedec_probe.c | ||
7606 | +++ b/drivers/mtd/chips/jedec_probe.c | ||
7607 | @@ -38,7 +38,7 @@ | ||
7608 | #define MANUFACTURER_ST 0x0020 | ||
7609 | #define MANUFACTURER_TOSHIBA 0x0098 | ||
7610 | #define MANUFACTURER_WINBOND 0x00da | ||
7611 | - | ||
7612 | +#define CONTINUATION_CODE 0x007f | ||
7613 | |||
7614 | /* AMD */ | ||
7615 | #define AM29DL800BB 0x22C8 | ||
7616 | @@ -68,6 +68,10 @@ | ||
7617 | #define AT49BV32X 0x00C8 | ||
7618 | #define AT49BV32XT 0x00C9 | ||
7619 | |||
7620 | +/* Eon */ | ||
7621 | +#define EN29SL800BB 0x226B | ||
7622 | +#define EN29SL800BT 0x22EA | ||
7623 | + | ||
7624 | /* Fujitsu */ | ||
7625 | #define MBM29F040C 0x00A4 | ||
7626 | #define MBM29LV650UE 0x22D7 | ||
7627 | @@ -632,6 +636,40 @@ static const struct amd_flash_info jedec_table[] = { | ||
7628 | ERASEINFO(0x02000,8) | ||
7629 | } | ||
7630 | }, { | ||
7631 | + .mfr_id = 0x1c, | ||
7632 | + .dev_id = EN29SL800BT, | ||
7633 | + .name = "Eon EN29SL800BT", | ||
7634 | + .uaddr = { | ||
7635 | + [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */ | ||
7636 | + [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */ | ||
7637 | + }, | ||
7638 | + .DevSize = SIZE_1MiB, | ||
7639 | + .CmdSet = P_ID_AMD_STD, | ||
7640 | + .NumEraseRegions= 4, | ||
7641 | + .regions = { | ||
7642 | + ERASEINFO(0x10000, 15), | ||
7643 | + ERASEINFO(0x08000, 1), | ||
7644 | + ERASEINFO(0x02000, 2), | ||
7645 | + ERASEINFO(0x04000, 1), | ||
7646 | + } | ||
7647 | + }, { | ||
7648 | + .mfr_id = 0x1c, | ||
7649 | + .dev_id = EN29SL800BB, | ||
7650 | + .name = "Eon EN29SL800BB", | ||
7651 | + .uaddr = { | ||
7652 | + [0] = MTD_UADDR_0x0555_0x02AA, /* x8 */ | ||
7653 | + [1] = MTD_UADDR_0x0555_0x02AA, /* x16 */ | ||
7654 | + }, | ||
7655 | + .DevSize = SIZE_1MiB, | ||
7656 | + .CmdSet = P_ID_AMD_STD, | ||
7657 | + .NumEraseRegions= 4, | ||
7658 | + .regions = { | ||
7659 | + ERASEINFO(0x04000, 1), | ||
7660 | + ERASEINFO(0x02000, 2), | ||
7661 | + ERASEINFO(0x08000, 1), | ||
7662 | + ERASEINFO(0x10000, 15), | ||
7663 | + } | ||
7664 | + }, { | ||
7665 | .mfr_id = MANUFACTURER_FUJITSU, | ||
7666 | .dev_id = MBM29F040C, | ||
7667 | .name = "Fujitsu MBM29F040C", | ||
7668 | @@ -1769,9 +1807,21 @@ static inline u32 jedec_read_mfr(struct map_info *map, __u32 base, | ||
7669 | { | ||
7670 | map_word result; | ||
7671 | unsigned long mask; | ||
7672 | - u32 ofs = cfi_build_cmd_addr(0, cfi_interleave(cfi), cfi->device_type); | ||
7673 | - mask = (1 << (cfi->device_type * 8)) -1; | ||
7674 | - result = map_read(map, base + ofs); | ||
7675 | + int bank = 0; | ||
7676 | + | ||
7677 | + /* According to JEDEC "Standard Manufacturer's Identification Code" | ||
7678 | + * (http://www.jedec.org/download/search/jep106W.pdf) | ||
7679 | + * several first banks can contain 0x7f instead of actual ID | ||
7680 | + */ | ||
7681 | + do { | ||
7682 | + u32 ofs = cfi_build_cmd_addr(0 + (bank << 8), | ||
7683 | + cfi_interleave(cfi), | ||
7684 | + cfi->device_type); | ||
7685 | + mask = (1 << (cfi->device_type * 8)) -1; | ||
7686 | + result = map_read(map, base + ofs); | ||
7687 | + bank++; | ||
7688 | + } while ((result.x[0] & mask) == CONTINUATION_CODE); | ||
7689 | + | ||
7690 | return result.x[0] & mask; | ||
7691 | } | ||
7692 | |||
7693 | diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c | ||
7694 | index 738aa59..88dbbdf 100644 | ||
7695 | --- a/drivers/net/dm9000.c | ||
7696 | +++ b/drivers/net/dm9000.c | ||
7697 | @@ -546,6 +546,7 @@ dm9000_probe(struct platform_device *pdev) | ||
7698 | |||
7699 | if (id_val != DM9000_ID) { | ||
7700 | printk("%s: wrong id: 0x%08x\n", CARDNAME, id_val); | ||
7701 | + ret = -ENODEV; | ||
7702 | goto release; | ||
7703 | } | ||
7704 | |||
7705 | diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig | ||
7706 | index 58c806e..3a16d9c 100644 | ||
7707 | --- a/drivers/power/Kconfig | ||
7708 | +++ b/drivers/power/Kconfig | ||
7709 | @@ -49,4 +49,10 @@ config BATTERY_OLPC | ||
7710 | help | ||
7711 | Say Y to enable support for the battery on the OLPC laptop. | ||
7712 | |||
7713 | +config BATTERY_EM_X270 | ||
7714 | + tristate "EM-X270 battery" | ||
7715 | + depends on DA9030 && MACH_EM_X270 | ||
7716 | + help | ||
7717 | + Say Y here to enable support for battery on EM-X270. | ||
7718 | + | ||
7719 | endif # POWER_SUPPLY | ||
7720 | diff --git a/drivers/power/Makefile b/drivers/power/Makefile | ||
7721 | index 6413ded..dc9585e 100644 | ||
7722 | --- a/drivers/power/Makefile | ||
7723 | +++ b/drivers/power/Makefile | ||
7724 | @@ -20,3 +20,4 @@ obj-$(CONFIG_APM_POWER) += apm_power.o | ||
7725 | obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o | ||
7726 | obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o | ||
7727 | obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o | ||
7728 | +obj-$(CONFIG_BATTERY_EM_X270) += em_x270_battery.o | ||
7729 | diff --git a/drivers/power/em_x270_battery.c b/drivers/power/em_x270_battery.c | ||
7730 | new file mode 100644 | ||
7731 | index 0000000..2630c68 | ||
7732 | --- /dev/null | ||
7733 | +++ b/drivers/power/em_x270_battery.c | ||
7734 | @@ -0,0 +1,579 @@ | ||
7735 | +/* | ||
7736 | + * Power managemnet implementation for EM-X270 | ||
7737 | + * | ||
7738 | + * Copyright (C) 2007 CompuLab, Ltd. | ||
7739 | + * Author: Mike Rapoport <mike@compulab.co.il> | ||
7740 | + * | ||
7741 | + * This program is free software; you can redistribute it and/or modify | ||
7742 | + * it under the terms of the GNU General Public License version 2 as | ||
7743 | + * published by the Free Software Foundation. | ||
7744 | + * | ||
7745 | + */ | ||
7746 | + | ||
7747 | +#define DEBUG | ||
7748 | + | ||
7749 | +#include <linux/module.h> | ||
7750 | +#include <linux/platform_device.h> | ||
7751 | +#include <linux/pda_power.h> | ||
7752 | +#include <linux/apm-emulation.h> | ||
7753 | +#include <linux/da9030.h> | ||
7754 | +#include <linux/power_supply.h> | ||
7755 | +#include <linux/pm.h> | ||
7756 | + | ||
7757 | +#include <linux/debugfs.h> | ||
7758 | +#include <linux/seq_file.h> | ||
7759 | + | ||
7760 | +#include "../i2c/chips/da9030.h" | ||
7761 | + | ||
7762 | +#define VOLTAGE_MAX_DESIGN 4200000 /* 4.2V in uV */ | ||
7763 | +#define VOLTAGE_MIN_DESIGN 3000000 /* 3V in uV */ | ||
7764 | + | ||
7765 | +/* #define VCHARGE_MIN_THRESHOLD 72 /\* 4.5V *\/ */ | ||
7766 | + | ||
7767 | +#define VCHARGE_MIN_THRESHOLD 60 /* ?.?V */ | ||
7768 | +#define VCHARGE_MAX_THRESHOLD 89 /* 5.5V */ | ||
7769 | +#define TBAT_LOW_THRESHOLD 197 /* 0oC */ | ||
7770 | +#define TBAT_HIGH_THRESHOLD 78 /* 45oC */ | ||
7771 | +#define TBAT_RESUME_THRESHOLD 100 /* 35oC */ | ||
7772 | +#define VBAT_LOW_THRESHOLD 82 /* 3.498V */ | ||
7773 | +#define VBAT_CRIT_THRESHOLD 62 /* 3.291V */ | ||
7774 | + | ||
7775 | +struct da9030_charger { | ||
7776 | + struct device *dev; | ||
7777 | + | ||
7778 | + struct power_supply bat; | ||
7779 | + struct da9030_adc_res adc; | ||
7780 | + struct delayed_work work; | ||
7781 | + | ||
7782 | + int interval; | ||
7783 | + int status; | ||
7784 | + int mA; | ||
7785 | + int mV; | ||
7786 | + | ||
7787 | + int is_charging:1; | ||
7788 | + | ||
7789 | +#ifdef CONFIG_DEBUG_FS | ||
7790 | + struct dentry *debug_file; | ||
7791 | +#endif | ||
7792 | +}; | ||
7793 | + | ||
7794 | +static unsigned short tbat_readings[] = { | ||
7795 | + 300, 244, 200, 178, 163, 152, 144, 137, 131, | ||
7796 | + 126, 122, 118, 114, 111, 108, 105, 103, 101, | ||
7797 | + 98, 96, 94, 93, 91, 89, 88, 86, 85, | ||
7798 | + 83, 82, 81, 79, 78, 77, 76, 75, 74, | ||
7799 | + 73, 72, 71, 70, 69, 68, 67, 67, 66, | ||
7800 | + 65, 64, 63, 63, 62, 61, 60, 60, 59, | ||
7801 | + 58, 58, 57, 57, 56, 55, 55, 54, 53, | ||
7802 | + 53, 52, 52, 51, 51, 50, 50, 49, 49, | ||
7803 | + 48, 48, 47, 47, 46, 46, 45, 45, 44, | ||
7804 | + 44, 43, 43, 42, 42, 41, 41, 41, 40, | ||
7805 | + 40, 39, 39, 38, 38, 38, 37, 37, 36, | ||
7806 | + 36, 35, 35, 35, 34, 34, 34, 33, 33, | ||
7807 | + 32, 32, 32, 31, 31, 30, 30, 30, 29, | ||
7808 | + 29, 29, 28, 28, 28, 27, 27, 26, 26, | ||
7809 | + 26, 25, 25, 25, 24, 24, 24, 23, 23, | ||
7810 | + 23, 22, 22, 21, 21, 21, 20, 20, 20, | ||
7811 | + 19, 19, 19, 18, 18, 18, 17, 17, 17, | ||
7812 | + 16, 16, 16, 15, 15, 14, 14, 14, 13, | ||
7813 | + 13, 13, 12, 12, 12, 11, 11, 11, 10, | ||
7814 | + 10, 10, 9, 9, 8, 8, 8, 7, 7, | ||
7815 | + 7, 6, 6, 5, 5, 5, 4, 4, 3, | ||
7816 | + 3, 3, 2, 2, 1, 1, 1, 0, 0, | ||
7817 | + -1, -1, -1, -2, -2, -3, -3, -4, -4, | ||
7818 | + -5, -5, -6, -6, -6, -7, -7, -8, -9, | ||
7819 | + -9, -10, -10, -11, -11, -12, -12, -13, -14, | ||
7820 | + -14, -15, -16, -16, -17, -18, -18, -19, -20, | ||
7821 | + -21, -21, -22, -23, -24, -25, -26, -27, -28, | ||
7822 | + -30, -31, -32, -34, -35, -37, -39, -41, -44, | ||
7823 | + -47, -50, -56, -64, | ||
7824 | +}; | ||
7825 | + | ||
7826 | +#ifdef CONFIG_DEBUG_FS | ||
7827 | + | ||
7828 | +#define REG2VOLT(x) ((((x) * 2650) >> 8) + 2650) | ||
7829 | + | ||
7830 | +static int debug_show(struct seq_file *s, void *data) | ||
7831 | +{ | ||
7832 | + struct da9030_charger *charger = s->private; | ||
7833 | + | ||
7834 | + seq_printf(s, "charger is %s\n", | ||
7835 | + charger->status & CHRG_CHARGER_ENABLE ? "on" : "off"); | ||
7836 | + if (charger->status & CHRG_CHARGER_ENABLE) { | ||
7837 | + seq_printf(s, "iset = %dmA, vset = %dmV\n", | ||
7838 | + charger->mA, charger->mV); | ||
7839 | + } | ||
7840 | + | ||
7841 | + seq_printf(s, "vbat_res = %d (%dmV)\n", | ||
7842 | + charger->adc.vbat_res, REG2VOLT(charger->adc.vbat_res)); | ||
7843 | + seq_printf(s, "vbatmin_res = %d (%dmV)\n", | ||
7844 | + charger->adc.vbatmin_res, | ||
7845 | + REG2VOLT(charger->adc.vbatmin_res)); | ||
7846 | + seq_printf(s, "vbatmintxon = %d (%dmV)\n", | ||
7847 | + charger->adc.vbatmintxon, | ||
7848 | + REG2VOLT(charger->adc.vbatmintxon)); | ||
7849 | + seq_printf(s, "ichmax_res = %d\n", charger->adc.ichmax_res); | ||
7850 | + seq_printf(s, "ichmin_res = %d\n", charger->adc.ichmin_res); | ||
7851 | + seq_printf(s, "ichaverage_res = %d\n", charger->adc.ichaverage_res); | ||
7852 | + seq_printf(s, "vchmax_res = %d (%dmV)\n", | ||
7853 | + charger->adc.vchmax_res, | ||
7854 | + REG2VOLT(charger->adc.vchmax_res)); | ||
7855 | + seq_printf(s, "vchmin_res = %d (%dmV)\n", | ||
7856 | + charger->adc.vchmin_res, | ||
7857 | + REG2VOLT(charger->adc.vchmin_res)); | ||
7858 | + seq_printf(s, "tbat_res = %d (%doC\n", charger->adc.tbat_res, | ||
7859 | + tbat_readings[charger->adc.tbat_res]); | ||
7860 | + seq_printf(s, "adc_in4_res = %d\n", charger->adc.adc_in4_res); | ||
7861 | + seq_printf(s, "adc_in5_res = %d\n", charger->adc.adc_in5_res); | ||
7862 | + | ||
7863 | + return 0; | ||
7864 | +} | ||
7865 | + | ||
7866 | +static int debug_open(struct inode *inode, struct file *file) | ||
7867 | +{ | ||
7868 | + return single_open(file, debug_show, inode->i_private); | ||
7869 | +} | ||
7870 | + | ||
7871 | +static const struct file_operations debug_fops = { | ||
7872 | + .open = debug_open, | ||
7873 | + .read = seq_read, | ||
7874 | + .llseek = seq_lseek, | ||
7875 | + .release = single_release, | ||
7876 | +}; | ||
7877 | + | ||
7878 | +static struct dentry* da9030_create_debugfs(struct da9030_charger *charger) | ||
7879 | +{ | ||
7880 | + charger->debug_file = debugfs_create_file("charger", 0666, 0, charger, | ||
7881 | + &debug_fops); | ||
7882 | + return charger->debug_file; | ||
7883 | +} | ||
7884 | + | ||
7885 | +static void da9030_remove_debugfs(struct da9030_charger *charger) | ||
7886 | +{ | ||
7887 | + debugfs_remove(charger->debug_file); | ||
7888 | +} | ||
7889 | +#else | ||
7890 | +#define da9030_create_debugfs(x) NULL | ||
7891 | +#define da9030_remove_debugfs(x) do {} while(0) | ||
7892 | +#endif | ||
7893 | + | ||
7894 | +static void da9030_set_charge(struct da9030_charger *charger, int on) | ||
7895 | +{ | ||
7896 | +/* int status = da9030_get_status(); */ | ||
7897 | + if (on) { | ||
7898 | + pr_debug("%s: enabling charger\n", __FUNCTION__); | ||
7899 | + da9030_set_thresholds(TBAT_HIGH_THRESHOLD, | ||
7900 | + TBAT_RESUME_THRESHOLD, | ||
7901 | + TBAT_LOW_THRESHOLD); | ||
7902 | + da9030_set_charger(1, 1000, 4200); | ||
7903 | + charger->is_charging = 1; | ||
7904 | + } | ||
7905 | + else { | ||
7906 | + /* disable charger */ | ||
7907 | + pr_debug("%s: disabling charger\n", __FUNCTION__); | ||
7908 | + da9030_set_charger(0, 0, 0); | ||
7909 | + charger->is_charging = 0; | ||
7910 | + } | ||
7911 | +} | ||
7912 | + | ||
7913 | +static void da9030_charging_monitor(struct work_struct *work) | ||
7914 | +{ | ||
7915 | + struct da9030_charger *charger; | ||
7916 | + int is_on; | ||
7917 | + unsigned int mA, mV; | ||
7918 | + | ||
7919 | + charger = container_of(work, struct da9030_charger, work.work); | ||
7920 | + | ||
7921 | + da9030_get_charger(&is_on, &mA, &mV); | ||
7922 | + da9030_read_adc(&charger->adc); | ||
7923 | + | ||
7924 | + charger->status = da9030_get_status(); | ||
7925 | + charger->mA = mA; | ||
7926 | + charger->mV = mV; | ||
7927 | + | ||
7928 | + /* we wake or boot with external power on */ | ||
7929 | + if (!is_on && (charger->status & STATUS_CHDET)) { | ||
7930 | + da9030_set_charge(charger, 1); | ||
7931 | + return; | ||
7932 | + } | ||
7933 | + | ||
7934 | + if (is_on) { | ||
7935 | +/* pr_info("%s: mA = %d, mV = %d\n", __FUNCTION__, mA, mV); */ | ||
7936 | +/* pr_info("%s: vchmin_res = %d, vchmax_res = %d\n", */ | ||
7937 | +/* __FUNCTION__, charger->adc.vchmin_res, */ | ||
7938 | +/* charger->adc.vchmax_res); */ | ||
7939 | +/* pr_info("%s: tbat_res = %d\n", */ | ||
7940 | +/* __FUNCTION__, charger->adc.tbat_res); */ | ||
7941 | + if (charger->adc.vbat_res > VBAT_LOW_THRESHOLD) { | ||
7942 | + /* update VBAT threshlods ? */ | ||
7943 | + da9030_set_reg(VBATMON, VBAT_LOW_THRESHOLD); | ||
7944 | + } | ||
7945 | + if (charger->adc.vchmax_res > VCHARGE_MAX_THRESHOLD || | ||
7946 | + charger->adc.vchmin_res < VCHARGE_MIN_THRESHOLD || | ||
7947 | + /* Tempreture readings are negative */ | ||
7948 | + charger->adc.tbat_res < TBAT_HIGH_THRESHOLD || | ||
7949 | + charger->adc.tbat_res > TBAT_LOW_THRESHOLD) { | ||
7950 | + /* disable charger */ | ||
7951 | + da9030_set_charge(charger, 0); | ||
7952 | + } | ||
7953 | + } | ||
7954 | + | ||
7955 | + /* reschedule for the next time */ | ||
7956 | + schedule_delayed_work(&charger->work, charger->interval); | ||
7957 | +} | ||
7958 | + | ||
7959 | +void da9030_battery_release(struct device * dev) | ||
7960 | +{ | ||
7961 | +} | ||
7962 | + | ||
7963 | +static void da9030_external_power_changed(struct power_supply *psy) | ||
7964 | +{ | ||
7965 | +/* struct da9030_charger *charger; */ | ||
7966 | + | ||
7967 | +/* charger = container_of(psy, struct da9030_charger, bat); */ | ||
7968 | +/* pr_info("%s:\n", __FUNCTION__); */ | ||
7969 | +/* da9030_set_charge(charger); */ | ||
7970 | +} | ||
7971 | + | ||
7972 | +struct da9030_battery_thresh { | ||
7973 | + int voltage; | ||
7974 | + int percentage; | ||
7975 | +}; | ||
7976 | + | ||
7977 | +static struct da9030_battery_thresh vbat_ranges[] = { | ||
7978 | + { 150, 100}, | ||
7979 | + { 149, 99}, | ||
7980 | + { 148, 98}, | ||
7981 | + { 147, 98}, | ||
7982 | + { 146, 97}, | ||
7983 | + { 145, 96}, | ||
7984 | + { 144, 96}, | ||
7985 | + { 143, 95}, | ||
7986 | + { 142, 94}, | ||
7987 | + { 141, 93}, | ||
7988 | + { 140, 92}, | ||
7989 | + { 139, 91}, | ||
7990 | + { 138, 90}, | ||
7991 | + { 137, 90}, | ||
7992 | + { 136, 89}, | ||
7993 | + { 135, 88}, | ||
7994 | + { 134, 88}, | ||
7995 | + { 133, 87}, | ||
7996 | + { 132, 86}, | ||
7997 | + { 131, 85}, | ||
7998 | + { 130, 83}, | ||
7999 | + { 129, 82}, | ||
8000 | + { 128, 81}, | ||
8001 | + { 127, 81}, | ||
8002 | + { 126, 80}, | ||
8003 | + { 125, 75}, | ||
8004 | + { 124, 74}, | ||
8005 | + { 123, 73}, | ||
8006 | + { 122, 70}, | ||
8007 | + { 121, 66}, | ||
8008 | + { 120, 65}, | ||
8009 | + { 119, 64}, | ||
8010 | + { 118, 64}, | ||
8011 | + { 117, 63}, | ||
8012 | + { 116, 59}, | ||
8013 | + { 115, 58}, | ||
8014 | + { 114, 57}, | ||
8015 | + { 113, 57}, | ||
8016 | + { 112, 56}, | ||
8017 | + { 111, 50}, | ||
8018 | + { 110, 49}, | ||
8019 | + { 109, 49}, | ||
8020 | + { 108, 48}, | ||
8021 | + { 107, 48}, | ||
8022 | + { 106, 33}, | ||
8023 | + { 105, 32}, | ||
8024 | + { 104, 32}, | ||
8025 | + { 103, 32}, | ||
8026 | + { 102, 31}, | ||
8027 | + { 101, 16}, | ||
8028 | + { 100, 15}, | ||
8029 | + { 99, 15}, | ||
8030 | + { 98, 15}, | ||
8031 | + { 97, 10}, | ||
8032 | + { 96, 9}, | ||
8033 | + { 95, 7}, | ||
8034 | + { 94, 3}, | ||
8035 | + { 93, 0}, | ||
8036 | +}; | ||
8037 | + | ||
8038 | +static enum power_supply_property da9030_bat_props[] = { | ||
8039 | + POWER_SUPPLY_PROP_STATUS, | ||
8040 | + POWER_SUPPLY_PROP_HEALTH, | ||
8041 | + POWER_SUPPLY_PROP_TECHNOLOGY, | ||
8042 | + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, | ||
8043 | + POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, | ||
8044 | + POWER_SUPPLY_PROP_VOLTAGE_NOW, | ||
8045 | + POWER_SUPPLY_PROP_CURRENT_AVG, | ||
8046 | + POWER_SUPPLY_PROP_CAPACITY, /* in percents! */ | ||
8047 | + POWER_SUPPLY_PROP_TEMP, | ||
8048 | + POWER_SUPPLY_PROP_MANUFACTURER, | ||
8049 | + POWER_SUPPLY_PROP_MODEL_NAME, | ||
8050 | +}; | ||
8051 | + | ||
8052 | +static void da9030_bat_check_status(union power_supply_propval *val) | ||
8053 | +{ | ||
8054 | + int charger_on; | ||
8055 | + int status = da9030_get_status(); | ||
8056 | + | ||
8057 | + da9030_get_charger(&charger_on, 0, 0); | ||
8058 | + | ||
8059 | + /* FIXME: below code is very crude approximation of actual | ||
8060 | + states, we need to take into account voltage and current | ||
8061 | + measurements to determine actual charger state */ | ||
8062 | + if (status & STATUS_CHDET) { | ||
8063 | + if (charger_on) { | ||
8064 | + val->intval = POWER_SUPPLY_STATUS_CHARGING; | ||
8065 | + } | ||
8066 | + else { | ||
8067 | + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; | ||
8068 | + } | ||
8069 | + } | ||
8070 | + else { | ||
8071 | + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; | ||
8072 | + } | ||
8073 | +} | ||
8074 | + | ||
8075 | +static void da9030_bat_check_health(union power_supply_propval *val) | ||
8076 | +{ | ||
8077 | + int fault_log = da9030_get_fault_log(); | ||
8078 | + | ||
8079 | + if (fault_log & FAULT_LOG_OVER_TEMP) { | ||
8080 | + val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; | ||
8081 | + } | ||
8082 | + else if (fault_log & FAULT_LOG_VBAT_OVER) { | ||
8083 | + val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; | ||
8084 | + } | ||
8085 | + else { | ||
8086 | + val->intval = POWER_SUPPLY_HEALTH_GOOD; | ||
8087 | + } | ||
8088 | +} | ||
8089 | + | ||
8090 | +static int vbat_interpolate(int reg) | ||
8091 | +{ | ||
8092 | + int i; | ||
8093 | + | ||
8094 | + for (i = 0; i < ARRAY_SIZE(vbat_ranges); i++ ) | ||
8095 | + if (vbat_ranges[i].voltage == reg) { | ||
8096 | + pr_debug("%s: voltage = %d, percentage = %d\n", | ||
8097 | + __FUNCTION__, vbat_ranges[i].voltage, | ||
8098 | + vbat_ranges[i].percentage); | ||
8099 | + return vbat_ranges[i].percentage; | ||
8100 | + } | ||
8101 | + | ||
8102 | + return 0; | ||
8103 | +} | ||
8104 | + | ||
8105 | +static int da9030_bat_get_property(struct power_supply *psy, | ||
8106 | + enum power_supply_property psp, | ||
8107 | + union power_supply_propval *val) | ||
8108 | +{ | ||
8109 | + u32 reg; | ||
8110 | + struct da9030_charger *charger; | ||
8111 | + charger = container_of(psy, struct da9030_charger, bat); | ||
8112 | + | ||
8113 | + switch(psp) { | ||
8114 | + case POWER_SUPPLY_PROP_STATUS: | ||
8115 | + da9030_bat_check_status(val); | ||
8116 | + break; | ||
8117 | + case POWER_SUPPLY_PROP_HEALTH: | ||
8118 | + da9030_bat_check_health(val); | ||
8119 | + break; | ||
8120 | + case POWER_SUPPLY_PROP_TECHNOLOGY: | ||
8121 | + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; | ||
8122 | + break; | ||
8123 | + case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: | ||
8124 | + val->intval = VOLTAGE_MAX_DESIGN; | ||
8125 | + break; | ||
8126 | + case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: | ||
8127 | + val->intval = VOLTAGE_MIN_DESIGN; | ||
8128 | + break; | ||
8129 | + case POWER_SUPPLY_PROP_VOLTAGE_NOW: | ||
8130 | + reg = charger->adc.vbat_res; | ||
8131 | + /* V = (reg / 256) * 2.65 + 2.65 (V) */ | ||
8132 | + val->intval = ((reg * 2650000) >> 8) + 2650000; | ||
8133 | + break; | ||
8134 | + case POWER_SUPPLY_PROP_CURRENT_AVG: | ||
8135 | + reg = charger->adc.ichaverage_res; | ||
8136 | + val->intval = reg; /* reg */ | ||
8137 | + break; | ||
8138 | + case POWER_SUPPLY_PROP_CAPACITY: | ||
8139 | + reg = charger->adc.vbat_res; | ||
8140 | + val->intval = vbat_interpolate(reg); | ||
8141 | + break; | ||
8142 | + case POWER_SUPPLY_PROP_TEMP: | ||
8143 | + reg = charger->adc.tbat_res; | ||
8144 | + val->intval = tbat_readings[reg]; | ||
8145 | + break; | ||
8146 | + case POWER_SUPPLY_PROP_MANUFACTURER: | ||
8147 | + val->strval = "MaxPower"; | ||
8148 | + pr_debug("%s: MFG = %s\n", __FUNCTION__, val->strval); | ||
8149 | + break; | ||
8150 | + case POWER_SUPPLY_PROP_MODEL_NAME: | ||
8151 | + val->strval = "LP555597P6H-FPS"; | ||
8152 | + pr_debug("%s: MODEL = %s\n", __FUNCTION__, val->strval); | ||
8153 | + break; | ||
8154 | + default: break; | ||
8155 | + } | ||
8156 | + | ||
8157 | + return 0; | ||
8158 | +} | ||
8159 | + | ||
8160 | +static void da9030_setup_battery(struct power_supply *bat) | ||
8161 | +{ | ||
8162 | + bat->name = "em-x270-battery"; | ||
8163 | + bat->type = POWER_SUPPLY_TYPE_BATTERY; | ||
8164 | + bat->properties = da9030_bat_props; | ||
8165 | + bat->num_properties = ARRAY_SIZE(da9030_bat_props); | ||
8166 | + bat->get_property = da9030_bat_get_property; | ||
8167 | + bat->use_for_apm = 1; | ||
8168 | + bat->external_power_changed = da9030_external_power_changed; | ||
8169 | +}; | ||
8170 | + | ||
8171 | +static void da9030_chiover_callback(int event, void *_charger) | ||
8172 | +{ | ||
8173 | + /* disable charger */ | ||
8174 | + struct da9030_charger *charger = _charger; | ||
8175 | + da9030_set_charge(charger, 0); | ||
8176 | +} | ||
8177 | + | ||
8178 | +static void da9030_tbat_callback(int event, void *_charger) | ||
8179 | +{ | ||
8180 | + /* disable charger */ | ||
8181 | + struct da9030_charger *charger = _charger; | ||
8182 | + da9030_set_charge(charger, 0); | ||
8183 | +} | ||
8184 | + | ||
8185 | +static void da9030_vbat_callback(int event, void *_charger) | ||
8186 | +{ | ||
8187 | + struct da9030_charger *charger = _charger; | ||
8188 | + da9030_read_adc(&charger->adc); | ||
8189 | + | ||
8190 | + if (charger->is_charging) { | ||
8191 | + if (charger->adc.vbat_res < VBAT_LOW_THRESHOLD) { | ||
8192 | + /* set VBAT threshold for critical */ | ||
8193 | + da9030_set_reg(VBATMON, VBAT_CRIT_THRESHOLD); | ||
8194 | + } | ||
8195 | + else if (charger->adc.vbat_res < VBAT_CRIT_THRESHOLD) { | ||
8196 | + /* notify the system of battery critical */ | ||
8197 | + apm_queue_event(APM_CRITICAL_SUSPEND); | ||
8198 | + } | ||
8199 | + } | ||
8200 | +} | ||
8201 | + | ||
8202 | +static void da9030_ccto_callback(int event, void *_charger) | ||
8203 | +{ | ||
8204 | + /* x3 */ | ||
8205 | +} | ||
8206 | + | ||
8207 | +static void da9030_tcto_callback(int event, void *_charger) | ||
8208 | +{ | ||
8209 | + /* x3 */ | ||
8210 | +} | ||
8211 | + | ||
8212 | +static void da9030_chdet_callback(int event, void *_charger) | ||
8213 | +{ | ||
8214 | + struct da9030_charger *charger = _charger; | ||
8215 | + int status = da9030_get_status(); | ||
8216 | + da9030_set_charge(charger, !!(status & CHRG_CHARGER_ENABLE)); | ||
8217 | +} | ||
8218 | + | ||
8219 | +static int da9030_battery_probe(struct platform_device *pdev) | ||
8220 | +{ | ||
8221 | + struct da9030_charger *charger; | ||
8222 | + | ||
8223 | + pr_debug("%s\n", __FUNCTION__); | ||
8224 | + charger = kzalloc(sizeof(*charger), GFP_KERNEL); | ||
8225 | + if (charger == NULL) { | ||
8226 | + return -ENOMEM; | ||
8227 | + } | ||
8228 | + | ||
8229 | + charger->dev = &pdev->dev; | ||
8230 | + | ||
8231 | + charger->interval = 10 * HZ; /* 10 seconds between monotor runs */ | ||
8232 | + da9030_setup_battery(&charger->bat); | ||
8233 | + | ||
8234 | + platform_set_drvdata(pdev, charger); | ||
8235 | + | ||
8236 | + da9030_enable_adc(); | ||
8237 | + | ||
8238 | + INIT_DELAYED_WORK(&charger->work, da9030_charging_monitor); | ||
8239 | + schedule_delayed_work(&charger->work, charger->interval); | ||
8240 | + | ||
8241 | + charger->debug_file = da9030_create_debugfs(charger); | ||
8242 | + | ||
8243 | + da9030_setup_battery(&charger->bat); | ||
8244 | + | ||
8245 | + da9030_register_callback(DA9030_IRQ_CHDET, | ||
8246 | + da9030_chdet_callback, | ||
8247 | + charger); | ||
8248 | + da9030_register_callback(DA9030_IRQ_VBATMON, | ||
8249 | + da9030_vbat_callback, | ||
8250 | + charger); | ||
8251 | + | ||
8252 | + /* critical condition events */ | ||
8253 | + da9030_register_callback(DA9030_IRQ_CHIOVER, | ||
8254 | + da9030_chiover_callback, | ||
8255 | + charger); | ||
8256 | + da9030_register_callback(DA9030_IRQ_TBAT, | ||
8257 | + da9030_tbat_callback, | ||
8258 | + charger); | ||
8259 | + | ||
8260 | + /* timer events */ | ||
8261 | + da9030_register_callback(DA9030_IRQ_TCTO, | ||
8262 | + da9030_tcto_callback, | ||
8263 | + charger); | ||
8264 | + da9030_register_callback(DA9030_IRQ_CCTO, | ||
8265 | + da9030_ccto_callback, | ||
8266 | + charger); | ||
8267 | + | ||
8268 | + power_supply_register(&pdev->dev, &charger->bat); | ||
8269 | + | ||
8270 | + return 0; | ||
8271 | +} | ||
8272 | + | ||
8273 | +static int da9030_battery_remove(struct platform_device *dev) | ||
8274 | +{ | ||
8275 | + struct da9030_charger *charger = platform_get_drvdata(dev); | ||
8276 | + | ||
8277 | + pr_debug("%s\n", __FUNCTION__); | ||
8278 | + da9030_remove_debugfs(charger); | ||
8279 | + cancel_delayed_work(&charger->work); | ||
8280 | + power_supply_unregister(&charger->bat); | ||
8281 | + kfree(charger); | ||
8282 | + return 0; | ||
8283 | +} | ||
8284 | + | ||
8285 | +static struct platform_driver da9030_battery_driver = { | ||
8286 | + .driver = { | ||
8287 | + .name = "da9030-battery", | ||
8288 | + .owner = THIS_MODULE, | ||
8289 | + }, | ||
8290 | + .probe = da9030_battery_probe, | ||
8291 | + .remove = da9030_battery_remove, | ||
8292 | +}; | ||
8293 | + | ||
8294 | +static int da9030_battery_init(void) | ||
8295 | +{ | ||
8296 | + pr_debug("%s\n", __FUNCTION__); | ||
8297 | + | ||
8298 | + return platform_driver_register(&da9030_battery_driver); | ||
8299 | +} | ||
8300 | + | ||
8301 | +static void da9030_battery_exit(void) | ||
8302 | +{ | ||
8303 | + pr_debug("%s\n", __FUNCTION__); | ||
8304 | + | ||
8305 | + platform_driver_unregister(&da9030_battery_driver); | ||
8306 | +} | ||
8307 | + | ||
8308 | +module_init(da9030_battery_init); | ||
8309 | +module_exit(da9030_battery_exit); | ||
8310 | + | ||
8311 | +MODULE_DESCRIPTION("DA9030 charger driver"); | ||
8312 | +MODULE_AUTHOR("Mike Rapoport"); | ||
8313 | +MODULE_LICENSE("GPL"); | ||
8314 | diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig | ||
8315 | index 767aed5..4c44a7a 100644 | ||
8316 | --- a/drivers/usb/gadget/Kconfig | ||
8317 | +++ b/drivers/usb/gadget/Kconfig | ||
8318 | @@ -195,6 +195,26 @@ config USB_M66592 | ||
8319 | default USB_GADGET | ||
8320 | select USB_GADGET_SELECTED | ||
8321 | |||
8322 | +config USB_GADGET_PXA27X | ||
8323 | + boolean "PXA 27x" | ||
8324 | + depends on ARCH_PXA && PXA27x | ||
8325 | + help | ||
8326 | + Intel's PXA 27x series XScale ARM-5TE processors include | ||
8327 | + an integrated full speed USB 1.1 device controller. | ||
8328 | + | ||
8329 | + It has 23 endpoints, as well as endpoint zero (for control | ||
8330 | + transfers). | ||
8331 | + | ||
8332 | + Say "y" to link the driver statically, or "m" to build a | ||
8333 | + dynamically linked module called "pxa27x_udc" and force all | ||
8334 | + gadget drivers to also be dynamically linked. | ||
8335 | + | ||
8336 | +config USB_PXA27X | ||
8337 | + tristate | ||
8338 | + depends on USB_GADGET_PXA27X | ||
8339 | + default USB_GADGET | ||
8340 | + select USB_GADGET_SELECTED | ||
8341 | + | ||
8342 | config USB_GADGET_GOKU | ||
8343 | boolean "Toshiba TC86C001 'Goku-S'" | ||
8344 | depends on PCI | ||
8345 | diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile | ||
8346 | index 1bc0f03..b8743bf 100644 | ||
8347 | --- a/drivers/usb/gadget/Makefile | ||
8348 | +++ b/drivers/usb/gadget/Makefile | ||
8349 | @@ -9,6 +9,7 @@ obj-$(CONFIG_USB_DUMMY_HCD) += dummy_hcd.o | ||
8350 | obj-$(CONFIG_USB_NET2280) += net2280.o | ||
8351 | obj-$(CONFIG_USB_AMD5536UDC) += amd5536udc.o | ||
8352 | obj-$(CONFIG_USB_PXA2XX) += pxa2xx_udc.o | ||
8353 | +obj-$(CONFIG_USB_PXA27X) += pxa27x_udc.o | ||
8354 | obj-$(CONFIG_USB_GOKU) += goku_udc.o | ||
8355 | obj-$(CONFIG_USB_OMAP) += omap_udc.o | ||
8356 | obj-$(CONFIG_USB_LH7A40X) += lh7a40x_udc.o | ||
8357 | diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c | ||
8358 | index 3aa46cf..d7d5550 100644 | ||
8359 | --- a/drivers/usb/gadget/epautoconf.c | ||
8360 | +++ b/drivers/usb/gadget/epautoconf.c | ||
8361 | @@ -228,14 +228,19 @@ find_ep (struct usb_gadget *gadget, const char *name) | ||
8362 | * | ||
8363 | * On failure, this returns a null endpoint descriptor. | ||
8364 | */ | ||
8365 | -struct usb_ep * __devinit usb_ep_autoconfig ( | ||
8366 | +struct usb_ep * usb_ep_autoconfig ( | ||
8367 | struct usb_gadget *gadget, | ||
8368 | - struct usb_endpoint_descriptor *desc | ||
8369 | + struct usb_endpoint_descriptor *desc, | ||
8370 | + struct usb_endpoint_config *epconfig, int numconfigs | ||
8371 | ) | ||
8372 | { | ||
8373 | struct usb_ep *ep; | ||
8374 | u8 type; | ||
8375 | |||
8376 | + /* Use device specific ep allocation code if provided */ | ||
8377 | + if (gadget->ops->ep_alloc) | ||
8378 | + return gadget->ops->ep_alloc(gadget, desc, epconfig, numconfigs); | ||
8379 | + | ||
8380 | type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; | ||
8381 | |||
8382 | /* First, apply chip-specific "best usage" knowledge. | ||
8383 | diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c | ||
8384 | index 593e235..87aa9fb 100644 | ||
8385 | --- a/drivers/usb/gadget/ether.c | ||
8386 | +++ b/drivers/usb/gadget/ether.c | ||
8387 | @@ -1350,6 +1350,10 @@ static void rndis_response_complete (struct usb_ep *ep, struct usb_request *req) | ||
8388 | /* done sending after USB_CDC_GET_ENCAPSULATED_RESPONSE */ | ||
8389 | } | ||
8390 | |||
8391 | +#ifdef CONFIG_USB_GADGET_PXA27X | ||
8392 | +int write_ep0_zlp(void); | ||
8393 | +#endif | ||
8394 | + | ||
8395 | static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) | ||
8396 | { | ||
8397 | struct eth_dev *dev = ep->driver_data; | ||
8398 | @@ -1360,6 +1364,10 @@ static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) | ||
8399 | status = rndis_msg_parser (dev->rndis_config, (u8 *) req->buf); | ||
8400 | if (status < 0) | ||
8401 | ERROR(dev, "%s: rndis parse error %d\n", __FUNCTION__, status); | ||
8402 | + | ||
8403 | +#ifdef CONFIG_USB_GADGET_PXA27X | ||
8404 | + write_ep0_zlp(); | ||
8405 | +#endif | ||
8406 | spin_unlock(&dev->lock); | ||
8407 | } | ||
8408 | |||
8409 | @@ -2287,7 +2295,8 @@ eth_bind (struct usb_gadget *gadget) | ||
8410 | struct eth_dev *dev; | ||
8411 | struct net_device *net; | ||
8412 | u8 cdc = 1, zlp = 1, rndis = 1; | ||
8413 | - struct usb_ep *in_ep, *out_ep, *status_ep = NULL; | ||
8414 | + struct usb_ep *in_ep = NULL , *out_ep = NULL, *status_ep = NULL; | ||
8415 | + struct usb_endpoint_config ep_config[2]; | ||
8416 | int status = -ENOMEM; | ||
8417 | int gcnum; | ||
8418 | |||
8419 | @@ -2386,7 +2395,30 @@ eth_bind (struct usb_gadget *gadget) | ||
8420 | |||
8421 | /* all we really need is bulk IN/OUT */ | ||
8422 | usb_ep_autoconfig_reset (gadget); | ||
8423 | - in_ep = usb_ep_autoconfig (gadget, &fs_source_desc); | ||
8424 | + | ||
8425 | + ep_config[0].config = DEV_CONFIG_VALUE; | ||
8426 | +#if defined(DEV_CONFIG_CDC) | ||
8427 | + ep_config[0].interface = data_intf.bInterfaceNumber; | ||
8428 | + ep_config[0].altinterface = data_intf.bAlternateSetting; | ||
8429 | +#else /* DEV_CONFIG_SUBSET */ | ||
8430 | + ep_config[0].interface = subset_data_intf.bInterfaceNumber; | ||
8431 | + ep_config[0].altinterface = subset_data_intf.bAlternateSetting; | ||
8432 | +#endif | ||
8433 | + | ||
8434 | +#ifdef CONFIG_USB_ETH_RNDIS | ||
8435 | + ep_config[1].config = DEV_RNDIS_CONFIG_VALUE; | ||
8436 | +#ifdef CONFIG_USB_GADGET_PXA27X | ||
8437 | + ep_config[1].interface = 0; | ||
8438 | +#else | ||
8439 | + ep_config[1].interface = rndis_data_intf.bInterfaceNumber; | ||
8440 | +#endif | ||
8441 | + ep_config[1].altinterface = rndis_data_intf.bAlternateSetting; | ||
8442 | + | ||
8443 | + in_ep = usb_ep_autoconfig(gadget, &fs_source_desc, &ep_config[0], 2); | ||
8444 | +#else | ||
8445 | + in_ep = usb_ep_autoconfig(gadget, &fs_source_desc, &ep_config[0], 1); | ||
8446 | +#endif | ||
8447 | + | ||
8448 | if (!in_ep) { | ||
8449 | autoconf_fail: | ||
8450 | dev_err (&gadget->dev, | ||
8451 | @@ -2396,7 +2428,12 @@ autoconf_fail: | ||
8452 | } | ||
8453 | in_ep->driver_data = in_ep; /* claim */ | ||
8454 | |||
8455 | - out_ep = usb_ep_autoconfig (gadget, &fs_sink_desc); | ||
8456 | +#ifdef CONFIG_USB_ETH_RNDIS | ||
8457 | + out_ep = usb_ep_autoconfig(gadget, &fs_sink_desc, &ep_config[0], 2); | ||
8458 | +#else | ||
8459 | + out_ep = usb_ep_autoconfig(gadget, &fs_sink_desc, &ep_config[0], 1); | ||
8460 | +#endif | ||
8461 | + | ||
8462 | if (!out_ep) | ||
8463 | goto autoconf_fail; | ||
8464 | out_ep->driver_data = out_ep; /* claim */ | ||
8465 | @@ -2406,7 +2443,25 @@ autoconf_fail: | ||
8466 | * Since some hosts expect one, try to allocate one anyway. | ||
8467 | */ | ||
8468 | if (cdc || rndis) { | ||
8469 | - status_ep = usb_ep_autoconfig (gadget, &fs_status_desc); | ||
8470 | +#ifdef DEV_CONFIG_CDC | ||
8471 | + ep_config[0].config = DEV_CONFIG_VALUE; | ||
8472 | + ep_config[0].interface = control_intf.bInterfaceNumber; | ||
8473 | + ep_config[0].altinterface = control_intf.bAlternateSetting; | ||
8474 | +#endif | ||
8475 | +#ifdef CONFIG_USB_ETH_RNDIS | ||
8476 | + ep_config[1].config = DEV_RNDIS_CONFIG_VALUE; | ||
8477 | + ep_config[1].interface = rndis_control_intf.bInterfaceNumber; | ||
8478 | + ep_config[1].altinterface = rndis_control_intf.bAlternateSetting; | ||
8479 | +#endif | ||
8480 | + | ||
8481 | +#if defined(DEV_CONFIG_CDC) && defined(CONFIG_USB_ETH_RNDIS) | ||
8482 | + status_ep = usb_ep_autoconfig(gadget, &fs_status_desc, &ep_config[0], 2); | ||
8483 | +#elif defined(CONFIG_USB_ETH_RNDIS) | ||
8484 | + status_ep = usb_ep_autoconfig(gadget, &fs_status_desc, &ep_config[1], 1); | ||
8485 | +#else | ||
8486 | + status_ep = usb_ep_autoconfig(gadget, &fs_status_desc, &ep_config[0], 1); | ||
8487 | +#endif | ||
8488 | + | ||
8489 | if (status_ep) { | ||
8490 | status_ep->driver_data = status_ep; /* claim */ | ||
8491 | } else if (rndis) { | ||
8492 | diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c | ||
8493 | index 965ad7b..b9cd8c9 100644 | ||
8494 | --- a/drivers/usb/gadget/file_storage.c | ||
8495 | +++ b/drivers/usb/gadget/file_storage.c | ||
8496 | @@ -3841,6 +3841,7 @@ static int __init fsg_bind(struct usb_gadget *gadget) | ||
8497 | struct usb_ep *ep; | ||
8498 | struct usb_request *req; | ||
8499 | char *pathbuf, *p; | ||
8500 | + struct usb_endpoint_config ep_config; | ||
8501 | |||
8502 | fsg->gadget = gadget; | ||
8503 | set_gadget_data(gadget, fsg); | ||
8504 | @@ -3911,21 +3912,25 @@ static int __init fsg_bind(struct usb_gadget *gadget) | ||
8505 | } | ||
8506 | |||
8507 | /* Find all the endpoints we will use */ | ||
8508 | + ep_config.config = CONFIG_VALUE; | ||
8509 | + ep_config.interface = intf_desc.bInterfaceNumber; | ||
8510 | + ep_config.altinterface = intf_desc.bAlternateSetting; | ||
8511 | + | ||
8512 | usb_ep_autoconfig_reset(gadget); | ||
8513 | - ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc); | ||
8514 | + ep = usb_ep_autoconfig(gadget, &fs_bulk_in_desc, &ep_config, 1); | ||
8515 | if (!ep) | ||
8516 | goto autoconf_fail; | ||
8517 | ep->driver_data = fsg; // claim the endpoint | ||
8518 | fsg->bulk_in = ep; | ||
8519 | |||
8520 | - ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc); | ||
8521 | + ep = usb_ep_autoconfig(gadget, &fs_bulk_out_desc, &ep_config, 1); | ||
8522 | if (!ep) | ||
8523 | goto autoconf_fail; | ||
8524 | ep->driver_data = fsg; // claim the endpoint | ||
8525 | fsg->bulk_out = ep; | ||
8526 | |||
8527 | if (transport_is_cbi()) { | ||
8528 | - ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc); | ||
8529 | + ep = usb_ep_autoconfig(gadget, &fs_intr_in_desc, &ep_config, 1); | ||
8530 | if (!ep) | ||
8531 | goto autoconf_fail; | ||
8532 | ep->driver_data = fsg; // claim the endpoint | ||
8533 | diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c | ||
8534 | new file mode 100644 | ||
8535 | index 0000000..d4270d4 | ||
8536 | --- /dev/null | ||
8537 | +++ b/drivers/usb/gadget/pxa27x_udc.c | ||
8538 | @@ -0,0 +1,2387 @@ | ||
8539 | +/* | ||
8540 | + * Handles the Intel 27x USB Device Controller (UDC) | ||
8541 | + * | ||
8542 | + * Copyright (C) 2002 Intrinsyc, Inc. (Frank Becker) | ||
8543 | + * Copyright (C) 2003 Robert Schwebel, Pengutronix | ||
8544 | + * Copyright (C) 2003 Benedikt Spranger, Pengutronix | ||
8545 | + * Copyright (C) 2003 David Brownell | ||
8546 | + * Copyright (C) 2003 Joshua Wise | ||
8547 | + * Copyright (C) 2004 Intel Corporation | ||
8548 | + * Copyright (C) 2005 SDG Systems, LLC (Aric Blumer) | ||
8549 | + * Copyright (C) 2005-2006 Openedhand Ltd. (Richard Purdie) | ||
8550 | + * | ||
8551 | + * This program is free software; you can redistribute it and/or modify | ||
8552 | + * it under the terms of the GNU General Public License as published by | ||
8553 | + * the Free Software Foundation; either version 2 of the License, or | ||
8554 | + * (at your option) any later version. | ||
8555 | + * | ||
8556 | + * This program is distributed in the hope that it will be useful, | ||
8557 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
8558 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
8559 | + * GNU General Public License for more details. | ||
8560 | + * | ||
8561 | + * You should have received a copy of the GNU General Public License | ||
8562 | + * along with this program; if not, write to the Free Software | ||
8563 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
8564 | + * | ||
8565 | + */ | ||
8566 | + | ||
8567 | +#undef DEBUG | ||
8568 | +//#define DEBUG 1 | ||
8569 | +//#define VERBOSE DBG_VERBOSE | ||
8570 | + | ||
8571 | +#include <linux/module.h> | ||
8572 | +#include <linux/kernel.h> | ||
8573 | +#include <linux/ioport.h> | ||
8574 | +#include <linux/types.h> | ||
8575 | +#include <linux/version.h> | ||
8576 | +#include <linux/errno.h> | ||
8577 | +#include <linux/platform_device.h> | ||
8578 | +#include <linux/delay.h> | ||
8579 | +#include <linux/sched.h> | ||
8580 | +#include <linux/slab.h> | ||
8581 | +#include <linux/init.h> | ||
8582 | +#include <linux/timer.h> | ||
8583 | +#include <linux/list.h> | ||
8584 | +#include <linux/interrupt.h> | ||
8585 | +#include <linux/proc_fs.h> | ||
8586 | +#include <linux/mm.h> | ||
8587 | +#include <linux/device.h> | ||
8588 | +#include <linux/dma-mapping.h> | ||
8589 | + | ||
8590 | +#include <asm/byteorder.h> | ||
8591 | +#include <asm/dma.h> | ||
8592 | +#include <asm/io.h> | ||
8593 | +#include <asm/irq.h> | ||
8594 | +#include <asm/system.h> | ||
8595 | +#include <asm/mach-types.h> | ||
8596 | +#include <asm/unaligned.h> | ||
8597 | +#include <asm/hardware.h> | ||
8598 | +#include <asm/arch/pxa-regs.h> | ||
8599 | + | ||
8600 | +#include <linux/usb/ch9.h> | ||
8601 | +#include <linux/usb_gadget.h> | ||
8602 | + | ||
8603 | +#include <asm/arch/udc.h> | ||
8604 | + | ||
8605 | +/* | ||
8606 | + * This driver handles the USB Device Controller (UDC) in Intel's PXA 27x | ||
8607 | + * series processors. | ||
8608 | + * | ||
8609 | + * Such controller drivers work with a gadget driver. The gadget driver | ||
8610 | + * returns descriptors, implements configuration and data protocols used | ||
8611 | + * by the host to interact with this device, and allocates endpoints to | ||
8612 | + * the different protocol interfaces. The controller driver virtualizes | ||
8613 | + * usb hardware so that the gadget drivers will be more portable. | ||
8614 | + * | ||
8615 | + * This UDC hardware wants to implement a bit too much USB protocol. The | ||
8616 | + * biggest issue is that the endpoints have to be setup before the controller | ||
8617 | + * can be enabled and each endpoint can only have one configuration, interface | ||
8618 | + * and alternative interface number. Once enabled, these cannot be changed | ||
8619 | + * without a controller reset. | ||
8620 | + * | ||
8621 | + * Intel Errata #22 mentions issues when changing alternate interface. | ||
8622 | + * The exact meaning of this remains uncertain as gadget drivers using alternate | ||
8623 | + * interfaces such as CDC-Ethernet appear to work... | ||
8624 | + */ | ||
8625 | + | ||
8626 | +#define DRIVER_VERSION "01-01-2006" | ||
8627 | +#define DRIVER_DESC "PXA 27x USB Device Controller driver" | ||
8628 | + | ||
8629 | +static const char driver_name [] = "pxa27x_udc"; | ||
8630 | + | ||
8631 | +static const char ep0name [] = "ep0"; | ||
8632 | + | ||
8633 | + | ||
8634 | +#define USE_DMA | ||
8635 | +//#undef USE_DMA | ||
8636 | + | ||
8637 | +#ifdef CONFIG_PROC_FS | ||
8638 | +#define UDC_PROC_FILE | ||
8639 | +#endif | ||
8640 | + | ||
8641 | +#include "pxa27x_udc.h" | ||
8642 | + | ||
8643 | +#ifdef USE_DMA | ||
8644 | +static int use_dma = 1; | ||
8645 | +module_param(use_dma, bool, 0); | ||
8646 | +MODULE_PARM_DESC(use_dma, "true to use dma"); | ||
8647 | + | ||
8648 | +static void dma_nodesc_handler(int dmach, void *_ep); | ||
8649 | +static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req); | ||
8650 | + | ||
8651 | +#define DMASTR " (dma support)" | ||
8652 | + | ||
8653 | +#else /* !USE_DMA */ | ||
8654 | +#define DMASTR " (pio only)" | ||
8655 | +#endif | ||
8656 | + | ||
8657 | +#define UDCISR0_IR0 0x3 | ||
8658 | +#define UDCISR_INT_MASK (UDC_INT_FIFOERROR | UDC_INT_PACKETCMP) | ||
8659 | +#define UDCICR_INT_MASK UDCISR_INT_MASK | ||
8660 | + | ||
8661 | +#define UDCCSR_MASK (UDCCSR_FST | UDCCSR_DME) | ||
8662 | + | ||
8663 | +static void pxa27x_ep_fifo_flush(struct usb_ep *ep); | ||
8664 | +static void nuke(struct pxa27x_ep *, int status); | ||
8665 | +static void udc_init_ep(struct pxa27x_udc *dev); | ||
8666 | + | ||
8667 | + | ||
8668 | +/* | ||
8669 | + * Endpoint Functions | ||
8670 | + */ | ||
8671 | +static void pio_irq_enable(int ep_num) | ||
8672 | +{ | ||
8673 | + if (ep_num < 16) | ||
8674 | + UDCICR0 |= 3 << (ep_num * 2); | ||
8675 | + else { | ||
8676 | + ep_num -= 16; | ||
8677 | + UDCICR1 |= 3 << (ep_num * 2); | ||
8678 | + } | ||
8679 | +} | ||
8680 | + | ||
8681 | +static void pio_irq_disable(int ep_num) | ||
8682 | +{ | ||
8683 | + ep_num &= 0xf; | ||
8684 | + if (ep_num < 16) | ||
8685 | + UDCICR0 &= ~(3 << (ep_num * 2)); | ||
8686 | + else { | ||
8687 | + ep_num -= 16; | ||
8688 | + UDCICR1 &= ~(3 << (ep_num * 2)); | ||
8689 | + } | ||
8690 | +} | ||
8691 | + | ||
8692 | +/* The UDCCR reg contains mask and interrupt status bits, | ||
8693 | + * so using '|=' isn't safe as it may ack an interrupt. | ||
8694 | + */ | ||
8695 | +#define UDCCR_MASK_BITS (UDCCR_OEN | UDCCR_UDE) | ||
8696 | + | ||
8697 | +static inline void udc_set_mask_UDCCR(int mask) | ||
8698 | +{ | ||
8699 | + UDCCR = (UDCCR & UDCCR_MASK_BITS) | (mask & UDCCR_MASK_BITS); | ||
8700 | +} | ||
8701 | + | ||
8702 | +static inline void udc_clear_mask_UDCCR(int mask) | ||
8703 | +{ | ||
8704 | + UDCCR = (UDCCR & UDCCR_MASK_BITS) & ~(mask & UDCCR_MASK_BITS); | ||
8705 | +} | ||
8706 | + | ||
8707 | +static inline void udc_ack_int_UDCCR(int mask) | ||
8708 | +{ | ||
8709 | + /* udccr contains the bits we dont want to change */ | ||
8710 | + __u32 udccr = UDCCR & UDCCR_MASK_BITS; | ||
8711 | + | ||
8712 | + UDCCR = udccr | (mask & ~UDCCR_MASK_BITS); | ||
8713 | +} | ||
8714 | + | ||
8715 | +/* | ||
8716 | + * Endpoint enable/disable | ||
8717 | + * | ||
8718 | + * Not much to do here as the ep_alloc function sets up most things. Once | ||
8719 | + * enabled, not much of the pxa27x configuration can be changed. | ||
8720 | + * | ||
8721 | + */ | ||
8722 | +static int pxa27x_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | ||
8723 | +{ | ||
8724 | + struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
8725 | + struct pxa27x_ep *ep = virt_ep->pxa_ep; | ||
8726 | + struct pxa27x_udc *dev; | ||
8727 | + | ||
8728 | + if (!_ep || !desc || _ep->name == ep0name | ||
8729 | + || desc->bDescriptorType != USB_DT_ENDPOINT | ||
8730 | + || ep->fifo_size < le16_to_cpu(desc->wMaxPacketSize)) { | ||
8731 | + dev_err(ep->dev->dev, "%s, bad ep or descriptor\n", __FUNCTION__); | ||
8732 | + return -EINVAL; | ||
8733 | + } | ||
8734 | + | ||
8735 | + /* xfer types must match, except that interrupt ~= bulk */ | ||
8736 | + if( ep->ep_type != USB_ENDPOINT_XFER_BULK | ||
8737 | + && desc->bmAttributes != USB_ENDPOINT_XFER_INT) { | ||
8738 | + dev_err(ep->dev->dev, "%s, %s type mismatch\n", __FUNCTION__, _ep->name); | ||
8739 | + return -EINVAL; | ||
8740 | + } | ||
8741 | + | ||
8742 | + /* hardware _could_ do smaller, but driver doesn't */ | ||
8743 | + if ((desc->bmAttributes == USB_ENDPOINT_XFER_BULK | ||
8744 | + && le16_to_cpu (desc->wMaxPacketSize) | ||
8745 | + != BULK_FIFO_SIZE) | ||
8746 | + || !desc->wMaxPacketSize) { | ||
8747 | + dev_err(ep->dev->dev, "%s, bad %s maxpacket\n", __FUNCTION__, _ep->name); | ||
8748 | + return -ERANGE; | ||
8749 | + } | ||
8750 | + | ||
8751 | + dev = ep->dev; | ||
8752 | + if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) { | ||
8753 | + dev_err(ep->dev->dev, "%s, bogus device state\n", __FUNCTION__); | ||
8754 | + return -ESHUTDOWN; | ||
8755 | + } | ||
8756 | + | ||
8757 | + ep->desc = desc; | ||
8758 | + ep->dma = -1; | ||
8759 | + ep->stopped = 0; | ||
8760 | + ep->pio_irqs = ep->dma_irqs = 0; | ||
8761 | + ep->usb_ep->maxpacket = le16_to_cpu(desc->wMaxPacketSize); | ||
8762 | + | ||
8763 | + /* flush fifo (mostly for OUT buffers) */ | ||
8764 | + pxa27x_ep_fifo_flush(_ep); | ||
8765 | + | ||
8766 | + /* ... reset halt state too, if we could ... */ | ||
8767 | + | ||
8768 | +#ifdef USE_DMA | ||
8769 | + /* for (some) bulk and ISO endpoints, try to get a DMA channel and | ||
8770 | + * bind it to the endpoint. otherwise use PIO. | ||
8771 | + */ | ||
8772 | + dev_dbg(ep->dev->dev, "%s: called attributes=%d\n", __FUNCTION__, ep->ep_type); | ||
8773 | + switch (ep->ep_type) { | ||
8774 | + case USB_ENDPOINT_XFER_ISOC: | ||
8775 | + if (le16_to_cpu(desc->wMaxPacketSize) % 32) | ||
8776 | + break; | ||
8777 | + // fall through | ||
8778 | + case USB_ENDPOINT_XFER_BULK: | ||
8779 | + if (!use_dma || !ep->reg_drcmr) | ||
8780 | + break; | ||
8781 | + ep->dma = pxa_request_dma((char *)_ep->name, (le16_to_cpu(desc->wMaxPacketSize) > 64) | ||
8782 | + ? DMA_PRIO_MEDIUM : DMA_PRIO_LOW, dma_nodesc_handler, ep); | ||
8783 | + if (ep->dma >= 0) { | ||
8784 | + *ep->reg_drcmr = DRCMR_MAPVLD | ep->dma; | ||
8785 | + dev_dbg(ep->dev->dev, "%s using dma%d\n", _ep->name, ep->dma); | ||
8786 | + } | ||
8787 | + default: | ||
8788 | + break; | ||
8789 | + } | ||
8790 | +#endif | ||
8791 | + DBG(DBG_VERBOSE, "enabled %s\n", _ep->name); | ||
8792 | + return 0; | ||
8793 | +} | ||
8794 | + | ||
8795 | +static int pxa27x_ep_disable(struct usb_ep *_ep) | ||
8796 | +{ | ||
8797 | + struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
8798 | + struct pxa27x_ep *ep = virt_ep->pxa_ep; | ||
8799 | + unsigned long flags; | ||
8800 | + | ||
8801 | + if (!_ep || !ep->desc) { | ||
8802 | + dev_err(ep->dev->dev, "%s, %s not enabled\n", __FUNCTION__, | ||
8803 | + _ep ? _ep->name : NULL); | ||
8804 | + return -EINVAL; | ||
8805 | + } | ||
8806 | + local_irq_save(flags); | ||
8807 | + nuke(ep, -ESHUTDOWN); | ||
8808 | + | ||
8809 | +#ifdef USE_DMA | ||
8810 | + if (ep->dma >= 0) { | ||
8811 | + *ep->reg_drcmr = 0; | ||
8812 | + pxa_free_dma(ep->dma); | ||
8813 | + ep->dma = -1; | ||
8814 | + } | ||
8815 | +#endif | ||
8816 | + | ||
8817 | + /* flush fifo (mostly for IN buffers) */ | ||
8818 | + pxa27x_ep_fifo_flush(_ep); | ||
8819 | + | ||
8820 | + ep->desc = 0; | ||
8821 | + ep->stopped = 1; | ||
8822 | + | ||
8823 | + local_irq_restore(flags); | ||
8824 | + DBG(DBG_VERBOSE, "%s disabled\n", _ep->name); | ||
8825 | + return 0; | ||
8826 | +} | ||
8827 | + | ||
8828 | + | ||
8829 | + | ||
8830 | +/* for the pxa27x, these can just wrap kmalloc/kfree. gadget drivers | ||
8831 | + * must still pass correctly initialized endpoints, since other controller | ||
8832 | + * drivers may care about how it's currently set up (dma issues etc). | ||
8833 | + */ | ||
8834 | + | ||
8835 | +/* | ||
8836 | + * pxa27x_ep_alloc_request - allocate a request data structure | ||
8837 | + */ | ||
8838 | +static struct usb_request * | ||
8839 | +pxa27x_ep_alloc_request(struct usb_ep *_ep, unsigned gfp_flags) | ||
8840 | +{ | ||
8841 | + struct pxa27x_request *req; | ||
8842 | + | ||
8843 | + req = kzalloc(sizeof *req, gfp_flags); | ||
8844 | + if (!req) | ||
8845 | + return 0; | ||
8846 | + | ||
8847 | + INIT_LIST_HEAD(&req->queue); | ||
8848 | + return &req->req; | ||
8849 | +} | ||
8850 | + | ||
8851 | + | ||
8852 | +/* | ||
8853 | + * pxa27x_ep_free_request - deallocate a request data structure | ||
8854 | + */ | ||
8855 | +static void | ||
8856 | +pxa27x_ep_free_request(struct usb_ep *_ep, struct usb_request *_req) | ||
8857 | +{ | ||
8858 | + struct pxa27x_request *req; | ||
8859 | + | ||
8860 | + req = container_of(_req, struct pxa27x_request, req); | ||
8861 | + WARN_ON(!list_empty(&req->queue)); | ||
8862 | + kfree(req); | ||
8863 | +} | ||
8864 | + | ||
8865 | + | ||
8866 | +/*-------------------------------------------------------------------------*/ | ||
8867 | + | ||
8868 | +/* | ||
8869 | + * done - retire a request; caller blocked irqs | ||
8870 | + */ | ||
8871 | +static void done(struct pxa27x_ep *ep, struct pxa27x_request *req, int status) | ||
8872 | +{ | ||
8873 | + list_del_init(&req->queue); | ||
8874 | + if (likely (req->req.status == -EINPROGRESS)) | ||
8875 | + req->req.status = status; | ||
8876 | + else | ||
8877 | + status = req->req.status; | ||
8878 | + | ||
8879 | + if (status && status != -ESHUTDOWN) | ||
8880 | + DBG(DBG_VERBOSE, "complete %s req %p stat %d len %u/%u\n", | ||
8881 | + ep->usb_ep->name, &req->req, status, | ||
8882 | + req->req.actual, req->req.length); | ||
8883 | + | ||
8884 | + /* don't modify queue heads during completion callback */ | ||
8885 | + req->req.complete(ep->usb_ep, &req->req); | ||
8886 | +} | ||
8887 | + | ||
8888 | + | ||
8889 | +static inline void ep0_idle(struct pxa27x_udc *dev) | ||
8890 | +{ | ||
8891 | + dev->ep0state = EP0_IDLE; | ||
8892 | +} | ||
8893 | + | ||
8894 | +static int write_packet(volatile u32 *uddr, struct pxa27x_request *req, unsigned max) | ||
8895 | +{ | ||
8896 | + u32 *buf; | ||
8897 | + int length, count, remain; | ||
8898 | + | ||
8899 | + buf = (u32*)(req->req.buf + req->req.actual); | ||
8900 | + prefetch(buf); | ||
8901 | + | ||
8902 | + /* how big will this packet be? */ | ||
8903 | + length = min(req->req.length - req->req.actual, max); | ||
8904 | + req->req.actual += length; | ||
8905 | + | ||
8906 | + remain = length & 0x3; | ||
8907 | + count = length & ~(0x3); | ||
8908 | + | ||
8909 | + //dev_dbg(ep->dev->dev, "Length %d, Remain %d, Count %d\n",length, remain, count); | ||
8910 | + | ||
8911 | + while (likely(count)) { | ||
8912 | + //dev_dbg(ep->dev->dev, "Sending:0x%x\n", *buf); | ||
8913 | + *uddr = *buf++; | ||
8914 | + count -= 4; | ||
8915 | + } | ||
8916 | + | ||
8917 | + if (remain) { | ||
8918 | + volatile u8* reg=(u8*)uddr; | ||
8919 | + char *rd =(u8*)buf; | ||
8920 | + | ||
8921 | + while (remain--) { | ||
8922 | + *reg=*rd++; | ||
8923 | + } | ||
8924 | + } | ||
8925 | + | ||
8926 | + return length; | ||
8927 | +} | ||
8928 | + | ||
8929 | +/* | ||
8930 | + * write to an IN endpoint fifo, as many packets as possible. | ||
8931 | + * irqs will use this to write the rest later. | ||
8932 | + * caller guarantees at least one packet buffer is ready (or a zlp). | ||
8933 | + */ | ||
8934 | +static int | ||
8935 | +write_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) | ||
8936 | +{ | ||
8937 | + unsigned max; | ||
8938 | + | ||
8939 | + max = le16_to_cpu(ep->desc->wMaxPacketSize); | ||
8940 | + do { | ||
8941 | + int count, is_last, is_short; | ||
8942 | + | ||
8943 | + //dev_dbg(ep->dev->dev, "write_fifo7 %x\n", *ep->reg_udccsr); | ||
8944 | + | ||
8945 | + if (*ep->reg_udccsr & UDCCSR_PC) { | ||
8946 | + //dev_dbg(ep->dev->dev, "Transmit Complete\n"); | ||
8947 | + *ep->reg_udccsr = UDCCSR_PC | (*ep->reg_udccsr & UDCCSR_MASK); | ||
8948 | + } | ||
8949 | + | ||
8950 | + if (*ep->reg_udccsr & UDCCSR_TRN) { | ||
8951 | + //dev_dbg(ep->dev->dev, "Clearing Underrun\n"); | ||
8952 | + *ep->reg_udccsr = UDCCSR_TRN | (*ep->reg_udccsr & UDCCSR_MASK); | ||
8953 | + } | ||
8954 | + //dev_dbg(ep->dev->dev, "write_fifo8 %x\n", *ep->reg_udccsr); | ||
8955 | + | ||
8956 | + count = write_packet(ep->reg_udcdr, req, max); | ||
8957 | + | ||
8958 | + /* last packet is usually short (or a zlp) */ | ||
8959 | + if (unlikely (count != max)) | ||
8960 | + is_last = is_short = 1; | ||
8961 | + else { | ||
8962 | + if (likely(req->req.length != req->req.actual) | ||
8963 | + || req->req.zero) | ||
8964 | + is_last = 0; | ||
8965 | + else | ||
8966 | + is_last = 1; | ||
8967 | + /* interrupt/iso maxpacket may not fill the fifo */ | ||
8968 | + is_short = unlikely (max < ep->fifo_size); | ||
8969 | + } | ||
8970 | + | ||
8971 | + //dev_dbg(ep->dev->dev, "write_fifo0 %x\n", *ep->reg_udccsr); | ||
8972 | + | ||
8973 | + dev_dbg(ep->dev->dev, "wrote %s count:%d bytes%s%s %d left %p\n", | ||
8974 | + ep->usb_ep->name, count, | ||
8975 | + is_last ? "/L" : "", is_short ? "/S" : "", | ||
8976 | + req->req.length - req->req.actual, &req->req); | ||
8977 | + | ||
8978 | + /* let loose that packet. maybe try writing another one, | ||
8979 | + * double buffering might work. | ||
8980 | + */ | ||
8981 | + | ||
8982 | + if (is_short) | ||
8983 | + *ep->reg_udccsr = UDCCSR_SP | (*ep->reg_udccsr & UDCCSR_MASK); | ||
8984 | + | ||
8985 | + dev_dbg(ep->dev->dev, "write_fifo0.5 %x\n", *ep->reg_udccsr); | ||
8986 | + | ||
8987 | + /* requests complete when all IN data is in the FIFO */ | ||
8988 | + if (is_last) { | ||
8989 | + done(ep, req, 0); | ||
8990 | + if (list_empty(&ep->queue) || unlikely(ep->dma >= 0)) { | ||
8991 | + pio_irq_disable(ep->pxa_ep_num); | ||
8992 | + //dev_dbg(ep->dev->dev, "write_fifo1 %x\n", *ep->reg_udccsr); | ||
8993 | +#ifdef USE_DMA | ||
8994 | + /* unaligned data and zlps couldn't use dma */ | ||
8995 | + if (unlikely(!list_empty(&ep->queue))) { | ||
8996 | + req = list_entry(ep->queue.next, | ||
8997 | + struct pxa27x_request, queue); | ||
8998 | + kick_dma(ep,req); | ||
8999 | + return 0; | ||
9000 | + } | ||
9001 | +#endif | ||
9002 | + } | ||
9003 | + //dev_dbg(ep->dev->dev, "write_fifo2 %x\n", *ep->reg_udccsr); | ||
9004 | + return 1; | ||
9005 | + } | ||
9006 | + | ||
9007 | + // TODO experiment: how robust can fifo mode tweaking be? | ||
9008 | + // double buffering is off in the default fifo mode, which | ||
9009 | + // prevents TFS from being set here. | ||
9010 | + | ||
9011 | + } while (*ep->reg_udccsr & UDCCSR_FS); | ||
9012 | + //dev_dbg(ep->dev->dev, "write_fifo2 %x\n", *ep->reg_udccsr); | ||
9013 | + return 0; | ||
9014 | +} | ||
9015 | + | ||
9016 | +/* caller asserts req->pending (ep0 irq status nyet cleared); starts | ||
9017 | + * ep0 data stage. these chips want very simple state transitions. | ||
9018 | + */ | ||
9019 | +static inline | ||
9020 | +void ep0start(struct pxa27x_udc *dev, u32 flags, const char *tag) | ||
9021 | +{ | ||
9022 | + UDCCSR0 = flags|UDCCSR0_SA|UDCCSR0_OPC; | ||
9023 | + UDCISR0 = UDCICR_INT(0, UDC_INT_FIFOERROR | UDC_INT_PACKETCMP); | ||
9024 | + dev->req_pending = 0; | ||
9025 | + DBG(DBG_VERY_NOISY, "%s %s, %02x/%02x\n", | ||
9026 | + __FUNCTION__, tag, UDCCSR0, flags); | ||
9027 | +} | ||
9028 | + | ||
9029 | +static int | ||
9030 | +write_ep0_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) | ||
9031 | +{ | ||
9032 | + unsigned count; | ||
9033 | + int is_short; | ||
9034 | + | ||
9035 | + count = write_packet(&UDCDR0, req, EP0_FIFO_SIZE); | ||
9036 | + ep->dev->stats.write.bytes += count; | ||
9037 | + | ||
9038 | + /* last packet "must be" short (or a zlp) */ | ||
9039 | + is_short = (count != EP0_FIFO_SIZE); | ||
9040 | + | ||
9041 | + DBG(DBG_VERY_NOISY, "ep0in %d bytes %d left %p\n", count, | ||
9042 | + req->req.length - req->req.actual, &req->req); | ||
9043 | + | ||
9044 | + if (unlikely (is_short)) { | ||
9045 | + if (ep->dev->req_pending) | ||
9046 | + ep0start(ep->dev, UDCCSR0_IPR, "short IN"); | ||
9047 | + else | ||
9048 | + UDCCSR0 = UDCCSR0_IPR; | ||
9049 | + | ||
9050 | + count = req->req.length; | ||
9051 | + done(ep, req, 0); | ||
9052 | + ep0_idle(ep->dev); | ||
9053 | +#if 0 | ||
9054 | + /* This seems to get rid of lost status irqs in some cases: | ||
9055 | + * host responds quickly, or next request involves config | ||
9056 | + * change automagic, or should have been hidden, or ... | ||
9057 | + * | ||
9058 | + * FIXME get rid of all udelays possible... | ||
9059 | + */ | ||
9060 | + if (count >= EP0_FIFO_SIZE) { | ||
9061 | + count = 100; | ||
9062 | + do { | ||
9063 | + if ((UDCCSR0 & UDCCSR0_OPC) != 0) { | ||
9064 | + /* clear OPC, generate ack */ | ||
9065 | + UDCCSR0 = UDCCSR0_OPC; | ||
9066 | + break; | ||
9067 | + } | ||
9068 | + count--; | ||
9069 | + udelay(1); | ||
9070 | + } while (count); | ||
9071 | + } | ||
9072 | +#endif | ||
9073 | + } else if (ep->dev->req_pending) | ||
9074 | + ep0start(ep->dev, 0, "IN"); | ||
9075 | + return is_short; | ||
9076 | +} | ||
9077 | + | ||
9078 | + | ||
9079 | +/* | ||
9080 | + * read_fifo - unload packet(s) from the fifo we use for usb OUT | ||
9081 | + * transfers and put them into the request. caller should have made | ||
9082 | + * sure there's at least one packet ready. | ||
9083 | + * | ||
9084 | + * returns true if the request completed because of short packet or the | ||
9085 | + * request buffer having filled (and maybe overran till end-of-packet). | ||
9086 | + */ | ||
9087 | +static int read_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) | ||
9088 | +{ | ||
9089 | + for (;;) { | ||
9090 | + u32 *buf; | ||
9091 | + int bufferspace, count, is_short; | ||
9092 | + | ||
9093 | + /* make sure there's a packet in the FIFO.*/ | ||
9094 | + if (unlikely ((*ep->reg_udccsr & UDCCSR_PC) == 0)) | ||
9095 | + break; | ||
9096 | + buf =(u32*) (req->req.buf + req->req.actual); | ||
9097 | + prefetchw(buf); | ||
9098 | + bufferspace = req->req.length - req->req.actual; | ||
9099 | + | ||
9100 | + /* read all bytes from this packet */ | ||
9101 | + if (likely (*ep->reg_udccsr & UDCCSR_BNE)) { | ||
9102 | + count = 0x3ff & *ep->reg_udcbcr; | ||
9103 | + req->req.actual += min(count, bufferspace); | ||
9104 | + } else /* zlp */ | ||
9105 | + count = 0; | ||
9106 | + | ||
9107 | + is_short = (count < ep->usb_ep->maxpacket); | ||
9108 | + dev_dbg(ep->dev->dev, "read %s udccsr:%02x, count:%d bytes%s req %p %d/%d\n", | ||
9109 | + ep->usb_ep->name, *ep->reg_udccsr, count, | ||
9110 | + is_short ? "/S" : "", | ||
9111 | + &req->req, req->req.actual, req->req.length); | ||
9112 | + | ||
9113 | + count = min(count, bufferspace); | ||
9114 | + while (likely (count > 0)) { | ||
9115 | + *buf++ = *ep->reg_udcdr; | ||
9116 | + count -= 4; | ||
9117 | + } | ||
9118 | + dev_dbg(ep->dev->dev, "Buf:0x%p\n", req->req.buf); | ||
9119 | + | ||
9120 | + *ep->reg_udccsr = UDCCSR_PC; | ||
9121 | + /* RPC/RSP/RNE could now reflect the other packet buffer */ | ||
9122 | + | ||
9123 | + /* completion */ | ||
9124 | + if (is_short || req->req.actual == req->req.length) { | ||
9125 | + done(ep, req, 0); | ||
9126 | + if (list_empty(&ep->queue)) | ||
9127 | + pio_irq_disable(ep->pxa_ep_num); | ||
9128 | + return 1; | ||
9129 | + } | ||
9130 | + | ||
9131 | + /* finished that packet. the next one may be waiting... */ | ||
9132 | + } | ||
9133 | + return 0; | ||
9134 | +} | ||
9135 | + | ||
9136 | +/* | ||
9137 | + * special ep0 version of the above. no UBCR0 or double buffering; status | ||
9138 | + * handshaking is magic. most device protocols don't need control-OUT. | ||
9139 | + * CDC vendor commands (and RNDIS), mass storage CB/CBI, and some other | ||
9140 | + * protocols do use them. | ||
9141 | + */ | ||
9142 | +static int read_ep0_fifo(struct pxa27x_ep *ep, struct pxa27x_request *req) | ||
9143 | +{ | ||
9144 | + u32 *buf, word; | ||
9145 | + unsigned bufferspace; | ||
9146 | + | ||
9147 | + buf = (u32*) (req->req.buf + req->req.actual); | ||
9148 | + bufferspace = req->req.length - req->req.actual; | ||
9149 | + | ||
9150 | + while (UDCCSR0 & UDCCSR0_RNE) { | ||
9151 | + word = UDCDR0; | ||
9152 | + | ||
9153 | + if (unlikely (bufferspace == 0)) { | ||
9154 | + /* this happens when the driver's buffer | ||
9155 | + * is smaller than what the host sent. | ||
9156 | + * discard the extra data. | ||
9157 | + */ | ||
9158 | + if (req->req.status != -EOVERFLOW) | ||
9159 | + dev_info(ep->dev->dev, "%s overflow\n", ep->usb_ep->name); | ||
9160 | + req->req.status = -EOVERFLOW; | ||
9161 | + } else { | ||
9162 | + *buf++ = word; | ||
9163 | + req->req.actual += 4; | ||
9164 | + bufferspace -= 4; | ||
9165 | + } | ||
9166 | + } | ||
9167 | + | ||
9168 | + UDCCSR0 = UDCCSR0_OPC ; | ||
9169 | + | ||
9170 | + /* completion */ | ||
9171 | + if (req->req.actual >= req->req.length) | ||
9172 | + return 1; | ||
9173 | + | ||
9174 | + /* finished that packet. the next one may be waiting... */ | ||
9175 | + return 0; | ||
9176 | +} | ||
9177 | + | ||
9178 | +#ifdef USE_DMA | ||
9179 | + | ||
9180 | +#define MAX_IN_DMA ((DCMD_LENGTH + 1) - BULK_FIFO_SIZE) | ||
9181 | +static void kick_dma(struct pxa27x_ep *ep, struct pxa27x_request *req) | ||
9182 | +{ | ||
9183 | + u32 dcmd = 0; | ||
9184 | + u32 len = req->req.length; | ||
9185 | + u32 buf = req->req.dma; | ||
9186 | + u32 fifo = io_v2p((u32)ep->reg_udcdr); | ||
9187 | + | ||
9188 | + buf += req->req.actual; | ||
9189 | + len -= req->req.actual; | ||
9190 | + ep->dma_con = 0; | ||
9191 | + | ||
9192 | + DMSG("%s: req:0x%p length:%d, actual:%d dma:%d\n", | ||
9193 | + __FUNCTION__, &req->req, req->req.length, | ||
9194 | + req->req.actual,ep->dma); | ||
9195 | + | ||
9196 | + /* no-descriptor mode can be simple for bulk-in, iso-in, iso-out */ | ||
9197 | + DCSR(ep->dma) = DCSR_NODESC; | ||
9198 | + if (buf & 0x3) | ||
9199 | + DALGN |= 1 << ep->dma; | ||
9200 | + else | ||
9201 | + DALGN &= ~(1 << ep->dma); | ||
9202 | + | ||
9203 | + if (ep->dir_in) { | ||
9204 | + DSADR(ep->dma) = buf; | ||
9205 | + DTADR(ep->dma) = fifo; | ||
9206 | + if (len > MAX_IN_DMA) { | ||
9207 | + len= MAX_IN_DMA; | ||
9208 | + ep->dma_con =1 ; | ||
9209 | + } else if (len >= ep->usb_ep->maxpacket) { | ||
9210 | + if ((ep->dma_con = (len % ep->usb_ep->maxpacket) != 0)) | ||
9211 | + len = ep->usb_ep->maxpacket; | ||
9212 | + } | ||
9213 | + dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN | ||
9214 | + | DCMD_FLOWTRG | DCMD_INCSRCADDR; | ||
9215 | + } else { | ||
9216 | + DSADR(ep->dma) = fifo; | ||
9217 | + DTADR(ep->dma) = buf; | ||
9218 | + dcmd = len | DCMD_BURST32 | DCMD_WIDTH4 | DCMD_ENDIRQEN | ||
9219 | + | DCMD_FLOWSRC | DCMD_INCTRGADDR; | ||
9220 | + } | ||
9221 | + *ep->reg_udccsr = UDCCSR_DME; | ||
9222 | + DCMD(ep->dma) = dcmd; | ||
9223 | + DCSR(ep->dma) = DCSR_NODESC | DCSR_EORIRQEN \ | ||
9224 | + | ((ep->dir_in) ? DCSR_STOPIRQEN : 0); | ||
9225 | + *ep->reg_drcmr = ep->dma | DRCMR_MAPVLD; | ||
9226 | + DCSR(ep->dma) |= DCSR_RUN; | ||
9227 | +} | ||
9228 | + | ||
9229 | +static void cancel_dma(struct pxa27x_ep *ep) | ||
9230 | +{ | ||
9231 | + struct pxa27x_request *req; | ||
9232 | + u32 tmp; | ||
9233 | + | ||
9234 | + if (DCSR(ep->dma) == 0 || list_empty(&ep->queue)) | ||
9235 | + return; | ||
9236 | + | ||
9237 | + DMSG("hehe dma:%d,dcsr:0x%x\n", ep->dma, DCSR(ep->dma)); | ||
9238 | + DCSR(ep->dma) = 0; | ||
9239 | + while ((DCSR(ep->dma) & DCSR_STOPSTATE) == 0) | ||
9240 | + cpu_relax(); | ||
9241 | + | ||
9242 | + req = list_entry(ep->queue.next, struct pxa27x_request, queue); | ||
9243 | + tmp = DCMD(ep->dma) & DCMD_LENGTH; | ||
9244 | + req->req.actual = req->req.length - tmp; | ||
9245 | + | ||
9246 | + /* the last tx packet may be incomplete, so flush the fifo. | ||
9247 | + * FIXME correct req.actual if we can | ||
9248 | + */ | ||
9249 | + *ep->reg_udccsr = UDCCSR_FEF; | ||
9250 | +} | ||
9251 | + | ||
9252 | +static void dma_nodesc_handler(int dmach, void *_ep) | ||
9253 | +{ | ||
9254 | + struct pxa27x_ep *ep = _ep; | ||
9255 | + struct pxa27x_request *req, *req_next; | ||
9256 | + u32 dcsr, tmp, completed; | ||
9257 | + | ||
9258 | + local_irq_disable(); | ||
9259 | + | ||
9260 | + req = list_entry(ep->queue.next, struct pxa27x_request, queue); | ||
9261 | + | ||
9262 | + DMSG("%s, buf:0x%p\n",__FUNCTION__, req->req.buf); | ||
9263 | + | ||
9264 | + ep->dma_irqs++; | ||
9265 | + ep->dev->stats.irqs++; | ||
9266 | + | ||
9267 | + completed = 0; | ||
9268 | + | ||
9269 | + dcsr = DCSR(dmach); | ||
9270 | + DCSR(ep->dma) &= ~DCSR_RUN; | ||
9271 | + | ||
9272 | + if (dcsr & DCSR_BUSERR) { | ||
9273 | + DCSR(dmach) = DCSR_BUSERR; | ||
9274 | + dev_err(ep->dev->dev, "DMA Bus Error\n"); | ||
9275 | + req->req.status = -EIO; | ||
9276 | + completed = 1; | ||
9277 | + } else if (dcsr & DCSR_ENDINTR) { | ||
9278 | + DCSR(dmach) = DCSR_ENDINTR; | ||
9279 | + if (ep->dir_in) { | ||
9280 | + tmp = req->req.length - req->req.actual; | ||
9281 | + /* Last packet is a short one*/ | ||
9282 | + if (tmp < ep->usb_ep->maxpacket) { | ||
9283 | + int count = 0; | ||
9284 | + | ||
9285 | + *ep->reg_udccsr = UDCCSR_SP | \ | ||
9286 | + (*ep->reg_udccsr & UDCCSR_MASK); | ||
9287 | + /*Wait for packet out */ | ||
9288 | + while( (count++ < 10000) && \ | ||
9289 | + !(*ep->reg_udccsr & UDCCSR_FS)); | ||
9290 | + if (count >= 10000) | ||
9291 | + DMSG("Failed to send packet\n"); | ||
9292 | + else | ||
9293 | + DMSG("%s: short packet sent len:%d," | ||
9294 | + "length:%d,actual:%d\n", __FUNCTION__, | ||
9295 | + tmp, req->req.length, req->req.actual); | ||
9296 | + req->req.actual = req->req.length; | ||
9297 | + completed = 1; | ||
9298 | + /* There are still packets to transfer */ | ||
9299 | + } else if ( ep->dma_con) { | ||
9300 | + DMSG("%s: more packets,length:%d,actual:%d\n", | ||
9301 | + __FUNCTION__,req->req.length, | ||
9302 | + req->req.actual); | ||
9303 | + req->req.actual += ep->usb_ep->maxpacket; | ||
9304 | + completed = 0; | ||
9305 | + } else { | ||
9306 | + DMSG("%s: no more packets,length:%d," | ||
9307 | + "actual:%d\n", __FUNCTION__, | ||
9308 | + req->req.length, req->req.actual); | ||
9309 | + req->req.actual = req->req.length; | ||
9310 | + completed = 1; | ||
9311 | + } | ||
9312 | + } else { | ||
9313 | + req->req.actual = req->req.length; | ||
9314 | + completed = 1; | ||
9315 | + } | ||
9316 | + } else if (dcsr & DCSR_EORINTR) { //Only happened in OUT DMA | ||
9317 | + int remain,udccsr ; | ||
9318 | + | ||
9319 | + DCSR(dmach) = DCSR_EORINTR; | ||
9320 | + remain = DCMD(dmach) & DCMD_LENGTH; | ||
9321 | + req->req.actual = req->req.length - remain; | ||
9322 | + | ||
9323 | + udccsr = *ep->reg_udccsr; | ||
9324 | + if (udccsr & UDCCSR_SP) { | ||
9325 | + *ep->reg_udccsr = UDCCSR_PC | (udccsr & UDCCSR_MASK); | ||
9326 | + completed = 1; | ||
9327 | + } | ||
9328 | + DMSG("%s: length:%d actual:%d\n", | ||
9329 | + __FUNCTION__, req->req.length, req->req.actual); | ||
9330 | + } else | ||
9331 | + DMSG("%s: Others dma:%d DCSR:0x%x DCMD:0x%x\n", | ||
9332 | + __FUNCTION__, dmach, DCSR(dmach), DCMD(dmach)); | ||
9333 | + | ||
9334 | + if (likely(completed)) { | ||
9335 | + if (req->queue.next != &ep->queue) { | ||
9336 | + req_next = list_entry(req->queue.next, | ||
9337 | + struct pxa27x_request, queue); | ||
9338 | + kick_dma(ep, req_next); | ||
9339 | + } | ||
9340 | + done(ep, req, 0); | ||
9341 | + } else { | ||
9342 | + kick_dma(ep, req); | ||
9343 | + } | ||
9344 | + | ||
9345 | + local_irq_enable(); | ||
9346 | +} | ||
9347 | + | ||
9348 | +#endif | ||
9349 | +/*-------------------------------------------------------------------------*/ | ||
9350 | + | ||
9351 | +static int | ||
9352 | +pxa27x_ep_queue(struct usb_ep *_ep, struct usb_request *_req, unsigned gfp_flags) | ||
9353 | +{ | ||
9354 | + struct pxa27x_virt_ep *virt_ep; | ||
9355 | + struct pxa27x_ep *ep; | ||
9356 | + struct pxa27x_request *req; | ||
9357 | + struct pxa27x_udc *dev; | ||
9358 | + unsigned long flags; | ||
9359 | + | ||
9360 | + virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
9361 | + ep = virt_ep->pxa_ep; | ||
9362 | + | ||
9363 | + req = container_of(_req, struct pxa27x_request, req); | ||
9364 | + if (unlikely (!_req || !_req->complete || !_req->buf|| | ||
9365 | + !list_empty(&req->queue))) { | ||
9366 | + DMSG("%s, bad params\n", __FUNCTION__); | ||
9367 | + return -EINVAL; | ||
9368 | + } | ||
9369 | + | ||
9370 | + if (unlikely (!_ep || (!ep->desc && _ep->name != ep0name))) { | ||
9371 | + DMSG("%s, bad ep\n", __FUNCTION__); | ||
9372 | + return -EINVAL; | ||
9373 | + } | ||
9374 | + | ||
9375 | + DMSG("%s, ep point %d is queue\n", __FUNCTION__, ep->ep_num); | ||
9376 | + | ||
9377 | + dev = ep->dev; | ||
9378 | + if (unlikely (!dev->driver | ||
9379 | + || dev->gadget.speed == USB_SPEED_UNKNOWN)) { | ||
9380 | + DMSG("%s, bogus device state\n", __FUNCTION__); | ||
9381 | + return -ESHUTDOWN; | ||
9382 | + } | ||
9383 | + | ||
9384 | + /* iso is always one packet per request, that's the only way | ||
9385 | + * we can report per-packet status. that also helps with dma. | ||
9386 | + */ | ||
9387 | + if (unlikely (ep->ep_type == USB_ENDPOINT_XFER_ISOC | ||
9388 | + && req->req.length > le16_to_cpu | ||
9389 | + (ep->desc->wMaxPacketSize))) | ||
9390 | + return -EMSGSIZE; | ||
9391 | + | ||
9392 | +#ifdef USE_DMA | ||
9393 | + // FIXME caller may already have done the dma mapping | ||
9394 | + if (ep->dma >= 0) { | ||
9395 | + _req->dma = dma_map_single(dev->dev, _req->buf, _req->length, | ||
9396 | + (ep->dir_in) ? DMA_TO_DEVICE : DMA_FROM_DEVICE); | ||
9397 | + } | ||
9398 | +#endif | ||
9399 | + | ||
9400 | + DBG(DBG_NOISY, "%s queue req %p, len %d buf %p\n", | ||
9401 | + _ep->name, _req, _req->length, _req->buf); | ||
9402 | + | ||
9403 | + local_irq_save(flags); | ||
9404 | + | ||
9405 | + _req->status = -EINPROGRESS; | ||
9406 | + _req->actual = 0; | ||
9407 | + | ||
9408 | + /* kickstart this i/o queue? */ | ||
9409 | + if (list_empty(&ep->queue) && !ep->stopped) { | ||
9410 | + if (ep->desc == 0 /* ep0 */) { | ||
9411 | + unsigned length = _req->length; | ||
9412 | + | ||
9413 | + switch (dev->ep0state) { | ||
9414 | + case EP0_IN_DATA_PHASE: | ||
9415 | + dev->stats.write.ops++; | ||
9416 | + if (write_ep0_fifo(ep, req)) | ||
9417 | + req = 0; | ||
9418 | + break; | ||
9419 | + | ||
9420 | + case EP0_OUT_DATA_PHASE: | ||
9421 | + dev->stats.read.ops++; | ||
9422 | + if (dev->req_pending) | ||
9423 | + ep0start(dev, UDCCSR0_IPR, "OUT"); | ||
9424 | + if (length == 0 || ((UDCCSR0 & UDCCSR0_RNE) != 0 | ||
9425 | + && read_ep0_fifo(ep, req))) { | ||
9426 | + ep0_idle(dev); | ||
9427 | + done(ep, req, 0); | ||
9428 | + req = 0; | ||
9429 | + } | ||
9430 | + break; | ||
9431 | + case EP0_NO_ACTION: | ||
9432 | + ep0_idle(dev); | ||
9433 | + req=0; | ||
9434 | + break; | ||
9435 | + default: | ||
9436 | + DMSG("ep0 i/o, odd state %d\n", dev->ep0state); | ||
9437 | + local_irq_restore (flags); | ||
9438 | + return -EL2HLT; | ||
9439 | + } | ||
9440 | +#ifdef USE_DMA | ||
9441 | + /* either start dma or prime pio pump */ | ||
9442 | + } else if (ep->dma >= 0) { | ||
9443 | + kick_dma(ep, req); | ||
9444 | +#endif | ||
9445 | + /* can the FIFO can satisfy the request immediately? */ | ||
9446 | + } else if (ep->dir_in && (*ep->reg_udccsr & UDCCSR_FS) != 0 | ||
9447 | + && write_fifo(ep, req)) { | ||
9448 | + req = 0; | ||
9449 | + } else if ((*ep->reg_udccsr & UDCCSR_FS) != 0 | ||
9450 | + && read_fifo(ep, req)) { | ||
9451 | + req = 0; | ||
9452 | + } | ||
9453 | + DMSG("req:%p,ep->desc:%p,ep->dma:%d\n", req, ep->desc, ep->dma); | ||
9454 | + if (likely (req && ep->desc) && ep->dma < 0) | ||
9455 | + pio_irq_enable(ep->pxa_ep_num); | ||
9456 | + } | ||
9457 | + | ||
9458 | + /* pio or dma irq handler advances the queue. */ | ||
9459 | + if (likely (req != 0)) | ||
9460 | + list_add_tail(&req->queue, &ep->queue); | ||
9461 | + local_irq_restore(flags); | ||
9462 | + | ||
9463 | + return 0; | ||
9464 | +} | ||
9465 | + | ||
9466 | + | ||
9467 | +/* | ||
9468 | + * nuke - dequeue ALL requests | ||
9469 | + */ | ||
9470 | +static void nuke(struct pxa27x_ep *ep, int status) | ||
9471 | +{ | ||
9472 | + struct pxa27x_request *req; | ||
9473 | + | ||
9474 | + /* called with irqs blocked */ | ||
9475 | +#ifdef USE_DMA | ||
9476 | + if (ep->dma >= 0 && !ep->stopped) | ||
9477 | + cancel_dma(ep); | ||
9478 | +#endif | ||
9479 | + while (!list_empty(&ep->queue)) { | ||
9480 | + req = list_entry(ep->queue.next, struct pxa27x_request, queue); | ||
9481 | + done(ep, req, status); | ||
9482 | + } | ||
9483 | + if (ep->desc) | ||
9484 | + pio_irq_disable(ep->pxa_ep_num); | ||
9485 | +} | ||
9486 | + | ||
9487 | + | ||
9488 | +/* dequeue JUST ONE request */ | ||
9489 | +static int pxa27x_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | ||
9490 | +{ | ||
9491 | + struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
9492 | + struct pxa27x_ep *ep = virt_ep->pxa_ep; | ||
9493 | + struct pxa27x_request *req; | ||
9494 | + unsigned long flags; | ||
9495 | + | ||
9496 | + if (!_ep || _ep->name == ep0name) | ||
9497 | + return -EINVAL; | ||
9498 | + | ||
9499 | + local_irq_save(flags); | ||
9500 | + | ||
9501 | + /* make sure it's actually queued on this endpoint */ | ||
9502 | + list_for_each_entry(req, &ep->queue, queue) { | ||
9503 | + if (&req->req == _req) | ||
9504 | + break; | ||
9505 | + } | ||
9506 | + if (&req->req != _req) { | ||
9507 | + local_irq_restore(flags); | ||
9508 | + return -EINVAL; | ||
9509 | + } | ||
9510 | + | ||
9511 | +#ifdef USE_DMA | ||
9512 | + if (ep->dma >= 0 && ep->queue.next == &req->queue && !ep->stopped) { | ||
9513 | + cancel_dma(ep); | ||
9514 | + done(ep, req, -ECONNRESET); | ||
9515 | + /* restart i/o */ | ||
9516 | + if (!list_empty(&ep->queue)) { | ||
9517 | + req = list_entry(ep->queue.next, | ||
9518 | + struct pxa27x_request, queue); | ||
9519 | + kick_dma(ep, req); | ||
9520 | + } | ||
9521 | + } else | ||
9522 | +#endif | ||
9523 | + done(ep, req, -ECONNRESET); | ||
9524 | + | ||
9525 | + local_irq_restore(flags); | ||
9526 | + return 0; | ||
9527 | +} | ||
9528 | + | ||
9529 | +/*-------------------------------------------------------------------------*/ | ||
9530 | + | ||
9531 | +static int pxa27x_ep_set_halt(struct usb_ep *_ep, int value) | ||
9532 | +{ | ||
9533 | + struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
9534 | + struct pxa27x_ep *ep = virt_ep->pxa_ep; | ||
9535 | + unsigned long flags; | ||
9536 | + | ||
9537 | + DMSG("%s is called\n", __FUNCTION__); | ||
9538 | + if (unlikely (!_ep || (!ep->desc && _ep->name != ep0name)) | ||
9539 | + || ep->ep_type == USB_ENDPOINT_XFER_ISOC) { | ||
9540 | + DMSG("%s, bad ep\n", __FUNCTION__); | ||
9541 | + return -EINVAL; | ||
9542 | + } | ||
9543 | + if (value == 0) { | ||
9544 | + /* this path (reset toggle+halt) is needed to implement | ||
9545 | + * SET_INTERFACE on normal hardware. but it can't be | ||
9546 | + * done from software on the PXA UDC, and the hardware | ||
9547 | + * forgets to do it as part of SET_INTERFACE automagic. | ||
9548 | + */ | ||
9549 | + DMSG("only host can clear %s halt\n", _ep->name); | ||
9550 | + return -EROFS; | ||
9551 | + } | ||
9552 | + | ||
9553 | + local_irq_save(flags); | ||
9554 | + | ||
9555 | + if (ep->dir_in && ((*ep->reg_udccsr & UDCCSR_FS) == 0 | ||
9556 | + || !list_empty(&ep->queue))) { | ||
9557 | + local_irq_restore(flags); | ||
9558 | + return -EAGAIN; | ||
9559 | + } | ||
9560 | + | ||
9561 | + /* FST bit is the same for control, bulk in, bulk out, interrupt in */ | ||
9562 | + *ep->reg_udccsr = UDCCSR_FST|UDCCSR_FEF; | ||
9563 | + | ||
9564 | + /* ep0 needs special care */ | ||
9565 | + if (!ep->desc) { | ||
9566 | + start_watchdog(ep->dev); | ||
9567 | + ep->dev->req_pending = 0; | ||
9568 | + ep->dev->ep0state = EP0_STALL; | ||
9569 | + | ||
9570 | + /* and bulk/intr endpoints like dropping stalls too */ | ||
9571 | + } else { | ||
9572 | + unsigned i; | ||
9573 | + for (i = 0; i < 1000; i += 20) { | ||
9574 | + if (*ep->reg_udccsr & UDCCSR_SST) | ||
9575 | + break; | ||
9576 | + udelay(20); | ||
9577 | + } | ||
9578 | + } | ||
9579 | + local_irq_restore(flags); | ||
9580 | + | ||
9581 | + DBG(DBG_VERBOSE, "%s halt\n", _ep->name); | ||
9582 | + return 0; | ||
9583 | +} | ||
9584 | + | ||
9585 | +static int pxa27x_ep_fifo_status(struct usb_ep *_ep) | ||
9586 | +{ | ||
9587 | + struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
9588 | + struct pxa27x_ep *ep = virt_ep->pxa_ep; | ||
9589 | + | ||
9590 | + if (!_ep) { | ||
9591 | + DMSG("%s, bad ep\n", __FUNCTION__); | ||
9592 | + return -ENODEV; | ||
9593 | + } | ||
9594 | + /* pxa can't report unclaimed bytes from IN fifos */ | ||
9595 | + if (ep->dir_in) | ||
9596 | + return -EOPNOTSUPP; | ||
9597 | + if (ep->dev->gadget.speed == USB_SPEED_UNKNOWN | ||
9598 | + || (*ep->reg_udccsr & UDCCSR_FS) == 0) | ||
9599 | + return 0; | ||
9600 | + else | ||
9601 | + return (*ep->reg_udcbcr & 0xfff) + 1; | ||
9602 | +} | ||
9603 | + | ||
9604 | +static void pxa27x_ep_fifo_flush(struct usb_ep *_ep) | ||
9605 | +{ | ||
9606 | + struct pxa27x_virt_ep *virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
9607 | + struct pxa27x_ep *ep = virt_ep->pxa_ep; | ||
9608 | + | ||
9609 | + DMSG("pxa27x_ep_fifo_flush\n"); | ||
9610 | + | ||
9611 | + if (!_ep || _ep->name == ep0name || !list_empty(&ep->queue)) { | ||
9612 | + DMSG("%s, bad ep\n", __FUNCTION__); | ||
9613 | + return; | ||
9614 | + } | ||
9615 | + | ||
9616 | + /* toggle and halt bits stay unchanged */ | ||
9617 | + | ||
9618 | + /* for OUT, just read and discard the FIFO contents. */ | ||
9619 | + if (!ep->dir_in) { | ||
9620 | + while (((*ep->reg_udccsr) & UDCCSR_BNE) != 0) | ||
9621 | + (void) *ep->reg_udcdr; | ||
9622 | + return; | ||
9623 | + } | ||
9624 | + | ||
9625 | + /* most IN status is the same, but ISO can't stall */ | ||
9626 | + *ep->reg_udccsr = UDCCSR_PC|UDCCSR_FST|UDCCSR_TRN | ||
9627 | + | (ep->ep_type == USB_ENDPOINT_XFER_ISOC) | ||
9628 | + ? 0 : UDCCSR_SST; | ||
9629 | +} | ||
9630 | + | ||
9631 | + | ||
9632 | +static struct usb_ep_ops pxa27x_ep_ops = { | ||
9633 | + .enable = pxa27x_ep_enable, | ||
9634 | + .disable = pxa27x_ep_disable, | ||
9635 | + | ||
9636 | + .alloc_request = pxa27x_ep_alloc_request, | ||
9637 | + .free_request = pxa27x_ep_free_request, | ||
9638 | + | ||
9639 | + .queue = pxa27x_ep_queue, | ||
9640 | + .dequeue = pxa27x_ep_dequeue, | ||
9641 | + | ||
9642 | + .set_halt = pxa27x_ep_set_halt, | ||
9643 | + .fifo_status = pxa27x_ep_fifo_status, | ||
9644 | + .fifo_flush = pxa27x_ep_fifo_flush, | ||
9645 | +}; | ||
9646 | + | ||
9647 | + | ||
9648 | +/* --------------------------------------------------------------------------- | ||
9649 | + * device-scoped parts of the api to the usb controller hardware | ||
9650 | + * --------------------------------------------------------------------------- | ||
9651 | + */ | ||
9652 | + | ||
9653 | +static inline unsigned int validate_fifo_size(u8 bmAttributes) | ||
9654 | +{ | ||
9655 | + switch (bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { | ||
9656 | + case USB_ENDPOINT_XFER_CONTROL: | ||
9657 | + return EP0_FIFO_SIZE; | ||
9658 | + break; | ||
9659 | + case USB_ENDPOINT_XFER_ISOC: | ||
9660 | + return ISO_FIFO_SIZE; | ||
9661 | + break; | ||
9662 | + case USB_ENDPOINT_XFER_BULK: | ||
9663 | + return BULK_FIFO_SIZE; | ||
9664 | + break; | ||
9665 | + case USB_ENDPOINT_XFER_INT: | ||
9666 | + return INT_FIFO_SIZE; | ||
9667 | + break; | ||
9668 | + default: | ||
9669 | + break; | ||
9670 | + } | ||
9671 | +} | ||
9672 | + | ||
9673 | +static void pxa27x_ep_free(struct usb_gadget *gadget, struct usb_ep *_ep) | ||
9674 | +{ | ||
9675 | + struct pxa27x_udc *dev = the_controller; | ||
9676 | + struct pxa27x_virt_ep *virt_ep; | ||
9677 | + int i; | ||
9678 | + | ||
9679 | + virt_ep = container_of(_ep, struct pxa27x_virt_ep, usb_ep); | ||
9680 | + | ||
9681 | + for (i = 1; i < UDC_EP_NUM; i++) { | ||
9682 | + if (dev->ep[i].usb_ep == &virt_ep->usb_ep) { | ||
9683 | + if (dev->ep[i].desc) { | ||
9684 | + virt_ep->pxa_ep = &dev->ep[i]; | ||
9685 | + pxa27x_ep_disable(&virt_ep->usb_ep); | ||
9686 | + } | ||
9687 | + dev->ep[i].usb_ep = NULL; | ||
9688 | + } | ||
9689 | + } | ||
9690 | + | ||
9691 | + if (!list_empty(&virt_ep->usb_ep.ep_list)) | ||
9692 | + list_del_init(&virt_ep->usb_ep.ep_list); | ||
9693 | + | ||
9694 | + kfree(virt_ep->usb_ep.name); | ||
9695 | + kfree(virt_ep); | ||
9696 | +} | ||
9697 | + | ||
9698 | +static void pxa27x_ep_freeall(struct usb_gadget *gadget) | ||
9699 | +{ | ||
9700 | + struct pxa27x_udc *dev = the_controller; | ||
9701 | + int i; | ||
9702 | + | ||
9703 | + for (i = 1; i < UDC_EP_NUM; i++) { | ||
9704 | + if(dev->ep[i].usb_ep) | ||
9705 | + pxa27x_ep_free(gadget, dev->ep[i].usb_ep); | ||
9706 | + } | ||
9707 | +} | ||
9708 | + | ||
9709 | +#define NAME_SIZE 18 | ||
9710 | + | ||
9711 | +static int pxa27x_find_free_ep(struct pxa27x_udc *dev) | ||
9712 | +{ | ||
9713 | + int i; | ||
9714 | + for (i = 1; i < UDC_EP_NUM; i++) { | ||
9715 | + if(!dev->ep[i].assigned) | ||
9716 | + return i; | ||
9717 | + } | ||
9718 | + return -1; | ||
9719 | +} | ||
9720 | + | ||
9721 | +/* | ||
9722 | + * Endpoint Allocation/Configuration | ||
9723 | + * | ||
9724 | + * pxa27x endpoint configuration is fixed when the device is enabled. Any pxa | ||
9725 | + * endpoint is only active in one configuration, interface and alternate | ||
9726 | + * interface combination so to support gadget drivers, we map one usb_ep to | ||
9727 | + * one of several pxa ep's. One pxa endpoint is assigned per configuration | ||
9728 | + * combination. | ||
9729 | + */ | ||
9730 | +static struct usb_ep* pxa27x_ep_alloc(struct usb_gadget *gadget, struct usb_endpoint_descriptor *desc, | ||
9731 | + struct usb_endpoint_config *epconfig, int configs) | ||
9732 | +{ | ||
9733 | + struct pxa27x_udc *dev = the_controller; | ||
9734 | + struct pxa27x_virt_ep *virt_ep; | ||
9735 | + unsigned int i, fifo_size; | ||
9736 | + char *name; | ||
9737 | + | ||
9738 | + if (unlikely(configs < 1)) { | ||
9739 | + dev_err(dev->dev, "%s: Error in config data\n", __FUNCTION__); | ||
9740 | + return NULL; | ||
9741 | + } | ||
9742 | + | ||
9743 | + virt_ep = kmalloc(sizeof(struct pxa27x_virt_ep), GFP_KERNEL); | ||
9744 | + name = kmalloc(NAME_SIZE, GFP_KERNEL); | ||
9745 | + if (!virt_ep || !name) { | ||
9746 | + dev_err(dev->dev, "%s: -ENOMEM\n", __FUNCTION__); | ||
9747 | + kfree(name); | ||
9748 | + kfree(virt_ep); | ||
9749 | + return NULL; | ||
9750 | + } | ||
9751 | + | ||
9752 | + if (!(desc->wMaxPacketSize)) { | ||
9753 | + fifo_size = validate_fifo_size(desc->bmAttributes); | ||
9754 | + desc->wMaxPacketSize = fifo_size; | ||
9755 | + } else { | ||
9756 | + fifo_size = desc->wMaxPacketSize; | ||
9757 | + } | ||
9758 | + | ||
9759 | + DMSG("pxa27x_ep_alloc: bLength: %d, bDescriptorType: %x, bEndpointAddress: %x,\n" | ||
9760 | + " bmAttributes: %x, wMaxPacketSize: %d\n", desc->bLength, | ||
9761 | + desc->bDescriptorType, desc->bEndpointAddress, desc->bmAttributes, | ||
9762 | + desc->wMaxPacketSize); | ||
9763 | + | ||
9764 | + if (!(desc->bEndpointAddress & 0xF)) | ||
9765 | + desc->bEndpointAddress |= dev->ep_num; | ||
9766 | + | ||
9767 | + for (i = 0; i < configs; i++) | ||
9768 | + { | ||
9769 | + struct pxa27x_ep *pxa_ep; | ||
9770 | + int j; | ||
9771 | + | ||
9772 | + DMSG("pxa27x_ep_alloc: config: %d, interface: %d, altinterface: %x,\n", | ||
9773 | + epconfig->config, epconfig->interface, epconfig->altinterface); | ||
9774 | + | ||
9775 | + j = pxa27x_find_free_ep(dev); | ||
9776 | + | ||
9777 | + if (unlikely(j < 0)) { | ||
9778 | + dev_err(dev->dev, "pxa27x_ep_alloc: Failed to find a spare endpoint\n"); | ||
9779 | + pxa27x_ep_free(gadget, &virt_ep->usb_ep); | ||
9780 | + return NULL; | ||
9781 | + } | ||
9782 | + | ||
9783 | + pxa_ep = &dev->ep[j]; | ||
9784 | + | ||
9785 | + if (i == 0) | ||
9786 | + virt_ep->pxa_ep = pxa_ep; | ||
9787 | + | ||
9788 | + pxa_ep->assigned = 1; | ||
9789 | + pxa_ep->ep_num = dev->ep_num; | ||
9790 | + pxa_ep->pxa_ep_num = j; | ||
9791 | + pxa_ep->usb_ep = &virt_ep->usb_ep; | ||
9792 | + pxa_ep->dev = dev; | ||
9793 | + pxa_ep->desc = desc; | ||
9794 | + pxa_ep->pio_irqs = pxa_ep->dma_irqs = 0; | ||
9795 | + pxa_ep->dma = -1; | ||
9796 | + | ||
9797 | + pxa_ep->fifo_size = fifo_size; | ||
9798 | + pxa_ep->dir_in = (desc->bEndpointAddress & USB_DIR_IN) ? 1 : 0; | ||
9799 | + pxa_ep->ep_type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; | ||
9800 | + pxa_ep->stopped = 1; | ||
9801 | + pxa_ep->dma_con = 0; | ||
9802 | + pxa_ep->config = epconfig->config; | ||
9803 | + pxa_ep->interface = epconfig->interface; | ||
9804 | + pxa_ep->aisn = epconfig->altinterface; | ||
9805 | + | ||
9806 | + pxa_ep->reg_udccsr = &UDCCSR0 + j; | ||
9807 | + pxa_ep->reg_udcbcr = &UDCBCR0 + j; | ||
9808 | + pxa_ep->reg_udcdr = &UDCDR0 + j ; | ||
9809 | + pxa_ep->reg_udccr = &UDCCRA - 1 + j; | ||
9810 | +#ifdef USE_DMA | ||
9811 | + pxa_ep->reg_drcmr = &DRCMR24 + j; | ||
9812 | +#endif | ||
9813 | + | ||
9814 | + /* Configure UDCCR */ | ||
9815 | + *pxa_ep->reg_udccr = ((pxa_ep->config << UDCCONR_CN_S) & UDCCONR_CN) | ||
9816 | + | ((pxa_ep->interface << UDCCONR_IN_S) & UDCCONR_IN) | ||
9817 | + | ((pxa_ep->aisn << UDCCONR_AISN_S) & UDCCONR_AISN) | ||
9818 | + | ((dev->ep_num << UDCCONR_EN_S) & UDCCONR_EN) | ||
9819 | + | ((pxa_ep->ep_type << UDCCONR_ET_S) & UDCCONR_ET) | ||
9820 | + | ((pxa_ep->dir_in) ? UDCCONR_ED : 0) | ||
9821 | + | ((min(pxa_ep->fifo_size, (unsigned)desc->wMaxPacketSize) << UDCCONR_MPS_S ) & UDCCONR_MPS) | ||
9822 | + | UDCCONR_EE; | ||
9823 | +// | UDCCONR_DE | UDCCONR_EE; | ||
9824 | + | ||
9825 | + | ||
9826 | + | ||
9827 | +#ifdef USE_DMA | ||
9828 | + /* Only BULK use DMA */ | ||
9829 | + if ((pxa_ep->ep_type & USB_ENDPOINT_XFERTYPE_MASK)\ | ||
9830 | + == USB_ENDPOINT_XFER_BULK) | ||
9831 | + *pxa_ep->reg_udccsr = UDCCSR_DME; | ||
9832 | +#endif | ||
9833 | + | ||
9834 | + DMSG("UDCCR: 0x%p is 0x%x\n", pxa_ep->reg_udccr,*pxa_ep->reg_udccr); | ||
9835 | + | ||
9836 | + epconfig++; | ||
9837 | + } | ||
9838 | + | ||
9839 | + /* Fill ep name*/ | ||
9840 | + switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) { | ||
9841 | + case USB_ENDPOINT_XFER_BULK: | ||
9842 | + sprintf(name, "ep%d%s-bulk", dev->ep_num, | ||
9843 | + ((desc->bEndpointAddress & USB_DIR_IN) ? "in":"out")); | ||
9844 | + break; | ||
9845 | + case USB_ENDPOINT_XFER_INT: | ||
9846 | + sprintf(name, "ep%d%s-intr", dev->ep_num, | ||
9847 | + ((desc->bEndpointAddress & USB_DIR_IN) ? "in":"out")); | ||
9848 | + break; | ||
9849 | + default: | ||
9850 | + sprintf(name, "ep%d%s", dev->ep_num, | ||
9851 | + ((desc->bEndpointAddress & USB_DIR_IN) ? "in":"out")); | ||
9852 | + break; | ||
9853 | + } | ||
9854 | + | ||
9855 | + virt_ep->desc = desc; | ||
9856 | + virt_ep->usb_ep.name = name; | ||
9857 | + virt_ep->usb_ep.ops = &pxa27x_ep_ops; | ||
9858 | + virt_ep->usb_ep.maxpacket = min((ushort)fifo_size, desc->wMaxPacketSize); | ||
9859 | + | ||
9860 | + list_add_tail(&virt_ep->usb_ep.ep_list, &gadget->ep_list); | ||
9861 | + | ||
9862 | + dev->ep_num++; | ||
9863 | + return &virt_ep->usb_ep; | ||
9864 | +} | ||
9865 | + | ||
9866 | +static int pxa27x_udc_get_frame(struct usb_gadget *_gadget) | ||
9867 | +{ | ||
9868 | + return (UDCFNR & 0x7FF); | ||
9869 | +} | ||
9870 | + | ||
9871 | +static int pxa27x_udc_wakeup(struct usb_gadget *_gadget) | ||
9872 | +{ | ||
9873 | + /* host may not have enabled remote wakeup */ | ||
9874 | + if ((UDCCR & UDCCR_DWRE) == 0) | ||
9875 | + return -EHOSTUNREACH; | ||
9876 | + udc_set_mask_UDCCR(UDCCR_UDR); | ||
9877 | + return 0; | ||
9878 | +} | ||
9879 | + | ||
9880 | +static const struct usb_gadget_ops pxa27x_udc_ops = { | ||
9881 | + .ep_alloc = pxa27x_ep_alloc, | ||
9882 | + .get_frame = pxa27x_udc_get_frame, | ||
9883 | + .wakeup = pxa27x_udc_wakeup, | ||
9884 | + // current versions must always be self-powered | ||
9885 | +}; | ||
9886 | + | ||
9887 | + | ||
9888 | +/*-------------------------------------------------------------------------*/ | ||
9889 | + | ||
9890 | +#ifdef UDC_PROC_FILE | ||
9891 | + | ||
9892 | +static const char proc_node_name [] = "driver/udc"; | ||
9893 | + | ||
9894 | +static int | ||
9895 | +udc_proc_read(char *page, char **start, off_t off, int count, | ||
9896 | + int *eof, void *_dev) | ||
9897 | +{ | ||
9898 | + char *buf = page; | ||
9899 | + struct pxa27x_udc *dev = _dev; | ||
9900 | + char *next = buf; | ||
9901 | + unsigned size = count; | ||
9902 | + unsigned long flags; | ||
9903 | + int i, t; | ||
9904 | + u32 tmp; | ||
9905 | + | ||
9906 | + if (off != 0) | ||
9907 | + return 0; | ||
9908 | + | ||
9909 | + local_irq_save(flags); | ||
9910 | + | ||
9911 | + /* basic device status */ | ||
9912 | + t = scnprintf(next, size, DRIVER_DESC "\n" | ||
9913 | + "%s version: %s\nGadget driver: %s\n", | ||
9914 | + driver_name, DRIVER_VERSION DMASTR, | ||
9915 | + dev->driver ? dev->driver->driver.name : "(none)"); | ||
9916 | + size -= t; | ||
9917 | + next += t; | ||
9918 | + | ||
9919 | + /* registers for device and ep0 */ | ||
9920 | + t = scnprintf(next, size, | ||
9921 | + "uicr %02X.%02X, usir %02X.%02x, ufnr %02X\n", | ||
9922 | + UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); | ||
9923 | + size -= t; | ||
9924 | + next += t; | ||
9925 | + | ||
9926 | + tmp = UDCCR; | ||
9927 | + t = scnprintf(next, size,"udccr %02X =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", tmp, | ||
9928 | + (tmp & UDCCR_OEN) ? " oen":"", | ||
9929 | + (tmp & UDCCR_AALTHNP) ? " aalthnp":"", | ||
9930 | + (tmp & UDCCR_AHNP) ? " rem" : "", | ||
9931 | + (tmp & UDCCR_BHNP) ? " rstir" : "", | ||
9932 | + (tmp & UDCCR_DWRE) ? " dwre" : "", | ||
9933 | + (tmp & UDCCR_SMAC) ? " smac" : "", | ||
9934 | + (tmp & UDCCR_EMCE) ? " emce" : "", | ||
9935 | + (tmp & UDCCR_UDR) ? " udr" : "", | ||
9936 | + (tmp & UDCCR_UDA) ? " uda" : "", | ||
9937 | + (tmp & UDCCR_UDE) ? " ude" : "", | ||
9938 | + (tmp & UDCCR_ACN) >> UDCCR_ACN_S, | ||
9939 | + (tmp & UDCCR_AIN) >> UDCCR_AIN_S, | ||
9940 | + (tmp & UDCCR_AAISN)>> UDCCR_AAISN_S ); | ||
9941 | + | ||
9942 | + size -= t; | ||
9943 | + next += t; | ||
9944 | + | ||
9945 | + tmp = UDCCSR0; | ||
9946 | + t = scnprintf(next, size, | ||
9947 | + "udccsr0 %02X =%s%s%s%s%s%s%s\n", tmp, | ||
9948 | + (tmp & UDCCSR0_SA) ? " sa" : "", | ||
9949 | + (tmp & UDCCSR0_RNE) ? " rne" : "", | ||
9950 | + (tmp & UDCCSR0_FST) ? " fst" : "", | ||
9951 | + (tmp & UDCCSR0_SST) ? " sst" : "", | ||
9952 | + (tmp & UDCCSR0_DME) ? " dme" : "", | ||
9953 | + (tmp & UDCCSR0_IPR) ? " ipr" : "", | ||
9954 | + (tmp & UDCCSR0_OPC) ? " opc" : ""); | ||
9955 | + size -= t; | ||
9956 | + next += t; | ||
9957 | + | ||
9958 | + if (!dev->driver) | ||
9959 | + goto done; | ||
9960 | + | ||
9961 | + t = scnprintf(next, size, "ep0 IN %lu/%lu, OUT %lu/%lu\nirqs %lu\n\n", | ||
9962 | + dev->stats.write.bytes, dev->stats.write.ops, | ||
9963 | + dev->stats.read.bytes, dev->stats.read.ops, | ||
9964 | + dev->stats.irqs); | ||
9965 | + size -= t; | ||
9966 | + next += t; | ||
9967 | + | ||
9968 | + /* dump endpoint queues */ | ||
9969 | + for (i = 0; i < UDC_EP_NUM; i++) { | ||
9970 | + struct pxa27x_ep *ep = &dev->ep [i]; | ||
9971 | + struct pxa27x_request *req; | ||
9972 | + int t; | ||
9973 | + | ||
9974 | + if (i != 0) { | ||
9975 | + const struct usb_endpoint_descriptor *d; | ||
9976 | + | ||
9977 | + d = ep->desc; | ||
9978 | + if (!d) | ||
9979 | + continue; | ||
9980 | + tmp = *dev->ep [i].reg_udccsr; | ||
9981 | + t = scnprintf(next, size, | ||
9982 | + "%d max %d %s udccs %02x udccr:0x%x\n", | ||
9983 | + i, le16_to_cpu (d->wMaxPacketSize), | ||
9984 | + (ep->dma >= 0) ? "dma" : "pio", tmp, | ||
9985 | + *dev->ep[i].reg_udccr); | ||
9986 | + /* TODO translate all five groups of udccs bits! */ | ||
9987 | + | ||
9988 | + } else /* ep0 should only have one transfer queued */ | ||
9989 | + t = scnprintf(next, size, "ep0 max 16 pio irqs %lu\n", | ||
9990 | + ep->pio_irqs); | ||
9991 | + if (t <= 0 || t > size) | ||
9992 | + goto done; | ||
9993 | + size -= t; | ||
9994 | + next += t; | ||
9995 | + | ||
9996 | + if (list_empty(&ep->queue)) { | ||
9997 | + t = scnprintf(next, size, "\t(nothing queued)\n"); | ||
9998 | + if (t <= 0 || t > size) | ||
9999 | + goto done; | ||
10000 | + size -= t; | ||
10001 | + next += t; | ||
10002 | + continue; | ||
10003 | + } | ||
10004 | + list_for_each_entry(req, &ep->queue, queue) { | ||
10005 | +#ifdef USE_DMA | ||
10006 | + if (ep->dma >= 0 && req->queue.prev == &ep->queue) | ||
10007 | + t = scnprintf(next, size, "\treq %p len %d/%d " | ||
10008 | + "buf %p (dma%d dcmd %08x)\n", | ||
10009 | + &req->req, req->req.actual, | ||
10010 | + req->req.length, req->req.buf, | ||
10011 | + ep->dma, DCMD(ep->dma) | ||
10012 | + /* low 13 bits == bytes-to-go */); | ||
10013 | + else | ||
10014 | +#endif | ||
10015 | + t = scnprintf(next, size, | ||
10016 | + "\treq %p len %d/%d buf %p\n", | ||
10017 | + &req->req, req->req.actual, | ||
10018 | + req->req.length, req->req.buf); | ||
10019 | + if (t <= 0 || t > size) | ||
10020 | + goto done; | ||
10021 | + size -= t; | ||
10022 | + next += t; | ||
10023 | + } | ||
10024 | + } | ||
10025 | + | ||
10026 | +done: | ||
10027 | + local_irq_restore(flags); | ||
10028 | + *eof = 1; | ||
10029 | + return count - size; | ||
10030 | +} | ||
10031 | + | ||
10032 | +#define create_proc_files() \ | ||
10033 | + create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev) | ||
10034 | +#define remove_proc_files() \ | ||
10035 | + remove_proc_entry(proc_node_name, NULL) | ||
10036 | + | ||
10037 | +#else /* !UDC_PROC_FILE */ | ||
10038 | +#define create_proc_files() do {} while (0) | ||
10039 | +#define remove_proc_files() do {} while (0) | ||
10040 | + | ||
10041 | +#endif /* UDC_PROC_FILE */ | ||
10042 | + | ||
10043 | +/* "function" sysfs attribute */ | ||
10044 | +static ssize_t show_function(struct device *_dev, struct device_attribute *attr, char *buf) | ||
10045 | +{ | ||
10046 | + struct pxa27x_udc *dev = dev_get_drvdata(_dev); | ||
10047 | + | ||
10048 | + if (!dev->driver || !dev->driver->function | ||
10049 | + || strlen(dev->driver->function) > PAGE_SIZE) | ||
10050 | + return 0; | ||
10051 | + return scnprintf(buf, PAGE_SIZE, "%s\n", dev->driver->function); | ||
10052 | +} | ||
10053 | +static DEVICE_ATTR(function, S_IRUGO, show_function, NULL); | ||
10054 | + | ||
10055 | +/*-------------------------------------------------------------------------*/ | ||
10056 | + | ||
10057 | +/* | ||
10058 | + * udc_disable - disable USB device controller | ||
10059 | + */ | ||
10060 | +static void udc_disable(struct pxa27x_udc *dev) | ||
10061 | +{ | ||
10062 | + UDCICR0 = UDCICR1 = 0x00000000; | ||
10063 | + | ||
10064 | + udc_clear_mask_UDCCR(UDCCR_UDE); | ||
10065 | + | ||
10066 | + /* Disable clock for USB device */ | ||
10067 | + pxa_set_cken(CKEN_USB, 0); | ||
10068 | + | ||
10069 | + ep0_idle(dev); | ||
10070 | + dev->gadget.speed = USB_SPEED_UNKNOWN; | ||
10071 | + dev->mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); | ||
10072 | +} | ||
10073 | + | ||
10074 | + | ||
10075 | +/* | ||
10076 | + * udc_reinit - initialize software state | ||
10077 | + */ | ||
10078 | +static void udc_reinit(struct pxa27x_udc *dev) | ||
10079 | +{ | ||
10080 | + u32 i; | ||
10081 | + | ||
10082 | + dev->ep0state = EP0_IDLE; | ||
10083 | + | ||
10084 | + /* basic endpoint records init */ | ||
10085 | + for (i = 0; i < UDC_EP_NUM; i++) { | ||
10086 | + struct pxa27x_ep *ep = &dev->ep[i]; | ||
10087 | + | ||
10088 | + ep->stopped = 0; | ||
10089 | + ep->pio_irqs = ep->dma_irqs = 0; | ||
10090 | + } | ||
10091 | + dev->configuration = 0; | ||
10092 | + dev->interface = 0; | ||
10093 | + dev->alternate = 0; | ||
10094 | + /* the rest was statically initialized, and is read-only */ | ||
10095 | +} | ||
10096 | + | ||
10097 | +/* until it's enabled, this UDC should be completely invisible | ||
10098 | + * to any USB host. | ||
10099 | + */ | ||
10100 | +static void udc_enable(struct pxa27x_udc *dev) | ||
10101 | +{ | ||
10102 | + udc_clear_mask_UDCCR(UDCCR_UDE); | ||
10103 | + | ||
10104 | + /* Enable clock for USB device */ | ||
10105 | + pxa_set_cken(CKEN_USB, 1); | ||
10106 | + | ||
10107 | + UDCICR0 = UDCICR1 = 0; | ||
10108 | + | ||
10109 | + ep0_idle(dev); | ||
10110 | + dev->gadget.speed = USB_SPEED_FULL; | ||
10111 | + dev->stats.irqs = 0; | ||
10112 | + | ||
10113 | + udc_set_mask_UDCCR(UDCCR_UDE); | ||
10114 | + udelay(2); | ||
10115 | + if (UDCCR & UDCCR_EMCE) | ||
10116 | + dev_err(dev->dev, "There are error in configuration, udc disabled\n"); | ||
10117 | + | ||
10118 | + /* caller must be able to sleep in order to cope | ||
10119 | + * with startup transients. | ||
10120 | + */ | ||
10121 | + msleep(100); | ||
10122 | + | ||
10123 | + /* enable suspend/resume and reset irqs */ | ||
10124 | + UDCICR1 = UDCICR1_IECC | UDCICR1_IERU | UDCICR1_IESU | UDCICR1_IERS; | ||
10125 | + | ||
10126 | + /* enable ep0 irqs */ | ||
10127 | + UDCICR0 = UDCICR_INT(0,UDCICR_INT_MASK); | ||
10128 | + | ||
10129 | + DMSG("Connecting\n"); | ||
10130 | + /* RPFIXME */ | ||
10131 | + UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE; | ||
10132 | + //dev->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); | ||
10133 | +} | ||
10134 | + | ||
10135 | + | ||
10136 | +/* when a driver is successfully registered, it will receive | ||
10137 | + * control requests including set_configuration(), which enables | ||
10138 | + * non-control requests. then usb traffic follows until a | ||
10139 | + * disconnect is reported. then a host may connect again, or | ||
10140 | + * the driver might get unbound. | ||
10141 | + */ | ||
10142 | +int usb_gadget_register_driver(struct usb_gadget_driver *driver) | ||
10143 | +{ | ||
10144 | + struct pxa27x_udc *dev = the_controller; | ||
10145 | + int retval; | ||
10146 | + | ||
10147 | + if (!driver || driver->speed != USB_SPEED_FULL || !driver->bind | ||
10148 | + || !driver->unbind || !driver->disconnect || !driver->setup) | ||
10149 | + return -EINVAL; | ||
10150 | + if (!dev) | ||
10151 | + return -ENODEV; | ||
10152 | + if (dev->driver) | ||
10153 | + return -EBUSY; | ||
10154 | + | ||
10155 | + udc_disable(dev); | ||
10156 | + udc_init_ep(dev); | ||
10157 | + udc_reinit(dev); | ||
10158 | + | ||
10159 | + /* first hook up the driver ... */ | ||
10160 | + dev->driver = driver; | ||
10161 | + dev->gadget.dev.driver = &driver->driver; | ||
10162 | + dev->ep_num = 1; | ||
10163 | + | ||
10164 | + retval = device_add(&dev->gadget.dev); | ||
10165 | + if (retval) { | ||
10166 | + DMSG("device_add error %d\n", retval); | ||
10167 | + goto add_fail; | ||
10168 | + } | ||
10169 | + retval = driver->bind(&dev->gadget); | ||
10170 | + if (retval) { | ||
10171 | + DMSG("bind to driver %s --> error %d\n", | ||
10172 | + driver->driver.name, retval); | ||
10173 | + goto bind_fail; | ||
10174 | + } | ||
10175 | + retval = device_create_file(dev->dev, &dev_attr_function); | ||
10176 | + if (retval) { | ||
10177 | + DMSG("device_create_file failed: %d\n", retval); | ||
10178 | + goto create_file_fail; | ||
10179 | + } | ||
10180 | + | ||
10181 | + /* ... then enable host detection and ep0; and we're ready | ||
10182 | + * for set_configuration as well as eventual disconnect. | ||
10183 | + * NOTE: this shouldn't power up until later. | ||
10184 | + */ | ||
10185 | + DMSG("registered gadget driver '%s'\n", driver->driver.name); | ||
10186 | + udc_enable(dev); | ||
10187 | + dump_state(dev); | ||
10188 | + return 0; | ||
10189 | + | ||
10190 | +create_file_fail: | ||
10191 | + driver->unbind(&dev->gadget); | ||
10192 | +bind_fail: | ||
10193 | + device_del(&dev->gadget.dev); | ||
10194 | +add_fail: | ||
10195 | + dev->driver = 0; | ||
10196 | + dev->gadget.dev.driver = 0; | ||
10197 | + return retval; | ||
10198 | +} | ||
10199 | +EXPORT_SYMBOL(usb_gadget_register_driver); | ||
10200 | + | ||
10201 | +static void | ||
10202 | +stop_activity(struct pxa27x_udc *dev, struct usb_gadget_driver *driver) | ||
10203 | +{ | ||
10204 | + int i; | ||
10205 | + | ||
10206 | + DMSG("Trace path 1\n"); | ||
10207 | + /* don't disconnect drivers more than once */ | ||
10208 | + if (dev->gadget.speed == USB_SPEED_UNKNOWN) | ||
10209 | + driver = 0; | ||
10210 | + dev->gadget.speed = USB_SPEED_UNKNOWN; | ||
10211 | + | ||
10212 | + /* prevent new request submissions, kill any outstanding requests */ | ||
10213 | + for (i = 0; i < UDC_EP_NUM; i++) { | ||
10214 | + struct pxa27x_ep *ep = &dev->ep[i]; | ||
10215 | + | ||
10216 | + ep->stopped = 1; | ||
10217 | + nuke(ep, -ESHUTDOWN); | ||
10218 | + } | ||
10219 | + del_timer_sync(&dev->timer); | ||
10220 | + | ||
10221 | + /* report disconnect; the driver is already quiesced */ | ||
10222 | + if (driver) | ||
10223 | + driver->disconnect(&dev->gadget); | ||
10224 | + | ||
10225 | + /* re-init driver-visible data structures */ | ||
10226 | + udc_reinit(dev); | ||
10227 | +} | ||
10228 | + | ||
10229 | +int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | ||
10230 | +{ | ||
10231 | + struct pxa27x_udc *dev = the_controller; | ||
10232 | + | ||
10233 | + if (!dev) | ||
10234 | + return -ENODEV; | ||
10235 | + if (!driver || driver != dev->driver) | ||
10236 | + return -EINVAL; | ||
10237 | + | ||
10238 | + local_irq_disable(); | ||
10239 | + udc_disable(dev); | ||
10240 | + stop_activity(dev, driver); | ||
10241 | + local_irq_enable(); | ||
10242 | + | ||
10243 | + driver->unbind(&dev->gadget); | ||
10244 | + pxa27x_ep_freeall(&dev->gadget); | ||
10245 | + dev->driver = 0; | ||
10246 | + | ||
10247 | + device_del(&dev->gadget.dev); | ||
10248 | + device_remove_file(dev->dev, &dev_attr_function); | ||
10249 | + | ||
10250 | + DMSG("unregistered gadget driver '%s'\n", driver->driver.name); | ||
10251 | + dump_state(dev); | ||
10252 | + return 0; | ||
10253 | +} | ||
10254 | +EXPORT_SYMBOL(usb_gadget_unregister_driver); | ||
10255 | + | ||
10256 | + | ||
10257 | +/*-------------------------------------------------------------------------*/ | ||
10258 | + | ||
10259 | +static inline void clear_ep_state(struct pxa27x_udc *dev) | ||
10260 | +{ | ||
10261 | + unsigned i; | ||
10262 | + | ||
10263 | + /* hardware SET_{CONFIGURATION,INTERFACE} automagic resets endpoint | ||
10264 | + * fifos, and pending transactions mustn't be continued in any case. | ||
10265 | + */ | ||
10266 | + for (i = 1; i < UDC_EP_NUM; i++) | ||
10267 | + nuke(&dev->ep[i], -ECONNABORTED); | ||
10268 | +} | ||
10269 | + | ||
10270 | +static void udc_watchdog(unsigned long _dev) | ||
10271 | +{ | ||
10272 | + struct pxa27x_udc *dev = (void *)_dev; | ||
10273 | + | ||
10274 | + local_irq_disable(); | ||
10275 | + if (dev->ep0state == EP0_STALL | ||
10276 | + && (UDCCSR0 & UDCCSR0_FST) == 0 | ||
10277 | + && (UDCCSR0 & UDCCSR0_SST) == 0) { | ||
10278 | + UDCCSR0 = UDCCSR0_FST|UDCCSR0_FTF; | ||
10279 | + DBG(DBG_VERBOSE, "ep0 re-stall\n"); | ||
10280 | + start_watchdog(dev); | ||
10281 | + } | ||
10282 | + local_irq_enable(); | ||
10283 | +} | ||
10284 | + | ||
10285 | +static void handle_ep0(struct pxa27x_udc *dev) | ||
10286 | +{ | ||
10287 | + u32 udccsr0 = UDCCSR0; | ||
10288 | + struct pxa27x_ep *ep = &dev->ep[0]; | ||
10289 | + struct pxa27x_request *req; | ||
10290 | + union { | ||
10291 | + struct usb_ctrlrequest r; | ||
10292 | + u8 raw[8]; | ||
10293 | + u32 word[2]; | ||
10294 | + } u; | ||
10295 | + | ||
10296 | + if (list_empty(&ep->queue)) | ||
10297 | + req = 0; | ||
10298 | + else | ||
10299 | + req = list_entry(ep->queue.next, struct pxa27x_request, queue); | ||
10300 | + | ||
10301 | + /* clear stall status */ | ||
10302 | + if (udccsr0 & UDCCSR0_SST) { | ||
10303 | + nuke(ep, -EPIPE); | ||
10304 | + UDCCSR0 = UDCCSR0_SST; | ||
10305 | + del_timer(&dev->timer); | ||
10306 | + ep0_idle(dev); | ||
10307 | + } | ||
10308 | + | ||
10309 | + /* previous request unfinished? non-error iff back-to-back ... */ | ||
10310 | + if ((udccsr0 & UDCCSR0_SA) != 0 && dev->ep0state != EP0_IDLE) { | ||
10311 | + nuke(ep, 0); | ||
10312 | + del_timer(&dev->timer); | ||
10313 | + ep0_idle(dev); | ||
10314 | + } | ||
10315 | + | ||
10316 | + switch (dev->ep0state) { | ||
10317 | + case EP0_NO_ACTION: | ||
10318 | + dev_info(dev->dev, "%s: Busy\n", __FUNCTION__); | ||
10319 | + /*Fall through */ | ||
10320 | + case EP0_IDLE: | ||
10321 | + /* late-breaking status? */ | ||
10322 | + udccsr0 = UDCCSR0; | ||
10323 | + | ||
10324 | + /* start control request? */ | ||
10325 | + if (likely((udccsr0 & (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE)) | ||
10326 | + == (UDCCSR0_OPC|UDCCSR0_SA|UDCCSR0_RNE))) { | ||
10327 | + int i; | ||
10328 | + | ||
10329 | + nuke(ep, -EPROTO); | ||
10330 | + /* read SETUP packet */ | ||
10331 | + for (i = 0; i < 2; i++) { | ||
10332 | + if (unlikely(!(UDCCSR0 & UDCCSR0_RNE))) { | ||
10333 | +bad_setup: | ||
10334 | + DMSG("SETUP %d!\n", i); | ||
10335 | + goto stall; | ||
10336 | + } | ||
10337 | + u.word [i] = UDCDR0; | ||
10338 | + } | ||
10339 | + if (unlikely((UDCCSR0 & UDCCSR0_RNE) != 0)) | ||
10340 | + goto bad_setup; | ||
10341 | + | ||
10342 | + le16_to_cpus(&u.r.wValue); | ||
10343 | + le16_to_cpus(&u.r.wIndex); | ||
10344 | + le16_to_cpus(&u.r.wLength); | ||
10345 | + | ||
10346 | + DBG(DBG_VERBOSE, "SETUP %02x.%02x v%04x i%04x l%04x\n", | ||
10347 | + u.r.bRequestType, u.r.bRequest, | ||
10348 | + u.r.wValue, u.r.wIndex, u.r.wLength); | ||
10349 | + /* cope with automagic for some standard requests. */ | ||
10350 | + dev->req_std = (u.r.bRequestType & USB_TYPE_MASK) | ||
10351 | + == USB_TYPE_STANDARD; | ||
10352 | + dev->req_config = 0; | ||
10353 | + dev->req_pending = 1; | ||
10354 | +#if 0 | ||
10355 | + switch (u.r.bRequest) { | ||
10356 | + /* hardware was supposed to hide this */ | ||
10357 | + case USB_REQ_SET_CONFIGURATION: | ||
10358 | + case USB_REQ_SET_INTERFACE: | ||
10359 | + case USB_REQ_SET_ADDRESS: | ||
10360 | + dev_err(dev->dev, "Should not come here\n"); | ||
10361 | + break; | ||
10362 | + } | ||
10363 | + | ||
10364 | +#endif | ||
10365 | + if (u.r.bRequestType & USB_DIR_IN) | ||
10366 | + dev->ep0state = EP0_IN_DATA_PHASE; | ||
10367 | + else | ||
10368 | + dev->ep0state = EP0_OUT_DATA_PHASE; | ||
10369 | + i = dev->driver->setup(&dev->gadget, &u.r); | ||
10370 | + | ||
10371 | + if (i < 0) { | ||
10372 | + /* hardware automagic preventing STALL... */ | ||
10373 | + if (dev->req_config) { | ||
10374 | + /* hardware sometimes neglects to tell | ||
10375 | + * tell us about config change events, | ||
10376 | + * so later ones may fail... | ||
10377 | + */ | ||
10378 | + WARN("config change %02x fail %d?\n", | ||
10379 | + u.r.bRequest, i); | ||
10380 | + return; | ||
10381 | + /* TODO experiment: if has_cfr, | ||
10382 | + * hardware didn't ACK; maybe we | ||
10383 | + * could actually STALL! | ||
10384 | + */ | ||
10385 | + } | ||
10386 | + DBG(DBG_VERBOSE, "protocol STALL, " | ||
10387 | + "%02x err %d\n", UDCCSR0, i); | ||
10388 | +stall: | ||
10389 | + /* the watchdog timer helps deal with cases | ||
10390 | + * where udc seems to clear FST wrongly, and | ||
10391 | + * then NAKs instead of STALLing. | ||
10392 | + */ | ||
10393 | + ep0start(dev, UDCCSR0_FST|UDCCSR0_FTF, "stall"); | ||
10394 | + start_watchdog(dev); | ||
10395 | + dev->ep0state = EP0_STALL; | ||
10396 | + | ||
10397 | + /* deferred i/o == no response yet */ | ||
10398 | + } else if (dev->req_pending) { | ||
10399 | + if (likely(dev->ep0state == EP0_IN_DATA_PHASE | ||
10400 | + || dev->req_std || u.r.wLength)) | ||
10401 | + ep0start(dev, 0, "defer"); | ||
10402 | + else | ||
10403 | + ep0start(dev, UDCCSR0_IPR, "defer/IPR"); | ||
10404 | + } | ||
10405 | + | ||
10406 | + /* expect at least one data or status stage irq */ | ||
10407 | + return; | ||
10408 | + | ||
10409 | + } else { | ||
10410 | + /* some random early IRQ: | ||
10411 | + * - we acked FST | ||
10412 | + * - IPR cleared | ||
10413 | + * - OPC got set, without SA (likely status stage) | ||
10414 | + */ | ||
10415 | + UDCCSR0 = udccsr0 & (UDCCSR0_SA|UDCCSR0_OPC); | ||
10416 | + } | ||
10417 | + break; | ||
10418 | + case EP0_IN_DATA_PHASE: /* GET_DESCRIPTOR etc */ | ||
10419 | + if (udccsr0 & UDCCSR0_OPC) { | ||
10420 | + UDCCSR0 = UDCCSR0_OPC|UDCCSR0_FTF; | ||
10421 | + DBG(DBG_VERBOSE, "ep0in premature status\n"); | ||
10422 | + if (req) | ||
10423 | + done(ep, req, 0); | ||
10424 | + ep0_idle(dev); | ||
10425 | + } else /* irq was IPR clearing */ { | ||
10426 | + if (req) { | ||
10427 | + /* this IN packet might finish the request */ | ||
10428 | + (void) write_ep0_fifo(ep, req); | ||
10429 | + } /* else IN token before response was written */ | ||
10430 | + } | ||
10431 | + break; | ||
10432 | + case EP0_OUT_DATA_PHASE: /* SET_DESCRIPTOR etc */ | ||
10433 | + if (udccsr0 & UDCCSR0_OPC) { | ||
10434 | + if (req) { | ||
10435 | + /* this OUT packet might finish the request */ | ||
10436 | + if (read_ep0_fifo(ep, req)) | ||
10437 | + done(ep, req, 0); | ||
10438 | + /* else more OUT packets expected */ | ||
10439 | + } /* else OUT token before read was issued */ | ||
10440 | + } else /* irq was IPR clearing */ { | ||
10441 | + DBG(DBG_VERBOSE, "ep0out premature status\n"); | ||
10442 | + if (req) | ||
10443 | + done(ep, req, 0); | ||
10444 | + ep0_idle(dev); | ||
10445 | + } | ||
10446 | + break; | ||
10447 | + case EP0_STALL: | ||
10448 | + UDCCSR0 = UDCCSR0_FST; | ||
10449 | + break; | ||
10450 | + } | ||
10451 | + UDCISR0 = UDCISR_INT(0, UDCISR_INT_MASK); | ||
10452 | +} | ||
10453 | + | ||
10454 | + | ||
10455 | +static void handle_ep(struct pxa27x_ep *ep) | ||
10456 | +{ | ||
10457 | + struct pxa27x_request *req; | ||
10458 | + int completed; | ||
10459 | + u32 udccsr=0; | ||
10460 | + | ||
10461 | + DMSG("%s is called\n", __FUNCTION__); | ||
10462 | + do { | ||
10463 | + completed = 0; | ||
10464 | + if (likely (!list_empty(&ep->queue))) { | ||
10465 | + req = list_entry(ep->queue.next, | ||
10466 | + struct pxa27x_request, queue); | ||
10467 | + } else | ||
10468 | + req = 0; | ||
10469 | + | ||
10470 | +// udccsr = *ep->reg_udccsr; | ||
10471 | + DMSG("%s: req:%p, udcisr0:0x%x udccsr %p:0x%x\n", __FUNCTION__, | ||
10472 | + req, UDCISR0, ep->reg_udccsr, *ep->reg_udccsr); | ||
10473 | + if (unlikely(ep->dir_in)) { | ||
10474 | + udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; | ||
10475 | + if (unlikely (udccsr)) | ||
10476 | + *ep->reg_udccsr = udccsr; | ||
10477 | + | ||
10478 | + if (req && likely ((*ep->reg_udccsr & UDCCSR_FS) != 0)) | ||
10479 | + completed = write_fifo(ep, req); | ||
10480 | + | ||
10481 | + } else { | ||
10482 | + udccsr = (UDCCSR_SST | UDCCSR_TRN) & *ep->reg_udccsr; | ||
10483 | + if (unlikely(udccsr)) | ||
10484 | + *ep->reg_udccsr = udccsr; | ||
10485 | + | ||
10486 | + /* fifos can hold packets, ready for reading... */ | ||
10487 | + if (likely(req)) { | ||
10488 | + completed = read_fifo(ep, req); | ||
10489 | + } else { | ||
10490 | + pio_irq_disable (ep->pxa_ep_num); | ||
10491 | + //*ep->reg_udccsr = UDCCSR_FEF; | ||
10492 | + DMSG("%s: no req for out data\n", | ||
10493 | + __FUNCTION__); | ||
10494 | + } | ||
10495 | + } | ||
10496 | + ep->pio_irqs++; | ||
10497 | + } while (completed); | ||
10498 | +} | ||
10499 | + | ||
10500 | +static void pxa27x_update_eps(struct pxa27x_udc *dev) | ||
10501 | +{ | ||
10502 | + struct pxa27x_virt_ep *virt_ep; | ||
10503 | + int i; | ||
10504 | + | ||
10505 | + for (i = 1; i < UDC_EP_NUM; i++) { | ||
10506 | + if(!dev->ep[i].assigned || !dev->ep[i].usb_ep) | ||
10507 | + continue; | ||
10508 | + virt_ep = container_of(dev->ep[i].usb_ep, struct pxa27x_virt_ep, usb_ep); | ||
10509 | + | ||
10510 | + DMSG("%s, Updating eps %d:%d, %d:%d, %d:%d, %p,%p\n", __FUNCTION__, dev->ep[i].config, dev->configuration | ||
10511 | + ,dev->ep[i].interface, dev->interface, dev->ep[i].aisn, dev->alternate, virt_ep->pxa_ep, &dev->ep[i]); | ||
10512 | + | ||
10513 | + if(dev->ep[i].config == dev->configuration && virt_ep->pxa_ep != &dev->ep[i]) { | ||
10514 | + if ((dev->ep[i].interface == dev->interface && | ||
10515 | + dev->ep[i].aisn == dev->alternate) || virt_ep->pxa_ep->config != dev->configuration) { | ||
10516 | + | ||
10517 | + if (virt_ep->pxa_ep->desc) { | ||
10518 | + DMSG("%s, Changing end point to %d (en/dis)\n", __FUNCTION__, i); | ||
10519 | + pxa27x_ep_disable(&virt_ep->usb_ep); | ||
10520 | + virt_ep->pxa_ep = &dev->ep[i]; | ||
10521 | + pxa27x_ep_enable(&virt_ep->usb_ep, virt_ep->desc); | ||
10522 | + } else { | ||
10523 | + DMSG("%s, Changing end point to %d (no en/dis)\n", __FUNCTION__, i); | ||
10524 | + virt_ep->pxa_ep = &dev->ep[i]; | ||
10525 | + } | ||
10526 | + } | ||
10527 | + } | ||
10528 | + } | ||
10529 | +} | ||
10530 | + | ||
10531 | +static void pxa27x_change_configuration(struct pxa27x_udc *dev) | ||
10532 | +{ | ||
10533 | + struct usb_ctrlrequest req ; | ||
10534 | + | ||
10535 | + pxa27x_update_eps(dev); | ||
10536 | + | ||
10537 | + req.bRequestType = 0; | ||
10538 | + req.bRequest = USB_REQ_SET_CONFIGURATION; | ||
10539 | + req.wValue = dev->configuration; | ||
10540 | + req.wIndex = 0; | ||
10541 | + req.wLength = 0; | ||
10542 | + | ||
10543 | + dev->ep0state = EP0_NO_ACTION; | ||
10544 | + dev->driver->setup(&dev->gadget, &req); | ||
10545 | +} | ||
10546 | + | ||
10547 | +static void pxa27x_change_interface(struct pxa27x_udc *dev) | ||
10548 | +{ | ||
10549 | + struct usb_ctrlrequest req; | ||
10550 | + | ||
10551 | + pxa27x_update_eps(dev); | ||
10552 | + | ||
10553 | + req.bRequestType = USB_RECIP_INTERFACE; | ||
10554 | + req.bRequest = USB_REQ_SET_INTERFACE; | ||
10555 | + req.wValue = dev->alternate; | ||
10556 | + req.wIndex = dev->interface; | ||
10557 | + req.wLength = 0; | ||
10558 | + | ||
10559 | + dev->ep0state = EP0_NO_ACTION; | ||
10560 | + dev->driver->setup(&dev->gadget, &req); | ||
10561 | +} | ||
10562 | + | ||
10563 | +/* | ||
10564 | + * pxa27x_udc_irq - interrupt handler | ||
10565 | + * | ||
10566 | + * avoid delays in ep0 processing. the control handshaking isn't always | ||
10567 | + * under software control (pxa250c0 and the pxa255 are better), and delays | ||
10568 | + * could cause usb protocol errors. | ||
10569 | + */ | ||
10570 | +static irqreturn_t pxa27x_udc_irq(int irq, void *_dev) | ||
10571 | +{ | ||
10572 | + struct pxa27x_udc *dev = _dev; | ||
10573 | + int handled; | ||
10574 | + | ||
10575 | + dev->stats.irqs++; | ||
10576 | + | ||
10577 | + DBG(DBG_VERBOSE, "Interrupt, UDCISR0:0x%08x, UDCISR1:0x%08x, " | ||
10578 | + "UDCCR:0x%08x\n", UDCISR0, UDCISR1, UDCCR); | ||
10579 | + do { | ||
10580 | + u32 udcir = UDCISR1 & 0xF8000000; | ||
10581 | + | ||
10582 | + handled = 0; | ||
10583 | + | ||
10584 | + /* SUSpend Interrupt Request */ | ||
10585 | + if (unlikely(udcir & UDCISR1_IRSU)) { | ||
10586 | + UDCISR1 = UDCISR1_IRSU; | ||
10587 | + handled = 1; | ||
10588 | + DBG(DBG_VERBOSE, "USB suspend\n"); | ||
10589 | + if (dev->gadget.speed != USB_SPEED_UNKNOWN | ||
10590 | + && dev->driver | ||
10591 | + && dev->driver->suspend) | ||
10592 | + dev->driver->suspend(&dev->gadget); | ||
10593 | + ep0_idle(dev); | ||
10594 | + } | ||
10595 | + | ||
10596 | + /* RESume Interrupt Request */ | ||
10597 | + if (unlikely(udcir & UDCISR1_IRRU)) { | ||
10598 | + UDCISR1 = UDCISR1_IRRU; | ||
10599 | + handled = 1; | ||
10600 | + DBG(DBG_VERBOSE, "USB resume\n"); | ||
10601 | + | ||
10602 | + if (dev->gadget.speed != USB_SPEED_UNKNOWN | ||
10603 | + && dev->driver | ||
10604 | + && dev->driver->resume) | ||
10605 | + dev->driver->resume(&dev->gadget); | ||
10606 | + } | ||
10607 | + | ||
10608 | + if (unlikely(udcir & UDCISR1_IRCC)) { | ||
10609 | + unsigned config, interface, alternate; | ||
10610 | + | ||
10611 | + handled = 1; | ||
10612 | + DBG(DBG_VERBOSE, "USB SET_CONFIGURATION or " | ||
10613 | + "SET_INTERFACE command received\n"); | ||
10614 | + | ||
10615 | + config = (UDCCR & UDCCR_ACN) >> UDCCR_ACN_S; | ||
10616 | + | ||
10617 | + if (dev->configuration != config) { | ||
10618 | + dev->configuration = config; | ||
10619 | + pxa27x_change_configuration(dev) ; | ||
10620 | + } | ||
10621 | + | ||
10622 | + interface = (UDCCR & UDCCR_AIN) >> UDCCR_AIN_S; | ||
10623 | + alternate = (UDCCR & UDCCR_AAISN) >> UDCCR_AAISN_S; | ||
10624 | + | ||
10625 | + if ((dev->interface != interface) || (dev->alternate != alternate)) { | ||
10626 | + dev->interface = interface; | ||
10627 | + dev->alternate = alternate; | ||
10628 | + pxa27x_change_interface(dev); | ||
10629 | + } | ||
10630 | + | ||
10631 | + UDCCR |= UDCCR_SMAC; | ||
10632 | + | ||
10633 | + UDCISR1 = UDCISR1_IRCC; | ||
10634 | + DMSG("%s: con:%d,inter:%d,alt:%d\n", | ||
10635 | + __FUNCTION__, config,interface, alternate); | ||
10636 | + } | ||
10637 | + | ||
10638 | + /* ReSeT Interrupt Request - USB reset */ | ||
10639 | + if (unlikely(udcir & UDCISR1_IRRS)) { | ||
10640 | + UDCISR1 = UDCISR1_IRRS; | ||
10641 | + handled = 1; | ||
10642 | + | ||
10643 | + if ((UDCCR & UDCCR_UDA) == 0) { | ||
10644 | + DBG(DBG_VERBOSE, "USB reset start\n"); | ||
10645 | + | ||
10646 | + /* reset driver and endpoints, | ||
10647 | + * in case that's not yet done | ||
10648 | + */ | ||
10649 | + stop_activity(dev, dev->driver); | ||
10650 | + } | ||
10651 | + INFO("USB reset\n"); | ||
10652 | + dev->gadget.speed = USB_SPEED_FULL; | ||
10653 | + memset(&dev->stats, 0, sizeof dev->stats); | ||
10654 | + | ||
10655 | + } else { | ||
10656 | + u32 udcisr0 = UDCISR0 ; | ||
10657 | + u32 udcisr1 = UDCISR1 & 0xFFFF; | ||
10658 | + int i; | ||
10659 | + | ||
10660 | + if (unlikely (!udcisr0 && !udcisr1)) | ||
10661 | + continue; | ||
10662 | + | ||
10663 | + DBG(DBG_VERY_NOISY, "irq %02x.%02x\n", udcisr1,udcisr0); | ||
10664 | + | ||
10665 | + /* control traffic */ | ||
10666 | + if (udcisr0 & UDCISR0_IR0) { | ||
10667 | + dev->ep[0].pio_irqs++; | ||
10668 | + handle_ep0(dev); | ||
10669 | + handled = 1; | ||
10670 | + } | ||
10671 | + | ||
10672 | + udcisr0 >>= 2; | ||
10673 | + /* endpoint data transfers */ | ||
10674 | + for (i = 1; udcisr0!=0 && i < 16; udcisr0>>=2,i++) { | ||
10675 | + UDCISR0 = UDCISR_INT(i, UDCISR_INT_MASK); | ||
10676 | + | ||
10677 | + if (udcisr0 & UDC_INT_FIFOERROR) | ||
10678 | + dev_err(dev->dev, " Endpoint %d Fifo error\n", i); | ||
10679 | + if (udcisr0 & UDC_INT_PACKETCMP) { | ||
10680 | + handle_ep(&dev->ep[i]); | ||
10681 | + handled = 1; | ||
10682 | + } | ||
10683 | + | ||
10684 | + } | ||
10685 | + | ||
10686 | + for (i = 0; udcisr1!=0 && i < 8; udcisr1 >>= 2, i++) { | ||
10687 | + UDCISR1 = UDCISR_INT(i, UDCISR_INT_MASK); | ||
10688 | + | ||
10689 | + if (udcisr1 & UDC_INT_FIFOERROR) { | ||
10690 | + dev_err(dev->dev, "Endpoint %d fifo error\n", (i+16)); | ||
10691 | + } | ||
10692 | + | ||
10693 | + if (udcisr1 & UDC_INT_PACKETCMP) { | ||
10694 | + handle_ep(&dev->ep[i+16]); | ||
10695 | + handled = 1; | ||
10696 | + } | ||
10697 | + } | ||
10698 | + } | ||
10699 | + | ||
10700 | + /* we could also ask for 1 msec SOF (SIR) interrupts */ | ||
10701 | + | ||
10702 | + } while (handled); | ||
10703 | + return IRQ_HANDLED; | ||
10704 | +} | ||
10705 | + | ||
10706 | +int write_ep0_zlp(void) | ||
10707 | +{ | ||
10708 | + UDCCSR0 = UDCCSR0_IPR; | ||
10709 | + return 0; | ||
10710 | +} | ||
10711 | +EXPORT_SYMBOL(write_ep0_zlp); | ||
10712 | + | ||
10713 | +static void udc_init_ep(struct pxa27x_udc *dev) | ||
10714 | +{ | ||
10715 | + int i; | ||
10716 | + | ||
10717 | + INIT_LIST_HEAD(&dev->gadget.ep_list); | ||
10718 | + INIT_LIST_HEAD(&dev->gadget.ep0->ep_list); | ||
10719 | + | ||
10720 | + for (i = 0; i < UDC_EP_NUM; i++) { | ||
10721 | + struct pxa27x_ep *ep = &dev->ep[i]; | ||
10722 | + | ||
10723 | + ep->dma = -1; | ||
10724 | + if (i != 0) { | ||
10725 | + memset(ep, 0, sizeof(*ep)); | ||
10726 | + } | ||
10727 | + INIT_LIST_HEAD(&ep->queue); | ||
10728 | + } | ||
10729 | +} | ||
10730 | + | ||
10731 | +/*-------------------------------------------------------------------------*/ | ||
10732 | + | ||
10733 | +static void nop_release(struct device *dev) | ||
10734 | +{ | ||
10735 | + DMSG("%s %s\n", __FUNCTION__, dev->bus_id); | ||
10736 | +} | ||
10737 | + | ||
10738 | +/* this uses load-time allocation and initialization (instead of | ||
10739 | + * doing it at run-time) to save code, eliminate fault paths, and | ||
10740 | + * be more obviously correct. | ||
10741 | + */ | ||
10742 | + | ||
10743 | +static struct pxa27x_udc memory = { | ||
10744 | + .gadget = { | ||
10745 | + .ops = &pxa27x_udc_ops, | ||
10746 | + .ep0 = &memory.virt_ep0.usb_ep, | ||
10747 | + .name = driver_name, | ||
10748 | + .dev = { | ||
10749 | + .bus_id = "gadget", | ||
10750 | + .release = nop_release, | ||
10751 | + }, | ||
10752 | + }, | ||
10753 | + | ||
10754 | + /* control endpoint */ | ||
10755 | + .virt_ep0 = { | ||
10756 | + .pxa_ep = &memory.ep[0], | ||
10757 | + .usb_ep = { | ||
10758 | + .name = ep0name, | ||
10759 | + .ops = &pxa27x_ep_ops, | ||
10760 | + .maxpacket = EP0_FIFO_SIZE, | ||
10761 | + }, | ||
10762 | + }, | ||
10763 | + | ||
10764 | + .ep[0] = { | ||
10765 | + .usb_ep = &memory.virt_ep0.usb_ep, | ||
10766 | + .dev = &memory, | ||
10767 | + .reg_udccsr = &UDCCSR0, | ||
10768 | + .reg_udcdr = &UDCDR0, | ||
10769 | + }, | ||
10770 | +}; | ||
10771 | + | ||
10772 | +static int __init pxa27x_udc_probe(struct platform_device *_dev) | ||
10773 | +{ | ||
10774 | + struct pxa27x_udc *dev = &memory; | ||
10775 | + int retval; | ||
10776 | + | ||
10777 | + /* other non-static parts of init */ | ||
10778 | + dev->dev = &_dev->dev; | ||
10779 | + dev->mach = _dev->dev.platform_data; | ||
10780 | + | ||
10781 | + /* RPFIXME */ | ||
10782 | + UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE; | ||
10783 | + | ||
10784 | + init_timer(&dev->timer); | ||
10785 | + dev->timer.function = udc_watchdog; | ||
10786 | + dev->timer.data = (unsigned long) dev; | ||
10787 | + | ||
10788 | + device_initialize(&dev->gadget.dev); | ||
10789 | + dev->gadget.dev.parent = &_dev->dev; | ||
10790 | + dev->gadget.dev.dma_mask = _dev->dev.dma_mask; | ||
10791 | + | ||
10792 | + the_controller = dev; | ||
10793 | + platform_set_drvdata(_dev, dev); | ||
10794 | + | ||
10795 | + udc_disable(dev); | ||
10796 | + udc_init_ep(dev); | ||
10797 | + udc_reinit(dev); | ||
10798 | + | ||
10799 | + /* irq setup after old hardware state is cleaned up */ | ||
10800 | + retval = request_irq(IRQ_USB, pxa27x_udc_irq, | ||
10801 | + SA_INTERRUPT, driver_name, dev); | ||
10802 | + if (retval != 0) { | ||
10803 | + dev_err(dev->dev, "%s: can't get irq %i, err %d\n", | ||
10804 | + driver_name, IRQ_USB, retval); | ||
10805 | + return -EBUSY; | ||
10806 | + } | ||
10807 | + dev->got_irq = 1; | ||
10808 | + | ||
10809 | + create_proc_files(); | ||
10810 | + | ||
10811 | + return 0; | ||
10812 | +} | ||
10813 | + | ||
10814 | +static int pxa27x_udc_remove(struct platform_device *_dev) | ||
10815 | +{ | ||
10816 | + struct pxa27x_udc *dev = platform_get_drvdata(_dev); | ||
10817 | + | ||
10818 | + udc_disable(dev); | ||
10819 | + remove_proc_files(); | ||
10820 | + usb_gadget_unregister_driver(dev->driver); | ||
10821 | + | ||
10822 | + pxa27x_ep_freeall(&dev->gadget); | ||
10823 | + | ||
10824 | + if (dev->got_irq) { | ||
10825 | + free_irq(IRQ_USB, dev); | ||
10826 | + dev->got_irq = 0; | ||
10827 | + } | ||
10828 | + platform_set_drvdata(_dev, 0); | ||
10829 | + the_controller = 0; | ||
10830 | + return 0; | ||
10831 | +} | ||
10832 | + | ||
10833 | +#ifdef CONFIG_PM | ||
10834 | +static void pxa27x_udc_shutdown(struct platform_device *_dev) | ||
10835 | +{ | ||
10836 | + struct pxa27x_udc *dev = platform_get_drvdata(_dev); | ||
10837 | + | ||
10838 | + udc_disable(dev); | ||
10839 | +} | ||
10840 | + | ||
10841 | +static int pxa27x_udc_suspend(struct platform_device *_dev, pm_message_t state) | ||
10842 | +{ | ||
10843 | + int i; | ||
10844 | + struct pxa27x_udc *dev = platform_get_drvdata(_dev); | ||
10845 | + | ||
10846 | + DMSG("%s is called\n", __FUNCTION__); | ||
10847 | + | ||
10848 | + dev->udccsr0 = UDCCSR0; | ||
10849 | + for(i=1; (i<UDC_EP_NUM); i++) { | ||
10850 | + if (dev->ep[i].assigned) { | ||
10851 | + struct pxa27x_ep *ep = &dev->ep[i]; | ||
10852 | + ep->udccsr_value = *ep->reg_udccsr; | ||
10853 | + ep->udccr_value = *ep->reg_udccr; | ||
10854 | + DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", | ||
10855 | + i, *ep->reg_udccsr, *ep->reg_udccr); | ||
10856 | + } | ||
10857 | + } | ||
10858 | + | ||
10859 | + udc_clear_mask_UDCCR(UDCCR_UDE); | ||
10860 | + pxa_set_cken(CKEN_USB, 0); | ||
10861 | + | ||
10862 | + return 0; | ||
10863 | +} | ||
10864 | + | ||
10865 | +static int pxa27x_udc_resume(struct platform_device *_dev) | ||
10866 | +{ | ||
10867 | + int i; | ||
10868 | + struct pxa27x_udc *dev = platform_get_drvdata(_dev); | ||
10869 | + | ||
10870 | + DMSG("%s is called\n", __FUNCTION__); | ||
10871 | + UDCCSR0 = dev->udccsr0 & (UDCCSR0_FST | UDCCSR0_DME); | ||
10872 | + for (i=1; i < UDC_EP_NUM; i++) { | ||
10873 | + if (dev->ep[i].assigned) { | ||
10874 | + struct pxa27x_ep *ep = &dev->ep[i]; | ||
10875 | + *ep->reg_udccsr = ep->udccsr_value; | ||
10876 | + *ep->reg_udccr = ep->udccr_value; | ||
10877 | + DMSG("EP%d, udccsr:0x%x, udccr:0x%x\n", | ||
10878 | + i, *ep->reg_udccsr, *ep->reg_udccr); | ||
10879 | + } | ||
10880 | + } | ||
10881 | + | ||
10882 | + udc_enable(dev); | ||
10883 | + | ||
10884 | + /* OTGPH bit is set when sleep mode is entered. | ||
10885 | + * it indicates that OTG pad is retaining its state. | ||
10886 | + * Upon exit from sleep mode and before clearing OTGPH, | ||
10887 | + * Software must configure the USB OTG pad, UDC, and UHC | ||
10888 | + * to the state they were in before entering sleep mode.*/ | ||
10889 | + PSSR |= PSSR_OTGPH; | ||
10890 | + | ||
10891 | + return 0; | ||
10892 | +} | ||
10893 | +#endif | ||
10894 | + | ||
10895 | +/*-------------------------------------------------------------------------*/ | ||
10896 | + | ||
10897 | +static struct platform_driver udc_driver = { | ||
10898 | + .driver = { | ||
10899 | + .name = "pxa2xx-udc", | ||
10900 | + }, | ||
10901 | + .probe = pxa27x_udc_probe, | ||
10902 | + .remove = pxa27x_udc_remove, | ||
10903 | +#ifdef CONFIG_PM | ||
10904 | + .shutdown = pxa27x_udc_shutdown, | ||
10905 | + .suspend = pxa27x_udc_suspend, | ||
10906 | + .resume = pxa27x_udc_resume | ||
10907 | +#endif | ||
10908 | +}; | ||
10909 | + | ||
10910 | +static int __init udc_init(void) | ||
10911 | +{ | ||
10912 | + printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); | ||
10913 | + return platform_driver_register(&udc_driver); | ||
10914 | +} | ||
10915 | +module_init(udc_init); | ||
10916 | + | ||
10917 | +static void __exit udc_exit(void) | ||
10918 | +{ | ||
10919 | + platform_driver_unregister(&udc_driver); | ||
10920 | +} | ||
10921 | +module_exit(udc_exit); | ||
10922 | + | ||
10923 | +MODULE_DESCRIPTION(DRIVER_DESC); | ||
10924 | +MODULE_AUTHOR("Frank Becker, Robert Schwebel, David Brownell"); | ||
10925 | +MODULE_LICENSE("GPL"); | ||
10926 | diff --git a/drivers/usb/gadget/pxa27x_udc.h b/drivers/usb/gadget/pxa27x_udc.h | ||
10927 | new file mode 100644 | ||
10928 | index 0000000..d4377cf | ||
10929 | --- /dev/null | ||
10930 | +++ b/drivers/usb/gadget/pxa27x_udc.h | ||
10931 | @@ -0,0 +1,298 @@ | ||
10932 | +/* | ||
10933 | + * linux/drivers/usb/gadget/pxa27x_udc.h | ||
10934 | + * Intel PXA27x on-chip full speed USB device controller | ||
10935 | + * | ||
10936 | + * Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix | ||
10937 | + * Copyright (C) 2003 David Brownell | ||
10938 | + * Copyright (C) 2004 Intel Corporation | ||
10939 | + * | ||
10940 | + * This program is free software; you can redistribute it and/or modify | ||
10941 | + * it under the terms of the GNU General Public License as published by | ||
10942 | + * the Free Software Foundation; either version 2 of the License, or | ||
10943 | + * (at your option) any later version. | ||
10944 | + * | ||
10945 | + * This program is distributed in the hope that it will be useful, | ||
10946 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10947 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
10948 | + * GNU General Public License for more details. | ||
10949 | + * | ||
10950 | + * You should have received a copy of the GNU General Public License | ||
10951 | + * along with this program; if not, write to the Free Software | ||
10952 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
10953 | + */ | ||
10954 | + | ||
10955 | +#ifndef __LINUX_USB_GADGET_PXA27X_H | ||
10956 | +#define __LINUX_USB_GADGET_PXA27X_H | ||
10957 | + | ||
10958 | +#include <linux/types.h> | ||
10959 | + | ||
10960 | +struct pxa27x_udc; | ||
10961 | + | ||
10962 | +struct pxa27x_ep { | ||
10963 | + struct pxa27x_udc *dev; | ||
10964 | + struct usb_ep *usb_ep; | ||
10965 | + const struct usb_endpoint_descriptor *desc; | ||
10966 | + | ||
10967 | + struct list_head queue; | ||
10968 | + unsigned long pio_irqs; | ||
10969 | + unsigned long dma_irqs; | ||
10970 | + | ||
10971 | + unsigned pxa_ep_num; | ||
10972 | + int dma; | ||
10973 | + unsigned fifo_size; | ||
10974 | + unsigned ep_type; | ||
10975 | + | ||
10976 | + unsigned stopped : 1; | ||
10977 | + unsigned dma_con : 1; | ||
10978 | + unsigned dir_in : 1; | ||
10979 | + unsigned assigned : 1; | ||
10980 | + | ||
10981 | + unsigned ep_num; | ||
10982 | + unsigned config; | ||
10983 | + unsigned interface; | ||
10984 | + unsigned aisn; | ||
10985 | + /* UDCCSR = UDC Control/Status Register for this EP | ||
10986 | + * UBCR = UDC Byte Count Remaining (contents of OUT fifo) | ||
10987 | + * UDCDR = UDC Endpoint Data Register (the fifo) | ||
10988 | + * UDCCR = UDC Endpoint Configuration Registers | ||
10989 | + * DRCM = DMA Request Channel Map | ||
10990 | + */ | ||
10991 | + volatile u32 *reg_udccsr; | ||
10992 | + volatile u32 *reg_udcbcr; | ||
10993 | + volatile u32 *reg_udcdr; | ||
10994 | + volatile u32 *reg_udccr; | ||
10995 | +#ifdef USE_DMA | ||
10996 | + volatile u32 *reg_drcmr; | ||
10997 | +#define drcmr(n) .reg_drcmr = & DRCMR ## n , | ||
10998 | +#else | ||
10999 | +#define drcmr(n) | ||
11000 | +#endif | ||
11001 | + | ||
11002 | +#ifdef CONFIG_PM | ||
11003 | + unsigned udccsr_value; | ||
11004 | + unsigned udccr_value; | ||
11005 | +#endif | ||
11006 | +}; | ||
11007 | + | ||
11008 | +struct pxa27x_virt_ep { | ||
11009 | + struct usb_ep usb_ep; | ||
11010 | + const struct usb_endpoint_descriptor *desc; | ||
11011 | + struct pxa27x_ep *pxa_ep; | ||
11012 | +}; | ||
11013 | + | ||
11014 | +struct pxa27x_request { | ||
11015 | + struct usb_request req; | ||
11016 | + struct list_head queue; | ||
11017 | +}; | ||
11018 | + | ||
11019 | +enum ep0_state { | ||
11020 | + EP0_IDLE, | ||
11021 | + EP0_IN_DATA_PHASE, | ||
11022 | + EP0_OUT_DATA_PHASE, | ||
11023 | +// EP0_END_XFER, | ||
11024 | + EP0_STALL, | ||
11025 | + EP0_NO_ACTION | ||
11026 | +}; | ||
11027 | + | ||
11028 | +#define EP0_FIFO_SIZE ((unsigned)16) | ||
11029 | +#define BULK_FIFO_SIZE ((unsigned)64) | ||
11030 | +#define ISO_FIFO_SIZE ((unsigned)256) | ||
11031 | +#define INT_FIFO_SIZE ((unsigned)8) | ||
11032 | + | ||
11033 | +struct udc_stats { | ||
11034 | + struct ep0stats { | ||
11035 | + unsigned long ops; | ||
11036 | + unsigned long bytes; | ||
11037 | + } read, write; | ||
11038 | + unsigned long irqs; | ||
11039 | +}; | ||
11040 | + | ||
11041 | +#define UDC_EP_NUM 24 | ||
11042 | + | ||
11043 | + | ||
11044 | +struct pxa27x_udc { | ||
11045 | + struct usb_gadget gadget; | ||
11046 | + struct usb_gadget_driver *driver; | ||
11047 | + | ||
11048 | + enum ep0_state ep0state; | ||
11049 | + struct udc_stats stats; | ||
11050 | + unsigned got_irq : 1, | ||
11051 | + has_cfr : 1, | ||
11052 | + req_pending : 1, | ||
11053 | + req_std : 1, | ||
11054 | + req_config : 1; | ||
11055 | + | ||
11056 | +#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200)) | ||
11057 | + struct timer_list timer; | ||
11058 | + | ||
11059 | + struct device *dev; | ||
11060 | + struct pxa2xx_udc_mach_info *mach; | ||
11061 | + u64 dma_mask; | ||
11062 | + struct pxa27x_virt_ep virt_ep0; | ||
11063 | + struct pxa27x_ep ep[UDC_EP_NUM]; | ||
11064 | + unsigned int ep_num; | ||
11065 | + | ||
11066 | + unsigned configuration, | ||
11067 | + interface, | ||
11068 | + alternate; | ||
11069 | +#ifdef CONFIG_PM | ||
11070 | + unsigned udccsr0; | ||
11071 | +#endif | ||
11072 | +}; | ||
11073 | + | ||
11074 | +static struct pxa27x_udc *the_controller; | ||
11075 | + | ||
11076 | +#if 0 | ||
11077 | +/*-------------------------------------------------------------------------*/ | ||
11078 | + | ||
11079 | + | ||
11080 | +/* one GPIO should be used to detect host disconnect */ | ||
11081 | +static inline int is_usb_connected(void) | ||
11082 | +{ | ||
11083 | + if (!the_controller->mach->udc_is_connected) | ||
11084 | + return 1; | ||
11085 | + return the_controller->mach->udc_is_connected(); | ||
11086 | +} | ||
11087 | + | ||
11088 | +/* one GPIO should force the host to see this device (or not) */ | ||
11089 | +static inline void make_usb_disappear(void) | ||
11090 | +{ | ||
11091 | + if (!the_controller->mach->udc_command) | ||
11092 | + return; | ||
11093 | + the_controller->mach->udc_command(PXA27X_UDC_CMD_DISCONNECT); | ||
11094 | +} | ||
11095 | + | ||
11096 | +static inline void let_usb_appear(void) | ||
11097 | +{ | ||
11098 | + if (!the_controller->mach->udc_command) | ||
11099 | + return; | ||
11100 | + the_controller->mach->udc_command(PXA2XX_UDC_CMD_CONNECT); | ||
11101 | +} | ||
11102 | +#endif | ||
11103 | + | ||
11104 | +/*-------------------------------------------------------------------------*/ | ||
11105 | + | ||
11106 | +/* | ||
11107 | + * Debugging support vanishes in non-debug builds. DBG_NORMAL should be | ||
11108 | + * mostly silent during normal use/testing, with no timing side-effects. | ||
11109 | + */ | ||
11110 | +#define DBG_NORMAL 1 /* error paths, device state transitions */ | ||
11111 | +#define DBG_VERBOSE 2 /* add some success path trace info */ | ||
11112 | +#define DBG_NOISY 3 /* ... even more: request level */ | ||
11113 | +#define DBG_VERY_NOISY 4 /* ... even more: packet level */ | ||
11114 | + | ||
11115 | +#ifdef DEBUG | ||
11116 | +static const char *state_name[] = { | ||
11117 | + "EP0_IDLE", | ||
11118 | + "EP0_IN_DATA_PHASE", "EP0_OUT_DATA_PHASE", | ||
11119 | + "EP0_END_XFER", "EP0_STALL" | ||
11120 | +}; | ||
11121 | + | ||
11122 | +#define DMSG(stuff...) printk(KERN_ERR "udc: " stuff) | ||
11123 | + | ||
11124 | +#ifdef VERBOSE | ||
11125 | +# define UDC_DEBUG DBG_VERBOSE | ||
11126 | +#else | ||
11127 | +# define UDC_DEBUG DBG_NORMAL | ||
11128 | +#endif | ||
11129 | + | ||
11130 | +static void __attribute__ ((__unused__)) | ||
11131 | +dump_udccr(const char *label) | ||
11132 | +{ | ||
11133 | + u32 udccr = UDCCR; | ||
11134 | + DMSG("%s 0x%08x =%s%s%s%s%s%s%s%s%s%s, con=%d,inter=%d,altinter=%d\n", | ||
11135 | + label, udccr, | ||
11136 | + (udccr & UDCCR_OEN) ? " oen":"", | ||
11137 | + (udccr & UDCCR_AALTHNP) ? " aalthnp":"", | ||
11138 | + (udccr & UDCCR_AHNP) ? " rem" : "", | ||
11139 | + (udccr & UDCCR_BHNP) ? " rstir" : "", | ||
11140 | + (udccr & UDCCR_DWRE) ? " dwre" : "", | ||
11141 | + (udccr & UDCCR_SMAC) ? " smac" : "", | ||
11142 | + (udccr & UDCCR_EMCE) ? " emce" : "", | ||
11143 | + (udccr & UDCCR_UDR) ? " udr" : "", | ||
11144 | + (udccr & UDCCR_UDA) ? " uda" : "", | ||
11145 | + (udccr & UDCCR_UDE) ? " ude" : "", | ||
11146 | + (udccr & UDCCR_ACN) >> UDCCR_ACN_S, | ||
11147 | + (udccr & UDCCR_AIN) >> UDCCR_AIN_S, | ||
11148 | + (udccr & UDCCR_AAISN)>> UDCCR_AAISN_S ); | ||
11149 | +} | ||
11150 | + | ||
11151 | +static void __attribute__ ((__unused__)) | ||
11152 | +dump_udccsr0(const char *label) | ||
11153 | +{ | ||
11154 | + u32 udccsr0 = UDCCSR0; | ||
11155 | + | ||
11156 | + DMSG("%s %s 0x%08x =%s%s%s%s%s%s%s\n", | ||
11157 | + label, state_name[the_controller->ep0state], udccsr0, | ||
11158 | + (udccsr0 & UDCCSR0_SA) ? " sa" : "", | ||
11159 | + (udccsr0 & UDCCSR0_RNE) ? " rne" : "", | ||
11160 | + (udccsr0 & UDCCSR0_FST) ? " fst" : "", | ||
11161 | + (udccsr0 & UDCCSR0_SST) ? " sst" : "", | ||
11162 | + (udccsr0 & UDCCSR0_DME) ? " dme" : "", | ||
11163 | + (udccsr0 & UDCCSR0_IPR) ? " ipr" : "", | ||
11164 | + (udccsr0 & UDCCSR0_OPC) ? " opr" : ""); | ||
11165 | +} | ||
11166 | + | ||
11167 | +static void __attribute__ ((__unused__)) | ||
11168 | +dump_state(struct pxa27x_udc *dev) | ||
11169 | +{ | ||
11170 | + unsigned i; | ||
11171 | + | ||
11172 | + DMSG("%s, udcicr %02X.%02X, udcsir %02X.%02x, udcfnr %02X\n", | ||
11173 | + state_name[dev->ep0state], | ||
11174 | + UDCICR1, UDCICR0, UDCISR1, UDCISR0, UDCFNR); | ||
11175 | + dump_udccr("udccr"); | ||
11176 | + | ||
11177 | + if (!dev->driver) { | ||
11178 | + DMSG("no gadget driver bound\n"); | ||
11179 | + return; | ||
11180 | + } else | ||
11181 | + DMSG("ep0 driver '%s'\n", dev->driver->driver.name); | ||
11182 | + | ||
11183 | + | ||
11184 | + dump_udccsr0 ("udccsr0"); | ||
11185 | + DMSG("ep0 IN %lu/%lu, OUT %lu/%lu\n", | ||
11186 | + dev->stats.write.bytes, dev->stats.write.ops, | ||
11187 | + dev->stats.read.bytes, dev->stats.read.ops); | ||
11188 | + | ||
11189 | + for (i = 1; i < UDC_EP_NUM; i++) { | ||
11190 | + if (dev->ep[i].assigned) | ||
11191 | + DMSG ("udccs%d = %02x\n", i, *dev->ep->reg_udccsr); | ||
11192 | + } | ||
11193 | +} | ||
11194 | + | ||
11195 | +#if 0 | ||
11196 | +static void dump_regs(u8 ep) | ||
11197 | +{ | ||
11198 | + DMSG("EP:%d UDCCSR:0x%08x UDCBCR:0x%08x\n UDCCR:0x%08x\n", | ||
11199 | + ep,UDCCSN(ep), UDCBCN(ep), UDCCN(ep)); | ||
11200 | +} | ||
11201 | +static void dump_req (struct pxa27x_request *req) | ||
11202 | +{ | ||
11203 | + struct usb_request *r = &req->req; | ||
11204 | + | ||
11205 | + DMSG("%s: buf:0x%08x length:%d dma:0x%08x actual:%d\n", | ||
11206 | + __FUNCTION__, (unsigned)r->buf, r->length, | ||
11207 | + r->dma, r->actual); | ||
11208 | +} | ||
11209 | +#endif | ||
11210 | + | ||
11211 | +#else | ||
11212 | + | ||
11213 | +#define DMSG(stuff...) do{}while(0) | ||
11214 | + | ||
11215 | +#define dump_udccr(x) do{}while(0) | ||
11216 | +#define dump_udccsr0(x) do{}while(0) | ||
11217 | +#define dump_state(x) do{}while(0) | ||
11218 | + | ||
11219 | +#define UDC_DEBUG ((unsigned)4) | ||
11220 | + | ||
11221 | +#endif | ||
11222 | + | ||
11223 | +#define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0) | ||
11224 | + | ||
11225 | +#define WARN(stuff...) printk(KERN_WARNING "udc: " stuff) | ||
11226 | +#define INFO(stuff...) printk(KERN_INFO "udc: " stuff) | ||
11227 | + | ||
11228 | + | ||
11229 | +#endif /* __LINUX_USB_GADGET_PXA27X_H */ | ||
11230 | diff --git a/drivers/usb/gadget/pxa2xx_udc.h b/drivers/usb/gadget/pxa2xx_udc.h | ||
11231 | index 0e5d0e6..9483a49 100644 | ||
11232 | --- a/drivers/usb/gadget/pxa2xx_udc.h | ||
11233 | +++ b/drivers/usb/gadget/pxa2xx_udc.h | ||
11234 | @@ -206,7 +206,8 @@ dump_state(struct pxa2xx_udc *dev) | ||
11235 | unsigned i; | ||
11236 | |||
11237 | DMSG("%s %s, uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X\n", | ||
11238 | - is_usb_connected() ? "host " : "disconnected", | ||
11239 | + //is_usb_connected() ? "host " : "disconnected", | ||
11240 | + "host ", | ||
11241 | state_name[dev->ep0state], | ||
11242 | UICR1, UICR0, USIR1, USIR0, UFNRH, UFNRL); | ||
11243 | dump_udccr("udccr"); | ||
11244 | @@ -223,8 +224,8 @@ dump_state(struct pxa2xx_udc *dev) | ||
11245 | } else | ||
11246 | DMSG("ep0 driver '%s'\n", dev->driver->driver.name); | ||
11247 | |||
11248 | - if (!is_usb_connected()) | ||
11249 | - return; | ||
11250 | + //if (!is_usb_connected()) | ||
11251 | + // return; | ||
11252 | |||
11253 | dump_udccs0 ("udccs0"); | ||
11254 | DMSG("ep0 IN %lu/%lu, OUT %lu/%lu\n", | ||
11255 | diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c | ||
11256 | index ce4d2e0..5dac23f 100644 | ||
11257 | --- a/drivers/usb/gadget/serial.c | ||
11258 | +++ b/drivers/usb/gadget/serial.c | ||
11259 | @@ -1356,6 +1356,7 @@ static int __init gs_bind(struct usb_gadget *gadget) | ||
11260 | struct usb_ep *ep; | ||
11261 | struct gs_dev *dev; | ||
11262 | int gcnum; | ||
11263 | + struct usb_endpoint_config ep_config[2]; | ||
11264 | |||
11265 | /* Some controllers can't support CDC ACM: | ||
11266 | * - sh doesn't support multiple interfaces or configs; | ||
11267 | @@ -1376,22 +1377,33 @@ static int __init gs_bind(struct usb_gadget *gadget) | ||
11268 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0099); | ||
11269 | } | ||
11270 | |||
11271 | + ep_config[0].config = GS_BULK_CONFIG_ID; | ||
11272 | + ep_config[0].interface = gs_bulk_interface_desc.bInterfaceNumber; | ||
11273 | + ep_config[0].altinterface = gs_bulk_interface_desc.bAlternateSetting; | ||
11274 | + ep_config[1].config = GS_ACM_CONFIG_ID; | ||
11275 | + ep_config[1].interface = gs_data_interface_desc.bInterfaceNumber; | ||
11276 | + ep_config[1].altinterface = gs_data_interface_desc.bAlternateSetting; | ||
11277 | + | ||
11278 | usb_ep_autoconfig_reset(gadget); | ||
11279 | |||
11280 | - ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc); | ||
11281 | + ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc, &ep_config[0], 2); | ||
11282 | if (!ep) | ||
11283 | goto autoconf_fail; | ||
11284 | EP_IN_NAME = ep->name; | ||
11285 | ep->driver_data = ep; /* claim the endpoint */ | ||
11286 | |||
11287 | - ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc); | ||
11288 | + ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc, &ep_config[0], 2); | ||
11289 | if (!ep) | ||
11290 | goto autoconf_fail; | ||
11291 | EP_OUT_NAME = ep->name; | ||
11292 | ep->driver_data = ep; /* claim the endpoint */ | ||
11293 | |||
11294 | if (use_acm) { | ||
11295 | - ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc); | ||
11296 | + ep_config[0].config = GS_ACM_CONFIG_ID; | ||
11297 | + ep_config[0].interface = gs_control_interface_desc.bInterfaceNumber; | ||
11298 | + ep_config[0].altinterface = gs_control_interface_desc.bAlternateSetting; | ||
11299 | + | ||
11300 | + ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc, &ep_config[0], 1); | ||
11301 | if (!ep) { | ||
11302 | printk(KERN_ERR "gs_bind: cannot run ACM on %s\n", gadget->name); | ||
11303 | goto autoconf_fail; | ||
11304 | diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c | ||
11305 | index fcfe869..1e40d46 100644 | ||
11306 | --- a/drivers/usb/gadget/zero.c | ||
11307 | +++ b/drivers/usb/gadget/zero.c | ||
11308 | @@ -1142,6 +1142,7 @@ zero_bind (struct usb_gadget *gadget) | ||
11309 | struct zero_dev *dev; | ||
11310 | struct usb_ep *ep; | ||
11311 | int gcnum; | ||
11312 | + struct usb_endpoint_config ep_config[2]; | ||
11313 | |||
11314 | /* FIXME this can't yet work right with SH ... it has only | ||
11315 | * one configuration, numbered one. | ||
11316 | @@ -1154,7 +1155,15 @@ zero_bind (struct usb_gadget *gadget) | ||
11317 | * but there may also be important quirks to address. | ||
11318 | */ | ||
11319 | usb_ep_autoconfig_reset (gadget); | ||
11320 | - ep = usb_ep_autoconfig (gadget, &fs_source_desc); | ||
11321 | + | ||
11322 | + ep_config[0].config = CONFIG_SOURCE_SINK; | ||
11323 | + ep_config[0].interface = source_sink_intf.bInterfaceNumber; | ||
11324 | + ep_config[0].altinterface = source_sink_intf.bAlternateSetting; | ||
11325 | + ep_config[1].config = CONFIG_LOOPBACK; | ||
11326 | + ep_config[1].interface = loopback_intf.bInterfaceNumber; | ||
11327 | + ep_config[1].altinterface = loopback_intf.bAlternateSetting; | ||
11328 | + | ||
11329 | + ep = usb_ep_autoconfig(gadget, &fs_source_desc, &ep_config[0], 2); | ||
11330 | if (!ep) { | ||
11331 | autoconf_fail: | ||
11332 | printk (KERN_ERR "%s: can't autoconfigure on %s\n", | ||
11333 | @@ -1164,7 +1173,7 @@ autoconf_fail: | ||
11334 | EP_IN_NAME = ep->name; | ||
11335 | ep->driver_data = ep; /* claim */ | ||
11336 | |||
11337 | - ep = usb_ep_autoconfig (gadget, &fs_sink_desc); | ||
11338 | + ep = usb_ep_autoconfig(gadget, &fs_sink_desc, &ep_config[0], 2); | ||
11339 | if (!ep) | ||
11340 | goto autoconf_fail; | ||
11341 | EP_OUT_NAME = ep->name; | ||
11342 | diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig | ||
11343 | index 2580f5f..12e4b91 100644 | ||
11344 | --- a/drivers/video/backlight/Kconfig | ||
11345 | +++ b/drivers/video/backlight/Kconfig | ||
11346 | @@ -40,7 +40,7 @@ config BACKLIGHT_CLASS_DEVICE | ||
11347 | |||
11348 | config BACKLIGHT_CORGI | ||
11349 | tristate "Sharp Corgi Backlight Driver (SL Series)" | ||
11350 | - depends on BACKLIGHT_CLASS_DEVICE && PXA_SHARPSL | ||
11351 | + depends on BACKLIGHT_CLASS_DEVICE && (PXA_SHARPSL || MACH_EM_X270) | ||
11352 | default y | ||
11353 | help | ||
11354 | If you have a Sharp Zaurus SL-C7xx, SL-Cxx00 or SL-6000x say y to enable the | ||
11355 | diff --git a/include/asm-arm/arch-pxa/pwr-i2c.h b/include/asm-arm/arch-pxa/pwr-i2c.h | ||
11356 | new file mode 100644 | ||
11357 | index 0000000..6bad486 | ||
11358 | --- /dev/null | ||
11359 | +++ b/include/asm-arm/arch-pxa/pwr-i2c.h | ||
11360 | @@ -0,0 +1,61 @@ | ||
11361 | +/* | ||
11362 | + * (C) Copyright 2007 CompuLab, Ltd | ||
11363 | + * Mike Rapoport <mike@compulab.co.il> | ||
11364 | + * | ||
11365 | + * Simple Power I2C interface for PXA processors. | ||
11366 | + * Based on U-Boot PXA I2C driver. | ||
11367 | + * | ||
11368 | + * This program is free software; you can redistribute it and/or | ||
11369 | + * modify it under the terms of the GNU General Public License as | ||
11370 | + * published by the Free Software Foundation; either version 2 of | ||
11371 | + * the License, or (at your option) any later version. | ||
11372 | + * | ||
11373 | + * This program is distributed in the hope that it will be useful, | ||
11374 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11375 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11376 | + * GNU General Public License for more details. | ||
11377 | + * | ||
11378 | + * You should have received a copy of the GNU General Public License | ||
11379 | + * along with this program; if not, write to the Free Software | ||
11380 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
11381 | + * MA 02111-1307 USA | ||
11382 | + * | ||
11383 | + */ | ||
11384 | + | ||
11385 | +#ifndef __PXA_PWR_I2C_H__ | ||
11386 | +#define __PXA_PWR_I2C_H__ | ||
11387 | + | ||
11388 | +/* | ||
11389 | + * Configuration items. | ||
11390 | + */ | ||
11391 | +#define I2C_RXTX_LEN 128 /* maximum tx/rx buffer length */ | ||
11392 | + | ||
11393 | +/* | ||
11394 | + * Probe the given I2C chip address. Returns 0 if a chip responded, | ||
11395 | + * not 0 on failure. | ||
11396 | + */ | ||
11397 | +extern int pxa_pwr_i2c_probe(u8 chip); | ||
11398 | + | ||
11399 | +/* | ||
11400 | + * Read/Write interface: | ||
11401 | + * chip: I2C chip address, range 0..127 | ||
11402 | + * addr: Memory (register) address within the chip | ||
11403 | + * alen: Number of bytes to use for addr (typically 1, 2 for larger | ||
11404 | + * memories, 0 for register type devices with only one | ||
11405 | + * register) | ||
11406 | + * buffer: Where to read/write the data | ||
11407 | + * len: How many bytes to read/write | ||
11408 | + * | ||
11409 | + * Returns: 0 on success, not 0 on failure | ||
11410 | + */ | ||
11411 | +extern int pxa_pwr_i2c_read(u8 chip, uint addr, int alen, u8 *buffer, int len); | ||
11412 | +extern int pxa_pwr_i2c_write(u8 chip, uint addr, int alen, | ||
11413 | + u8 *buffer, int len); | ||
11414 | + | ||
11415 | +/* | ||
11416 | + * Utility routines to read/write registers. | ||
11417 | + */ | ||
11418 | +extern s32 pxa_pwr_i2c_reg_read (u8 chip, u8 reg); | ||
11419 | +extern s32 pxa_pwr_i2c_reg_write(u8 chip, u8 reg, u8 val); | ||
11420 | + | ||
11421 | +#endif /* __PXA_PWR_I2C_H___ */ | ||
11422 | diff --git a/include/linux/da9030.h b/include/linux/da9030.h | ||
11423 | new file mode 100644 | ||
11424 | index 0000000..6eb89e2 | ||
11425 | --- /dev/null | ||
11426 | +++ b/include/linux/da9030.h | ||
11427 | @@ -0,0 +1,118 @@ | ||
11428 | +#ifndef _DA9030_H | ||
11429 | +#define _DA9030_H | ||
11430 | + | ||
11431 | +/* DA9030 has 24 possible interrupts */ | ||
11432 | +#define DA9030_IRQ_COUNT 24 | ||
11433 | + | ||
11434 | +/* EVENT A */ | ||
11435 | +#define DA9030_IRQ_ONKEY_EN 0 | ||
11436 | +#define DA9030_IRQ_PWREN1 1 | ||
11437 | +#define DA9030_IRQ_EXTON 2 | ||
11438 | +#define DA9030_IRQ_CHDET 3 | ||
11439 | +#define DA9030_IRQ_TBAT 4 | ||
11440 | +#define DA9030_IRQ_VBATMON 5 | ||
11441 | +#define DA9030_IRQ_VBATMONTXON 6 | ||
11442 | +#define DA9030_IRQ_CHIOVER 7 | ||
11443 | + | ||
11444 | +/* EVENT B */ | ||
11445 | +#define DA9030_IRQ_TCTO 8 | ||
11446 | +#define DA9030_IRQ_CCTO 9 | ||
11447 | +#define DA9030_IRQ_ADC_READY 10 | ||
11448 | +#define DA9030_IRQ_VBUS_4_4 11 | ||
11449 | +#define DA9030_IRQ_VBUS_4_0 12 | ||
11450 | +#define DA9030_IRQ_SESSION_VALID 13 | ||
11451 | +#define DA9030_IRQ_SRP_DETECT 14 | ||
11452 | +#define DA9030_IRQ_WDOG_INTR 15 | ||
11453 | + | ||
11454 | +/* EVENT C */ | ||
11455 | +#define DA9030_IRQ_LDO15 16 | ||
11456 | +#define DA9030_IRQ_LDO16 17 | ||
11457 | +#define DA9030_IRQ_LDO17 18 | ||
11458 | +#define DA9030_IRQ_LDO18 19 | ||
11459 | +#define DA9030_IRQ_LDO19 20 | ||
11460 | +#define DA9030_IRQ_BUCK2 21 | ||
11461 | +#define DA9030_IRQ_ADC_IN4 22 | ||
11462 | +#define DA9030_IRQ_ADC_IN5 23 | ||
11463 | + | ||
11464 | +enum da9030_ldo_sleep_mode { | ||
11465 | + DA9030_LDO_SLEEP_KEEP = 0x0, | ||
11466 | + DA9030_LDO_SLEEP_SHUT_DOWN = 0x1, | ||
11467 | + DA9030_LDO_SLEEP_POWER_UP = 0x2, | ||
11468 | + DA9030_LDO_SLEEP_HIGH_Z = 0x3, | ||
11469 | +}; | ||
11470 | + | ||
11471 | +enum da9030_led_rate { | ||
11472 | + DA9030_LED_RATE_ON = 0x0, | ||
11473 | + DA9030_LED_RATE_0_52 = 0x1, | ||
11474 | + DA9030_LED_RATE_1_05 = 0x2, | ||
11475 | + DA9030_LED_RATE_2_1 = 0x3, | ||
11476 | +}; | ||
11477 | + | ||
11478 | +enum da9030_led_duty_cycle { | ||
11479 | + DA9030_LED_DUTY_1_16 = 0x0, | ||
11480 | + DA9030_LED_DUTY_1_8 = 0x1, | ||
11481 | + DA9030_LED_DUTY_1_4 = 0x2, | ||
11482 | + DA9030_LED_DUTY_1_2 = 0x3, | ||
11483 | +}; | ||
11484 | + | ||
11485 | +enum da9030_led_pwm_chop { | ||
11486 | + DA9030_LED_PWM_8_8 = 0x0, | ||
11487 | + DA9030_LED_PWM_7_8 = 0x1, | ||
11488 | + DA9030_LED_PWM_6_8 = 0x2, | ||
11489 | + DA9030_LED_PWM_5_8 = 0x3, | ||
11490 | + DA9030_LED_PWM_4_8 = 0x4, | ||
11491 | + DA9030_LED_PWM_3_8 = 0x5, | ||
11492 | + DA9030_LED_PWM_2_8 = 0x6, | ||
11493 | + DA9030_LED_PWM_1_8 = 0x7, | ||
11494 | +}; | ||
11495 | + | ||
11496 | +struct da9030_adc_res { | ||
11497 | + int vbat_res; | ||
11498 | + int vbatmin_res; | ||
11499 | + int vbatmintxon; | ||
11500 | + int ichmax_res; | ||
11501 | + int ichmin_res; | ||
11502 | + int ichaverage_res; | ||
11503 | + int vchmax_res; | ||
11504 | + int vchmin_res; | ||
11505 | + int tbat_res; | ||
11506 | + int adc_in4_res; | ||
11507 | + int adc_in5_res; | ||
11508 | +}; | ||
11509 | + | ||
11510 | +extern int da9030_get_status(void); | ||
11511 | +extern int da9030_get_fault_log(void); | ||
11512 | + | ||
11513 | +extern void da9030_enable_adc(void); | ||
11514 | +extern void da9030_read_adc(struct da9030_adc_res *adc); | ||
11515 | + | ||
11516 | +extern void da9030_set_wled(int on, unsigned int brightness); | ||
11517 | + | ||
11518 | +extern int da9030_set_led(int led, int on, | ||
11519 | + enum da9030_led_rate rate, | ||
11520 | + enum da9030_led_duty_cycle duty, | ||
11521 | + enum da9030_led_pwm_chop pwm_chop); | ||
11522 | + | ||
11523 | +extern int da9030_set_charger(int on, unsigned int mA, unsigned int mV); | ||
11524 | +extern void da9030_get_charger(int *on, unsigned int *mA, unsigned int *mV); | ||
11525 | + | ||
11526 | +extern int da9030_set_ldo(int ldo, int on, unsigned int mV, | ||
11527 | + enum da9030_ldo_sleep_mode sleep_mode); | ||
11528 | +extern int da9030_set_buck(int buck, int on, unsigned int mV, int flags); | ||
11529 | + | ||
11530 | +extern void da9030_set_thresholds(unsigned int tbathighp, | ||
11531 | + unsigned int tbathighn, | ||
11532 | + unsigned int tbatlow, | ||
11533 | + unsigned int vbatmon); | ||
11534 | + | ||
11535 | +extern int da9030_register_callback(int event, | ||
11536 | + void (*callback)(int event, void *data), | ||
11537 | + void *data); | ||
11538 | +extern void da9030_unregister_callback(int event); | ||
11539 | + | ||
11540 | +/* Keep these for now, although they are unsafe. When I'll see what | ||
11541 | + other methods are needed from DA9030, I'll remove these */ | ||
11542 | +extern s32 da9030_get_reg(u32 reg); | ||
11543 | +extern s32 da9030_set_reg(u32 reg, u8 val); | ||
11544 | + | ||
11545 | +#endif | ||
11546 | diff --git a/include/linux/usb_gadget.h b/include/linux/usb_gadget.h | ||
11547 | index 4f59b2a..792c568 100644 | ||
11548 | --- a/include/linux/usb_gadget.h | ||
11549 | +++ b/include/linux/usb_gadget.h | ||
11550 | @@ -397,10 +397,28 @@ usb_ep_fifo_flush (struct usb_ep *ep) | ||
11551 | |||
11552 | struct usb_gadget; | ||
11553 | |||
11554 | +/** | ||
11555 | + * struct usb_endpoint_config - possible configurations of a given endpoint | ||
11556 | + * @config: the configuration number | ||
11557 | + * @interface: the interface number | ||
11558 | + * @altinterface: the altinterface number | ||
11559 | + * | ||
11560 | + * Used as an array to pass information about the possible configurations | ||
11561 | + * of a given endpoint to the bus controller. | ||
11562 | + */ | ||
11563 | +struct usb_endpoint_config { | ||
11564 | + u8 config; | ||
11565 | + u8 interface; | ||
11566 | + u8 altinterface; | ||
11567 | +}; | ||
11568 | + | ||
11569 | /* the rest of the api to the controller hardware: device operations, | ||
11570 | * which don't involve endpoints (or i/o). | ||
11571 | */ | ||
11572 | struct usb_gadget_ops { | ||
11573 | + struct usb_ep* (*ep_alloc)(struct usb_gadget *, | ||
11574 | + struct usb_endpoint_descriptor *, | ||
11575 | + struct usb_endpoint_config *, int); | ||
11576 | int (*get_frame)(struct usb_gadget *); | ||
11577 | int (*wakeup)(struct usb_gadget *); | ||
11578 | int (*set_selfpowered) (struct usb_gadget *, int is_selfpowered); | ||
11579 | @@ -824,7 +842,10 @@ int usb_gadget_config_buf(const struct usb_config_descriptor *config, | ||
11580 | /* utility wrapping a simple endpoint selection policy */ | ||
11581 | |||
11582 | extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *, | ||
11583 | - struct usb_endpoint_descriptor *) __devinit; | ||
11584 | + struct usb_endpoint_descriptor *, | ||
11585 | + struct usb_endpoint_config *, | ||
11586 | + int numconfigs | ||
11587 | +); | ||
11588 | |||
11589 | extern void usb_ep_autoconfig_reset (struct usb_gadget *) __devinit; | ||
11590 | |||
11591 | diff --git a/include/linux/wm97xx.h b/include/linux/wm97xx.h | ||
11592 | new file mode 100644 | ||
11593 | index 0000000..354e533 | ||
11594 | --- /dev/null | ||
11595 | +++ b/include/linux/wm97xx.h | ||
11596 | @@ -0,0 +1,291 @@ | ||
11597 | + | ||
11598 | +/* | ||
11599 | + * Register bits and API for Wolfson WM97xx series of codecs | ||
11600 | + */ | ||
11601 | + | ||
11602 | +#ifndef _LINUX_WM97XX_H | ||
11603 | +#define _LINUX_WM97XX_H | ||
11604 | + | ||
11605 | +#include <sound/driver.h> | ||
11606 | +#include <sound/core.h> | ||
11607 | +#include <sound/pcm.h> | ||
11608 | +#include <sound/ac97_codec.h> | ||
11609 | +#include <sound/initval.h> | ||
11610 | +#include <linux/types.h> | ||
11611 | +#include <linux/list.h> | ||
11612 | +#include <linux/input.h> /* Input device layer */ | ||
11613 | + | ||
11614 | +/* | ||
11615 | + * WM97xx AC97 Touchscreen registers | ||
11616 | + */ | ||
11617 | +#define AC97_WM97XX_DIGITISER1 0x76 | ||
11618 | +#define AC97_WM97XX_DIGITISER2 0x78 | ||
11619 | +#define AC97_WM97XX_DIGITISER_RD 0x7a | ||
11620 | +#define AC97_WM9713_DIG1 0x74 | ||
11621 | +#define AC97_WM9713_DIG2 AC97_WM97XX_DIGITISER1 | ||
11622 | +#define AC97_WM9713_DIG3 AC97_WM97XX_DIGITISER2 | ||
11623 | + | ||
11624 | +/* | ||
11625 | + * WM97xx register bits | ||
11626 | + */ | ||
11627 | +#define WM97XX_POLL 0x8000 /* initiate a polling measurement */ | ||
11628 | +#define WM97XX_ADCSEL_X 0x1000 /* x coord measurement */ | ||
11629 | +#define WM97XX_ADCSEL_Y 0x2000 /* y coord measurement */ | ||
11630 | +#define WM97XX_ADCSEL_PRES 0x3000 /* pressure measurement */ | ||
11631 | +#define WM97XX_ADCSEL_MASK 0x7000 | ||
11632 | +#define WM97XX_COO 0x0800 /* enable coordinate mode */ | ||
11633 | +#define WM97XX_CTC 0x0400 /* enable continuous mode */ | ||
11634 | +#define WM97XX_CM_RATE_93 0x0000 /* 93.75Hz continuous rate */ | ||
11635 | +#define WM97XX_CM_RATE_187 0x0100 /* 187.5Hz continuous rate */ | ||
11636 | +#define WM97XX_CM_RATE_375 0x0200 /* 375Hz continuous rate */ | ||
11637 | +#define WM97XX_CM_RATE_750 0x0300 /* 750Hz continuous rate */ | ||
11638 | +#define WM97XX_CM_RATE_8K 0x00f0 /* 8kHz continuous rate */ | ||
11639 | +#define WM97XX_CM_RATE_12K 0x01f0 /* 12kHz continuous rate */ | ||
11640 | +#define WM97XX_CM_RATE_24K 0x02f0 /* 24kHz continuous rate */ | ||
11641 | +#define WM97XX_CM_RATE_48K 0x03f0 /* 48kHz continuous rate */ | ||
11642 | +#define WM97XX_CM_RATE_MASK 0x03f0 | ||
11643 | +#define WM97XX_RATE(i) (((i & 3) << 8) | ((i & 4) ? 0xf0 : 0)) | ||
11644 | +#define WM97XX_DELAY(i) ((i << 4) & 0x00f0) /* sample delay times */ | ||
11645 | +#define WM97XX_DELAY_MASK 0x00f0 | ||
11646 | +#define WM97XX_SLEN 0x0008 /* slot read back enable */ | ||
11647 | +#define WM97XX_SLT(i) ((i - 5) & 0x7) /* touchpanel slot selection (5-11) */ | ||
11648 | +#define WM97XX_SLT_MASK 0x0007 | ||
11649 | +#define WM97XX_PRP_DETW 0x4000 /* pen detect on, digitiser off, wake up */ | ||
11650 | +#define WM97XX_PRP_DET 0x8000 /* pen detect on, digitiser off, no wake up */ | ||
11651 | +#define WM97XX_PRP_DET_DIG 0xc000 /* pen detect on, digitiser on */ | ||
11652 | +#define WM97XX_RPR 0x2000 /* wake up on pen down */ | ||
11653 | +#define WM97XX_PEN_DOWN 0x8000 /* pen is down */ | ||
11654 | +#define WM97XX_ADCSRC_MASK 0x7000 /* ADC source mask */ | ||
11655 | + | ||
11656 | +#define WM97XX_AUX_ID1 0x8001 | ||
11657 | +#define WM97XX_AUX_ID2 0x8002 | ||
11658 | +#define WM97XX_AUX_ID3 0x8003 | ||
11659 | +#define WM97XX_AUX_ID4 0x8004 | ||
11660 | + | ||
11661 | + | ||
11662 | +/* WM9712 Bits */ | ||
11663 | +#define WM9712_45W 0x1000 /* set for 5-wire touchscreen */ | ||
11664 | +#define WM9712_PDEN 0x0800 /* measure only when pen down */ | ||
11665 | +#define WM9712_WAIT 0x0200 /* wait until adc is read before next sample */ | ||
11666 | +#define WM9712_PIL 0x0100 /* current used for pressure measurement. set 400uA else 200uA */ | ||
11667 | +#define WM9712_MASK_HI 0x0040 /* hi on mask pin (47) stops conversions */ | ||
11668 | +#define WM9712_MASK_EDGE 0x0080 /* rising/falling edge on pin delays sample */ | ||
11669 | +#define WM9712_MASK_SYNC 0x00c0 /* rising/falling edge on mask initiates sample */ | ||
11670 | +#define WM9712_RPU(i) (i&0x3f) /* internal pull up on pen detect (64k / rpu) */ | ||
11671 | +#define WM9712_PD(i) (0x1 << i) /* power management */ | ||
11672 | + | ||
11673 | +/* WM9712 Registers */ | ||
11674 | +#define AC97_WM9712_POWER 0x24 | ||
11675 | +#define AC97_WM9712_REV 0x58 | ||
11676 | + | ||
11677 | +/* WM9705 Bits */ | ||
11678 | +#define WM9705_PDEN 0x1000 /* measure only when pen is down */ | ||
11679 | +#define WM9705_PINV 0x0800 /* inverts sense of pen down output */ | ||
11680 | +#define WM9705_BSEN 0x0400 /* BUSY flag enable, pin47 is 1 when busy */ | ||
11681 | +#define WM9705_BINV 0x0200 /* invert BUSY (pin47) output */ | ||
11682 | +#define WM9705_WAIT 0x0100 /* wait until adc is read before next sample */ | ||
11683 | +#define WM9705_PIL 0x0080 /* current used for pressure measurement. set 400uA else 200uA */ | ||
11684 | +#define WM9705_PHIZ 0x0040 /* set PHONE and PCBEEP inputs to high impedance */ | ||
11685 | +#define WM9705_MASK_HI 0x0010 /* hi on mask stops conversions */ | ||
11686 | +#define WM9705_MASK_EDGE 0x0020 /* rising/falling edge on pin delays sample */ | ||
11687 | +#define WM9705_MASK_SYNC 0x0030 /* rising/falling edge on mask initiates sample */ | ||
11688 | +#define WM9705_PDD(i) (i & 0x000f) /* pen detect comparator threshold */ | ||
11689 | + | ||
11690 | + | ||
11691 | +/* WM9713 Bits */ | ||
11692 | +#define WM9713_PDPOL 0x0400 /* Pen down polarity */ | ||
11693 | +#define WM9713_POLL 0x0200 /* initiate a polling measurement */ | ||
11694 | +#define WM9713_CTC 0x0100 /* enable continuous mode */ | ||
11695 | +#define WM9713_ADCSEL_X 0x0002 /* X measurement */ | ||
11696 | +#define WM9713_ADCSEL_Y 0x0004 /* Y measurement */ | ||
11697 | +#define WM9713_ADCSEL_PRES 0x0008 /* Pressure measurement */ | ||
11698 | +#define WM9713_COO 0x0001 /* enable coordinate mode */ | ||
11699 | +#define WM9713_PDEN 0x0800 /* measure only when pen down */ | ||
11700 | +#define WM9713_ADCSEL_MASK 0x00fe /* ADC selection mask */ | ||
11701 | +#define WM9713_WAIT 0x0200 /* coordinate wait */ | ||
11702 | + | ||
11703 | +/* AUX ADC ID's */ | ||
11704 | +#define TS_COMP1 0x0 | ||
11705 | +#define TS_COMP2 0x1 | ||
11706 | +#define TS_BMON 0x2 | ||
11707 | +#define TS_WIPER 0x3 | ||
11708 | + | ||
11709 | +/* ID numbers */ | ||
11710 | +#define WM97XX_ID1 0x574d | ||
11711 | +#define WM9712_ID2 0x4c12 | ||
11712 | +#define WM9705_ID2 0x4c05 | ||
11713 | +#define WM9713_ID2 0x4c13 | ||
11714 | + | ||
11715 | +/* Codec GPIO's */ | ||
11716 | +#define WM97XX_MAX_GPIO 16 | ||
11717 | +#define WM97XX_GPIO_1 (1 << 1) | ||
11718 | +#define WM97XX_GPIO_2 (1 << 2) | ||
11719 | +#define WM97XX_GPIO_3 (1 << 3) | ||
11720 | +#define WM97XX_GPIO_4 (1 << 4) | ||
11721 | +#define WM97XX_GPIO_5 (1 << 5) | ||
11722 | +#define WM97XX_GPIO_6 (1 << 6) | ||
11723 | +#define WM97XX_GPIO_7 (1 << 7) | ||
11724 | +#define WM97XX_GPIO_8 (1 << 8) | ||
11725 | +#define WM97XX_GPIO_9 (1 << 9) | ||
11726 | +#define WM97XX_GPIO_10 (1 << 10) | ||
11727 | +#define WM97XX_GPIO_11 (1 << 11) | ||
11728 | +#define WM97XX_GPIO_12 (1 << 12) | ||
11729 | +#define WM97XX_GPIO_13 (1 << 13) | ||
11730 | +#define WM97XX_GPIO_14 (1 << 14) | ||
11731 | +#define WM97XX_GPIO_15 (1 << 15) | ||
11732 | + | ||
11733 | + | ||
11734 | +#define AC97_LINK_FRAME 21 /* time in uS for AC97 link frame */ | ||
11735 | + | ||
11736 | + | ||
11737 | +/*---------------- Return codes from sample reading functions ---------------*/ | ||
11738 | + | ||
11739 | +/* More data is available; call the sample gathering function again */ | ||
11740 | +#define RC_AGAIN 0x00000001 | ||
11741 | +/* The returned sample is valid */ | ||
11742 | +#define RC_VALID 0x00000002 | ||
11743 | +/* The pen is up (the first RC_VALID without RC_PENUP means pen is down) */ | ||
11744 | +#define RC_PENUP 0x00000004 | ||
11745 | +/* The pen is down (RC_VALID implies RC_PENDOWN, but sometimes it is helpful | ||
11746 | + to tell the handler that the pen is down but we don't know yet his coords, | ||
11747 | + so the handler should not sleep or wait for pendown irq) */ | ||
11748 | +#define RC_PENDOWN 0x00000008 | ||
11749 | + | ||
11750 | +/* The wm97xx driver provides a private API for writing platform-specific | ||
11751 | + * drivers. | ||
11752 | + */ | ||
11753 | + | ||
11754 | +/* The structure used to return arch specific sampled data into */ | ||
11755 | +struct wm97xx_data { | ||
11756 | + int x; | ||
11757 | + int y; | ||
11758 | + int p; | ||
11759 | +}; | ||
11760 | + | ||
11761 | +/* Codec GPIO status | ||
11762 | + */ | ||
11763 | +typedef enum { | ||
11764 | + WM97XX_GPIO_HIGH, | ||
11765 | + WM97XX_GPIO_LOW | ||
11766 | +} wm97xx_gpio_status_t; | ||
11767 | + | ||
11768 | +/* Codec GPIO direction | ||
11769 | + */ | ||
11770 | +typedef enum { | ||
11771 | + WM97XX_GPIO_IN, | ||
11772 | + WM97XX_GPIO_OUT | ||
11773 | +} wm97xx_gpio_dir_t; | ||
11774 | + | ||
11775 | +/* Codec GPIO polarity | ||
11776 | + */ | ||
11777 | +typedef enum { | ||
11778 | + WM97XX_GPIO_POL_HIGH, | ||
11779 | + WM97XX_GPIO_POL_LOW | ||
11780 | +} wm97xx_gpio_pol_t; | ||
11781 | + | ||
11782 | +/* Codec GPIO sticky | ||
11783 | + */ | ||
11784 | +typedef enum { | ||
11785 | + WM97XX_GPIO_STICKY, | ||
11786 | + WM97XX_GPIO_NOTSTICKY | ||
11787 | +} wm97xx_gpio_sticky_t; | ||
11788 | + | ||
11789 | +/* Codec GPIO wake | ||
11790 | + */ | ||
11791 | +typedef enum { | ||
11792 | + WM97XX_GPIO_WAKE, | ||
11793 | + WM97XX_GPIO_NOWAKE | ||
11794 | +} wm97xx_gpio_wake_t; | ||
11795 | + | ||
11796 | + | ||
11797 | +/* | ||
11798 | + * Digitiser ioctl commands | ||
11799 | + */ | ||
11800 | +#define WM97XX_DIG_START 0x1 | ||
11801 | +#define WM97XX_DIG_STOP 0x2 | ||
11802 | +#define WM97XX_PHY_INIT 0x3 | ||
11803 | +#define WM97XX_AUX_PREPARE 0x4 | ||
11804 | +#define WM97XX_DIG_RESTORE 0x5 | ||
11805 | + | ||
11806 | +struct wm97xx; | ||
11807 | +extern struct wm97xx_codec_drv wm97xx_codec; | ||
11808 | + | ||
11809 | +/* | ||
11810 | + * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs | ||
11811 | + */ | ||
11812 | +struct wm97xx_codec_drv { | ||
11813 | + u16 id; | ||
11814 | + char *name; | ||
11815 | + int (*poll_sample) (struct wm97xx *, int adcsel, int *sample); /* read 1 sample */ | ||
11816 | + int (*poll_touch) (struct wm97xx *, struct wm97xx_data *); /* read X,Y,[P] in poll */ | ||
11817 | + int (*digitiser_ioctl) (struct wm97xx *, int cmd); | ||
11818 | + int (*acc_enable) (struct wm97xx *, int enable); | ||
11819 | +}; | ||
11820 | + | ||
11821 | + | ||
11822 | +/* Machine specific and accelerated touch operations */ | ||
11823 | +struct wm97xx_mach_ops { | ||
11824 | + | ||
11825 | + /* accelerated touch readback - coords are transmited on AC97 link */ | ||
11826 | + int acc_enabled; | ||
11827 | + void (*acc_pen_up) (struct wm97xx *); | ||
11828 | + int (*acc_pen_down) (struct wm97xx *); | ||
11829 | + int (*acc_startup) (struct wm97xx *); | ||
11830 | + void (*acc_shutdown) (struct wm97xx *); | ||
11831 | + | ||
11832 | + /* pre and post sample - can be used to minimise any analog noise */ | ||
11833 | + void (*pre_sample) (int); /* function to run before sampling */ | ||
11834 | + void (*post_sample) (int); /* function to run after sampling */ | ||
11835 | +}; | ||
11836 | + | ||
11837 | +struct wm97xx { | ||
11838 | + u16 dig[3], id, gpio[6], misc; /* Cached codec registers */ | ||
11839 | + u16 dig_save[3]; /* saved during aux reading */ | ||
11840 | + struct wm97xx_codec_drv *codec; /* attached codec driver*/ | ||
11841 | + struct input_dev* input_dev; /* touchscreen input device */ | ||
11842 | + struct snd_ac97 *ac97; /* ALSA codec access */ | ||
11843 | + struct device *dev; /* ALSA device */ | ||
11844 | + struct device *battery_dev; | ||
11845 | + struct device *touch_dev; | ||
11846 | + struct wm97xx_mach_ops *mach_ops; | ||
11847 | + struct mutex codec_mutex; | ||
11848 | + struct completion ts_init; | ||
11849 | + struct completion ts_exit; | ||
11850 | + struct task_struct *ts_task; | ||
11851 | + unsigned int pen_irq; /* Pen IRQ number in use */ | ||
11852 | + wait_queue_head_t pen_irq_wait; /* Pen IRQ wait queue */ | ||
11853 | + struct workqueue_struct *pen_irq_workq; | ||
11854 | + struct work_struct pen_event_work; | ||
11855 | + u16 acc_slot; /* AC97 slot used for acc touch data */ | ||
11856 | + u16 acc_rate; /* acc touch data rate */ | ||
11857 | + unsigned int ts_use_count; | ||
11858 | + unsigned pen_is_down:1; /* Pen is down */ | ||
11859 | + unsigned aux_waiting:1; /* aux measurement waiting */ | ||
11860 | + unsigned pen_probably_down:1; /* used in polling mode */ | ||
11861 | +}; | ||
11862 | + | ||
11863 | +/* Codec GPIO access (not supported on WM9705) | ||
11864 | + * This can be used to set/get codec GPIO and Virtual GPIO status. | ||
11865 | + */ | ||
11866 | +wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio); | ||
11867 | +void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, | ||
11868 | + wm97xx_gpio_status_t status); | ||
11869 | +void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, | ||
11870 | + wm97xx_gpio_dir_t dir, | ||
11871 | + wm97xx_gpio_pol_t pol, | ||
11872 | + wm97xx_gpio_sticky_t sticky, | ||
11873 | + wm97xx_gpio_wake_t wake); | ||
11874 | + | ||
11875 | +/* codec AC97 IO access */ | ||
11876 | +int wm97xx_reg_read(struct wm97xx *wm, u16 reg); | ||
11877 | +void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val); | ||
11878 | + | ||
11879 | +/* aux adc readback */ | ||
11880 | +int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel); | ||
11881 | + | ||
11882 | +/* machine ops */ | ||
11883 | +int wm97xx_register_mach_ops(struct wm97xx *, struct wm97xx_mach_ops *); | ||
11884 | +void wm97xx_unregister_mach_ops(struct wm97xx *); | ||
11885 | + | ||
11886 | +extern struct bus_type wm97xx_bus_type; | ||
11887 | +#endif | ||
11888 | diff --git a/sound/soc/pxa/Kconfig b/sound/soc/pxa/Kconfig | ||
11889 | index a83e229..89b5730 100644 | ||
11890 | --- a/sound/soc/pxa/Kconfig | ||
11891 | +++ b/sound/soc/pxa/Kconfig | ||
11892 | @@ -53,3 +53,12 @@ config SND_PXA2XX_SOC_TOSA | ||
11893 | help | ||
11894 | Say Y if you want to add support for SoC audio on Sharp | ||
11895 | Zaurus SL-C6000x models (Tosa). | ||
11896 | + | ||
11897 | +config SND_PXA2XX_SOC_EM_X270 | ||
11898 | + tristate "SoC Audio support for CompuLab EM-x270" | ||
11899 | + depends on SND_PXA2XX_SOC && MACH_EM_X270 | ||
11900 | + select SND_PXA2XX_SOC_AC97 | ||
11901 | + select SND_SOC_WM9712 | ||
11902 | + help | ||
11903 | + Say Y if you want to add support for SoC audio on | ||
11904 | + CompuLab EM-x270. | ||
11905 | diff --git a/sound/soc/pxa/Makefile b/sound/soc/pxa/Makefile | ||
11906 | index 78e0d6b..32375ac 100644 | ||
11907 | --- a/sound/soc/pxa/Makefile | ||
11908 | +++ b/sound/soc/pxa/Makefile | ||
11909 | @@ -12,9 +12,11 @@ snd-soc-corgi-objs := corgi.o | ||
11910 | snd-soc-poodle-objs := poodle.o | ||
11911 | snd-soc-tosa-objs := tosa.o | ||
11912 | snd-soc-spitz-objs := spitz.o | ||
11913 | +snd-soc-em-x270-objs := em-x270.o | ||
11914 | |||
11915 | obj-$(CONFIG_SND_PXA2XX_SOC_CORGI) += snd-soc-corgi.o | ||
11916 | obj-$(CONFIG_SND_PXA2XX_SOC_POODLE) += snd-soc-poodle.o | ||
11917 | obj-$(CONFIG_SND_PXA2XX_SOC_TOSA) += snd-soc-tosa.o | ||
11918 | obj-$(CONFIG_SND_PXA2XX_SOC_SPITZ) += snd-soc-spitz.o | ||
11919 | +obj-$(CONFIG_SND_PXA2XX_SOC_EM_X270) += snd-soc-em-x270.o | ||
11920 | |||
11921 | diff --git a/sound/soc/pxa/em-x270.c b/sound/soc/pxa/em-x270.c | ||
11922 | new file mode 100644 | ||
11923 | index 0000000..9e891d0 | ||
11924 | --- /dev/null | ||
11925 | +++ b/sound/soc/pxa/em-x270.c | ||
11926 | @@ -0,0 +1,137 @@ | ||
11927 | +/* | ||
11928 | + * em-x270.c -- SoC audio for EM-X270 | ||
11929 | + * | ||
11930 | + * Copyright 2007 CompuLab, Ltd. | ||
11931 | + * | ||
11932 | + * Author: Mike Rapoport <mike@compulab.co.il> | ||
11933 | + * | ||
11934 | + * Copied from tosa.c: | ||
11935 | + * Copyright 2005 Wolfson Microelectronics PLC. | ||
11936 | + * Copyright 2005 Openedhand Ltd. | ||
11937 | + * | ||
11938 | + * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com> | ||
11939 | + * Richard Purdie <richard@openedhand.com> | ||
11940 | + * | ||
11941 | + * This program is free software; you can redistribute it and/or modify it | ||
11942 | + * under the terms of the GNU General Public License as published by the | ||
11943 | + * Free Software Foundation; either version 2 of the License, or (at your | ||
11944 | + * option) any later version. | ||
11945 | + * | ||
11946 | + */ | ||
11947 | + | ||
11948 | +#include <linux/module.h> | ||
11949 | +#include <linux/moduleparam.h> | ||
11950 | +#include <linux/device.h> | ||
11951 | + | ||
11952 | +#include <sound/driver.h> | ||
11953 | +#include <sound/core.h> | ||
11954 | +#include <sound/pcm.h> | ||
11955 | +#include <sound/soc.h> | ||
11956 | +#include <sound/soc-dapm.h> | ||
11957 | + | ||
11958 | +#include <asm/mach-types.h> | ||
11959 | +#include <asm/arch/pxa-regs.h> | ||
11960 | +#include <asm/arch/hardware.h> | ||
11961 | +#include <asm/arch/audio.h> | ||
11962 | + | ||
11963 | +#include "../codecs/wm9712.h" | ||
11964 | +#include "pxa2xx-pcm.h" | ||
11965 | +#include "pxa2xx-ac97.h" | ||
11966 | + | ||
11967 | +static struct snd_soc_machine em_x270; | ||
11968 | + | ||
11969 | +#define EM_X270_HP 0 | ||
11970 | +#define EM_X270_MIC_INT 1 | ||
11971 | +#define EM_X270_HEADSET 2 | ||
11972 | +#define EM_X270_HP_OFF 3 | ||
11973 | +#define EM_X270_SPK_ON 0 | ||
11974 | +#define EM_X270_SPK_OFF 1 | ||
11975 | + | ||
11976 | + | ||
11977 | +static struct snd_soc_ops em_x270_ops = { | ||
11978 | +}; | ||
11979 | + | ||
11980 | +static const struct snd_kcontrol_new em_x270_controls[] = { | ||
11981 | +}; | ||
11982 | + | ||
11983 | +static int em_x270_ac97_init(struct snd_soc_codec *codec) | ||
11984 | +{ | ||
11985 | + int i, err; | ||
11986 | + | ||
11987 | + /* add em_x270 specific controls */ | ||
11988 | + for (i = 0; i < ARRAY_SIZE(em_x270_controls); i++) { | ||
11989 | + err = snd_ctl_add(codec->card, | ||
11990 | + snd_soc_cnew(&em_x270_controls[i],codec, NULL)); | ||
11991 | + if (err < 0) | ||
11992 | + return err; | ||
11993 | + } | ||
11994 | + | ||
11995 | + snd_soc_dapm_sync_endpoints(codec); | ||
11996 | + return 0; | ||
11997 | +} | ||
11998 | + | ||
11999 | +static struct snd_soc_dai_link em_x270_dai[] = { | ||
12000 | + { | ||
12001 | + .name = "AC97", | ||
12002 | + .stream_name = "AC97 HiFi", | ||
12003 | + .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI], | ||
12004 | + .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI], | ||
12005 | + .init = em_x270_ac97_init, | ||
12006 | + .ops = &em_x270_ops, | ||
12007 | + }, | ||
12008 | + { | ||
12009 | + .name = "AC97 Aux", | ||
12010 | + .stream_name = "AC97 Aux", | ||
12011 | + .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX], | ||
12012 | + .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX], | ||
12013 | + .ops = &em_x270_ops, | ||
12014 | + }, | ||
12015 | +}; | ||
12016 | + | ||
12017 | +static struct snd_soc_machine em_x270 = { | ||
12018 | + .name = "EM-X270", | ||
12019 | + .dai_link = em_x270_dai, | ||
12020 | + .num_links = ARRAY_SIZE(em_x270_dai), | ||
12021 | +}; | ||
12022 | + | ||
12023 | +static struct snd_soc_device em_x270_snd_devdata = { | ||
12024 | + .machine = &em_x270, | ||
12025 | + .platform = &pxa2xx_soc_platform, | ||
12026 | + .codec_dev = &soc_codec_dev_wm9712, | ||
12027 | +}; | ||
12028 | + | ||
12029 | +static struct platform_device *em_x270_snd_device; | ||
12030 | + | ||
12031 | +static int __init em_x270_init(void) | ||
12032 | +{ | ||
12033 | + int ret; | ||
12034 | + | ||
12035 | + if (!machine_is_em_x270()) | ||
12036 | + return -ENODEV; | ||
12037 | + | ||
12038 | + em_x270_snd_device = platform_device_alloc("soc-audio", -1); | ||
12039 | + if (!em_x270_snd_device) | ||
12040 | + return -ENOMEM; | ||
12041 | + | ||
12042 | + platform_set_drvdata(em_x270_snd_device, &em_x270_snd_devdata); | ||
12043 | + em_x270_snd_devdata.dev = &em_x270_snd_device->dev; | ||
12044 | + ret = platform_device_add(em_x270_snd_device); | ||
12045 | + | ||
12046 | + if (ret) | ||
12047 | + platform_device_put(em_x270_snd_device); | ||
12048 | + | ||
12049 | + return ret; | ||
12050 | +} | ||
12051 | + | ||
12052 | +static void __exit em_x270_exit(void) | ||
12053 | +{ | ||
12054 | + platform_device_unregister(em_x270_snd_device); | ||
12055 | +} | ||
12056 | + | ||
12057 | +module_init(em_x270_init); | ||
12058 | +module_exit(em_x270_exit); | ||
12059 | + | ||
12060 | +/* Module information */ | ||
12061 | +MODULE_AUTHOR("Mike Rapoport"); | ||
12062 | +MODULE_DESCRIPTION("ALSA SoC EM-X270"); | ||
12063 | +MODULE_LICENSE("GPL"); | ||
diff --git a/meta/recipes-kernel/linux/linux_2.6.23.bb b/meta/recipes-kernel/linux/linux_2.6.23.bb deleted file mode 100644 index 4ced980c83..0000000000 --- a/meta/recipes-kernel/linux/linux_2.6.23.bb +++ /dev/null | |||
@@ -1,83 +0,0 @@ | |||
1 | require linux.inc | ||
2 | |||
3 | # Mark archs/machines that this kernel supports | ||
4 | DEFAULT_PREFERENCE = "-1" | ||
5 | DEFAULT_PREFERENCE_cm-x270 = "1" | ||
6 | DEFAULT_PREFERENCE_em-x270 = "1" | ||
7 | DEFAULT_PREFERENCE_mpc8313e-rdb = "1" | ||
8 | DEFAULT_PREFERENCE_mpc8323e-rdb = "1" | ||
9 | |||
10 | PR = "r7" | ||
11 | |||
12 | SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.23.tar.bz2 \ | ||
13 | file://binutils-buildid-arm.patch;patch=1 \ | ||
14 | file://1300-fix-gcc-4.3-false-modulo-optimization.patch.patch;patch=1 \ | ||
15 | file://defconfig \ | ||
16 | " | ||
17 | |||
18 | SRC_URI_append_em-x270 = "\ | ||
19 | file://em-x270.patch;patch=1 \ | ||
20 | file://em-x270-battery-sysfs-fix.patch;patch=1 " | ||
21 | |||
22 | SRC_URI_append_cm-x270 = "\ | ||
23 | file://0001-cm-x270-base2.patch;patch=1 \ | ||
24 | file://0002-cm-x270-match-type.patch;patch=1 \ | ||
25 | file://0003-cm-x270-ide.patch;patch=1 \ | ||
26 | file://0004-cm-x270-it8152.patch;patch=1 \ | ||
27 | file://0005-cm-x270-pcmcia.patch;patch=1 \ | ||
28 | file://0006-ramdisk_load.patch;patch=1 \ | ||
29 | file://0007-mmcsd_large_cards-r0.patch;patch=1 \ | ||
30 | file://0008-cm-x270-nand-simplify-name.patch;patch=1 \ | ||
31 | file://16bpp.patch;patch=1" | ||
32 | |||
33 | CMDLINE_cm-x270 = "console=${CMX270_CONSOLE_SERIAL_PORT},38400 monitor=8 bpp=16 mem=64M mtdparts=physmap-flash.0:256k(boot)ro,0x180000(kernel),-(root);cm-x270-nand:64m(app),-(data) rdinit=/sbin/init root=mtd3 rootfstype=jffs2" | ||
34 | |||
35 | FILES_kernel-image_cm-x270 = "" | ||
36 | |||
37 | python compulab_image() { | ||
38 | import os | ||
39 | import os.path | ||
40 | import struct | ||
41 | |||
42 | machine = bb.data.getVar('MACHINE', d, 1) | ||
43 | if machine == "cm-x270": | ||
44 | deploy_dir = bb.data.getVar('DEPLOYDIR', d, 1) | ||
45 | kernel_file = os.path.join(deploy_dir, bb.data.expand('${KERNEL_IMAGE_BASE_NAME}', d) + '.bin') | ||
46 | img_file = os.path.join(deploy_dir, bb.data.expand('${KERNEL_IMAGE_BASE_NAME}', d) + '.cmx270') | ||
47 | |||
48 | fo = open(img_file, 'wb') | ||
49 | |||
50 | image_data = open(kernel_file, 'rb').read() | ||
51 | |||
52 | # first write size into first 4 bytes | ||
53 | size_s = struct.pack('i', len(image_data)) | ||
54 | |||
55 | # truncate size if we are running on a 64-bit host | ||
56 | size_s = size_s[:4] | ||
57 | |||
58 | fo.write(size_s) | ||
59 | fo.write(image_data) | ||
60 | fo.close() | ||
61 | |||
62 | os.chdir(deploy_dir) | ||
63 | link_file = bb.data.expand('${KERNEL_IMAGE_SYMLINK_NAME}', d) + '.cmx270' | ||
64 | img_file = bb.data.expand('${KERNEL_IMAGE_BASE_NAME}', d) + '.cmx270' | ||
65 | try: | ||
66 | os.unlink(link_file) | ||
67 | except: | ||
68 | pass | ||
69 | os.symlink(img_file, link_file) | ||
70 | } | ||
71 | do_deploy[postfuncs] += "compulab_image" | ||
72 | |||
73 | do_kernel_image() { | ||
74 | |||
75 | if [ "${MACHINE}" = "em-x270" ] | ||
76 | then | ||
77 | mkdir -p ${WORKDIR}/t | ||
78 | install -m 0644 ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_SYMLINK_NAME}.bin ${WORKDIR}/t/uImage | ||
79 | mkfs.jffs2 --eraseblock=0x20000 --pad --no-cleanmarkers --faketime --root=${WORKDIR}/t --output=${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.jffs2 | ||
80 | cd ${DEPLOY_DIR_IMAGE} && ln -sf ${KERNEL_IMAGE_BASE_NAME}.jffs2 uImage-em-x270.jffs2 | ||
81 | fi | ||
82 | } | ||
83 | addtask kernel_image after do_deploy | ||