diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2008-10-07 14:07:22 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-10-07 14:07:22 -0400 |
commit | 1543966a079fc7065849ae43ca4dd767c188ad55 (patch) | |
tree | 760ddb82836a4e3edf314227c731d5dc181d11a7 | |
parent | 5ff7f78a3db462ea4edf1a781a2002d4e8a8a473 (diff) | |
parent | 4e9687d9c843dc34d368358a36f5f1610e4fbab3 (diff) |
Merge branch 'pxa-palm' into pxa-machines
Conflicts:
drivers/mfd/Kconfig
drivers/pcmcia/Makefile
-rw-r--r-- | MAINTAINERS | 6 | ||||
-rw-r--r-- | arch/arm/configs/palmz72_defconfig | 951 | ||||
-rw-r--r-- | arch/arm/mach-pxa/Kconfig | 10 | ||||
-rw-r--r-- | arch/arm/mach-pxa/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-pxa/include/mach/palmz72.h | 67 | ||||
-rw-r--r-- | arch/arm/mach-pxa/palmtx.c | 20 | ||||
-rw-r--r-- | arch/arm/mach-pxa/palmz72.c | 480 | ||||
-rw-r--r-- | drivers/input/touchscreen/Kconfig | 1 | ||||
-rw-r--r-- | drivers/input/touchscreen/ucb1400_ts.c | 382 | ||||
-rw-r--r-- | drivers/mfd/Kconfig | 9 | ||||
-rw-r--r-- | drivers/mfd/Makefile | 1 | ||||
-rw-r--r-- | drivers/mfd/ucb1400_core.c | 106 | ||||
-rw-r--r-- | drivers/pcmcia/Makefile | 3 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_palmld.c | 151 | ||||
-rw-r--r-- | drivers/power/Kconfig | 8 | ||||
-rw-r--r-- | drivers/power/Makefile | 2 | ||||
-rw-r--r-- | drivers/power/palmtx_battery.c | 198 | ||||
-rw-r--r-- | drivers/power/wm97xx_battery.c | 272 | ||||
-rw-r--r-- | include/linux/ucb1400.h | 161 | ||||
-rw-r--r-- | include/linux/wm97xx_batt.h | 26 |
20 files changed, 2403 insertions, 452 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index d02ee7b6cd91..96b0137a575c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -623,6 +623,12 @@ M: marek.vasut@gmail.com | |||
623 | W: http://hackndev.com | 623 | W: http://hackndev.com |
624 | S: Maintained | 624 | S: Maintained |
625 | 625 | ||
626 | ARM/PALMZ72 SUPPORT | ||
627 | P: Sergey Lapin | ||
628 | M: slapin@ossfans.org | ||
629 | W: http://hackndev.com | ||
630 | S: Maintained | ||
631 | |||
626 | ARM/PLEB SUPPORT | 632 | ARM/PLEB SUPPORT |
627 | P: Peter Chubb | 633 | P: Peter Chubb |
628 | M: pleb@gelato.unsw.edu.au | 634 | M: pleb@gelato.unsw.edu.au |
diff --git a/arch/arm/configs/palmz72_defconfig b/arch/arm/configs/palmz72_defconfig new file mode 100644 index 000000000000..3245f8f33e0a --- /dev/null +++ b/arch/arm/configs/palmz72_defconfig | |||
@@ -0,0 +1,951 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.27-rc4 | ||
4 | # Sun Aug 24 02:29:27 2008 | ||
5 | # | ||
6 | CONFIG_ARM=y | ||
7 | CONFIG_HAVE_PWM=y | ||
8 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||
9 | CONFIG_GENERIC_GPIO=y | ||
10 | CONFIG_GENERIC_TIME=y | ||
11 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
12 | CONFIG_MMU=y | ||
13 | # CONFIG_NO_IOPORT is not set | ||
14 | CONFIG_GENERIC_HARDIRQS=y | ||
15 | CONFIG_STACKTRACE_SUPPORT=y | ||
16 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||
17 | CONFIG_LOCKDEP_SUPPORT=y | ||
18 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
19 | CONFIG_HARDIRQS_SW_RESEND=y | ||
20 | CONFIG_GENERIC_IRQ_PROBE=y | ||
21 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
22 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
23 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
24 | CONFIG_GENERIC_HWEIGHT=y | ||
25 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
26 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
27 | CONFIG_ZONE_DMA=y | ||
28 | CONFIG_ARCH_MTD_XIP=y | ||
29 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
30 | CONFIG_VECTORS_BASE=0xffff0000 | ||
31 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
32 | |||
33 | # | ||
34 | # General setup | ||
35 | # | ||
36 | CONFIG_EXPERIMENTAL=y | ||
37 | CONFIG_BROKEN_ON_SMP=y | ||
38 | CONFIG_LOCK_KERNEL=y | ||
39 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
40 | CONFIG_LOCALVERSION="" | ||
41 | # CONFIG_LOCALVERSION_AUTO is not set | ||
42 | CONFIG_SWAP=y | ||
43 | CONFIG_SYSVIPC=y | ||
44 | CONFIG_SYSVIPC_SYSCTL=y | ||
45 | # CONFIG_POSIX_MQUEUE is not set | ||
46 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
47 | # CONFIG_TASKSTATS is not set | ||
48 | # CONFIG_AUDIT is not set | ||
49 | # CONFIG_IKCONFIG is not set | ||
50 | CONFIG_LOG_BUF_SHIFT=14 | ||
51 | # CONFIG_CGROUPS is not set | ||
52 | # CONFIG_GROUP_SCHED is not set | ||
53 | CONFIG_SYSFS_DEPRECATED=y | ||
54 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
55 | # CONFIG_RELAY is not set | ||
56 | CONFIG_NAMESPACES=y | ||
57 | # CONFIG_UTS_NS is not set | ||
58 | # CONFIG_IPC_NS is not set | ||
59 | # CONFIG_USER_NS is not set | ||
60 | # CONFIG_PID_NS is not set | ||
61 | CONFIG_BLK_DEV_INITRD=y | ||
62 | CONFIG_INITRAMFS_SOURCE="" | ||
63 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
64 | CONFIG_SYSCTL=y | ||
65 | # CONFIG_EMBEDDED is not set | ||
66 | CONFIG_UID16=y | ||
67 | CONFIG_SYSCTL_SYSCALL=y | ||
68 | CONFIG_KALLSYMS=y | ||
69 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
70 | CONFIG_HOTPLUG=y | ||
71 | CONFIG_PRINTK=y | ||
72 | CONFIG_BUG=y | ||
73 | CONFIG_ELF_CORE=y | ||
74 | CONFIG_COMPAT_BRK=y | ||
75 | CONFIG_BASE_FULL=y | ||
76 | CONFIG_FUTEX=y | ||
77 | CONFIG_ANON_INODES=y | ||
78 | CONFIG_EPOLL=y | ||
79 | CONFIG_SIGNALFD=y | ||
80 | CONFIG_TIMERFD=y | ||
81 | CONFIG_EVENTFD=y | ||
82 | CONFIG_SHMEM=y | ||
83 | CONFIG_VM_EVENT_COUNTERS=y | ||
84 | CONFIG_SLAB=y | ||
85 | # CONFIG_SLUB is not set | ||
86 | # CONFIG_SLOB is not set | ||
87 | # CONFIG_PROFILING is not set | ||
88 | # CONFIG_MARKERS is not set | ||
89 | CONFIG_HAVE_OPROFILE=y | ||
90 | # CONFIG_KPROBES is not set | ||
91 | # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set | ||
92 | # CONFIG_HAVE_IOREMAP_PROT is not set | ||
93 | CONFIG_HAVE_KPROBES=y | ||
94 | CONFIG_HAVE_KRETPROBES=y | ||
95 | # CONFIG_HAVE_ARCH_TRACEHOOK is not set | ||
96 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
97 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||
98 | CONFIG_HAVE_CLK=y | ||
99 | CONFIG_PROC_PAGE_MONITOR=y | ||
100 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
101 | CONFIG_SLABINFO=y | ||
102 | CONFIG_RT_MUTEXES=y | ||
103 | # CONFIG_TINY_SHMEM is not set | ||
104 | CONFIG_BASE_SMALL=0 | ||
105 | CONFIG_MODULES=y | ||
106 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
107 | CONFIG_MODULE_UNLOAD=y | ||
108 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
109 | # CONFIG_MODVERSIONS is not set | ||
110 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
111 | CONFIG_KMOD=y | ||
112 | CONFIG_BLOCK=y | ||
113 | # CONFIG_LBD is not set | ||
114 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
115 | # CONFIG_LSF is not set | ||
116 | # CONFIG_BLK_DEV_BSG is not set | ||
117 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
118 | |||
119 | # | ||
120 | # IO Schedulers | ||
121 | # | ||
122 | CONFIG_IOSCHED_NOOP=y | ||
123 | CONFIG_IOSCHED_AS=y | ||
124 | # CONFIG_IOSCHED_DEADLINE is not set | ||
125 | # CONFIG_IOSCHED_CFQ is not set | ||
126 | CONFIG_DEFAULT_AS=y | ||
127 | # CONFIG_DEFAULT_DEADLINE is not set | ||
128 | # CONFIG_DEFAULT_CFQ is not set | ||
129 | # CONFIG_DEFAULT_NOOP is not set | ||
130 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
131 | CONFIG_CLASSIC_RCU=y | ||
132 | |||
133 | # | ||
134 | # System Type | ||
135 | # | ||
136 | # CONFIG_ARCH_AAEC2000 is not set | ||
137 | # CONFIG_ARCH_INTEGRATOR is not set | ||
138 | # CONFIG_ARCH_REALVIEW is not set | ||
139 | # CONFIG_ARCH_VERSATILE is not set | ||
140 | # CONFIG_ARCH_AT91 is not set | ||
141 | # CONFIG_ARCH_CLPS7500 is not set | ||
142 | # CONFIG_ARCH_CLPS711X is not set | ||
143 | # CONFIG_ARCH_EBSA110 is not set | ||
144 | # CONFIG_ARCH_EP93XX is not set | ||
145 | # CONFIG_ARCH_FOOTBRIDGE is not set | ||
146 | # CONFIG_ARCH_NETX is not set | ||
147 | # CONFIG_ARCH_H720X is not set | ||
148 | # CONFIG_ARCH_IMX is not set | ||
149 | # CONFIG_ARCH_IOP13XX is not set | ||
150 | # CONFIG_ARCH_IOP32X is not set | ||
151 | # CONFIG_ARCH_IOP33X is not set | ||
152 | # CONFIG_ARCH_IXP23XX is not set | ||
153 | # CONFIG_ARCH_IXP2000 is not set | ||
154 | # CONFIG_ARCH_IXP4XX is not set | ||
155 | # CONFIG_ARCH_L7200 is not set | ||
156 | # CONFIG_ARCH_KIRKWOOD is not set | ||
157 | # CONFIG_ARCH_KS8695 is not set | ||
158 | # CONFIG_ARCH_NS9XXX is not set | ||
159 | # CONFIG_ARCH_LOKI is not set | ||
160 | # CONFIG_ARCH_MV78XX0 is not set | ||
161 | # CONFIG_ARCH_MXC is not set | ||
162 | # CONFIG_ARCH_ORION5X is not set | ||
163 | # CONFIG_ARCH_PNX4008 is not set | ||
164 | CONFIG_ARCH_PXA=y | ||
165 | # CONFIG_ARCH_RPC is not set | ||
166 | # CONFIG_ARCH_SA1100 is not set | ||
167 | # CONFIG_ARCH_S3C2410 is not set | ||
168 | # CONFIG_ARCH_SHARK is not set | ||
169 | # CONFIG_ARCH_LH7A40X is not set | ||
170 | # CONFIG_ARCH_DAVINCI is not set | ||
171 | # CONFIG_ARCH_OMAP is not set | ||
172 | # CONFIG_ARCH_MSM7X00A is not set | ||
173 | |||
174 | # | ||
175 | # Intel PXA2xx/PXA3xx Implementations | ||
176 | # | ||
177 | # CONFIG_ARCH_GUMSTIX is not set | ||
178 | # CONFIG_ARCH_LUBBOCK is not set | ||
179 | # CONFIG_MACH_LOGICPD_PXA270 is not set | ||
180 | # CONFIG_MACH_MAINSTONE is not set | ||
181 | # CONFIG_ARCH_PXA_IDP is not set | ||
182 | # CONFIG_PXA_SHARPSL is not set | ||
183 | # CONFIG_ARCH_PXA_ESERIES is not set | ||
184 | # CONFIG_MACH_TRIZEPS4 is not set | ||
185 | # CONFIG_MACH_EM_X270 is not set | ||
186 | # CONFIG_MACH_COLIBRI is not set | ||
187 | # CONFIG_MACH_ZYLONITE is not set | ||
188 | # CONFIG_MACH_LITTLETON is not set | ||
189 | # CONFIG_MACH_TAVOREVB is not set | ||
190 | # CONFIG_MACH_SAAR is not set | ||
191 | # CONFIG_MACH_ARMCORE is not set | ||
192 | # CONFIG_MACH_MAGICIAN is not set | ||
193 | # CONFIG_MACH_PCM027 is not set | ||
194 | CONFIG_ARCH_PXA_PALM=y | ||
195 | # CONFIG_MACH_PALMTX is not set | ||
196 | CONFIG_MACH_PALMZ72=y | ||
197 | # CONFIG_PXA_EZX is not set | ||
198 | CONFIG_PXA27x=y | ||
199 | CONFIG_PXA_PWM=y | ||
200 | |||
201 | # | ||
202 | # Boot options | ||
203 | # | ||
204 | |||
205 | # | ||
206 | # Power management | ||
207 | # | ||
208 | |||
209 | # | ||
210 | # Processor Type | ||
211 | # | ||
212 | CONFIG_CPU_32=y | ||
213 | CONFIG_CPU_XSCALE=y | ||
214 | CONFIG_CPU_32v5=y | ||
215 | CONFIG_CPU_ABRT_EV5T=y | ||
216 | CONFIG_CPU_PABRT_NOIFAR=y | ||
217 | CONFIG_CPU_CACHE_VIVT=y | ||
218 | CONFIG_CPU_TLB_V4WBI=y | ||
219 | CONFIG_CPU_CP15=y | ||
220 | CONFIG_CPU_CP15_MMU=y | ||
221 | |||
222 | # | ||
223 | # Processor Features | ||
224 | # | ||
225 | CONFIG_ARM_THUMB=y | ||
226 | # CONFIG_CPU_DCACHE_DISABLE is not set | ||
227 | # CONFIG_OUTER_CACHE is not set | ||
228 | CONFIG_IWMMXT=y | ||
229 | CONFIG_XSCALE_PMU=y | ||
230 | |||
231 | # | ||
232 | # Bus support | ||
233 | # | ||
234 | # CONFIG_PCI_SYSCALL is not set | ||
235 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
236 | # CONFIG_PCCARD is not set | ||
237 | |||
238 | # | ||
239 | # Kernel Features | ||
240 | # | ||
241 | CONFIG_TICK_ONESHOT=y | ||
242 | # CONFIG_NO_HZ is not set | ||
243 | # CONFIG_HIGH_RES_TIMERS is not set | ||
244 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
245 | CONFIG_PREEMPT=y | ||
246 | CONFIG_HZ=100 | ||
247 | CONFIG_AEABI=y | ||
248 | CONFIG_OABI_COMPAT=y | ||
249 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
250 | CONFIG_SELECT_MEMORY_MODEL=y | ||
251 | CONFIG_FLATMEM_MANUAL=y | ||
252 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
253 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
254 | CONFIG_FLATMEM=y | ||
255 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
256 | # CONFIG_SPARSEMEM_STATIC is not set | ||
257 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
258 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
259 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||
260 | # CONFIG_RESOURCES_64BIT is not set | ||
261 | CONFIG_ZONE_DMA_FLAG=1 | ||
262 | CONFIG_BOUNCE=y | ||
263 | CONFIG_VIRT_TO_BUS=y | ||
264 | CONFIG_ALIGNMENT_TRAP=y | ||
265 | |||
266 | # | ||
267 | # Boot options | ||
268 | # | ||
269 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
270 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
271 | CONFIG_CMDLINE="mem=32M console=tty root=/dev/mmcblk0" | ||
272 | # CONFIG_XIP_KERNEL is not set | ||
273 | # CONFIG_KEXEC is not set | ||
274 | |||
275 | # | ||
276 | # CPU Frequency scaling | ||
277 | # | ||
278 | # CONFIG_CPU_FREQ is not set | ||
279 | |||
280 | # | ||
281 | # Floating point emulation | ||
282 | # | ||
283 | |||
284 | # | ||
285 | # At least one emulation must be selected | ||
286 | # | ||
287 | CONFIG_FPE_NWFPE=y | ||
288 | # CONFIG_FPE_NWFPE_XP is not set | ||
289 | # CONFIG_FPE_FASTFPE is not set | ||
290 | |||
291 | # | ||
292 | # Userspace binary formats | ||
293 | # | ||
294 | CONFIG_BINFMT_ELF=y | ||
295 | # CONFIG_BINFMT_AOUT is not set | ||
296 | # CONFIG_BINFMT_MISC is not set | ||
297 | |||
298 | # | ||
299 | # Power management options | ||
300 | # | ||
301 | CONFIG_PM=y | ||
302 | # CONFIG_PM_DEBUG is not set | ||
303 | CONFIG_PM_SLEEP=y | ||
304 | CONFIG_SUSPEND=y | ||
305 | CONFIG_SUSPEND_FREEZER=y | ||
306 | CONFIG_APM_EMULATION=y | ||
307 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
308 | CONFIG_NET=y | ||
309 | |||
310 | # | ||
311 | # Networking options | ||
312 | # | ||
313 | CONFIG_PACKET=y | ||
314 | # CONFIG_PACKET_MMAP is not set | ||
315 | CONFIG_UNIX=y | ||
316 | # CONFIG_NET_KEY is not set | ||
317 | CONFIG_INET=y | ||
318 | # CONFIG_IP_MULTICAST is not set | ||
319 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
320 | CONFIG_IP_FIB_HASH=y | ||
321 | CONFIG_IP_PNP=y | ||
322 | # CONFIG_IP_PNP_DHCP is not set | ||
323 | CONFIG_IP_PNP_BOOTP=y | ||
324 | # CONFIG_IP_PNP_RARP is not set | ||
325 | # CONFIG_NET_IPIP is not set | ||
326 | # CONFIG_NET_IPGRE is not set | ||
327 | # CONFIG_ARPD is not set | ||
328 | # CONFIG_SYN_COOKIES is not set | ||
329 | # CONFIG_INET_AH is not set | ||
330 | # CONFIG_INET_ESP is not set | ||
331 | # CONFIG_INET_IPCOMP is not set | ||
332 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
333 | # CONFIG_INET_TUNNEL is not set | ||
334 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
335 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
336 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
337 | # CONFIG_INET_LRO is not set | ||
338 | CONFIG_INET_DIAG=y | ||
339 | CONFIG_INET_TCP_DIAG=y | ||
340 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
341 | CONFIG_TCP_CONG_CUBIC=y | ||
342 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
343 | # CONFIG_TCP_MD5SIG is not set | ||
344 | # CONFIG_IPV6 is not set | ||
345 | # CONFIG_NETWORK_SECMARK is not set | ||
346 | # CONFIG_NETFILTER is not set | ||
347 | # CONFIG_IP_DCCP is not set | ||
348 | # CONFIG_IP_SCTP is not set | ||
349 | # CONFIG_TIPC is not set | ||
350 | # CONFIG_ATM is not set | ||
351 | # CONFIG_BRIDGE is not set | ||
352 | # CONFIG_VLAN_8021Q is not set | ||
353 | # CONFIG_DECNET is not set | ||
354 | # CONFIG_LLC2 is not set | ||
355 | # CONFIG_IPX is not set | ||
356 | # CONFIG_ATALK is not set | ||
357 | # CONFIG_X25 is not set | ||
358 | # CONFIG_LAPB is not set | ||
359 | # CONFIG_ECONET is not set | ||
360 | # CONFIG_WAN_ROUTER is not set | ||
361 | # CONFIG_NET_SCHED is not set | ||
362 | |||
363 | # | ||
364 | # Network testing | ||
365 | # | ||
366 | # CONFIG_NET_PKTGEN is not set | ||
367 | # CONFIG_HAMRADIO is not set | ||
368 | # CONFIG_CAN is not set | ||
369 | # CONFIG_IRDA is not set | ||
370 | # CONFIG_BT is not set | ||
371 | # CONFIG_AF_RXRPC is not set | ||
372 | |||
373 | # | ||
374 | # Wireless | ||
375 | # | ||
376 | # CONFIG_CFG80211 is not set | ||
377 | # CONFIG_WIRELESS_EXT is not set | ||
378 | # CONFIG_MAC80211 is not set | ||
379 | # CONFIG_IEEE80211 is not set | ||
380 | # CONFIG_RFKILL is not set | ||
381 | # CONFIG_NET_9P is not set | ||
382 | |||
383 | # | ||
384 | # Device Drivers | ||
385 | # | ||
386 | |||
387 | # | ||
388 | # Generic Driver Options | ||
389 | # | ||
390 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
391 | CONFIG_STANDALONE=y | ||
392 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
393 | CONFIG_FW_LOADER=y | ||
394 | CONFIG_FIRMWARE_IN_KERNEL=y | ||
395 | CONFIG_EXTRA_FIRMWARE="" | ||
396 | # CONFIG_SYS_HYPERVISOR is not set | ||
397 | # CONFIG_CONNECTOR is not set | ||
398 | # CONFIG_MTD is not set | ||
399 | # CONFIG_PARPORT is not set | ||
400 | CONFIG_BLK_DEV=y | ||
401 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
402 | CONFIG_BLK_DEV_LOOP=y | ||
403 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
404 | # CONFIG_BLK_DEV_NBD is not set | ||
405 | # CONFIG_BLK_DEV_RAM is not set | ||
406 | # CONFIG_CDROM_PKTCDVD is not set | ||
407 | # CONFIG_ATA_OVER_ETH is not set | ||
408 | # CONFIG_MISC_DEVICES is not set | ||
409 | CONFIG_HAVE_IDE=y | ||
410 | # CONFIG_IDE is not set | ||
411 | |||
412 | # | ||
413 | # SCSI device support | ||
414 | # | ||
415 | # CONFIG_RAID_ATTRS is not set | ||
416 | # CONFIG_SCSI is not set | ||
417 | # CONFIG_SCSI_DMA is not set | ||
418 | # CONFIG_SCSI_NETLINK is not set | ||
419 | # CONFIG_ATA is not set | ||
420 | # CONFIG_MD is not set | ||
421 | # CONFIG_NETDEVICES is not set | ||
422 | # CONFIG_ISDN is not set | ||
423 | |||
424 | # | ||
425 | # Input device support | ||
426 | # | ||
427 | CONFIG_INPUT=y | ||
428 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
429 | # CONFIG_INPUT_POLLDEV is not set | ||
430 | |||
431 | # | ||
432 | # Userland interfaces | ||
433 | # | ||
434 | CONFIG_INPUT_MOUSEDEV=y | ||
435 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
436 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
437 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
438 | # CONFIG_INPUT_JOYDEV is not set | ||
439 | CONFIG_INPUT_EVDEV=y | ||
440 | # CONFIG_INPUT_EVBUG is not set | ||
441 | |||
442 | # | ||
443 | # Input Device Drivers | ||
444 | # | ||
445 | CONFIG_INPUT_KEYBOARD=y | ||
446 | # CONFIG_KEYBOARD_ATKBD is not set | ||
447 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
448 | # CONFIG_KEYBOARD_LKKBD is not set | ||
449 | # CONFIG_KEYBOARD_XTKBD is not set | ||
450 | # CONFIG_KEYBOARD_NEWTON is not set | ||
451 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
452 | CONFIG_KEYBOARD_PXA27x=y | ||
453 | # CONFIG_KEYBOARD_GPIO is not set | ||
454 | # CONFIG_KEYBOARD_MATRIX is not set | ||
455 | # CONFIG_INPUT_MOUSE is not set | ||
456 | # CONFIG_INPUT_JOYSTICK is not set | ||
457 | # CONFIG_INPUT_TABLET is not set | ||
458 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
459 | # CONFIG_INPUT_MISC is not set | ||
460 | |||
461 | # | ||
462 | # Hardware I/O ports | ||
463 | # | ||
464 | # CONFIG_SERIO is not set | ||
465 | # CONFIG_GAMEPORT is not set | ||
466 | |||
467 | # | ||
468 | # Character devices | ||
469 | # | ||
470 | CONFIG_VT=y | ||
471 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
472 | CONFIG_VT_CONSOLE=y | ||
473 | CONFIG_HW_CONSOLE=y | ||
474 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
475 | CONFIG_DEVKMEM=y | ||
476 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
477 | |||
478 | # | ||
479 | # Serial drivers | ||
480 | # | ||
481 | # CONFIG_SERIAL_8250 is not set | ||
482 | |||
483 | # | ||
484 | # Non-8250 serial port support | ||
485 | # | ||
486 | # CONFIG_SERIAL_PXA is not set | ||
487 | CONFIG_UNIX98_PTYS=y | ||
488 | CONFIG_LEGACY_PTYS=y | ||
489 | CONFIG_LEGACY_PTY_COUNT=256 | ||
490 | # CONFIG_IPMI_HANDLER is not set | ||
491 | # CONFIG_HW_RANDOM is not set | ||
492 | # CONFIG_NVRAM is not set | ||
493 | # CONFIG_R3964 is not set | ||
494 | # CONFIG_RAW_DRIVER is not set | ||
495 | # CONFIG_TCG_TPM is not set | ||
496 | CONFIG_I2C=y | ||
497 | CONFIG_I2C_BOARDINFO=y | ||
498 | # CONFIG_I2C_CHARDEV is not set | ||
499 | CONFIG_I2C_HELPER_AUTO=y | ||
500 | |||
501 | # | ||
502 | # I2C Hardware Bus support | ||
503 | # | ||
504 | |||
505 | # | ||
506 | # I2C system bus drivers (mostly embedded / system-on-chip) | ||
507 | # | ||
508 | # CONFIG_I2C_GPIO is not set | ||
509 | # CONFIG_I2C_OCORES is not set | ||
510 | CONFIG_I2C_PXA=y | ||
511 | # CONFIG_I2C_PXA_SLAVE is not set | ||
512 | # CONFIG_I2C_SIMTEC is not set | ||
513 | |||
514 | # | ||
515 | # External I2C/SMBus adapter drivers | ||
516 | # | ||
517 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
518 | # CONFIG_I2C_TAOS_EVM is not set | ||
519 | |||
520 | # | ||
521 | # Other I2C/SMBus bus drivers | ||
522 | # | ||
523 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
524 | # CONFIG_I2C_STUB is not set | ||
525 | |||
526 | # | ||
527 | # Miscellaneous I2C Chip support | ||
528 | # | ||
529 | # CONFIG_DS1682 is not set | ||
530 | # CONFIG_AT24 is not set | ||
531 | # CONFIG_SENSORS_EEPROM is not set | ||
532 | # CONFIG_SENSORS_PCF8574 is not set | ||
533 | # CONFIG_PCF8575 is not set | ||
534 | # CONFIG_SENSORS_PCA9539 is not set | ||
535 | # CONFIG_SENSORS_PCF8591 is not set | ||
536 | # CONFIG_TPS65010 is not set | ||
537 | # CONFIG_SENSORS_MAX6875 is not set | ||
538 | # CONFIG_SENSORS_TSL2550 is not set | ||
539 | # CONFIG_I2C_DEBUG_CORE is not set | ||
540 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
541 | # CONFIG_I2C_DEBUG_BUS is not set | ||
542 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
543 | CONFIG_SPI=y | ||
544 | CONFIG_SPI_MASTER=y | ||
545 | |||
546 | # | ||
547 | # SPI Master Controller Drivers | ||
548 | # | ||
549 | # CONFIG_SPI_BITBANG is not set | ||
550 | # CONFIG_SPI_PXA2XX is not set | ||
551 | |||
552 | # | ||
553 | # SPI Protocol Masters | ||
554 | # | ||
555 | # CONFIG_SPI_AT25 is not set | ||
556 | CONFIG_SPI_SPIDEV=y | ||
557 | # CONFIG_SPI_TLE62X0 is not set | ||
558 | CONFIG_ARCH_REQUIRE_GPIOLIB=y | ||
559 | CONFIG_GPIOLIB=y | ||
560 | CONFIG_GPIO_SYSFS=y | ||
561 | |||
562 | # | ||
563 | # I2C GPIO expanders: | ||
564 | # | ||
565 | # CONFIG_GPIO_MAX732X is not set | ||
566 | # CONFIG_GPIO_PCA953X is not set | ||
567 | # CONFIG_GPIO_PCF857X is not set | ||
568 | |||
569 | # | ||
570 | # PCI GPIO expanders: | ||
571 | # | ||
572 | |||
573 | # | ||
574 | # SPI GPIO expanders: | ||
575 | # | ||
576 | # CONFIG_GPIO_MAX7301 is not set | ||
577 | # CONFIG_GPIO_MCP23S08 is not set | ||
578 | # CONFIG_W1 is not set | ||
579 | CONFIG_POWER_SUPPLY=y | ||
580 | # CONFIG_POWER_SUPPLY_DEBUG is not set | ||
581 | CONFIG_PDA_POWER=y | ||
582 | # CONFIG_APM_POWER is not set | ||
583 | # CONFIG_BATTERY_DS2760 is not set | ||
584 | # CONFIG_HWMON is not set | ||
585 | # CONFIG_WATCHDOG is not set | ||
586 | |||
587 | # | ||
588 | # Sonics Silicon Backplane | ||
589 | # | ||
590 | CONFIG_SSB_POSSIBLE=y | ||
591 | # CONFIG_SSB is not set | ||
592 | |||
593 | # | ||
594 | # Multifunction device drivers | ||
595 | # | ||
596 | # CONFIG_MFD_CORE is not set | ||
597 | # CONFIG_MFD_SM501 is not set | ||
598 | # CONFIG_HTC_EGPIO is not set | ||
599 | # CONFIG_HTC_PASIC3 is not set | ||
600 | # CONFIG_MFD_TMIO is not set | ||
601 | # CONFIG_MFD_T7L66XB is not set | ||
602 | # CONFIG_MFD_TC6387XB is not set | ||
603 | # CONFIG_MFD_TC6393XB is not set | ||
604 | |||
605 | # | ||
606 | # Multimedia devices | ||
607 | # | ||
608 | |||
609 | # | ||
610 | # Multimedia core support | ||
611 | # | ||
612 | # CONFIG_VIDEO_DEV is not set | ||
613 | # CONFIG_DVB_CORE is not set | ||
614 | # CONFIG_VIDEO_MEDIA is not set | ||
615 | |||
616 | # | ||
617 | # Multimedia drivers | ||
618 | # | ||
619 | # CONFIG_DAB is not set | ||
620 | |||
621 | # | ||
622 | # Graphics support | ||
623 | # | ||
624 | # CONFIG_VGASTATE is not set | ||
625 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
626 | CONFIG_FB=y | ||
627 | # CONFIG_FIRMWARE_EDID is not set | ||
628 | # CONFIG_FB_DDC is not set | ||
629 | CONFIG_FB_CFB_FILLRECT=y | ||
630 | CONFIG_FB_CFB_COPYAREA=y | ||
631 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
632 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
633 | # CONFIG_FB_SYS_FILLRECT is not set | ||
634 | # CONFIG_FB_SYS_COPYAREA is not set | ||
635 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
636 | # CONFIG_FB_FOREIGN_ENDIAN is not set | ||
637 | # CONFIG_FB_SYS_FOPS is not set | ||
638 | # CONFIG_FB_SVGALIB is not set | ||
639 | # CONFIG_FB_MACMODES is not set | ||
640 | # CONFIG_FB_BACKLIGHT is not set | ||
641 | # CONFIG_FB_MODE_HELPERS is not set | ||
642 | # CONFIG_FB_TILEBLITTING is not set | ||
643 | |||
644 | # | ||
645 | # Frame buffer hardware drivers | ||
646 | # | ||
647 | # CONFIG_FB_S1D13XXX is not set | ||
648 | CONFIG_FB_PXA=y | ||
649 | # CONFIG_FB_PXA_SMARTPANEL is not set | ||
650 | # CONFIG_FB_PXA_PARAMETERS is not set | ||
651 | # CONFIG_FB_MBX is not set | ||
652 | # CONFIG_FB_W100 is not set | ||
653 | # CONFIG_FB_AM200EPD is not set | ||
654 | # CONFIG_FB_VIRTUAL is not set | ||
655 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
656 | # CONFIG_LCD_CLASS_DEVICE is not set | ||
657 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
658 | # CONFIG_BACKLIGHT_CORGI is not set | ||
659 | CONFIG_BACKLIGHT_PWM=y | ||
660 | |||
661 | # | ||
662 | # Display device support | ||
663 | # | ||
664 | CONFIG_DISPLAY_SUPPORT=y | ||
665 | |||
666 | # | ||
667 | # Display hardware drivers | ||
668 | # | ||
669 | |||
670 | # | ||
671 | # Console display driver support | ||
672 | # | ||
673 | # CONFIG_VGA_CONSOLE is not set | ||
674 | CONFIG_DUMMY_CONSOLE=y | ||
675 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
676 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
677 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
678 | CONFIG_FONTS=y | ||
679 | CONFIG_FONT_8x8=y | ||
680 | # CONFIG_FONT_8x16 is not set | ||
681 | # CONFIG_FONT_6x11 is not set | ||
682 | # CONFIG_FONT_7x14 is not set | ||
683 | # CONFIG_FONT_PEARL_8x8 is not set | ||
684 | # CONFIG_FONT_ACORN_8x8 is not set | ||
685 | # CONFIG_FONT_MINI_4x6 is not set | ||
686 | # CONFIG_FONT_SUN8x16 is not set | ||
687 | # CONFIG_FONT_SUN12x22 is not set | ||
688 | # CONFIG_FONT_10x18 is not set | ||
689 | # CONFIG_LOGO is not set | ||
690 | # CONFIG_SOUND is not set | ||
691 | # CONFIG_HID_SUPPORT is not set | ||
692 | # CONFIG_USB_SUPPORT is not set | ||
693 | CONFIG_MMC=y | ||
694 | CONFIG_MMC_DEBUG=y | ||
695 | # CONFIG_MMC_UNSAFE_RESUME is not set | ||
696 | |||
697 | # | ||
698 | # MMC/SD Card Drivers | ||
699 | # | ||
700 | CONFIG_MMC_BLOCK=y | ||
701 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
702 | # CONFIG_SDIO_UART is not set | ||
703 | # CONFIG_MMC_TEST is not set | ||
704 | |||
705 | # | ||
706 | # MMC/SD Host Controller Drivers | ||
707 | # | ||
708 | CONFIG_MMC_PXA=y | ||
709 | # CONFIG_MMC_SDHCI is not set | ||
710 | # CONFIG_MMC_SPI is not set | ||
711 | # CONFIG_NEW_LEDS is not set | ||
712 | CONFIG_RTC_LIB=y | ||
713 | CONFIG_RTC_CLASS=y | ||
714 | CONFIG_RTC_HCTOSYS=y | ||
715 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
716 | # CONFIG_RTC_DEBUG is not set | ||
717 | |||
718 | # | ||
719 | # RTC interfaces | ||
720 | # | ||
721 | CONFIG_RTC_INTF_SYSFS=y | ||
722 | CONFIG_RTC_INTF_PROC=y | ||
723 | CONFIG_RTC_INTF_DEV=y | ||
724 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
725 | # CONFIG_RTC_DRV_TEST is not set | ||
726 | |||
727 | # | ||
728 | # I2C RTC drivers | ||
729 | # | ||
730 | # CONFIG_RTC_DRV_DS1307 is not set | ||
731 | # CONFIG_RTC_DRV_DS1374 is not set | ||
732 | # CONFIG_RTC_DRV_DS1672 is not set | ||
733 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
734 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
735 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
736 | # CONFIG_RTC_DRV_X1205 is not set | ||
737 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
738 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
739 | # CONFIG_RTC_DRV_M41T80 is not set | ||
740 | # CONFIG_RTC_DRV_S35390A is not set | ||
741 | # CONFIG_RTC_DRV_FM3130 is not set | ||
742 | |||
743 | # | ||
744 | # SPI RTC drivers | ||
745 | # | ||
746 | # CONFIG_RTC_DRV_M41T94 is not set | ||
747 | # CONFIG_RTC_DRV_DS1305 is not set | ||
748 | # CONFIG_RTC_DRV_MAX6902 is not set | ||
749 | # CONFIG_RTC_DRV_R9701 is not set | ||
750 | # CONFIG_RTC_DRV_RS5C348 is not set | ||
751 | |||
752 | # | ||
753 | # Platform RTC drivers | ||
754 | # | ||
755 | # CONFIG_RTC_DRV_CMOS is not set | ||
756 | # CONFIG_RTC_DRV_DS1511 is not set | ||
757 | # CONFIG_RTC_DRV_DS1553 is not set | ||
758 | # CONFIG_RTC_DRV_DS1742 is not set | ||
759 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
760 | # CONFIG_RTC_DRV_M48T86 is not set | ||
761 | # CONFIG_RTC_DRV_M48T59 is not set | ||
762 | # CONFIG_RTC_DRV_V3020 is not set | ||
763 | |||
764 | # | ||
765 | # on-CPU RTC drivers | ||
766 | # | ||
767 | CONFIG_RTC_DRV_SA1100=y | ||
768 | # CONFIG_DMADEVICES is not set | ||
769 | |||
770 | # | ||
771 | # Voltage and Current regulators | ||
772 | # | ||
773 | # CONFIG_REGULATOR is not set | ||
774 | # CONFIG_REGULATOR_FIXED_VOLTAGE is not set | ||
775 | # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set | ||
776 | # CONFIG_REGULATOR_BQ24022 is not set | ||
777 | # CONFIG_UIO is not set | ||
778 | |||
779 | # | ||
780 | # File systems | ||
781 | # | ||
782 | CONFIG_EXT2_FS=y | ||
783 | # CONFIG_EXT2_FS_XATTR is not set | ||
784 | # CONFIG_EXT2_FS_XIP is not set | ||
785 | CONFIG_EXT3_FS=y | ||
786 | CONFIG_EXT3_FS_XATTR=y | ||
787 | # CONFIG_EXT3_FS_POSIX_ACL is not set | ||
788 | # CONFIG_EXT3_FS_SECURITY is not set | ||
789 | # CONFIG_EXT4DEV_FS is not set | ||
790 | CONFIG_JBD=y | ||
791 | CONFIG_FS_MBCACHE=y | ||
792 | # CONFIG_REISERFS_FS is not set | ||
793 | # CONFIG_JFS_FS is not set | ||
794 | # CONFIG_FS_POSIX_ACL is not set | ||
795 | # CONFIG_XFS_FS is not set | ||
796 | # CONFIG_OCFS2_FS is not set | ||
797 | # CONFIG_DNOTIFY is not set | ||
798 | # CONFIG_INOTIFY is not set | ||
799 | # CONFIG_QUOTA is not set | ||
800 | # CONFIG_AUTOFS_FS is not set | ||
801 | # CONFIG_AUTOFS4_FS is not set | ||
802 | # CONFIG_FUSE_FS is not set | ||
803 | |||
804 | # | ||
805 | # CD-ROM/DVD Filesystems | ||
806 | # | ||
807 | # CONFIG_ISO9660_FS is not set | ||
808 | # CONFIG_UDF_FS is not set | ||
809 | |||
810 | # | ||
811 | # DOS/FAT/NT Filesystems | ||
812 | # | ||
813 | CONFIG_FAT_FS=y | ||
814 | CONFIG_MSDOS_FS=y | ||
815 | CONFIG_VFAT_FS=y | ||
816 | CONFIG_FAT_DEFAULT_CODEPAGE=866 | ||
817 | CONFIG_FAT_DEFAULT_IOCHARSET="utf8" | ||
818 | # CONFIG_NTFS_FS is not set | ||
819 | |||
820 | # | ||
821 | # Pseudo filesystems | ||
822 | # | ||
823 | CONFIG_PROC_FS=y | ||
824 | CONFIG_PROC_SYSCTL=y | ||
825 | CONFIG_SYSFS=y | ||
826 | CONFIG_TMPFS=y | ||
827 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
828 | # CONFIG_HUGETLB_PAGE is not set | ||
829 | # CONFIG_CONFIGFS_FS is not set | ||
830 | |||
831 | # | ||
832 | # Miscellaneous filesystems | ||
833 | # | ||
834 | # CONFIG_ADFS_FS is not set | ||
835 | # CONFIG_AFFS_FS is not set | ||
836 | # CONFIG_HFS_FS is not set | ||
837 | # CONFIG_HFSPLUS_FS is not set | ||
838 | # CONFIG_BEFS_FS is not set | ||
839 | # CONFIG_BFS_FS is not set | ||
840 | # CONFIG_EFS_FS is not set | ||
841 | # CONFIG_CRAMFS is not set | ||
842 | # CONFIG_VXFS_FS is not set | ||
843 | # CONFIG_MINIX_FS is not set | ||
844 | # CONFIG_OMFS_FS is not set | ||
845 | # CONFIG_HPFS_FS is not set | ||
846 | # CONFIG_QNX4FS_FS is not set | ||
847 | # CONFIG_ROMFS_FS is not set | ||
848 | # CONFIG_SYSV_FS is not set | ||
849 | # CONFIG_UFS_FS is not set | ||
850 | # CONFIG_NETWORK_FILESYSTEMS is not set | ||
851 | |||
852 | # | ||
853 | # Partition Types | ||
854 | # | ||
855 | # CONFIG_PARTITION_ADVANCED is not set | ||
856 | CONFIG_MSDOS_PARTITION=y | ||
857 | CONFIG_NLS=y | ||
858 | CONFIG_NLS_DEFAULT="utf8" | ||
859 | # CONFIG_NLS_CODEPAGE_437 is not set | ||
860 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
861 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
862 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
863 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
864 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
865 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
866 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
867 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
868 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
869 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
870 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
871 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
872 | CONFIG_NLS_CODEPAGE_866=y | ||
873 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
874 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
875 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
876 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
877 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
878 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
879 | # CONFIG_NLS_ISO8859_8 is not set | ||
880 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
881 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
882 | # CONFIG_NLS_ASCII is not set | ||
883 | # CONFIG_NLS_ISO8859_1 is not set | ||
884 | # CONFIG_NLS_ISO8859_2 is not set | ||
885 | # CONFIG_NLS_ISO8859_3 is not set | ||
886 | # CONFIG_NLS_ISO8859_4 is not set | ||
887 | # CONFIG_NLS_ISO8859_5 is not set | ||
888 | # CONFIG_NLS_ISO8859_6 is not set | ||
889 | # CONFIG_NLS_ISO8859_7 is not set | ||
890 | # CONFIG_NLS_ISO8859_9 is not set | ||
891 | # CONFIG_NLS_ISO8859_13 is not set | ||
892 | # CONFIG_NLS_ISO8859_14 is not set | ||
893 | # CONFIG_NLS_ISO8859_15 is not set | ||
894 | # CONFIG_NLS_KOI8_R is not set | ||
895 | # CONFIG_NLS_KOI8_U is not set | ||
896 | CONFIG_NLS_UTF8=y | ||
897 | # CONFIG_DLM is not set | ||
898 | |||
899 | # | ||
900 | # Kernel hacking | ||
901 | # | ||
902 | # CONFIG_PRINTK_TIME is not set | ||
903 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
904 | CONFIG_ENABLE_MUST_CHECK=y | ||
905 | CONFIG_FRAME_WARN=1024 | ||
906 | # CONFIG_MAGIC_SYSRQ is not set | ||
907 | # CONFIG_UNUSED_SYMBOLS is not set | ||
908 | # CONFIG_DEBUG_FS is not set | ||
909 | # CONFIG_HEADERS_CHECK is not set | ||
910 | # CONFIG_DEBUG_KERNEL is not set | ||
911 | CONFIG_DEBUG_BUGVERBOSE=y | ||
912 | CONFIG_DEBUG_MEMORY_INIT=y | ||
913 | CONFIG_FRAME_POINTER=y | ||
914 | # CONFIG_LATENCYTOP is not set | ||
915 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
916 | CONFIG_HAVE_FTRACE=y | ||
917 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
918 | # CONFIG_FTRACE is not set | ||
919 | # CONFIG_IRQSOFF_TRACER is not set | ||
920 | # CONFIG_PREEMPT_TRACER is not set | ||
921 | # CONFIG_SCHED_TRACER is not set | ||
922 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
923 | # CONFIG_SAMPLES is not set | ||
924 | CONFIG_HAVE_ARCH_KGDB=y | ||
925 | CONFIG_DEBUG_USER=y | ||
926 | |||
927 | # | ||
928 | # Security options | ||
929 | # | ||
930 | # CONFIG_KEYS is not set | ||
931 | # CONFIG_SECURITY is not set | ||
932 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
933 | # CONFIG_CRYPTO is not set | ||
934 | |||
935 | # | ||
936 | # Library routines | ||
937 | # | ||
938 | CONFIG_BITREVERSE=y | ||
939 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
940 | # CONFIG_GENERIC_FIND_NEXT_BIT is not set | ||
941 | # CONFIG_CRC_CCITT is not set | ||
942 | # CONFIG_CRC16 is not set | ||
943 | CONFIG_CRC_T10DIF=y | ||
944 | # CONFIG_CRC_ITU_T is not set | ||
945 | CONFIG_CRC32=y | ||
946 | # CONFIG_CRC7 is not set | ||
947 | # CONFIG_LIBCRC32C is not set | ||
948 | CONFIG_PLIST=y | ||
949 | CONFIG_HAS_IOMEM=y | ||
950 | CONFIG_HAS_IOPORT=y | ||
951 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index d056e0ff7812..5548abd6390c 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig | |||
@@ -288,6 +288,16 @@ config MACH_PALMTX | |||
288 | Say Y here if you intend to run this kernel on a Palm T|X | 288 | Say Y here if you intend to run this kernel on a Palm T|X |
289 | handheld computer. | 289 | handheld computer. |
290 | 290 | ||
291 | config MACH_PALMZ72 | ||
292 | bool "Palm Zire 72" | ||
293 | default y | ||
294 | depends on ARCH_PXA_PALM | ||
295 | select PXA27x | ||
296 | select IWMMXT | ||
297 | help | ||
298 | Say Y here if you intend to run this kernel on Palm Zire 72 | ||
299 | handheld computer. | ||
300 | |||
291 | config MACH_PCM990_BASEBOARD | 301 | config MACH_PCM990_BASEBOARD |
292 | bool "PHYTEC PCM-990 development board" | 302 | bool "PHYTEC PCM-990 development board" |
293 | select HAVE_PWM | 303 | select HAVE_PWM |
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index 0d213ec58b1c..30936e40fea6 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile | |||
@@ -45,6 +45,7 @@ obj-$(CONFIG_MACH_E750) += e750_lcd.o | |||
45 | obj-$(CONFIG_MACH_E400) += e400_lcd.o | 45 | obj-$(CONFIG_MACH_E400) += e400_lcd.o |
46 | obj-$(CONFIG_MACH_E800) += e800_lcd.o | 46 | obj-$(CONFIG_MACH_E800) += e800_lcd.o |
47 | obj-$(CONFIG_MACH_PALMTX) += palmtx.o | 47 | obj-$(CONFIG_MACH_PALMTX) += palmtx.o |
48 | obj-$(CONFIG_MACH_PALMZ72) += palmz72.o | ||
48 | 49 | ||
49 | ifeq ($(CONFIG_MACH_ZYLONITE),y) | 50 | ifeq ($(CONFIG_MACH_ZYLONITE),y) |
50 | obj-y += zylonite.o | 51 | obj-y += zylonite.o |
diff --git a/arch/arm/mach-pxa/include/mach/palmz72.h b/arch/arm/mach-pxa/include/mach/palmz72.h new file mode 100644 index 000000000000..8fd30bcecb7c --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/palmz72.h | |||
@@ -0,0 +1,67 @@ | |||
1 | /* | ||
2 | * GPIOs and interrupts for Palm Zire72 Handheld Computer | ||
3 | * | ||
4 | * Authors: Alex Osborne <bobofdoom@gmail.com> | ||
5 | * Jan Herman <2hp@seznam.cz> | ||
6 | * Sergey Lapin <slapin@ossfans.org> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #ifndef _INCLUDE_PALMZ72_H_ | ||
15 | #define _INCLUDE_PALMZ72_H_ | ||
16 | |||
17 | /* Power and control */ | ||
18 | #define GPIO_NR_PALMZ72_GPIO_RESET 1 | ||
19 | #define GPIO_NR_PALMZ72_POWER_DETECT 0 | ||
20 | |||
21 | /* SD/MMC */ | ||
22 | #define GPIO_NR_PALMZ72_SD_DETECT_N 14 | ||
23 | #define GPIO_NR_PALMZ72_SD_POWER_N 98 | ||
24 | #define GPIO_NR_PALMZ72_SD_RO 115 | ||
25 | |||
26 | /* Touchscreen */ | ||
27 | #define GPIO_NR_PALMZ72_WM9712_IRQ 27 | ||
28 | |||
29 | /* IRDA - disable GPIO connected to SD pin of tranceiver (TFBS4710?) ? */ | ||
30 | #define GPIO_NR_PALMZ72_IR_DISABLE 49 | ||
31 | |||
32 | /* USB */ | ||
33 | #define GPIO_NR_PALMZ72_USB_DETECT_N 15 | ||
34 | #define GPIO_NR_PALMZ72_USB_POWER 95 | ||
35 | #define GPIO_NR_PALMZ72_USB_PULLUP 12 | ||
36 | |||
37 | /* LCD/Backlight */ | ||
38 | #define GPIO_NR_PALMZ72_BL_POWER 20 | ||
39 | #define GPIO_NR_PALMZ72_LCD_POWER 96 | ||
40 | |||
41 | /* LED */ | ||
42 | #define GPIO_NR_PALMZ72_LED_GREEN 88 | ||
43 | |||
44 | /* Bluetooth */ | ||
45 | #define GPIO_NR_PALMZ72_BT_POWER 17 | ||
46 | #define GPIO_NR_PALMZ72_BT_RESET 83 | ||
47 | |||
48 | /** Initial values **/ | ||
49 | |||
50 | /* Battery */ | ||
51 | #define PALMZ72_BAT_MAX_VOLTAGE 4000 /* 4.00v current voltage */ | ||
52 | #define PALMZ72_BAT_MIN_VOLTAGE 3550 /* 3.55v critical voltage */ | ||
53 | #define PALMZ72_BAT_MAX_CURRENT 0 /* unknokn */ | ||
54 | #define PALMZ72_BAT_MIN_CURRENT 0 /* unknown */ | ||
55 | #define PALMZ72_BAT_MAX_CHARGE 1 /* unknown */ | ||
56 | #define PALMZ72_BAT_MIN_CHARGE 1 /* unknown */ | ||
57 | #define PALMZ72_MAX_LIFE_MINS 360 /* on-life in minutes */ | ||
58 | |||
59 | /* Backlight */ | ||
60 | #define PALMZ72_MAX_INTENSITY 0xFE | ||
61 | #define PALMZ72_DEFAULT_INTENSITY 0x7E | ||
62 | #define PALMZ72_LIMIT_MASK 0x7F | ||
63 | #define PALMZ72_PRESCALER 0x3F | ||
64 | #define PALMZ72_PERIOD_NS 3500 | ||
65 | |||
66 | #endif | ||
67 | |||
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index fe924a23debe..4447711c9fc6 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include <linux/pda_power.h> | 25 | #include <linux/pda_power.h> |
26 | #include <linux/pwm_backlight.h> | 26 | #include <linux/pwm_backlight.h> |
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | #include <linux/wm97xx_batt.h> | ||
29 | #include <linux/power_supply.h> | ||
28 | 30 | ||
29 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
@@ -340,6 +342,23 @@ static struct platform_device power_supply = { | |||
340 | }; | 342 | }; |
341 | 343 | ||
342 | /****************************************************************************** | 344 | /****************************************************************************** |
345 | * WM97xx battery | ||
346 | ******************************************************************************/ | ||
347 | static struct wm97xx_batt_info wm97xx_batt_pdata = { | ||
348 | .batt_aux = WM97XX_AUX_ID3, | ||
349 | .temp_aux = WM97XX_AUX_ID2, | ||
350 | .charge_gpio = -1, | ||
351 | .max_voltage = PALMTX_BAT_MAX_VOLTAGE, | ||
352 | .min_voltage = PALMTX_BAT_MIN_VOLTAGE, | ||
353 | .batt_mult = 1000, | ||
354 | .batt_div = 414, | ||
355 | .temp_mult = 1, | ||
356 | .temp_div = 1, | ||
357 | .batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO, | ||
358 | .batt_name = "main-batt", | ||
359 | }; | ||
360 | |||
361 | /****************************************************************************** | ||
343 | * Framebuffer | 362 | * Framebuffer |
344 | ******************************************************************************/ | 363 | ******************************************************************************/ |
345 | static struct pxafb_mode_info palmtx_lcd_modes[] = { | 364 | static struct pxafb_mode_info palmtx_lcd_modes[] = { |
@@ -401,6 +420,7 @@ static void __init palmtx_init(void) | |||
401 | pxa_set_ac97_info(NULL); | 420 | pxa_set_ac97_info(NULL); |
402 | pxa_set_ficp_info(&palmtx_ficp_platform_data); | 421 | pxa_set_ficp_info(&palmtx_ficp_platform_data); |
403 | pxa_set_keypad_info(&palmtx_keypad_platform_data); | 422 | pxa_set_keypad_info(&palmtx_keypad_platform_data); |
423 | wm97xx_bat_set_pdata(&wm97xx_batt_pdata); | ||
404 | 424 | ||
405 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 425 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
406 | } | 426 | } |
diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c new file mode 100644 index 000000000000..a90b4d77a201 --- /dev/null +++ b/arch/arm/mach-pxa/palmz72.c | |||
@@ -0,0 +1,480 @@ | |||
1 | /* | ||
2 | * Hardware definitions for Palm Zire72 | ||
3 | * | ||
4 | * Authors: | ||
5 | * Vladimir "Farcaller" Pouzanov <farcaller@gmail.com> | ||
6 | * Sergey Lapin <slapin@ossfans.org> | ||
7 | * Alex Osborne <bobofdoom@gmail.com> | ||
8 | * Jan Herman <2hp@seznam.cz> | ||
9 | * | ||
10 | * Rewrite for mainline: | ||
11 | * Marek Vasut <marek.vasut@gmail.com> | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License version 2 as | ||
15 | * published by the Free Software Foundation. | ||
16 | * | ||
17 | * (find more info at www.hackndev.com) | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/sysdev.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/irq.h> | ||
25 | #include <linux/gpio_keys.h> | ||
26 | #include <linux/input.h> | ||
27 | #include <linux/pda_power.h> | ||
28 | #include <linux/pwm_backlight.h> | ||
29 | #include <linux/gpio.h> | ||
30 | #include <linux/power_supply.h> | ||
31 | |||
32 | #include <asm/mach-types.h> | ||
33 | #include <asm/mach/arch.h> | ||
34 | #include <asm/mach/map.h> | ||
35 | |||
36 | #include <mach/audio.h> | ||
37 | #include <mach/palmz72.h> | ||
38 | #include <mach/mmc.h> | ||
39 | #include <mach/pxafb.h> | ||
40 | #include <mach/pxa-regs.h> | ||
41 | #include <mach/pxa2xx-regs.h> | ||
42 | #include <mach/mfp-pxa27x.h> | ||
43 | #include <mach/irda.h> | ||
44 | #include <mach/pxa27x_keypad.h> | ||
45 | #include <mach/udc.h> | ||
46 | #include <mach/pm.h> | ||
47 | |||
48 | #include "generic.h" | ||
49 | #include "devices.h" | ||
50 | |||
51 | /****************************************************************************** | ||
52 | * Pin configuration | ||
53 | ******************************************************************************/ | ||
54 | static unsigned long palmz72_pin_config[] __initdata = { | ||
55 | /* MMC */ | ||
56 | GPIO32_MMC_CLK, | ||
57 | GPIO92_MMC_DAT_0, | ||
58 | GPIO109_MMC_DAT_1, | ||
59 | GPIO110_MMC_DAT_2, | ||
60 | GPIO111_MMC_DAT_3, | ||
61 | GPIO112_MMC_CMD, | ||
62 | GPIO14_GPIO, /* SD detect */ | ||
63 | GPIO115_GPIO, /* SD RO */ | ||
64 | GPIO98_GPIO, /* SD power */ | ||
65 | |||
66 | /* AC97 */ | ||
67 | GPIO28_AC97_BITCLK, | ||
68 | GPIO29_AC97_SDATA_IN_0, | ||
69 | GPIO30_AC97_SDATA_OUT, | ||
70 | GPIO31_AC97_SYNC, | ||
71 | |||
72 | /* IrDA */ | ||
73 | GPIO49_GPIO, /* ir disable */ | ||
74 | GPIO46_FICP_RXD, | ||
75 | GPIO47_FICP_TXD, | ||
76 | |||
77 | /* PWM */ | ||
78 | GPIO16_PWM0_OUT, | ||
79 | |||
80 | /* USB */ | ||
81 | GPIO15_GPIO, /* usb detect */ | ||
82 | GPIO12_GPIO, /* usb pullup */ | ||
83 | GPIO95_GPIO, /* usb power */ | ||
84 | |||
85 | /* Matrix keypad */ | ||
86 | GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, | ||
87 | GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, | ||
88 | GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, | ||
89 | GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, | ||
90 | GPIO103_KP_MKOUT_0, | ||
91 | GPIO104_KP_MKOUT_1, | ||
92 | GPIO105_KP_MKOUT_2, | ||
93 | |||
94 | /* LCD */ | ||
95 | GPIO58_LCD_LDD_0, | ||
96 | GPIO59_LCD_LDD_1, | ||
97 | GPIO60_LCD_LDD_2, | ||
98 | GPIO61_LCD_LDD_3, | ||
99 | GPIO62_LCD_LDD_4, | ||
100 | GPIO63_LCD_LDD_5, | ||
101 | GPIO64_LCD_LDD_6, | ||
102 | GPIO65_LCD_LDD_7, | ||
103 | GPIO66_LCD_LDD_8, | ||
104 | GPIO67_LCD_LDD_9, | ||
105 | GPIO68_LCD_LDD_10, | ||
106 | GPIO69_LCD_LDD_11, | ||
107 | GPIO70_LCD_LDD_12, | ||
108 | GPIO71_LCD_LDD_13, | ||
109 | GPIO72_LCD_LDD_14, | ||
110 | GPIO73_LCD_LDD_15, | ||
111 | GPIO74_LCD_FCLK, | ||
112 | GPIO75_LCD_LCLK, | ||
113 | GPIO76_LCD_PCLK, | ||
114 | GPIO77_LCD_BIAS, | ||
115 | GPIO20_GPIO, /* bl power */ | ||
116 | GPIO21_GPIO, /* LCD border switch */ | ||
117 | GPIO22_GPIO, /* LCD border color */ | ||
118 | GPIO96_GPIO, /* lcd power */ | ||
119 | |||
120 | /* Misc. */ | ||
121 | GPIO0_GPIO | WAKEUP_ON_LEVEL_HIGH, /* power detect */ | ||
122 | GPIO88_GPIO, /* green led */ | ||
123 | GPIO27_GPIO, /* WM9712 IRQ */ | ||
124 | }; | ||
125 | |||
126 | /****************************************************************************** | ||
127 | * SD/MMC card controller | ||
128 | ******************************************************************************/ | ||
129 | static int palmz72_mci_init(struct device *dev, | ||
130 | irq_handler_t palmz72_detect_int, void *data) | ||
131 | { | ||
132 | int err = 0; | ||
133 | |||
134 | /* Setup an interrupt for detecting card insert/remove events */ | ||
135 | err = gpio_request(GPIO_NR_PALMZ72_SD_DETECT_N, "SD IRQ"); | ||
136 | if (err) | ||
137 | goto err; | ||
138 | err = gpio_direction_input(GPIO_NR_PALMZ72_SD_DETECT_N); | ||
139 | if (err) | ||
140 | goto err2; | ||
141 | err = request_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), | ||
142 | palmz72_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM | | ||
143 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, | ||
144 | "SD/MMC card detect", data); | ||
145 | if (err) { | ||
146 | printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n", | ||
147 | __func__); | ||
148 | goto err2; | ||
149 | } | ||
150 | |||
151 | /* SD_POWER is not actually power, but it is more like chip | ||
152 | * select, i.e. it is inverted */ | ||
153 | |||
154 | err = gpio_request(GPIO_NR_PALMZ72_SD_POWER_N, "SD_POWER"); | ||
155 | if (err) | ||
156 | goto err3; | ||
157 | err = gpio_direction_output(GPIO_NR_PALMZ72_SD_POWER_N, 0); | ||
158 | if (err) | ||
159 | goto err4; | ||
160 | err = gpio_request(GPIO_NR_PALMZ72_SD_RO, "SD_RO"); | ||
161 | if (err) | ||
162 | goto err4; | ||
163 | err = gpio_direction_input(GPIO_NR_PALMZ72_SD_RO); | ||
164 | if (err) | ||
165 | goto err5; | ||
166 | |||
167 | printk(KERN_DEBUG "%s: irq registered\n", __func__); | ||
168 | |||
169 | return 0; | ||
170 | |||
171 | err5: | ||
172 | gpio_free(GPIO_NR_PALMZ72_SD_RO); | ||
173 | err4: | ||
174 | gpio_free(GPIO_NR_PALMZ72_SD_POWER_N); | ||
175 | err3: | ||
176 | free_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), data); | ||
177 | err2: | ||
178 | gpio_free(GPIO_NR_PALMZ72_SD_DETECT_N); | ||
179 | err: | ||
180 | return err; | ||
181 | } | ||
182 | |||
183 | static void palmz72_mci_exit(struct device *dev, void *data) | ||
184 | { | ||
185 | gpio_free(GPIO_NR_PALMZ72_SD_POWER_N); | ||
186 | free_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), data); | ||
187 | gpio_free(GPIO_NR_PALMZ72_SD_DETECT_N); | ||
188 | gpio_free(GPIO_NR_PALMZ72_SD_RO); | ||
189 | } | ||
190 | |||
191 | static void palmz72_mci_power(struct device *dev, unsigned int vdd) | ||
192 | { | ||
193 | struct pxamci_platform_data *p_d = dev->platform_data; | ||
194 | if (p_d->ocr_mask & (1 << vdd)) | ||
195 | gpio_set_value(GPIO_NR_PALMZ72_SD_POWER_N, 0); | ||
196 | else | ||
197 | gpio_set_value(GPIO_NR_PALMZ72_SD_POWER_N, 1); | ||
198 | } | ||
199 | |||
200 | static int palmz72_mci_ro(struct device *dev) | ||
201 | { | ||
202 | return gpio_get_value(GPIO_NR_PALMZ72_SD_RO); | ||
203 | } | ||
204 | |||
205 | static struct pxamci_platform_data palmz72_mci_platform_data = { | ||
206 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, | ||
207 | .setpower = palmz72_mci_power, | ||
208 | .get_ro = palmz72_mci_ro, | ||
209 | .init = palmz72_mci_init, | ||
210 | .exit = palmz72_mci_exit, | ||
211 | }; | ||
212 | |||
213 | /****************************************************************************** | ||
214 | * GPIO keyboard | ||
215 | ******************************************************************************/ | ||
216 | static unsigned int palmz72_matrix_keys[] = { | ||
217 | KEY(0, 0, KEY_POWER), | ||
218 | KEY(0, 1, KEY_F1), | ||
219 | KEY(0, 2, KEY_ENTER), | ||
220 | |||
221 | KEY(1, 0, KEY_F2), | ||
222 | KEY(1, 1, KEY_F3), | ||
223 | KEY(1, 2, KEY_F4), | ||
224 | |||
225 | KEY(2, 0, KEY_UP), | ||
226 | KEY(2, 2, KEY_DOWN), | ||
227 | |||
228 | KEY(3, 0, KEY_RIGHT), | ||
229 | KEY(3, 2, KEY_LEFT), | ||
230 | }; | ||
231 | |||
232 | static struct pxa27x_keypad_platform_data palmz72_keypad_platform_data = { | ||
233 | .matrix_key_rows = 4, | ||
234 | .matrix_key_cols = 3, | ||
235 | .matrix_key_map = palmz72_matrix_keys, | ||
236 | .matrix_key_map_size = ARRAY_SIZE(palmz72_matrix_keys), | ||
237 | |||
238 | .debounce_interval = 30, | ||
239 | }; | ||
240 | |||
241 | /****************************************************************************** | ||
242 | * Backlight | ||
243 | ******************************************************************************/ | ||
244 | static int palmz72_backlight_init(struct device *dev) | ||
245 | { | ||
246 | int ret; | ||
247 | |||
248 | ret = gpio_request(GPIO_NR_PALMZ72_BL_POWER, "BL POWER"); | ||
249 | if (ret) | ||
250 | goto err; | ||
251 | ret = gpio_direction_output(GPIO_NR_PALMZ72_BL_POWER, 0); | ||
252 | if (ret) | ||
253 | goto err2; | ||
254 | ret = gpio_request(GPIO_NR_PALMZ72_LCD_POWER, "LCD POWER"); | ||
255 | if (ret) | ||
256 | goto err2; | ||
257 | ret = gpio_direction_output(GPIO_NR_PALMZ72_LCD_POWER, 0); | ||
258 | if (ret) | ||
259 | goto err3; | ||
260 | |||
261 | return 0; | ||
262 | err3: | ||
263 | gpio_free(GPIO_NR_PALMZ72_LCD_POWER); | ||
264 | err2: | ||
265 | gpio_free(GPIO_NR_PALMZ72_BL_POWER); | ||
266 | err: | ||
267 | return ret; | ||
268 | } | ||
269 | |||
270 | static int palmz72_backlight_notify(int brightness) | ||
271 | { | ||
272 | gpio_set_value(GPIO_NR_PALMZ72_BL_POWER, brightness); | ||
273 | gpio_set_value(GPIO_NR_PALMZ72_LCD_POWER, brightness); | ||
274 | return brightness; | ||
275 | } | ||
276 | |||
277 | static void palmz72_backlight_exit(struct device *dev) | ||
278 | { | ||
279 | gpio_free(GPIO_NR_PALMZ72_BL_POWER); | ||
280 | gpio_free(GPIO_NR_PALMZ72_LCD_POWER); | ||
281 | } | ||
282 | |||
283 | static struct platform_pwm_backlight_data palmz72_backlight_data = { | ||
284 | .pwm_id = 0, | ||
285 | .max_brightness = PALMZ72_MAX_INTENSITY, | ||
286 | .dft_brightness = PALMZ72_MAX_INTENSITY, | ||
287 | .pwm_period_ns = PALMZ72_PERIOD_NS, | ||
288 | .init = palmz72_backlight_init, | ||
289 | .notify = palmz72_backlight_notify, | ||
290 | .exit = palmz72_backlight_exit, | ||
291 | }; | ||
292 | |||
293 | static struct platform_device palmz72_backlight = { | ||
294 | .name = "pwm-backlight", | ||
295 | .dev = { | ||
296 | .parent = &pxa27x_device_pwm0.dev, | ||
297 | .platform_data = &palmz72_backlight_data, | ||
298 | }, | ||
299 | }; | ||
300 | |||
301 | /****************************************************************************** | ||
302 | * IrDA | ||
303 | ******************************************************************************/ | ||
304 | static int palmz72_irda_startup(struct device *dev) | ||
305 | { | ||
306 | int err; | ||
307 | err = gpio_request(GPIO_NR_PALMZ72_IR_DISABLE, "IR DISABLE"); | ||
308 | if (err) | ||
309 | goto err; | ||
310 | err = gpio_direction_output(GPIO_NR_PALMZ72_IR_DISABLE, 1); | ||
311 | if (err) | ||
312 | gpio_free(GPIO_NR_PALMZ72_IR_DISABLE); | ||
313 | err: | ||
314 | return err; | ||
315 | } | ||
316 | |||
317 | static void palmz72_irda_shutdown(struct device *dev) | ||
318 | { | ||
319 | gpio_free(GPIO_NR_PALMZ72_IR_DISABLE); | ||
320 | } | ||
321 | |||
322 | static void palmz72_irda_transceiver_mode(struct device *dev, int mode) | ||
323 | { | ||
324 | gpio_set_value(GPIO_NR_PALMZ72_IR_DISABLE, mode & IR_OFF); | ||
325 | pxa2xx_transceiver_mode(dev, mode); | ||
326 | } | ||
327 | |||
328 | static struct pxaficp_platform_data palmz72_ficp_platform_data = { | ||
329 | .startup = palmz72_irda_startup, | ||
330 | .shutdown = palmz72_irda_shutdown, | ||
331 | .transceiver_cap = IR_SIRMODE | IR_OFF, | ||
332 | .transceiver_mode = palmz72_irda_transceiver_mode, | ||
333 | }; | ||
334 | |||
335 | /****************************************************************************** | ||
336 | * LEDs | ||
337 | ******************************************************************************/ | ||
338 | static struct gpio_led gpio_leds[] = { | ||
339 | { | ||
340 | .name = "palmz72:green:led", | ||
341 | .default_trigger = "none", | ||
342 | .gpio = GPIO_NR_PALMZ72_LED_GREEN, | ||
343 | }, | ||
344 | }; | ||
345 | |||
346 | static struct gpio_led_platform_data gpio_led_info = { | ||
347 | .leds = gpio_leds, | ||
348 | .num_leds = ARRAY_SIZE(gpio_leds), | ||
349 | }; | ||
350 | |||
351 | static struct platform_device palmz72_leds = { | ||
352 | .name = "leds-gpio", | ||
353 | .id = -1, | ||
354 | .dev = { | ||
355 | .platform_data = &gpio_led_info, | ||
356 | } | ||
357 | }; | ||
358 | |||
359 | /****************************************************************************** | ||
360 | * Power supply | ||
361 | ******************************************************************************/ | ||
362 | static int power_supply_init(struct device *dev) | ||
363 | { | ||
364 | int ret; | ||
365 | |||
366 | ret = gpio_request(GPIO_NR_PALMZ72_POWER_DETECT, "CABLE_STATE_AC"); | ||
367 | if (ret) | ||
368 | goto err1; | ||
369 | ret = gpio_direction_input(GPIO_NR_PALMZ72_POWER_DETECT); | ||
370 | if (ret) | ||
371 | goto err2; | ||
372 | |||
373 | ret = gpio_request(GPIO_NR_PALMZ72_USB_DETECT_N, "CABLE_STATE_USB"); | ||
374 | if (ret) | ||
375 | goto err2; | ||
376 | ret = gpio_direction_input(GPIO_NR_PALMZ72_USB_DETECT_N); | ||
377 | if (ret) | ||
378 | goto err3; | ||
379 | |||
380 | return 0; | ||
381 | err3: | ||
382 | gpio_free(GPIO_NR_PALMZ72_USB_DETECT_N); | ||
383 | err2: | ||
384 | gpio_free(GPIO_NR_PALMZ72_POWER_DETECT); | ||
385 | err1: | ||
386 | return ret; | ||
387 | } | ||
388 | |||
389 | static int palmz72_is_ac_online(void) | ||
390 | { | ||
391 | return gpio_get_value(GPIO_NR_PALMZ72_POWER_DETECT); | ||
392 | } | ||
393 | |||
394 | static int palmz72_is_usb_online(void) | ||
395 | { | ||
396 | return !gpio_get_value(GPIO_NR_PALMZ72_USB_DETECT_N); | ||
397 | } | ||
398 | |||
399 | static void power_supply_exit(struct device *dev) | ||
400 | { | ||
401 | gpio_free(GPIO_NR_PALMZ72_USB_DETECT_N); | ||
402 | gpio_free(GPIO_NR_PALMZ72_POWER_DETECT); | ||
403 | } | ||
404 | |||
405 | static char *palmz72_supplicants[] = { | ||
406 | "main-battery", | ||
407 | }; | ||
408 | |||
409 | static struct pda_power_pdata power_supply_info = { | ||
410 | .init = power_supply_init, | ||
411 | .is_ac_online = palmz72_is_ac_online, | ||
412 | .is_usb_online = palmz72_is_usb_online, | ||
413 | .exit = power_supply_exit, | ||
414 | .supplied_to = palmz72_supplicants, | ||
415 | .num_supplicants = ARRAY_SIZE(palmz72_supplicants), | ||
416 | }; | ||
417 | |||
418 | static struct platform_device power_supply = { | ||
419 | .name = "pda-power", | ||
420 | .id = -1, | ||
421 | .dev = { | ||
422 | .platform_data = &power_supply_info, | ||
423 | }, | ||
424 | }; | ||
425 | |||
426 | /****************************************************************************** | ||
427 | * Framebuffer | ||
428 | ******************************************************************************/ | ||
429 | static struct pxafb_mode_info palmz72_lcd_modes[] = { | ||
430 | { | ||
431 | .pixclock = 115384, | ||
432 | .xres = 320, | ||
433 | .yres = 320, | ||
434 | .bpp = 16, | ||
435 | |||
436 | .left_margin = 27, | ||
437 | .right_margin = 7, | ||
438 | .upper_margin = 7, | ||
439 | .lower_margin = 8, | ||
440 | |||
441 | .hsync_len = 6, | ||
442 | .vsync_len = 1, | ||
443 | }, | ||
444 | }; | ||
445 | |||
446 | static struct pxafb_mach_info palmz72_lcd_screen = { | ||
447 | .modes = palmz72_lcd_modes, | ||
448 | .num_modes = ARRAY_SIZE(palmz72_lcd_modes), | ||
449 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, | ||
450 | }; | ||
451 | |||
452 | /****************************************************************************** | ||
453 | * Machine init | ||
454 | ******************************************************************************/ | ||
455 | static struct platform_device *devices[] __initdata = { | ||
456 | &palmz72_backlight, | ||
457 | &palmz72_leds, | ||
458 | &power_supply, | ||
459 | }; | ||
460 | |||
461 | static void __init palmz72_init(void) | ||
462 | { | ||
463 | pxa2xx_mfp_config(ARRAY_AND_SIZE(palmz72_pin_config)); | ||
464 | set_pxa_fb_info(&palmz72_lcd_screen); | ||
465 | pxa_set_mci_info(&palmz72_mci_platform_data); | ||
466 | pxa_set_ac97_info(NULL); | ||
467 | pxa_set_ficp_info(&palmz72_ficp_platform_data); | ||
468 | pxa_set_keypad_info(&palmz72_keypad_platform_data); | ||
469 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
470 | } | ||
471 | |||
472 | MACHINE_START(PALMZ72, "Palm Zire72") | ||
473 | .phys_io = 0x40000000, | ||
474 | .io_pg_offst = io_p2v(0x40000000), | ||
475 | .boot_params = 0xa0000100, | ||
476 | .map_io = pxa_map_io, | ||
477 | .init_irq = pxa27x_init_irq, | ||
478 | .timer = &pxa_timer, | ||
479 | .init_machine = palmz72_init | ||
480 | MACHINE_END | ||
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 25287e80e236..6e1e8c624f9e 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
@@ -220,6 +220,7 @@ config TOUCHSCREEN_ATMEL_TSADCC | |||
220 | config TOUCHSCREEN_UCB1400 | 220 | config TOUCHSCREEN_UCB1400 |
221 | tristate "Philips UCB1400 touchscreen" | 221 | tristate "Philips UCB1400 touchscreen" |
222 | select AC97_BUS | 222 | select AC97_BUS |
223 | depends on UCB1400_CORE | ||
223 | help | 224 | help |
224 | This enables support for the Philips UCB1400 touchscreen interface. | 225 | This enables support for the Philips UCB1400 touchscreen interface. |
225 | The UCB1400 is an AC97 audio codec. The touchscreen interface | 226 | The UCB1400 is an AC97 audio codec. The touchscreen interface |
diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c index bce018e45bce..54986627def0 100644 --- a/drivers/input/touchscreen/ucb1400_ts.c +++ b/drivers/input/touchscreen/ucb1400_ts.c | |||
@@ -5,6 +5,10 @@ | |||
5 | * Created: September 25, 2006 | 5 | * Created: September 25, 2006 |
6 | * Copyright: MontaVista Software, Inc. | 6 | * Copyright: MontaVista Software, Inc. |
7 | * | 7 | * |
8 | * Spliting done by: Marek Vasut <marek.vasut@gmail.com> | ||
9 | * If something doesnt work and it worked before spliting, e-mail me, | ||
10 | * dont bother Nicolas please ;-) | ||
11 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
10 | * published by the Free Software Foundation. | 14 | * published by the Free Software Foundation. |
@@ -25,124 +29,16 @@ | |||
25 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
26 | #include <linux/kthread.h> | 30 | #include <linux/kthread.h> |
27 | #include <linux/freezer.h> | 31 | #include <linux/freezer.h> |
28 | 32 | #include <linux/ucb1400.h> | |
29 | #include <sound/core.h> | ||
30 | #include <sound/ac97_codec.h> | ||
31 | |||
32 | |||
33 | /* | ||
34 | * Interesting UCB1400 AC-link registers | ||
35 | */ | ||
36 | |||
37 | #define UCB_IE_RIS 0x5e | ||
38 | #define UCB_IE_FAL 0x60 | ||
39 | #define UCB_IE_STATUS 0x62 | ||
40 | #define UCB_IE_CLEAR 0x62 | ||
41 | #define UCB_IE_ADC (1 << 11) | ||
42 | #define UCB_IE_TSPX (1 << 12) | ||
43 | |||
44 | #define UCB_TS_CR 0x64 | ||
45 | #define UCB_TS_CR_TSMX_POW (1 << 0) | ||
46 | #define UCB_TS_CR_TSPX_POW (1 << 1) | ||
47 | #define UCB_TS_CR_TSMY_POW (1 << 2) | ||
48 | #define UCB_TS_CR_TSPY_POW (1 << 3) | ||
49 | #define UCB_TS_CR_TSMX_GND (1 << 4) | ||
50 | #define UCB_TS_CR_TSPX_GND (1 << 5) | ||
51 | #define UCB_TS_CR_TSMY_GND (1 << 6) | ||
52 | #define UCB_TS_CR_TSPY_GND (1 << 7) | ||
53 | #define UCB_TS_CR_MODE_INT (0 << 8) | ||
54 | #define UCB_TS_CR_MODE_PRES (1 << 8) | ||
55 | #define UCB_TS_CR_MODE_POS (2 << 8) | ||
56 | #define UCB_TS_CR_BIAS_ENA (1 << 11) | ||
57 | #define UCB_TS_CR_TSPX_LOW (1 << 12) | ||
58 | #define UCB_TS_CR_TSMX_LOW (1 << 13) | ||
59 | |||
60 | #define UCB_ADC_CR 0x66 | ||
61 | #define UCB_ADC_SYNC_ENA (1 << 0) | ||
62 | #define UCB_ADC_VREFBYP_CON (1 << 1) | ||
63 | #define UCB_ADC_INP_TSPX (0 << 2) | ||
64 | #define UCB_ADC_INP_TSMX (1 << 2) | ||
65 | #define UCB_ADC_INP_TSPY (2 << 2) | ||
66 | #define UCB_ADC_INP_TSMY (3 << 2) | ||
67 | #define UCB_ADC_INP_AD0 (4 << 2) | ||
68 | #define UCB_ADC_INP_AD1 (5 << 2) | ||
69 | #define UCB_ADC_INP_AD2 (6 << 2) | ||
70 | #define UCB_ADC_INP_AD3 (7 << 2) | ||
71 | #define UCB_ADC_EXT_REF (1 << 5) | ||
72 | #define UCB_ADC_START (1 << 7) | ||
73 | #define UCB_ADC_ENA (1 << 15) | ||
74 | |||
75 | #define UCB_ADC_DATA 0x68 | ||
76 | #define UCB_ADC_DAT_VALID (1 << 15) | ||
77 | #define UCB_ADC_DAT_VALUE(x) ((x) & 0x3ff) | ||
78 | |||
79 | #define UCB_ID 0x7e | ||
80 | #define UCB_ID_1400 0x4304 | ||
81 | |||
82 | |||
83 | struct ucb1400 { | ||
84 | struct snd_ac97 *ac97; | ||
85 | struct input_dev *ts_idev; | ||
86 | |||
87 | int irq; | ||
88 | |||
89 | wait_queue_head_t ts_wait; | ||
90 | struct task_struct *ts_task; | ||
91 | |||
92 | unsigned int irq_pending; /* not bit field shared */ | ||
93 | unsigned int ts_restart:1; | ||
94 | unsigned int adcsync:1; | ||
95 | }; | ||
96 | 33 | ||
97 | static int adcsync; | 34 | static int adcsync; |
98 | static int ts_delay = 55; /* us */ | 35 | static int ts_delay = 55; /* us */ |
99 | static int ts_delay_pressure; /* us */ | 36 | static int ts_delay_pressure; /* us */ |
100 | 37 | ||
101 | static inline u16 ucb1400_reg_read(struct ucb1400 *ucb, u16 reg) | ||
102 | { | ||
103 | return ucb->ac97->bus->ops->read(ucb->ac97, reg); | ||
104 | } | ||
105 | |||
106 | static inline void ucb1400_reg_write(struct ucb1400 *ucb, u16 reg, u16 val) | ||
107 | { | ||
108 | ucb->ac97->bus->ops->write(ucb->ac97, reg, val); | ||
109 | } | ||
110 | |||
111 | static inline void ucb1400_adc_enable(struct ucb1400 *ucb) | ||
112 | { | ||
113 | ucb1400_reg_write(ucb, UCB_ADC_CR, UCB_ADC_ENA); | ||
114 | } | ||
115 | |||
116 | static unsigned int ucb1400_adc_read(struct ucb1400 *ucb, u16 adc_channel) | ||
117 | { | ||
118 | unsigned int val; | ||
119 | |||
120 | if (ucb->adcsync) | ||
121 | adc_channel |= UCB_ADC_SYNC_ENA; | ||
122 | |||
123 | ucb1400_reg_write(ucb, UCB_ADC_CR, UCB_ADC_ENA | adc_channel); | ||
124 | ucb1400_reg_write(ucb, UCB_ADC_CR, UCB_ADC_ENA | adc_channel | UCB_ADC_START); | ||
125 | |||
126 | for (;;) { | ||
127 | val = ucb1400_reg_read(ucb, UCB_ADC_DATA); | ||
128 | if (val & UCB_ADC_DAT_VALID) | ||
129 | break; | ||
130 | /* yield to other processes */ | ||
131 | schedule_timeout_uninterruptible(1); | ||
132 | } | ||
133 | |||
134 | return UCB_ADC_DAT_VALUE(val); | ||
135 | } | ||
136 | |||
137 | static inline void ucb1400_adc_disable(struct ucb1400 *ucb) | ||
138 | { | ||
139 | ucb1400_reg_write(ucb, UCB_ADC_CR, 0); | ||
140 | } | ||
141 | |||
142 | /* Switch to interrupt mode. */ | 38 | /* Switch to interrupt mode. */ |
143 | static inline void ucb1400_ts_mode_int(struct ucb1400 *ucb) | 39 | static inline void ucb1400_ts_mode_int(struct snd_ac97 *ac97) |
144 | { | 40 | { |
145 | ucb1400_reg_write(ucb, UCB_TS_CR, | 41 | ucb1400_reg_write(ac97, UCB_TS_CR, |
146 | UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | | 42 | UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | |
147 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | | 43 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | |
148 | UCB_TS_CR_MODE_INT); | 44 | UCB_TS_CR_MODE_INT); |
@@ -152,14 +48,14 @@ static inline void ucb1400_ts_mode_int(struct ucb1400 *ucb) | |||
152 | * Switch to pressure mode, and read pressure. We don't need to wait | 48 | * Switch to pressure mode, and read pressure. We don't need to wait |
153 | * here, since both plates are being driven. | 49 | * here, since both plates are being driven. |
154 | */ | 50 | */ |
155 | static inline unsigned int ucb1400_ts_read_pressure(struct ucb1400 *ucb) | 51 | static inline unsigned int ucb1400_ts_read_pressure(struct ucb1400_ts *ucb) |
156 | { | 52 | { |
157 | ucb1400_reg_write(ucb, UCB_TS_CR, | 53 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
158 | UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | | 54 | UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | |
159 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | | 55 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | |
160 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); | 56 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); |
161 | udelay(ts_delay_pressure); | 57 | udelay(ts_delay_pressure); |
162 | return ucb1400_adc_read(ucb, UCB_ADC_INP_TSPY); | 58 | return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); |
163 | } | 59 | } |
164 | 60 | ||
165 | /* | 61 | /* |
@@ -168,21 +64,21 @@ static inline unsigned int ucb1400_ts_read_pressure(struct ucb1400 *ucb) | |||
168 | * gives a faster response time. Even so, we need to wait about 55us | 64 | * gives a faster response time. Even so, we need to wait about 55us |
169 | * for things to stabilise. | 65 | * for things to stabilise. |
170 | */ | 66 | */ |
171 | static inline unsigned int ucb1400_ts_read_xpos(struct ucb1400 *ucb) | 67 | static inline unsigned int ucb1400_ts_read_xpos(struct ucb1400_ts *ucb) |
172 | { | 68 | { |
173 | ucb1400_reg_write(ucb, UCB_TS_CR, | 69 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
174 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | | 70 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | |
175 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); | 71 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); |
176 | ucb1400_reg_write(ucb, UCB_TS_CR, | 72 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
177 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | | 73 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | |
178 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); | 74 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); |
179 | ucb1400_reg_write(ucb, UCB_TS_CR, | 75 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
180 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | | 76 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | |
181 | UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); | 77 | UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); |
182 | 78 | ||
183 | udelay(ts_delay); | 79 | udelay(ts_delay); |
184 | 80 | ||
185 | return ucb1400_adc_read(ucb, UCB_ADC_INP_TSPY); | 81 | return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); |
186 | } | 82 | } |
187 | 83 | ||
188 | /* | 84 | /* |
@@ -191,63 +87,63 @@ static inline unsigned int ucb1400_ts_read_xpos(struct ucb1400 *ucb) | |||
191 | * gives a faster response time. Even so, we need to wait about 55us | 87 | * gives a faster response time. Even so, we need to wait about 55us |
192 | * for things to stabilise. | 88 | * for things to stabilise. |
193 | */ | 89 | */ |
194 | static inline unsigned int ucb1400_ts_read_ypos(struct ucb1400 *ucb) | 90 | static inline unsigned int ucb1400_ts_read_ypos(struct ucb1400_ts *ucb) |
195 | { | 91 | { |
196 | ucb1400_reg_write(ucb, UCB_TS_CR, | 92 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
197 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | | 93 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | |
198 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); | 94 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); |
199 | ucb1400_reg_write(ucb, UCB_TS_CR, | 95 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
200 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | | 96 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | |
201 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); | 97 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); |
202 | ucb1400_reg_write(ucb, UCB_TS_CR, | 98 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
203 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | | 99 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | |
204 | UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); | 100 | UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); |
205 | 101 | ||
206 | udelay(ts_delay); | 102 | udelay(ts_delay); |
207 | 103 | ||
208 | return ucb1400_adc_read(ucb, UCB_ADC_INP_TSPX); | 104 | return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPX, adcsync); |
209 | } | 105 | } |
210 | 106 | ||
211 | /* | 107 | /* |
212 | * Switch to X plate resistance mode. Set MX to ground, PX to | 108 | * Switch to X plate resistance mode. Set MX to ground, PX to |
213 | * supply. Measure current. | 109 | * supply. Measure current. |
214 | */ | 110 | */ |
215 | static inline unsigned int ucb1400_ts_read_xres(struct ucb1400 *ucb) | 111 | static inline unsigned int ucb1400_ts_read_xres(struct ucb1400_ts *ucb) |
216 | { | 112 | { |
217 | ucb1400_reg_write(ucb, UCB_TS_CR, | 113 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
218 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | | 114 | UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | |
219 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); | 115 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); |
220 | return ucb1400_adc_read(ucb, 0); | 116 | return ucb1400_adc_read(ucb->ac97, 0, adcsync); |
221 | } | 117 | } |
222 | 118 | ||
223 | /* | 119 | /* |
224 | * Switch to Y plate resistance mode. Set MY to ground, PY to | 120 | * Switch to Y plate resistance mode. Set MY to ground, PY to |
225 | * supply. Measure current. | 121 | * supply. Measure current. |
226 | */ | 122 | */ |
227 | static inline unsigned int ucb1400_ts_read_yres(struct ucb1400 *ucb) | 123 | static inline unsigned int ucb1400_ts_read_yres(struct ucb1400_ts *ucb) |
228 | { | 124 | { |
229 | ucb1400_reg_write(ucb, UCB_TS_CR, | 125 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, |
230 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | | 126 | UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | |
231 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); | 127 | UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); |
232 | return ucb1400_adc_read(ucb, 0); | 128 | return ucb1400_adc_read(ucb->ac97, 0, adcsync); |
233 | } | 129 | } |
234 | 130 | ||
235 | static inline int ucb1400_ts_pen_down(struct ucb1400 *ucb) | 131 | static inline int ucb1400_ts_pen_down(struct snd_ac97 *ac97) |
236 | { | 132 | { |
237 | unsigned short val = ucb1400_reg_read(ucb, UCB_TS_CR); | 133 | unsigned short val = ucb1400_reg_read(ac97, UCB_TS_CR); |
238 | return (val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW)); | 134 | return val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW); |
239 | } | 135 | } |
240 | 136 | ||
241 | static inline void ucb1400_ts_irq_enable(struct ucb1400 *ucb) | 137 | static inline void ucb1400_ts_irq_enable(struct snd_ac97 *ac97) |
242 | { | 138 | { |
243 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, UCB_IE_TSPX); | 139 | ucb1400_reg_write(ac97, UCB_IE_CLEAR, UCB_IE_TSPX); |
244 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, 0); | 140 | ucb1400_reg_write(ac97, UCB_IE_CLEAR, 0); |
245 | ucb1400_reg_write(ucb, UCB_IE_FAL, UCB_IE_TSPX); | 141 | ucb1400_reg_write(ac97, UCB_IE_FAL, UCB_IE_TSPX); |
246 | } | 142 | } |
247 | 143 | ||
248 | static inline void ucb1400_ts_irq_disable(struct ucb1400 *ucb) | 144 | static inline void ucb1400_ts_irq_disable(struct snd_ac97 *ac97) |
249 | { | 145 | { |
250 | ucb1400_reg_write(ucb, UCB_IE_FAL, 0); | 146 | ucb1400_reg_write(ac97, UCB_IE_FAL, 0); |
251 | } | 147 | } |
252 | 148 | ||
253 | static void ucb1400_ts_evt_add(struct input_dev *idev, u16 pressure, u16 x, u16 y) | 149 | static void ucb1400_ts_evt_add(struct input_dev *idev, u16 pressure, u16 x, u16 y) |
@@ -264,25 +160,24 @@ static void ucb1400_ts_event_release(struct input_dev *idev) | |||
264 | input_sync(idev); | 160 | input_sync(idev); |
265 | } | 161 | } |
266 | 162 | ||
267 | static void ucb1400_handle_pending_irq(struct ucb1400 *ucb) | 163 | static void ucb1400_handle_pending_irq(struct ucb1400_ts *ucb) |
268 | { | 164 | { |
269 | unsigned int isr; | 165 | unsigned int isr; |
270 | 166 | ||
271 | isr = ucb1400_reg_read(ucb, UCB_IE_STATUS); | 167 | isr = ucb1400_reg_read(ucb->ac97, UCB_IE_STATUS); |
272 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, isr); | 168 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr); |
273 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, 0); | 169 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); |
274 | 170 | ||
275 | if (isr & UCB_IE_TSPX) | 171 | if (isr & UCB_IE_TSPX) { |
276 | ucb1400_ts_irq_disable(ucb); | 172 | ucb1400_ts_irq_disable(ucb->ac97); |
277 | else | 173 | enable_irq(ucb->irq); |
174 | } else | ||
278 | printk(KERN_ERR "ucb1400: unexpected IE_STATUS = %#x\n", isr); | 175 | printk(KERN_ERR "ucb1400: unexpected IE_STATUS = %#x\n", isr); |
279 | |||
280 | enable_irq(ucb->irq); | ||
281 | } | 176 | } |
282 | 177 | ||
283 | static int ucb1400_ts_thread(void *_ucb) | 178 | static int ucb1400_ts_thread(void *_ucb) |
284 | { | 179 | { |
285 | struct ucb1400 *ucb = _ucb; | 180 | struct ucb1400_ts *ucb = _ucb; |
286 | struct task_struct *tsk = current; | 181 | struct task_struct *tsk = current; |
287 | int valid = 0; | 182 | int valid = 0; |
288 | struct sched_param param = { .sched_priority = 1 }; | 183 | struct sched_param param = { .sched_priority = 1 }; |
@@ -301,19 +196,19 @@ static int ucb1400_ts_thread(void *_ucb) | |||
301 | ucb1400_handle_pending_irq(ucb); | 196 | ucb1400_handle_pending_irq(ucb); |
302 | } | 197 | } |
303 | 198 | ||
304 | ucb1400_adc_enable(ucb); | 199 | ucb1400_adc_enable(ucb->ac97); |
305 | x = ucb1400_ts_read_xpos(ucb); | 200 | x = ucb1400_ts_read_xpos(ucb); |
306 | y = ucb1400_ts_read_ypos(ucb); | 201 | y = ucb1400_ts_read_ypos(ucb); |
307 | p = ucb1400_ts_read_pressure(ucb); | 202 | p = ucb1400_ts_read_pressure(ucb); |
308 | ucb1400_adc_disable(ucb); | 203 | ucb1400_adc_disable(ucb->ac97); |
309 | 204 | ||
310 | /* Switch back to interrupt mode. */ | 205 | /* Switch back to interrupt mode. */ |
311 | ucb1400_ts_mode_int(ucb); | 206 | ucb1400_ts_mode_int(ucb->ac97); |
312 | 207 | ||
313 | msleep(10); | 208 | msleep(10); |
314 | 209 | ||
315 | if (ucb1400_ts_pen_down(ucb)) { | 210 | if (ucb1400_ts_pen_down(ucb->ac97)) { |
316 | ucb1400_ts_irq_enable(ucb); | 211 | ucb1400_ts_irq_enable(ucb->ac97); |
317 | 212 | ||
318 | /* | 213 | /* |
319 | * If we spat out a valid sample set last time, | 214 | * If we spat out a valid sample set last time, |
@@ -332,8 +227,8 @@ static int ucb1400_ts_thread(void *_ucb) | |||
332 | } | 227 | } |
333 | 228 | ||
334 | wait_event_freezable_timeout(ucb->ts_wait, | 229 | wait_event_freezable_timeout(ucb->ts_wait, |
335 | ucb->irq_pending || ucb->ts_restart || kthread_should_stop(), | 230 | ucb->irq_pending || ucb->ts_restart || |
336 | timeout); | 231 | kthread_should_stop(), timeout); |
337 | } | 232 | } |
338 | 233 | ||
339 | /* Send the "pen off" if we are stopping with the pen still active */ | 234 | /* Send the "pen off" if we are stopping with the pen still active */ |
@@ -356,7 +251,7 @@ static int ucb1400_ts_thread(void *_ucb) | |||
356 | */ | 251 | */ |
357 | static irqreturn_t ucb1400_hard_irq(int irqnr, void *devid) | 252 | static irqreturn_t ucb1400_hard_irq(int irqnr, void *devid) |
358 | { | 253 | { |
359 | struct ucb1400 *ucb = devid; | 254 | struct ucb1400_ts *ucb = devid; |
360 | 255 | ||
361 | if (irqnr == ucb->irq) { | 256 | if (irqnr == ucb->irq) { |
362 | disable_irq(ucb->irq); | 257 | disable_irq(ucb->irq); |
@@ -369,7 +264,7 @@ static irqreturn_t ucb1400_hard_irq(int irqnr, void *devid) | |||
369 | 264 | ||
370 | static int ucb1400_ts_open(struct input_dev *idev) | 265 | static int ucb1400_ts_open(struct input_dev *idev) |
371 | { | 266 | { |
372 | struct ucb1400 *ucb = input_get_drvdata(idev); | 267 | struct ucb1400_ts *ucb = input_get_drvdata(idev); |
373 | int ret = 0; | 268 | int ret = 0; |
374 | 269 | ||
375 | BUG_ON(ucb->ts_task); | 270 | BUG_ON(ucb->ts_task); |
@@ -385,34 +280,14 @@ static int ucb1400_ts_open(struct input_dev *idev) | |||
385 | 280 | ||
386 | static void ucb1400_ts_close(struct input_dev *idev) | 281 | static void ucb1400_ts_close(struct input_dev *idev) |
387 | { | 282 | { |
388 | struct ucb1400 *ucb = input_get_drvdata(idev); | 283 | struct ucb1400_ts *ucb = input_get_drvdata(idev); |
389 | 284 | ||
390 | if (ucb->ts_task) | 285 | if (ucb->ts_task) |
391 | kthread_stop(ucb->ts_task); | 286 | kthread_stop(ucb->ts_task); |
392 | 287 | ||
393 | ucb1400_ts_irq_disable(ucb); | 288 | ucb1400_ts_irq_disable(ucb->ac97); |
394 | ucb1400_reg_write(ucb, UCB_TS_CR, 0); | 289 | ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 0); |
395 | } | ||
396 | |||
397 | #ifdef CONFIG_PM | ||
398 | static int ucb1400_ts_resume(struct device *dev) | ||
399 | { | ||
400 | struct ucb1400 *ucb = dev_get_drvdata(dev); | ||
401 | |||
402 | if (ucb->ts_task) { | ||
403 | /* | ||
404 | * Restart the TS thread to ensure the | ||
405 | * TS interrupt mode is set up again | ||
406 | * after sleep. | ||
407 | */ | ||
408 | ucb->ts_restart = 1; | ||
409 | wake_up(&ucb->ts_wait); | ||
410 | } | ||
411 | return 0; | ||
412 | } | 290 | } |
413 | #else | ||
414 | #define ucb1400_ts_resume NULL | ||
415 | #endif | ||
416 | 291 | ||
417 | #ifndef NO_IRQ | 292 | #ifndef NO_IRQ |
418 | #define NO_IRQ 0 | 293 | #define NO_IRQ 0 |
@@ -422,25 +297,26 @@ static int ucb1400_ts_resume(struct device *dev) | |||
422 | * Try to probe our interrupt, rather than relying on lots of | 297 | * Try to probe our interrupt, rather than relying on lots of |
423 | * hard-coded machine dependencies. | 298 | * hard-coded machine dependencies. |
424 | */ | 299 | */ |
425 | static int ucb1400_detect_irq(struct ucb1400 *ucb) | 300 | static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb) |
426 | { | 301 | { |
427 | unsigned long mask, timeout; | 302 | unsigned long mask, timeout; |
428 | 303 | ||
429 | mask = probe_irq_on(); | 304 | mask = probe_irq_on(); |
430 | 305 | ||
431 | /* Enable the ADC interrupt. */ | 306 | /* Enable the ADC interrupt. */ |
432 | ucb1400_reg_write(ucb, UCB_IE_RIS, UCB_IE_ADC); | 307 | ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, UCB_IE_ADC); |
433 | ucb1400_reg_write(ucb, UCB_IE_FAL, UCB_IE_ADC); | 308 | ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_ADC); |
434 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, 0xffff); | 309 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); |
435 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, 0); | 310 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); |
436 | 311 | ||
437 | /* Cause an ADC interrupt. */ | 312 | /* Cause an ADC interrupt. */ |
438 | ucb1400_reg_write(ucb, UCB_ADC_CR, UCB_ADC_ENA); | 313 | ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA); |
439 | ucb1400_reg_write(ucb, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START); | 314 | ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START); |
440 | 315 | ||
441 | /* Wait for the conversion to complete. */ | 316 | /* Wait for the conversion to complete. */ |
442 | timeout = jiffies + HZ/2; | 317 | timeout = jiffies + HZ/2; |
443 | while (!(ucb1400_reg_read(ucb, UCB_ADC_DATA) & UCB_ADC_DAT_VALID)) { | 318 | while (!(ucb1400_reg_read(ucb->ac97, UCB_ADC_DATA) & |
319 | UCB_ADC_DAT_VALID)) { | ||
444 | cpu_relax(); | 320 | cpu_relax(); |
445 | if (time_after(jiffies, timeout)) { | 321 | if (time_after(jiffies, timeout)) { |
446 | printk(KERN_ERR "ucb1400: timed out in IRQ probe\n"); | 322 | printk(KERN_ERR "ucb1400: timed out in IRQ probe\n"); |
@@ -448,13 +324,13 @@ static int ucb1400_detect_irq(struct ucb1400 *ucb) | |||
448 | return -ENODEV; | 324 | return -ENODEV; |
449 | } | 325 | } |
450 | } | 326 | } |
451 | ucb1400_reg_write(ucb, UCB_ADC_CR, 0); | 327 | ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, 0); |
452 | 328 | ||
453 | /* Disable and clear interrupt. */ | 329 | /* Disable and clear interrupt. */ |
454 | ucb1400_reg_write(ucb, UCB_IE_RIS, 0); | 330 | ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, 0); |
455 | ucb1400_reg_write(ucb, UCB_IE_FAL, 0); | 331 | ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); |
456 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, 0xffff); | 332 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); |
457 | ucb1400_reg_write(ucb, UCB_IE_CLEAR, 0); | 333 | ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); |
458 | 334 | ||
459 | /* Read triggered interrupt. */ | 335 | /* Read triggered interrupt. */ |
460 | ucb->irq = probe_irq_off(mask); | 336 | ucb->irq = probe_irq_off(mask); |
@@ -464,36 +340,25 @@ static int ucb1400_detect_irq(struct ucb1400 *ucb) | |||
464 | return 0; | 340 | return 0; |
465 | } | 341 | } |
466 | 342 | ||
467 | static int ucb1400_ts_probe(struct device *dev) | 343 | static int ucb1400_ts_probe(struct platform_device *dev) |
468 | { | 344 | { |
469 | struct ucb1400 *ucb; | 345 | int error, x_res, y_res; |
470 | struct input_dev *idev; | 346 | struct ucb1400_ts *ucb = dev->dev.platform_data; |
471 | int error, id, x_res, y_res; | ||
472 | 347 | ||
473 | ucb = kzalloc(sizeof(struct ucb1400), GFP_KERNEL); | 348 | ucb->ts_idev = input_allocate_device(); |
474 | idev = input_allocate_device(); | 349 | if (!ucb->ts_idev) { |
475 | if (!ucb || !idev) { | ||
476 | error = -ENOMEM; | 350 | error = -ENOMEM; |
477 | goto err_free_devs; | 351 | goto err; |
478 | } | 352 | } |
479 | 353 | ||
480 | ucb->ts_idev = idev; | 354 | error = ucb1400_ts_detect_irq(ucb); |
481 | ucb->adcsync = adcsync; | ||
482 | ucb->ac97 = to_ac97_t(dev); | ||
483 | init_waitqueue_head(&ucb->ts_wait); | ||
484 | |||
485 | id = ucb1400_reg_read(ucb, UCB_ID); | ||
486 | if (id != UCB_ID_1400) { | ||
487 | error = -ENODEV; | ||
488 | goto err_free_devs; | ||
489 | } | ||
490 | |||
491 | error = ucb1400_detect_irq(ucb); | ||
492 | if (error) { | 355 | if (error) { |
493 | printk(KERN_ERR "UCB1400: IRQ probe failed\n"); | 356 | printk(KERN_ERR "UCB1400: IRQ probe failed\n"); |
494 | goto err_free_devs; | 357 | goto err_free_devs; |
495 | } | 358 | } |
496 | 359 | ||
360 | init_waitqueue_head(&ucb->ts_wait); | ||
361 | |||
497 | error = request_irq(ucb->irq, ucb1400_hard_irq, IRQF_TRIGGER_RISING, | 362 | error = request_irq(ucb->irq, ucb1400_hard_irq, IRQF_TRIGGER_RISING, |
498 | "UCB1400", ucb); | 363 | "UCB1400", ucb); |
499 | if (error) { | 364 | if (error) { |
@@ -503,80 +368,101 @@ static int ucb1400_ts_probe(struct device *dev) | |||
503 | } | 368 | } |
504 | printk(KERN_DEBUG "UCB1400: found IRQ %d\n", ucb->irq); | 369 | printk(KERN_DEBUG "UCB1400: found IRQ %d\n", ucb->irq); |
505 | 370 | ||
506 | input_set_drvdata(idev, ucb); | 371 | input_set_drvdata(ucb->ts_idev, ucb); |
507 | 372 | ||
508 | idev->dev.parent = dev; | 373 | ucb->ts_idev->dev.parent = &dev->dev; |
509 | idev->name = "UCB1400 touchscreen interface"; | 374 | ucb->ts_idev->name = "UCB1400 touchscreen interface"; |
510 | idev->id.vendor = ucb1400_reg_read(ucb, AC97_VENDOR_ID1); | 375 | ucb->ts_idev->id.vendor = ucb1400_reg_read(ucb->ac97, |
511 | idev->id.product = id; | 376 | AC97_VENDOR_ID1); |
512 | idev->open = ucb1400_ts_open; | 377 | ucb->ts_idev->id.product = ucb->id; |
513 | idev->close = ucb1400_ts_close; | 378 | ucb->ts_idev->open = ucb1400_ts_open; |
514 | idev->evbit[0] = BIT_MASK(EV_ABS); | 379 | ucb->ts_idev->close = ucb1400_ts_close; |
380 | ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS); | ||
515 | 381 | ||
516 | ucb1400_adc_enable(ucb); | 382 | ucb1400_adc_enable(ucb->ac97); |
517 | x_res = ucb1400_ts_read_xres(ucb); | 383 | x_res = ucb1400_ts_read_xres(ucb); |
518 | y_res = ucb1400_ts_read_yres(ucb); | 384 | y_res = ucb1400_ts_read_yres(ucb); |
519 | ucb1400_adc_disable(ucb); | 385 | ucb1400_adc_disable(ucb->ac97); |
520 | printk(KERN_DEBUG "UCB1400: x/y = %d/%d\n", x_res, y_res); | 386 | printk(KERN_DEBUG "UCB1400: x/y = %d/%d\n", x_res, y_res); |
521 | 387 | ||
522 | input_set_abs_params(idev, ABS_X, 0, x_res, 0, 0); | 388 | input_set_abs_params(ucb->ts_idev, ABS_X, 0, x_res, 0, 0); |
523 | input_set_abs_params(idev, ABS_Y, 0, y_res, 0, 0); | 389 | input_set_abs_params(ucb->ts_idev, ABS_Y, 0, y_res, 0, 0); |
524 | input_set_abs_params(idev, ABS_PRESSURE, 0, 0, 0, 0); | 390 | input_set_abs_params(ucb->ts_idev, ABS_PRESSURE, 0, 0, 0, 0); |
525 | 391 | ||
526 | error = input_register_device(idev); | 392 | error = input_register_device(ucb->ts_idev); |
527 | if (error) | 393 | if (error) |
528 | goto err_free_irq; | 394 | goto err_free_irq; |
529 | 395 | ||
530 | dev_set_drvdata(dev, ucb); | ||
531 | return 0; | 396 | return 0; |
532 | 397 | ||
533 | err_free_irq: | 398 | err_free_irq: |
534 | free_irq(ucb->irq, ucb); | 399 | free_irq(ucb->irq, ucb); |
535 | err_free_devs: | 400 | err_free_devs: |
536 | input_free_device(idev); | 401 | input_free_device(ucb->ts_idev); |
537 | kfree(ucb); | 402 | err: |
538 | return error; | 403 | return error; |
404 | |||
539 | } | 405 | } |
540 | 406 | ||
541 | static int ucb1400_ts_remove(struct device *dev) | 407 | static int ucb1400_ts_remove(struct platform_device *dev) |
542 | { | 408 | { |
543 | struct ucb1400 *ucb = dev_get_drvdata(dev); | 409 | struct ucb1400_ts *ucb = dev->dev.platform_data; |
544 | 410 | ||
545 | free_irq(ucb->irq, ucb); | 411 | free_irq(ucb->irq, ucb); |
546 | input_unregister_device(ucb->ts_idev); | 412 | input_unregister_device(ucb->ts_idev); |
547 | dev_set_drvdata(dev, NULL); | ||
548 | kfree(ucb); | ||
549 | return 0; | 413 | return 0; |
550 | } | 414 | } |
551 | 415 | ||
552 | static struct device_driver ucb1400_ts_driver = { | 416 | #ifdef CONFIG_PM |
553 | .name = "ucb1400_ts", | 417 | static int ucb1400_ts_resume(struct platform_device *dev) |
554 | .owner = THIS_MODULE, | 418 | { |
555 | .bus = &ac97_bus_type, | 419 | struct ucb1400_ts *ucb = platform_get_drvdata(dev); |
556 | .probe = ucb1400_ts_probe, | 420 | |
557 | .remove = ucb1400_ts_remove, | 421 | if (ucb->ts_task) { |
558 | .resume = ucb1400_ts_resume, | 422 | /* |
423 | * Restart the TS thread to ensure the | ||
424 | * TS interrupt mode is set up again | ||
425 | * after sleep. | ||
426 | */ | ||
427 | ucb->ts_restart = 1; | ||
428 | wake_up(&ucb->ts_wait); | ||
429 | } | ||
430 | return 0; | ||
431 | } | ||
432 | #else | ||
433 | #define ucb1400_ts_resume NULL | ||
434 | #endif | ||
435 | |||
436 | static struct platform_driver ucb1400_ts_driver = { | ||
437 | .probe = ucb1400_ts_probe, | ||
438 | .remove = ucb1400_ts_remove, | ||
439 | .resume = ucb1400_ts_resume, | ||
440 | .driver = { | ||
441 | .name = "ucb1400_ts", | ||
442 | }, | ||
559 | }; | 443 | }; |
560 | 444 | ||
561 | static int __init ucb1400_ts_init(void) | 445 | static int __init ucb1400_ts_init(void) |
562 | { | 446 | { |
563 | return driver_register(&ucb1400_ts_driver); | 447 | return platform_driver_register(&ucb1400_ts_driver); |
564 | } | 448 | } |
565 | 449 | ||
566 | static void __exit ucb1400_ts_exit(void) | 450 | static void __exit ucb1400_ts_exit(void) |
567 | { | 451 | { |
568 | driver_unregister(&ucb1400_ts_driver); | 452 | platform_driver_unregister(&ucb1400_ts_driver); |
569 | } | 453 | } |
570 | 454 | ||
571 | module_param(adcsync, bool, 0444); | 455 | module_param(adcsync, bool, 0444); |
572 | MODULE_PARM_DESC(adcsync, "Synchronize touch readings with ADCSYNC pin."); | 456 | MODULE_PARM_DESC(adcsync, "Synchronize touch readings with ADCSYNC pin."); |
573 | 457 | ||
574 | module_param(ts_delay, int, 0444); | 458 | module_param(ts_delay, int, 0444); |
575 | MODULE_PARM_DESC(ts_delay, "Delay between panel setup and position read. Default = 55us."); | 459 | MODULE_PARM_DESC(ts_delay, "Delay between panel setup and" |
460 | " position read. Default = 55us."); | ||
576 | 461 | ||
577 | module_param(ts_delay_pressure, int, 0444); | 462 | module_param(ts_delay_pressure, int, 0444); |
578 | MODULE_PARM_DESC(ts_delay_pressure, | 463 | MODULE_PARM_DESC(ts_delay_pressure, |
579 | "delay between panel setup and pressure read. Default = 0us."); | 464 | "delay between panel setup and pressure read." |
465 | " Default = 0us."); | ||
580 | 466 | ||
581 | module_init(ucb1400_ts_init); | 467 | module_init(ucb1400_ts_init); |
582 | module_exit(ucb1400_ts_exit); | 468 | module_exit(ucb1400_ts_exit); |
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 10c44d3fe01a..5dba1651f9cc 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
@@ -50,6 +50,15 @@ config HTC_PASIC3 | |||
50 | HTC Magician devices, respectively. Actual functionality is | 50 | HTC Magician devices, respectively. Actual functionality is |
51 | handled by the leds-pasic3 and ds1wm drivers. | 51 | handled by the leds-pasic3 and ds1wm drivers. |
52 | 52 | ||
53 | config UCB1400_CORE | ||
54 | tristate "Philips UCB1400 Core driver" | ||
55 | help | ||
56 | This enables support for the Philips UCB1400 core functions. | ||
57 | The UCB1400 is an AC97 audio codec. | ||
58 | |||
59 | To compile this driver as a module, choose M here: the | ||
60 | module will be called ucb1400_core. | ||
61 | |||
53 | config MFD_TMIO | 62 | config MFD_TMIO |
54 | bool | 63 | bool |
55 | default n | 64 | default n |
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 03ad239ecef0..6abebe364419 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile | |||
@@ -22,3 +22,4 @@ obj-$(CONFIG_MCP_UCB1200_TS) += ucb1x00-ts.o | |||
22 | ifeq ($(CONFIG_SA1100_ASSABET),y) | 22 | ifeq ($(CONFIG_SA1100_ASSABET),y) |
23 | obj-$(CONFIG_MCP_UCB1200) += ucb1x00-assabet.o | 23 | obj-$(CONFIG_MCP_UCB1200) += ucb1x00-assabet.o |
24 | endif | 24 | endif |
25 | obj-$(CONFIG_UCB1400_CORE) += ucb1400_core.o | ||
diff --git a/drivers/mfd/ucb1400_core.c b/drivers/mfd/ucb1400_core.c new file mode 100644 index 000000000000..178159e264ce --- /dev/null +++ b/drivers/mfd/ucb1400_core.c | |||
@@ -0,0 +1,106 @@ | |||
1 | /* | ||
2 | * Core functions for: | ||
3 | * Philips UCB1400 multifunction chip | ||
4 | * | ||
5 | * Based on ucb1400_ts.c: | ||
6 | * Author: Nicolas Pitre | ||
7 | * Created: September 25, 2006 | ||
8 | * Copyright: MontaVista Software, Inc. | ||
9 | * | ||
10 | * Spliting done by: Marek Vasut <marek.vasut@gmail.com> | ||
11 | * If something doesnt work and it worked before spliting, e-mail me, | ||
12 | * dont bother Nicolas please ;-) | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License version 2 as | ||
16 | * published by the Free Software Foundation. | ||
17 | * | ||
18 | * This code is heavily based on ucb1x00-*.c copyrighted by Russell King | ||
19 | * covering the UCB1100, UCB1200 and UCB1300.. Support for the UCB1400 has | ||
20 | * been made separate from ucb1x00-core/ucb1x00-ts on Russell's request. | ||
21 | */ | ||
22 | |||
23 | #include <linux/module.h> | ||
24 | #include <linux/ucb1400.h> | ||
25 | |||
26 | static int ucb1400_core_probe(struct device *dev) | ||
27 | { | ||
28 | int err; | ||
29 | struct ucb1400 *ucb; | ||
30 | struct ucb1400_ts ucb_ts; | ||
31 | struct snd_ac97 *ac97; | ||
32 | |||
33 | memset(&ucb_ts, 0, sizeof(ucb_ts)); | ||
34 | |||
35 | ucb = kzalloc(sizeof(struct ucb1400), GFP_KERNEL); | ||
36 | if (!ucb) { | ||
37 | err = -ENOMEM; | ||
38 | goto err; | ||
39 | } | ||
40 | |||
41 | dev_set_drvdata(dev, ucb); | ||
42 | |||
43 | ac97 = to_ac97_t(dev); | ||
44 | |||
45 | ucb_ts.id = ucb1400_reg_read(ac97, UCB_ID); | ||
46 | if (ucb_ts.id != UCB_ID_1400) { | ||
47 | err = -ENODEV; | ||
48 | goto err0; | ||
49 | } | ||
50 | |||
51 | /* TOUCHSCREEN */ | ||
52 | ucb_ts.ac97 = ac97; | ||
53 | ucb->ucb1400_ts = platform_device_alloc("ucb1400_ts", -1); | ||
54 | if (!ucb->ucb1400_ts) { | ||
55 | err = -ENOMEM; | ||
56 | goto err0; | ||
57 | } | ||
58 | err = platform_device_add_data(ucb->ucb1400_ts, &ucb_ts, | ||
59 | sizeof(ucb_ts)); | ||
60 | if (err) | ||
61 | goto err1; | ||
62 | err = platform_device_add(ucb->ucb1400_ts); | ||
63 | if (err) | ||
64 | goto err1; | ||
65 | |||
66 | return 0; | ||
67 | |||
68 | err1: | ||
69 | platform_device_put(ucb->ucb1400_ts); | ||
70 | err0: | ||
71 | kfree(ucb); | ||
72 | err: | ||
73 | return err; | ||
74 | } | ||
75 | |||
76 | static int ucb1400_core_remove(struct device *dev) | ||
77 | { | ||
78 | struct ucb1400 *ucb = dev_get_drvdata(dev); | ||
79 | |||
80 | platform_device_unregister(ucb->ucb1400_ts); | ||
81 | kfree(ucb); | ||
82 | return 0; | ||
83 | } | ||
84 | |||
85 | static struct device_driver ucb1400_core_driver = { | ||
86 | .name = "ucb1400_core", | ||
87 | .bus = &ac97_bus_type, | ||
88 | .probe = ucb1400_core_probe, | ||
89 | .remove = ucb1400_core_remove, | ||
90 | }; | ||
91 | |||
92 | static int __init ucb1400_core_init(void) | ||
93 | { | ||
94 | return driver_register(&ucb1400_core_driver); | ||
95 | } | ||
96 | |||
97 | static void __exit ucb1400_core_exit(void) | ||
98 | { | ||
99 | driver_unregister(&ucb1400_core_driver); | ||
100 | } | ||
101 | |||
102 | module_init(ucb1400_core_init); | ||
103 | module_exit(ucb1400_core_exit); | ||
104 | |||
105 | MODULE_DESCRIPTION("Philips UCB1400 driver"); | ||
106 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile index 20c5b06790a5..679ca927a62a 100644 --- a/drivers/pcmcia/Makefile +++ b/drivers/pcmcia/Makefile | |||
@@ -73,5 +73,6 @@ pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o | |||
73 | pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o | 73 | pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o |
74 | pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x2xx.o pxa2xx_cm_x255.o pxa2xx_cm_x270.o | 74 | pxa2xx_cs-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x2xx.o pxa2xx_cm_x255.o pxa2xx_cm_x270.o |
75 | pxa2xx_cs-$(CONFIG_TRIZEPS_PCMCIA) += pxa2xx_trizeps.o | 75 | pxa2xx_cs-$(CONFIG_TRIZEPS_PCMCIA) += pxa2xx_trizeps.o |
76 | pxa2xx_cs-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o | 76 | pxa2xx_cs-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o |
77 | pxa2xx_cs-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o | ||
77 | 78 | ||
diff --git a/drivers/pcmcia/pxa2xx_palmld.c b/drivers/pcmcia/pxa2xx_palmld.c new file mode 100644 index 000000000000..1736c67e547e --- /dev/null +++ b/drivers/pcmcia/pxa2xx_palmld.c | |||
@@ -0,0 +1,151 @@ | |||
1 | /* | ||
2 | * linux/drivers/pcmcia/pxa2xx_palmld.c | ||
3 | * | ||
4 | * Driver for Palm LifeDrive PCMCIA | ||
5 | * | ||
6 | * Copyright (C) 2006 Alex Osborne <ato@meshy.org> | ||
7 | * Copyright (C) 2007-2008 Marek Vasut <marek.vasut@gmail.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/gpio.h> | ||
18 | |||
19 | #include <asm/mach-types.h> | ||
20 | #include <mach/palmld.h> | ||
21 | #include "soc_common.h" | ||
22 | |||
23 | static int palmld_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | ||
24 | { | ||
25 | int ret; | ||
26 | |||
27 | ret = gpio_request(GPIO_NR_PALMLD_PCMCIA_POWER, "PCMCIA PWR"); | ||
28 | if (ret) | ||
29 | goto err1; | ||
30 | ret = gpio_direction_output(GPIO_NR_PALMLD_PCMCIA_POWER, 0); | ||
31 | if (ret) | ||
32 | goto err2; | ||
33 | |||
34 | ret = gpio_request(GPIO_NR_PALMLD_PCMCIA_RESET, "PCMCIA RST"); | ||
35 | if (ret) | ||
36 | goto err2; | ||
37 | ret = gpio_direction_output(GPIO_NR_PALMLD_PCMCIA_RESET, 1); | ||
38 | if (ret) | ||
39 | goto err3; | ||
40 | |||
41 | ret = gpio_request(GPIO_NR_PALMLD_PCMCIA_READY, "PCMCIA RDY"); | ||
42 | if (ret) | ||
43 | goto err3; | ||
44 | ret = gpio_direction_input(GPIO_NR_PALMLD_PCMCIA_READY); | ||
45 | if (ret) | ||
46 | goto err4; | ||
47 | |||
48 | skt->irq = IRQ_GPIO(GPIO_NR_PALMLD_PCMCIA_READY); | ||
49 | return 0; | ||
50 | |||
51 | err4: | ||
52 | gpio_free(GPIO_NR_PALMLD_PCMCIA_READY); | ||
53 | err3: | ||
54 | gpio_free(GPIO_NR_PALMLD_PCMCIA_RESET); | ||
55 | err2: | ||
56 | gpio_free(GPIO_NR_PALMLD_PCMCIA_POWER); | ||
57 | err1: | ||
58 | return ret; | ||
59 | } | ||
60 | |||
61 | static void palmld_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | ||
62 | { | ||
63 | gpio_free(GPIO_NR_PALMLD_PCMCIA_READY); | ||
64 | gpio_free(GPIO_NR_PALMLD_PCMCIA_RESET); | ||
65 | gpio_free(GPIO_NR_PALMLD_PCMCIA_POWER); | ||
66 | } | ||
67 | |||
68 | static void palmld_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | ||
69 | struct pcmcia_state *state) | ||
70 | { | ||
71 | state->detect = 1; /* always inserted */ | ||
72 | state->ready = !!gpio_get_value(GPIO_NR_PALMLD_PCMCIA_READY); | ||
73 | state->bvd1 = 1; | ||
74 | state->bvd2 = 1; | ||
75 | state->wrprot = 0; | ||
76 | state->vs_3v = 1; | ||
77 | state->vs_Xv = 0; | ||
78 | } | ||
79 | |||
80 | static int palmld_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | ||
81 | const socket_state_t *state) | ||
82 | { | ||
83 | gpio_set_value(GPIO_NR_PALMLD_PCMCIA_POWER, 1); | ||
84 | gpio_set_value(GPIO_NR_PALMLD_PCMCIA_RESET, | ||
85 | !!(state->flags & SS_RESET)); | ||
86 | |||
87 | return 0; | ||
88 | } | ||
89 | |||
90 | static void palmld_pcmcia_socket_init(struct soc_pcmcia_socket *skt) | ||
91 | { | ||
92 | } | ||
93 | |||
94 | static void palmld_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) | ||
95 | { | ||
96 | } | ||
97 | |||
98 | static struct pcmcia_low_level palmld_pcmcia_ops = { | ||
99 | .owner = THIS_MODULE, | ||
100 | |||
101 | .first = 0, | ||
102 | .nr = 2, | ||
103 | |||
104 | .hw_init = palmld_pcmcia_hw_init, | ||
105 | .hw_shutdown = palmld_pcmcia_hw_shutdown, | ||
106 | |||
107 | .socket_state = palmld_pcmcia_socket_state, | ||
108 | .configure_socket = palmld_pcmcia_configure_socket, | ||
109 | |||
110 | .socket_init = palmld_pcmcia_socket_init, | ||
111 | .socket_suspend = palmld_pcmcia_socket_suspend, | ||
112 | }; | ||
113 | |||
114 | static struct platform_device *palmld_pcmcia_device; | ||
115 | |||
116 | static int __init palmld_pcmcia_init(void) | ||
117 | { | ||
118 | int ret; | ||
119 | |||
120 | if (!machine_is_palmld()) | ||
121 | return -ENODEV; | ||
122 | |||
123 | palmld_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | ||
124 | if (!palmld_pcmcia_device) | ||
125 | return -ENOMEM; | ||
126 | |||
127 | ret = platform_device_add_data(palmld_pcmcia_device, &palmld_pcmcia_ops, | ||
128 | sizeof(palmld_pcmcia_ops)); | ||
129 | |||
130 | if (!ret) | ||
131 | ret = platform_device_add(palmld_pcmcia_device); | ||
132 | |||
133 | if (ret) | ||
134 | platform_device_put(palmld_pcmcia_device); | ||
135 | |||
136 | return ret; | ||
137 | } | ||
138 | |||
139 | static void __exit palmld_pcmcia_exit(void) | ||
140 | { | ||
141 | platform_device_unregister(palmld_pcmcia_device); | ||
142 | } | ||
143 | |||
144 | module_init(palmld_pcmcia_init); | ||
145 | module_exit(palmld_pcmcia_exit); | ||
146 | |||
147 | MODULE_AUTHOR("Alex Osborne <ato@meshy.org>," | ||
148 | " Marek Vasut <marek.vasut@gmail.com>"); | ||
149 | MODULE_DESCRIPTION("PCMCIA support for Palm LifeDrive"); | ||
150 | MODULE_ALIAS("platform:pxa2xx-pcmcia"); | ||
151 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 9ce55850271a..1982f8b42782 100644 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig | |||
@@ -56,10 +56,10 @@ config BATTERY_TOSA | |||
56 | Say Y to enable support for the battery on the Sharp Zaurus | 56 | Say Y to enable support for the battery on the Sharp Zaurus |
57 | SL-6000 (tosa) models. | 57 | SL-6000 (tosa) models. |
58 | 58 | ||
59 | config BATTERY_PALMTX | 59 | config BATTERY_WM97XX |
60 | tristate "Palm T|X battery" | 60 | bool "WM97xx generic battery driver" |
61 | depends on MACH_PALMTX | 61 | depends on TOUCHSCREEN_WM97XX |
62 | help | 62 | help |
63 | Say Y to enable support for the battery in Palm T|X. | 63 | Say Y to enable support for battery measured by WM97xx aux port. |
64 | 64 | ||
65 | endif # POWER_SUPPLY | 65 | endif # POWER_SUPPLY |
diff --git a/drivers/power/Makefile b/drivers/power/Makefile index 4706bf8ff459..4e20026cc45a 100644 --- a/drivers/power/Makefile +++ b/drivers/power/Makefile | |||
@@ -21,4 +21,4 @@ obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o | |||
21 | obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o | 21 | obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o |
22 | obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o | 22 | obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o |
23 | obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o | 23 | obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o |
24 | obj-$(CONFIG_BATTERY_PALMTX) += palmtx_battery.o | 24 | obj-$(CONFIG_BATTERY_WM97XX) += wm97xx_battery.o \ No newline at end of file |
diff --git a/drivers/power/palmtx_battery.c b/drivers/power/palmtx_battery.c deleted file mode 100644 index 7035bfa41c62..000000000000 --- a/drivers/power/palmtx_battery.c +++ /dev/null | |||
@@ -1,198 +0,0 @@ | |||
1 | /* | ||
2 | * linux/drivers/power/palmtx_battery.c | ||
3 | * | ||
4 | * Battery measurement code for Palm T|X Handheld computer | ||
5 | * | ||
6 | * based on tosa_battery.c | ||
7 | * | ||
8 | * Copyright (C) 2008 Marek Vasut <marek.vasut@gmail.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | */ | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/power_supply.h> | ||
18 | #include <linux/wm97xx.h> | ||
19 | #include <linux/delay.h> | ||
20 | #include <linux/spinlock.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/gpio.h> | ||
23 | |||
24 | #include <asm/mach-types.h> | ||
25 | #include <mach/palmtx.h> | ||
26 | |||
27 | static DEFINE_MUTEX(bat_lock); | ||
28 | static struct work_struct bat_work; | ||
29 | struct mutex work_lock; | ||
30 | int bat_status = POWER_SUPPLY_STATUS_DISCHARGING; | ||
31 | |||
32 | static unsigned long palmtx_read_bat(struct power_supply *bat_ps) | ||
33 | { | ||
34 | return wm97xx_read_aux_adc(bat_ps->dev->parent->driver_data, | ||
35 | WM97XX_AUX_ID3) * 1000 / 414; | ||
36 | } | ||
37 | |||
38 | static unsigned long palmtx_read_temp(struct power_supply *bat_ps) | ||
39 | { | ||
40 | return wm97xx_read_aux_adc(bat_ps->dev->parent->driver_data, | ||
41 | WM97XX_AUX_ID2); | ||
42 | } | ||
43 | |||
44 | static int palmtx_bat_get_property(struct power_supply *bat_ps, | ||
45 | enum power_supply_property psp, | ||
46 | union power_supply_propval *val) | ||
47 | { | ||
48 | switch (psp) { | ||
49 | case POWER_SUPPLY_PROP_STATUS: | ||
50 | val->intval = bat_status; | ||
51 | break; | ||
52 | case POWER_SUPPLY_PROP_TECHNOLOGY: | ||
53 | val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; | ||
54 | break; | ||
55 | case POWER_SUPPLY_PROP_VOLTAGE_NOW: | ||
56 | val->intval = palmtx_read_bat(bat_ps); | ||
57 | break; | ||
58 | case POWER_SUPPLY_PROP_VOLTAGE_MAX: | ||
59 | case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: | ||
60 | val->intval = PALMTX_BAT_MAX_VOLTAGE; | ||
61 | break; | ||
62 | case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: | ||
63 | val->intval = PALMTX_BAT_MIN_VOLTAGE; | ||
64 | break; | ||
65 | case POWER_SUPPLY_PROP_TEMP: | ||
66 | val->intval = palmtx_read_temp(bat_ps); | ||
67 | break; | ||
68 | case POWER_SUPPLY_PROP_PRESENT: | ||
69 | val->intval = 1; | ||
70 | break; | ||
71 | default: | ||
72 | return -EINVAL; | ||
73 | } | ||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static void palmtx_bat_external_power_changed(struct power_supply *bat_ps) | ||
78 | { | ||
79 | schedule_work(&bat_work); | ||
80 | } | ||
81 | |||
82 | static char *status_text[] = { | ||
83 | [POWER_SUPPLY_STATUS_UNKNOWN] = "Unknown", | ||
84 | [POWER_SUPPLY_STATUS_CHARGING] = "Charging", | ||
85 | [POWER_SUPPLY_STATUS_DISCHARGING] = "Discharging", | ||
86 | }; | ||
87 | |||
88 | static void palmtx_bat_update(struct power_supply *bat_ps) | ||
89 | { | ||
90 | int old_status = bat_status; | ||
91 | |||
92 | mutex_lock(&work_lock); | ||
93 | |||
94 | bat_status = gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT) ? | ||
95 | POWER_SUPPLY_STATUS_CHARGING : | ||
96 | POWER_SUPPLY_STATUS_DISCHARGING; | ||
97 | |||
98 | if (old_status != bat_status) { | ||
99 | pr_debug("%s %s -> %s\n", bat_ps->name, | ||
100 | status_text[old_status], | ||
101 | status_text[bat_status]); | ||
102 | power_supply_changed(bat_ps); | ||
103 | } | ||
104 | |||
105 | mutex_unlock(&work_lock); | ||
106 | } | ||
107 | |||
108 | static enum power_supply_property palmtx_bat_main_props[] = { | ||
109 | POWER_SUPPLY_PROP_STATUS, | ||
110 | POWER_SUPPLY_PROP_TECHNOLOGY, | ||
111 | POWER_SUPPLY_PROP_VOLTAGE_NOW, | ||
112 | POWER_SUPPLY_PROP_VOLTAGE_MAX, | ||
113 | POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, | ||
114 | POWER_SUPPLY_PROP_TEMP, | ||
115 | POWER_SUPPLY_PROP_PRESENT, | ||
116 | }; | ||
117 | |||
118 | struct power_supply bat_ps = { | ||
119 | .name = "main-battery", | ||
120 | .type = POWER_SUPPLY_TYPE_BATTERY, | ||
121 | .properties = palmtx_bat_main_props, | ||
122 | .num_properties = ARRAY_SIZE(palmtx_bat_main_props), | ||
123 | .get_property = palmtx_bat_get_property, | ||
124 | .external_power_changed = palmtx_bat_external_power_changed, | ||
125 | .use_for_apm = 1, | ||
126 | }; | ||
127 | |||
128 | static void palmtx_bat_work(struct work_struct *work) | ||
129 | { | ||
130 | palmtx_bat_update(&bat_ps); | ||
131 | } | ||
132 | |||
133 | #ifdef CONFIG_PM | ||
134 | static int palmtx_bat_suspend(struct platform_device *dev, pm_message_t state) | ||
135 | { | ||
136 | flush_scheduled_work(); | ||
137 | return 0; | ||
138 | } | ||
139 | |||
140 | static int palmtx_bat_resume(struct platform_device *dev) | ||
141 | { | ||
142 | schedule_work(&bat_work); | ||
143 | return 0; | ||
144 | } | ||
145 | #else | ||
146 | #define palmtx_bat_suspend NULL | ||
147 | #define palmtx_bat_resume NULL | ||
148 | #endif | ||
149 | |||
150 | static int __devinit palmtx_bat_probe(struct platform_device *dev) | ||
151 | { | ||
152 | int ret = 0; | ||
153 | |||
154 | if (!machine_is_palmtx()) | ||
155 | return -ENODEV; | ||
156 | |||
157 | mutex_init(&work_lock); | ||
158 | |||
159 | INIT_WORK(&bat_work, palmtx_bat_work); | ||
160 | |||
161 | ret = power_supply_register(&dev->dev, &bat_ps); | ||
162 | if (!ret) | ||
163 | schedule_work(&bat_work); | ||
164 | |||
165 | return ret; | ||
166 | } | ||
167 | |||
168 | static int __devexit palmtx_bat_remove(struct platform_device *dev) | ||
169 | { | ||
170 | power_supply_unregister(&bat_ps); | ||
171 | return 0; | ||
172 | } | ||
173 | |||
174 | static struct platform_driver palmtx_bat_driver = { | ||
175 | .driver.name = "wm97xx-battery", | ||
176 | .driver.owner = THIS_MODULE, | ||
177 | .probe = palmtx_bat_probe, | ||
178 | .remove = __devexit_p(palmtx_bat_remove), | ||
179 | .suspend = palmtx_bat_suspend, | ||
180 | .resume = palmtx_bat_resume, | ||
181 | }; | ||
182 | |||
183 | static int __init palmtx_bat_init(void) | ||
184 | { | ||
185 | return platform_driver_register(&palmtx_bat_driver); | ||
186 | } | ||
187 | |||
188 | static void __exit palmtx_bat_exit(void) | ||
189 | { | ||
190 | platform_driver_unregister(&palmtx_bat_driver); | ||
191 | } | ||
192 | |||
193 | module_init(palmtx_bat_init); | ||
194 | module_exit(palmtx_bat_exit); | ||
195 | |||
196 | MODULE_LICENSE("GPL"); | ||
197 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); | ||
198 | MODULE_DESCRIPTION("Palm T|X battery driver"); | ||
diff --git a/drivers/power/wm97xx_battery.c b/drivers/power/wm97xx_battery.c new file mode 100644 index 000000000000..8bde92126d34 --- /dev/null +++ b/drivers/power/wm97xx_battery.c | |||
@@ -0,0 +1,272 @@ | |||
1 | /* | ||
2 | * linux/drivers/power/wm97xx_battery.c | ||
3 | * | ||
4 | * Battery measurement code for WM97xx | ||
5 | * | ||
6 | * based on tosa_battery.c | ||
7 | * | ||
8 | * Copyright (C) 2008 Marek Vasut <marek.vasut@gmail.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/init.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/platform_device.h> | ||
20 | #include <linux/power_supply.h> | ||
21 | #include <linux/wm97xx.h> | ||
22 | #include <linux/spinlock.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/gpio.h> | ||
25 | #include <linux/wm97xx_batt.h> | ||
26 | |||
27 | static DEFINE_MUTEX(bat_lock); | ||
28 | static struct work_struct bat_work; | ||
29 | struct mutex work_lock; | ||
30 | static int bat_status = POWER_SUPPLY_STATUS_UNKNOWN; | ||
31 | static struct wm97xx_batt_info *pdata; | ||
32 | static enum power_supply_property *prop; | ||
33 | |||
34 | static unsigned long wm97xx_read_bat(struct power_supply *bat_ps) | ||
35 | { | ||
36 | return wm97xx_read_aux_adc(bat_ps->dev->parent->driver_data, | ||
37 | pdata->batt_aux) * pdata->batt_mult / | ||
38 | pdata->batt_div; | ||
39 | } | ||
40 | |||
41 | static unsigned long wm97xx_read_temp(struct power_supply *bat_ps) | ||
42 | { | ||
43 | return wm97xx_read_aux_adc(bat_ps->dev->parent->driver_data, | ||
44 | pdata->temp_aux) * pdata->temp_mult / | ||
45 | pdata->temp_div; | ||
46 | } | ||
47 | |||
48 | static int wm97xx_bat_get_property(struct power_supply *bat_ps, | ||
49 | enum power_supply_property psp, | ||
50 | union power_supply_propval *val) | ||
51 | { | ||
52 | switch (psp) { | ||
53 | case POWER_SUPPLY_PROP_STATUS: | ||
54 | val->intval = bat_status; | ||
55 | break; | ||
56 | case POWER_SUPPLY_PROP_TECHNOLOGY: | ||
57 | val->intval = pdata->batt_tech; | ||
58 | break; | ||
59 | case POWER_SUPPLY_PROP_VOLTAGE_NOW: | ||
60 | if (pdata->batt_aux >= 0) | ||
61 | val->intval = wm97xx_read_bat(bat_ps); | ||
62 | else | ||
63 | return -EINVAL; | ||
64 | break; | ||
65 | case POWER_SUPPLY_PROP_TEMP: | ||
66 | if (pdata->temp_aux >= 0) | ||
67 | val->intval = wm97xx_read_temp(bat_ps); | ||
68 | else | ||
69 | return -EINVAL; | ||
70 | break; | ||
71 | case POWER_SUPPLY_PROP_VOLTAGE_MAX: | ||
72 | if (pdata->max_voltage >= 0) | ||
73 | val->intval = pdata->max_voltage; | ||
74 | else | ||
75 | return -EINVAL; | ||
76 | break; | ||
77 | case POWER_SUPPLY_PROP_VOLTAGE_MIN: | ||
78 | if (pdata->min_voltage >= 0) | ||
79 | val->intval = pdata->min_voltage; | ||
80 | else | ||
81 | return -EINVAL; | ||
82 | break; | ||
83 | case POWER_SUPPLY_PROP_PRESENT: | ||
84 | val->intval = 1; | ||
85 | break; | ||
86 | default: | ||
87 | return -EINVAL; | ||
88 | } | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | static void wm97xx_bat_external_power_changed(struct power_supply *bat_ps) | ||
93 | { | ||
94 | schedule_work(&bat_work); | ||
95 | } | ||
96 | |||
97 | static void wm97xx_bat_update(struct power_supply *bat_ps) | ||
98 | { | ||
99 | int old_status = bat_status; | ||
100 | |||
101 | mutex_lock(&work_lock); | ||
102 | |||
103 | bat_status = (pdata->charge_gpio >= 0) ? | ||
104 | (gpio_get_value(pdata->charge_gpio) ? | ||
105 | POWER_SUPPLY_STATUS_DISCHARGING : | ||
106 | POWER_SUPPLY_STATUS_CHARGING) : | ||
107 | POWER_SUPPLY_STATUS_UNKNOWN; | ||
108 | |||
109 | if (old_status != bat_status) { | ||
110 | pr_debug("%s: %i -> %i\n", bat_ps->name, old_status, | ||
111 | bat_status); | ||
112 | power_supply_changed(bat_ps); | ||
113 | } | ||
114 | |||
115 | mutex_unlock(&work_lock); | ||
116 | } | ||
117 | |||
118 | static struct power_supply bat_ps = { | ||
119 | .type = POWER_SUPPLY_TYPE_BATTERY, | ||
120 | .get_property = wm97xx_bat_get_property, | ||
121 | .external_power_changed = wm97xx_bat_external_power_changed, | ||
122 | .use_for_apm = 1, | ||
123 | }; | ||
124 | |||
125 | static void wm97xx_bat_work(struct work_struct *work) | ||
126 | { | ||
127 | wm97xx_bat_update(&bat_ps); | ||
128 | } | ||
129 | |||
130 | #ifdef CONFIG_PM | ||
131 | static int wm97xx_bat_suspend(struct platform_device *dev, pm_message_t state) | ||
132 | { | ||
133 | flush_scheduled_work(); | ||
134 | return 0; | ||
135 | } | ||
136 | |||
137 | static int wm97xx_bat_resume(struct platform_device *dev) | ||
138 | { | ||
139 | schedule_work(&bat_work); | ||
140 | return 0; | ||
141 | } | ||
142 | #else | ||
143 | #define wm97xx_bat_suspend NULL | ||
144 | #define wm97xx_bat_resume NULL | ||
145 | #endif | ||
146 | |||
147 | static int __devinit wm97xx_bat_probe(struct platform_device *dev) | ||
148 | { | ||
149 | int ret = 0; | ||
150 | int props = 1; /* POWER_SUPPLY_PROP_PRESENT */ | ||
151 | int i = 0; | ||
152 | |||
153 | if (dev->id != -1) | ||
154 | return -EINVAL; | ||
155 | |||
156 | mutex_init(&work_lock); | ||
157 | |||
158 | if (!pdata) { | ||
159 | dev_err(&dev->dev, "Please use wm97xx_bat_set_pdata\n"); | ||
160 | return -EINVAL; | ||
161 | } | ||
162 | |||
163 | if (pdata->charge_gpio >= 0 && gpio_is_valid(pdata->charge_gpio)) { | ||
164 | ret = gpio_request(pdata->charge_gpio, "BATT CHRG"); | ||
165 | if (ret) | ||
166 | goto err; | ||
167 | ret = gpio_direction_input(pdata->charge_gpio); | ||
168 | if (ret) | ||
169 | goto err2; | ||
170 | props++; /* POWER_SUPPLY_PROP_STATUS */ | ||
171 | } | ||
172 | |||
173 | if (pdata->batt_tech >= 0) | ||
174 | props++; /* POWER_SUPPLY_PROP_TECHNOLOGY */ | ||
175 | if (pdata->temp_aux >= 0) | ||
176 | props++; /* POWER_SUPPLY_PROP_TEMP */ | ||
177 | if (pdata->batt_aux >= 0) | ||
178 | props++; /* POWER_SUPPLY_PROP_VOLTAGE_NOW */ | ||
179 | if (pdata->max_voltage >= 0) | ||
180 | props++; /* POWER_SUPPLY_PROP_VOLTAGE_MAX */ | ||
181 | if (pdata->min_voltage >= 0) | ||
182 | props++; /* POWER_SUPPLY_PROP_VOLTAGE_MIN */ | ||
183 | |||
184 | prop = kzalloc(props * sizeof(*prop), GFP_KERNEL); | ||
185 | if (!prop) | ||
186 | goto err2; | ||
187 | |||
188 | prop[i++] = POWER_SUPPLY_PROP_PRESENT; | ||
189 | if (pdata->charge_gpio >= 0) | ||
190 | prop[i++] = POWER_SUPPLY_PROP_STATUS; | ||
191 | if (pdata->batt_tech >= 0) | ||
192 | prop[i++] = POWER_SUPPLY_PROP_TECHNOLOGY; | ||
193 | if (pdata->temp_aux >= 0) | ||
194 | prop[i++] = POWER_SUPPLY_PROP_TEMP; | ||
195 | if (pdata->batt_aux >= 0) | ||
196 | prop[i++] = POWER_SUPPLY_PROP_VOLTAGE_NOW; | ||
197 | if (pdata->max_voltage >= 0) | ||
198 | prop[i++] = POWER_SUPPLY_PROP_VOLTAGE_MAX; | ||
199 | if (pdata->min_voltage >= 0) | ||
200 | prop[i++] = POWER_SUPPLY_PROP_VOLTAGE_MIN; | ||
201 | |||
202 | INIT_WORK(&bat_work, wm97xx_bat_work); | ||
203 | |||
204 | if (!pdata->batt_name) { | ||
205 | dev_info(&dev->dev, "Please consider setting proper battery " | ||
206 | "name in platform definition file, falling " | ||
207 | "back to name \"wm97xx-batt\"\n"); | ||
208 | bat_ps.name = "wm97xx-batt"; | ||
209 | } else | ||
210 | bat_ps.name = pdata->batt_name; | ||
211 | |||
212 | bat_ps.properties = prop; | ||
213 | bat_ps.num_properties = props; | ||
214 | |||
215 | ret = power_supply_register(&dev->dev, &bat_ps); | ||
216 | if (!ret) | ||
217 | schedule_work(&bat_work); | ||
218 | else | ||
219 | goto err3; | ||
220 | |||
221 | return 0; | ||
222 | err3: | ||
223 | kfree(prop); | ||
224 | err2: | ||
225 | gpio_free(pdata->charge_gpio); | ||
226 | err: | ||
227 | return ret; | ||
228 | } | ||
229 | |||
230 | static int __devexit wm97xx_bat_remove(struct platform_device *dev) | ||
231 | { | ||
232 | if (pdata && pdata->charge_gpio && pdata->charge_gpio >= 0) | ||
233 | gpio_free(pdata->charge_gpio); | ||
234 | flush_scheduled_work(); | ||
235 | power_supply_unregister(&bat_ps); | ||
236 | kfree(prop); | ||
237 | return 0; | ||
238 | } | ||
239 | |||
240 | static struct platform_driver wm97xx_bat_driver = { | ||
241 | .driver = { | ||
242 | .name = "wm97xx-battery", | ||
243 | .owner = THIS_MODULE, | ||
244 | }, | ||
245 | .probe = wm97xx_bat_probe, | ||
246 | .remove = __devexit_p(wm97xx_bat_remove), | ||
247 | .suspend = wm97xx_bat_suspend, | ||
248 | .resume = wm97xx_bat_resume, | ||
249 | }; | ||
250 | |||
251 | static int __init wm97xx_bat_init(void) | ||
252 | { | ||
253 | return platform_driver_register(&wm97xx_bat_driver); | ||
254 | } | ||
255 | |||
256 | static void __exit wm97xx_bat_exit(void) | ||
257 | { | ||
258 | platform_driver_unregister(&wm97xx_bat_driver); | ||
259 | } | ||
260 | |||
261 | void __init wm97xx_bat_set_pdata(struct wm97xx_batt_info *data) | ||
262 | { | ||
263 | pdata = data; | ||
264 | } | ||
265 | EXPORT_SYMBOL_GPL(wm97xx_bat_set_pdata); | ||
266 | |||
267 | module_init(wm97xx_bat_init); | ||
268 | module_exit(wm97xx_bat_exit); | ||
269 | |||
270 | MODULE_LICENSE("GPL"); | ||
271 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); | ||
272 | MODULE_DESCRIPTION("WM97xx battery driver"); | ||
diff --git a/include/linux/ucb1400.h b/include/linux/ucb1400.h new file mode 100644 index 000000000000..970473bf8d5a --- /dev/null +++ b/include/linux/ucb1400.h | |||
@@ -0,0 +1,161 @@ | |||
1 | /* | ||
2 | * Register definitions and functions for: | ||
3 | * Philips UCB1400 driver | ||
4 | * | ||
5 | * Based on ucb1400_ts: | ||
6 | * Author: Nicolas Pitre | ||
7 | * Created: September 25, 2006 | ||
8 | * Copyright: MontaVista Software, Inc. | ||
9 | * | ||
10 | * Spliting done by: Marek Vasut <marek.vasut@gmail.com> | ||
11 | * If something doesnt work and it worked before spliting, e-mail me, | ||
12 | * dont bother Nicolas please ;-) | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License version 2 as | ||
16 | * published by the Free Software Foundation. | ||
17 | * | ||
18 | * This code is heavily based on ucb1x00-*.c copyrighted by Russell King | ||
19 | * covering the UCB1100, UCB1200 and UCB1300.. Support for the UCB1400 has | ||
20 | * been made separate from ucb1x00-core/ucb1x00-ts on Russell's request. | ||
21 | */ | ||
22 | |||
23 | #ifndef _LINUX__UCB1400_H | ||
24 | #define _LINUX__UCB1400_H | ||
25 | |||
26 | #include <sound/ac97_codec.h> | ||
27 | #include <linux/mutex.h> | ||
28 | #include <linux/platform_device.h> | ||
29 | |||
30 | /* | ||
31 | * UCB1400 AC-link registers | ||
32 | */ | ||
33 | |||
34 | #define UCB_IO_DATA 0x5a | ||
35 | #define UCB_IO_DIR 0x5c | ||
36 | #define UCB_IE_RIS 0x5e | ||
37 | #define UCB_IE_FAL 0x60 | ||
38 | #define UCB_IE_STATUS 0x62 | ||
39 | #define UCB_IE_CLEAR 0x62 | ||
40 | #define UCB_IE_ADC (1 << 11) | ||
41 | #define UCB_IE_TSPX (1 << 12) | ||
42 | |||
43 | #define UCB_TS_CR 0x64 | ||
44 | #define UCB_TS_CR_TSMX_POW (1 << 0) | ||
45 | #define UCB_TS_CR_TSPX_POW (1 << 1) | ||
46 | #define UCB_TS_CR_TSMY_POW (1 << 2) | ||
47 | #define UCB_TS_CR_TSPY_POW (1 << 3) | ||
48 | #define UCB_TS_CR_TSMX_GND (1 << 4) | ||
49 | #define UCB_TS_CR_TSPX_GND (1 << 5) | ||
50 | #define UCB_TS_CR_TSMY_GND (1 << 6) | ||
51 | #define UCB_TS_CR_TSPY_GND (1 << 7) | ||
52 | #define UCB_TS_CR_MODE_INT (0 << 8) | ||
53 | #define UCB_TS_CR_MODE_PRES (1 << 8) | ||
54 | #define UCB_TS_CR_MODE_POS (2 << 8) | ||
55 | #define UCB_TS_CR_BIAS_ENA (1 << 11) | ||
56 | #define UCB_TS_CR_TSPX_LOW (1 << 12) | ||
57 | #define UCB_TS_CR_TSMX_LOW (1 << 13) | ||
58 | |||
59 | #define UCB_ADC_CR 0x66 | ||
60 | #define UCB_ADC_SYNC_ENA (1 << 0) | ||
61 | #define UCB_ADC_VREFBYP_CON (1 << 1) | ||
62 | #define UCB_ADC_INP_TSPX (0 << 2) | ||
63 | #define UCB_ADC_INP_TSMX (1 << 2) | ||
64 | #define UCB_ADC_INP_TSPY (2 << 2) | ||
65 | #define UCB_ADC_INP_TSMY (3 << 2) | ||
66 | #define UCB_ADC_INP_AD0 (4 << 2) | ||
67 | #define UCB_ADC_INP_AD1 (5 << 2) | ||
68 | #define UCB_ADC_INP_AD2 (6 << 2) | ||
69 | #define UCB_ADC_INP_AD3 (7 << 2) | ||
70 | #define UCB_ADC_EXT_REF (1 << 5) | ||
71 | #define UCB_ADC_START (1 << 7) | ||
72 | #define UCB_ADC_ENA (1 << 15) | ||
73 | |||
74 | #define UCB_ADC_DATA 0x68 | ||
75 | #define UCB_ADC_DAT_VALID (1 << 15) | ||
76 | #define UCB_ADC_DAT_MASK 0x3ff | ||
77 | |||
78 | #define UCB_ID 0x7e | ||
79 | #define UCB_ID_1400 0x4304 | ||
80 | |||
81 | struct ucb1400_ts { | ||
82 | struct input_dev *ts_idev; | ||
83 | struct task_struct *ts_task; | ||
84 | int id; | ||
85 | wait_queue_head_t ts_wait; | ||
86 | unsigned int ts_restart:1; | ||
87 | int irq; | ||
88 | unsigned int irq_pending; /* not bit field shared */ | ||
89 | struct snd_ac97 *ac97; | ||
90 | }; | ||
91 | |||
92 | struct ucb1400 { | ||
93 | struct platform_device *ucb1400_ts; | ||
94 | }; | ||
95 | |||
96 | static inline u16 ucb1400_reg_read(struct snd_ac97 *ac97, u16 reg) | ||
97 | { | ||
98 | return ac97->bus->ops->read(ac97, reg); | ||
99 | } | ||
100 | |||
101 | static inline void ucb1400_reg_write(struct snd_ac97 *ac97, u16 reg, u16 val) | ||
102 | { | ||
103 | ac97->bus->ops->write(ac97, reg, val); | ||
104 | } | ||
105 | |||
106 | static inline u16 ucb1400_gpio_get_value(struct snd_ac97 *ac97, u16 gpio) | ||
107 | { | ||
108 | return ucb1400_reg_read(ac97, UCB_IO_DATA) & (1 << gpio); | ||
109 | } | ||
110 | |||
111 | static inline void ucb1400_gpio_set_value(struct snd_ac97 *ac97, u16 gpio, | ||
112 | u16 val) | ||
113 | { | ||
114 | ucb1400_reg_write(ac97, UCB_IO_DATA, val ? | ||
115 | ucb1400_reg_read(ac97, UCB_IO_DATA) | (1 << gpio) : | ||
116 | ucb1400_reg_read(ac97, UCB_IO_DATA) & ~(1 << gpio)); | ||
117 | } | ||
118 | |||
119 | static inline u16 ucb1400_gpio_get_direction(struct snd_ac97 *ac97, u16 gpio) | ||
120 | { | ||
121 | return ucb1400_reg_read(ac97, UCB_IO_DIR) & (1 << gpio); | ||
122 | } | ||
123 | |||
124 | static inline void ucb1400_gpio_set_direction(struct snd_ac97 *ac97, u16 gpio, | ||
125 | u16 dir) | ||
126 | { | ||
127 | ucb1400_reg_write(ac97, UCB_IO_DIR, dir ? | ||
128 | ucb1400_reg_read(ac97, UCB_IO_DIR) | (1 << gpio) : | ||
129 | ucb1400_reg_read(ac97, UCB_IO_DIR) & ~(1 << gpio)); | ||
130 | } | ||
131 | |||
132 | static inline void ucb1400_adc_enable(struct snd_ac97 *ac97) | ||
133 | { | ||
134 | ucb1400_reg_write(ac97, UCB_ADC_CR, UCB_ADC_ENA); | ||
135 | } | ||
136 | |||
137 | static unsigned int ucb1400_adc_read(struct snd_ac97 *ac97, u16 adc_channel, | ||
138 | int adcsync) | ||
139 | { | ||
140 | unsigned int val; | ||
141 | |||
142 | if (adcsync) | ||
143 | adc_channel |= UCB_ADC_SYNC_ENA; | ||
144 | |||
145 | ucb1400_reg_write(ac97, UCB_ADC_CR, UCB_ADC_ENA | adc_channel); | ||
146 | ucb1400_reg_write(ac97, UCB_ADC_CR, UCB_ADC_ENA | adc_channel | | ||
147 | UCB_ADC_START); | ||
148 | |||
149 | while (!((val = ucb1400_reg_read(ac97, UCB_ADC_DATA)) | ||
150 | & UCB_ADC_DAT_VALID)) | ||
151 | schedule_timeout_uninterruptible(1); | ||
152 | |||
153 | return val & UCB_ADC_DAT_MASK; | ||
154 | } | ||
155 | |||
156 | static inline void ucb1400_adc_disable(struct snd_ac97 *ac97) | ||
157 | { | ||
158 | ucb1400_reg_write(ac97, UCB_ADC_CR, 0); | ||
159 | } | ||
160 | |||
161 | #endif | ||
diff --git a/include/linux/wm97xx_batt.h b/include/linux/wm97xx_batt.h new file mode 100644 index 000000000000..9681d1ab0e4f --- /dev/null +++ b/include/linux/wm97xx_batt.h | |||
@@ -0,0 +1,26 @@ | |||
1 | #ifndef _LINUX_WM97XX_BAT_H | ||
2 | #define _LINUX_WM97XX_BAT_H | ||
3 | |||
4 | #include <linux/wm97xx.h> | ||
5 | |||
6 | struct wm97xx_batt_info { | ||
7 | int batt_aux; | ||
8 | int temp_aux; | ||
9 | int charge_gpio; | ||
10 | int min_voltage; | ||
11 | int max_voltage; | ||
12 | int batt_div; | ||
13 | int batt_mult; | ||
14 | int temp_div; | ||
15 | int temp_mult; | ||
16 | int batt_tech; | ||
17 | char *batt_name; | ||
18 | }; | ||
19 | |||
20 | #ifdef CONFIG_BATTERY_WM97XX | ||
21 | void __init wm97xx_bat_set_pdata(struct wm97xx_batt_info *data); | ||
22 | #else | ||
23 | static inline void wm97xx_bat_set_pdata(struct wm97xx_batt_info *data) {} | ||
24 | #endif | ||
25 | |||
26 | #endif | ||