1 diff --git a/arch/arm/Makefile b/arch/arm/Makefile
2 index 24e0f01..f47f9c9 100644
3 --- a/arch/arm/Makefile
4 +++ b/arch/arm/Makefile
5 @@ -68,7 +68,7 @@ tune-$(CONFIG_CPU_ARM740T) :=-mtune=arm7tdmi
6 tune-$(CONFIG_CPU_ARM9TDMI) :=-mtune=arm9tdmi
7 tune-$(CONFIG_CPU_ARM940T) :=-mtune=arm9tdmi
8 tune-$(CONFIG_CPU_ARM946E) :=$(call cc-option,-mtune=arm9e,-mtune=arm9tdmi)
9 -tune-$(CONFIG_CPU_ARM920T) :=-mtune=arm9tdmi
10 +tune-$(CONFIG_CPU_ARM920T) :=-mtune=arm920t
11 tune-$(CONFIG_CPU_ARM922T) :=-mtune=arm9tdmi
12 tune-$(CONFIG_CPU_ARM925T) :=-mtune=arm9tdmi
13 tune-$(CONFIG_CPU_ARM926T) :=-mtune=arm9tdmi
14 diff --git a/arch/arm/configs/mini2440_defconfig b/arch/arm/configs/mini2440_defconfig
16 index 0000000..cbc37fe
18 +++ b/arch/arm/configs/mini2440_defconfig
21 +# Automatically generated make config: don't edit
22 +# Linux kernel version: 2.6.29-rc7
23 +# Thu Mar 5 13:12:56 2009
27 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
28 +CONFIG_GENERIC_GPIO=y
29 +# CONFIG_GENERIC_TIME is not set
30 +# CONFIG_GENERIC_CLOCKEVENTS is not set
33 +CONFIG_GENERIC_HARDIRQS=y
34 +CONFIG_STACKTRACE_SUPPORT=y
35 +CONFIG_HAVE_LATENCYTOP_SUPPORT=y
36 +CONFIG_LOCKDEP_SUPPORT=y
37 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
38 +CONFIG_HARDIRQS_SW_RESEND=y
39 +CONFIG_GENERIC_IRQ_PROBE=y
40 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
41 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
42 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
43 +CONFIG_GENERIC_HWEIGHT=y
44 +CONFIG_GENERIC_CALIBRATE_DELAY=y
45 +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
46 +CONFIG_VECTORS_BASE=0xffff0000
47 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
52 +CONFIG_EXPERIMENTAL=y
53 +CONFIG_BROKEN_ON_SMP=y
55 +CONFIG_INIT_ENV_ARG_LIMIT=32
56 +CONFIG_LOCALVERSION=""
57 +# CONFIG_LOCALVERSION_AUTO is not set
60 +CONFIG_SYSVIPC_SYSCTL=y
61 +CONFIG_POSIX_MQUEUE=y
62 +# CONFIG_BSD_PROCESS_ACCT is not set
63 +# CONFIG_TASKSTATS is not set
64 +# CONFIG_AUDIT is not set
70 +# CONFIG_TREE_RCU is not set
71 +# CONFIG_PREEMPT_RCU is not set
72 +# CONFIG_TREE_RCU_TRACE is not set
73 +# CONFIG_PREEMPT_RCU_TRACE is not set
74 +# CONFIG_IKCONFIG is not set
75 +CONFIG_LOG_BUF_SHIFT=17
76 +# CONFIG_GROUP_SCHED is not set
77 +# CONFIG_CGROUPS is not set
78 +# CONFIG_SYSFS_DEPRECATED_V2 is not set
83 +# CONFIG_USER_NS is not set
84 +# CONFIG_PID_NS is not set
85 +# CONFIG_NET_NS is not set
86 +CONFIG_BLK_DEV_INITRD=y
87 +CONFIG_INITRAMFS_SOURCE=""
88 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
90 +# CONFIG_EMBEDDED is not set
92 +CONFIG_SYSCTL_SYSCALL=y
94 +# CONFIG_KALLSYMS_ALL is not set
95 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
100 +# CONFIG_COMPAT_BRK is not set
103 +CONFIG_ANON_INODES=y
110 +CONFIG_VM_EVENT_COUNTERS=y
112 +# CONFIG_SLAB is not set
114 +# CONFIG_SLOB is not set
115 +# CONFIG_PROFILING is not set
116 +CONFIG_HAVE_OPROFILE=y
117 +# CONFIG_KPROBES is not set
118 +CONFIG_HAVE_KPROBES=y
119 +CONFIG_HAVE_KRETPROBES=y
121 +CONFIG_HAVE_GENERIC_DMA_COHERENT=y
126 +CONFIG_MODULE_FORCE_LOAD=y
127 +CONFIG_MODULE_UNLOAD=y
128 +CONFIG_MODULE_FORCE_UNLOAD=y
129 +# CONFIG_MODVERSIONS is not set
130 +# CONFIG_MODULE_SRCVERSION_ALL is not set
133 +# CONFIG_BLK_DEV_IO_TRACE is not set
134 +# CONFIG_BLK_DEV_BSG is not set
135 +CONFIG_BLK_DEV_INTEGRITY=y
140 +CONFIG_IOSCHED_NOOP=y
142 +CONFIG_IOSCHED_DEADLINE=y
143 +CONFIG_IOSCHED_CFQ=y
145 +# CONFIG_DEFAULT_DEADLINE is not set
146 +# CONFIG_DEFAULT_CFQ is not set
147 +# CONFIG_DEFAULT_NOOP is not set
148 +CONFIG_DEFAULT_IOSCHED="anticipatory"
154 +# CONFIG_ARCH_AAEC2000 is not set
155 +# CONFIG_ARCH_INTEGRATOR is not set
156 +# CONFIG_ARCH_REALVIEW is not set
157 +# CONFIG_ARCH_VERSATILE is not set
158 +# CONFIG_ARCH_AT91 is not set
159 +# CONFIG_ARCH_CLPS711X is not set
160 +# CONFIG_ARCH_EBSA110 is not set
161 +# CONFIG_ARCH_EP93XX is not set
162 +# CONFIG_ARCH_FOOTBRIDGE is not set
163 +# CONFIG_ARCH_NETX is not set
164 +# CONFIG_ARCH_H720X is not set
165 +# CONFIG_ARCH_IMX is not set
166 +# CONFIG_ARCH_IOP13XX is not set
167 +# CONFIG_ARCH_IOP32X is not set
168 +# CONFIG_ARCH_IOP33X is not set
169 +# CONFIG_ARCH_IXP23XX is not set
170 +# CONFIG_ARCH_IXP2000 is not set
171 +# CONFIG_ARCH_IXP4XX is not set
172 +# CONFIG_ARCH_L7200 is not set
173 +# CONFIG_ARCH_KIRKWOOD is not set
174 +# CONFIG_ARCH_KS8695 is not set
175 +# CONFIG_ARCH_NS9XXX is not set
176 +# CONFIG_ARCH_LOKI is not set
177 +# CONFIG_ARCH_MV78XX0 is not set
178 +# CONFIG_ARCH_MXC is not set
179 +# CONFIG_ARCH_ORION5X is not set
180 +# CONFIG_ARCH_PNX4008 is not set
181 +# CONFIG_ARCH_PXA is not set
182 +# CONFIG_ARCH_RPC is not set
183 +# CONFIG_ARCH_SA1100 is not set
184 +CONFIG_ARCH_S3C2410=y
185 +# CONFIG_ARCH_S3C64XX is not set
186 +# CONFIG_ARCH_SHARK is not set
187 +# CONFIG_ARCH_LH7A40X is not set
188 +# CONFIG_ARCH_DAVINCI is not set
189 +# CONFIG_ARCH_OMAP is not set
190 +# CONFIG_ARCH_MSM is not set
191 +# CONFIG_ARCH_W90X900 is not set
192 +CONFIG_PLAT_S3C24XX=y
193 +CONFIG_S3C2410_CLOCK=y
194 +CONFIG_CPU_S3C244X=y
195 +CONFIG_S3C24XX_PWM=y
196 +CONFIG_S3C24XX_GPIO_EXTRA=0
197 +CONFIG_S3C2410_DMA=y
198 +# CONFIG_S3C2410_DMA_DEBUG is not set
199 +CONFIG_S3C24XX_ADC=y
201 +CONFIG_CPU_LLSERIAL_S3C2440_ONLY=y
202 +CONFIG_CPU_LLSERIAL_S3C2440=y
207 +# CONFIG_S3C_BOOT_WATCHDOG is not set
208 +# CONFIG_S3C_BOOT_ERROR_RESET is not set
209 +CONFIG_S3C_BOOT_UART_FORCE_FIFO=y
214 +# CONFIG_S3C2410_PM_DEBUG is not set
215 +# CONFIG_S3C2410_PM_CHECK is not set
216 +CONFIG_S3C_LOWLEVEL_UART_PORT=0
217 +CONFIG_S3C_GPIO_SPACE=0
223 +CONFIG_S3C2410_GPIO=y
228 +# CONFIG_ARCH_SMDK2410 is not set
229 +# CONFIG_ARCH_H1940 is not set
230 +# CONFIG_MACH_N30 is not set
231 +# CONFIG_ARCH_BAST is not set
232 +# CONFIG_MACH_OTOM is not set
233 +# CONFIG_MACH_AML_M5900 is not set
234 +# CONFIG_MACH_TCT_HAMMER is not set
235 +# CONFIG_MACH_VR1000 is not set
236 +# CONFIG_MACH_QT2410 is not set
241 +# CONFIG_MACH_JIVE is not set
242 +# CONFIG_MACH_SMDK2413 is not set
243 +# CONFIG_MACH_SMDK2412 is not set
244 +# CONFIG_MACH_VSTMS is not set
245 +CONFIG_CPU_S3C2440=y
246 +CONFIG_S3C2440_DMA=y
251 +# CONFIG_MACH_ANUBIS is not set
252 +# CONFIG_MACH_OSIRIS is not set
253 +# CONFIG_MACH_RX3715 is not set
254 +# CONFIG_ARCH_S3C2440 is not set
255 +# CONFIG_MACH_NEXCODER_2440 is not set
256 +# CONFIG_MACH_AT2440EVB is not set
257 +CONFIG_MACH_MINI2440=y
266 +# CONFIG_MACH_SMDK2443 is not set
272 +CONFIG_CPU_ARM920T=y
274 +CONFIG_CPU_ABRT_EV4T=y
275 +CONFIG_CPU_PABRT_NOIFAR=y
276 +CONFIG_CPU_CACHE_V4WT=y
277 +CONFIG_CPU_CACHE_VIVT=y
278 +CONFIG_CPU_COPY_V4WB=y
279 +CONFIG_CPU_TLB_V4WBI=y
281 +CONFIG_CPU_CP15_MMU=y
284 +# Processor Features
287 +# CONFIG_CPU_ICACHE_DISABLE is not set
288 +# CONFIG_CPU_DCACHE_DISABLE is not set
289 +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
290 +# CONFIG_OUTER_CACHE is not set
295 +# CONFIG_PCI_SYSCALL is not set
296 +# CONFIG_ARCH_SUPPORTS_MSI is not set
297 +# CONFIG_PCCARD is not set
303 +# CONFIG_VMSPLIT_2G is not set
304 +# CONFIG_VMSPLIT_1G is not set
305 +CONFIG_PAGE_OFFSET=0xC0000000
309 +# CONFIG_OABI_COMPAT is not set
310 +CONFIG_ARCH_FLATMEM_HAS_HOLES=y
311 +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
312 +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
313 +CONFIG_SELECT_MEMORY_MODEL=y
314 +CONFIG_FLATMEM_MANUAL=y
315 +# CONFIG_DISCONTIGMEM_MANUAL is not set
316 +# CONFIG_SPARSEMEM_MANUAL is not set
318 +CONFIG_FLAT_NODE_MEM_MAP=y
319 +CONFIG_PAGEFLAGS_EXTENDED=y
320 +CONFIG_SPLIT_PTLOCK_CPUS=4096
321 +# CONFIG_PHYS_ADDR_T_64BIT is not set
322 +CONFIG_ZONE_DMA_FLAG=0
323 +CONFIG_VIRT_TO_BUS=y
324 +CONFIG_UNEVICTABLE_LRU=y
325 +CONFIG_ALIGNMENT_TRAP=y
330 +CONFIG_ZBOOT_ROM_TEXT=0
331 +CONFIG_ZBOOT_ROM_BSS=0
333 +# CONFIG_XIP_KERNEL is not set
338 +# CPU Power Management
341 +CONFIG_CPU_IDLE_GOV_LADDER=y
344 +# Floating point emulation
348 +# At least one emulation must be selected
352 +# Userspace binary formats
355 +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
357 +CONFIG_BINFMT_AOUT=m
358 +CONFIG_BINFMT_MISC=m
361 +# Power management options
364 +# CONFIG_PM_DEBUG is not set
367 +CONFIG_SUSPEND_FREEZER=y
368 +CONFIG_APM_EMULATION=y
369 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
373 +# Networking options
375 +CONFIG_COMPAT_NET_DEV_OPS=y
377 +CONFIG_PACKET_MMAP=y
381 +# CONFIG_XFRM_SUB_POLICY is not set
382 +# CONFIG_XFRM_MIGRATE is not set
383 +# CONFIG_XFRM_STATISTICS is not set
385 +# CONFIG_NET_KEY_MIGRATE is not set
387 +CONFIG_IP_MULTICAST=y
388 +CONFIG_IP_ADVANCED_ROUTER=y
389 +CONFIG_ASK_IP_FIB_HASH=y
390 +# CONFIG_IP_FIB_TRIE is not set
391 +CONFIG_IP_FIB_HASH=y
392 +CONFIG_IP_MULTIPLE_TABLES=y
393 +CONFIG_IP_ROUTE_MULTIPATH=y
394 +CONFIG_IP_ROUTE_VERBOSE=y
396 +CONFIG_IP_PNP_DHCP=y
397 +CONFIG_IP_PNP_BOOTP=y
398 +CONFIG_IP_PNP_RARP=y
399 +# CONFIG_NET_IPIP is not set
400 +# CONFIG_NET_IPGRE is not set
402 +CONFIG_IP_PIMSM_V1=y
403 +CONFIG_IP_PIMSM_V2=y
404 +# CONFIG_ARPD is not set
405 +CONFIG_SYN_COOKIES=y
406 +# CONFIG_INET_AH is not set
407 +# CONFIG_INET_ESP is not set
408 +# CONFIG_INET_IPCOMP is not set
409 +# CONFIG_INET_XFRM_TUNNEL is not set
410 +# CONFIG_INET_TUNNEL is not set
411 +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
412 +# CONFIG_INET_XFRM_MODE_TUNNEL is not set
413 +# CONFIG_INET_XFRM_MODE_BEET is not set
414 +# CONFIG_INET_LRO is not set
416 +CONFIG_INET_TCP_DIAG=y
417 +CONFIG_TCP_CONG_ADVANCED=y
418 +CONFIG_TCP_CONG_BIC=m
419 +CONFIG_TCP_CONG_CUBIC=y
420 +CONFIG_TCP_CONG_WESTWOOD=m
421 +CONFIG_TCP_CONG_HTCP=m
422 +CONFIG_TCP_CONG_HSTCP=m
423 +CONFIG_TCP_CONG_HYBLA=m
424 +CONFIG_TCP_CONG_VEGAS=m
425 +CONFIG_TCP_CONG_SCALABLE=m
426 +CONFIG_TCP_CONG_LP=m
427 +CONFIG_TCP_CONG_VENO=m
428 +CONFIG_TCP_CONG_YEAH=m
429 +CONFIG_TCP_CONG_ILLINOIS=m
430 +# CONFIG_DEFAULT_BIC is not set
431 +CONFIG_DEFAULT_CUBIC=y
432 +# CONFIG_DEFAULT_HTCP is not set
433 +# CONFIG_DEFAULT_VEGAS is not set
434 +# CONFIG_DEFAULT_WESTWOOD is not set
435 +# CONFIG_DEFAULT_RENO is not set
436 +CONFIG_DEFAULT_TCP_CONG="cubic"
438 +# CONFIG_IPV6 is not set
439 +CONFIG_NETWORK_SECMARK=y
441 +# CONFIG_NETFILTER_DEBUG is not set
442 +CONFIG_NETFILTER_ADVANCED=y
443 +CONFIG_BRIDGE_NETFILTER=y
446 +# Core Netfilter Configuration
448 +# CONFIG_NETFILTER_NETLINK_QUEUE is not set
449 +# CONFIG_NETFILTER_NETLINK_LOG is not set
450 +# CONFIG_NF_CONNTRACK is not set
451 +CONFIG_NETFILTER_XTABLES=m
452 +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
453 +# CONFIG_NETFILTER_XT_TARGET_MARK is not set
454 +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
455 +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
456 +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
457 +# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set
458 +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
459 +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
460 +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
461 +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
462 +# CONFIG_NETFILTER_XT_MATCH_ESP is not set
463 +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
464 +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
465 +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
466 +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
467 +# CONFIG_NETFILTER_XT_MATCH_MAC is not set
468 +# CONFIG_NETFILTER_XT_MATCH_MARK is not set
469 +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
470 +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
471 +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
472 +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
473 +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
474 +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
475 +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
476 +# CONFIG_NETFILTER_XT_MATCH_REALM is not set
477 +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
478 +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
479 +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
480 +# CONFIG_NETFILTER_XT_MATCH_STRING is not set
481 +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
482 +# CONFIG_NETFILTER_XT_MATCH_TIME is not set
483 +# CONFIG_NETFILTER_XT_MATCH_U32 is not set
484 +# CONFIG_IP_VS is not set
487 +# IP: Netfilter Configuration
489 +# CONFIG_NF_DEFRAG_IPV4 is not set
490 +CONFIG_IP_NF_QUEUE=y
491 +# CONFIG_IP_NF_IPTABLES is not set
492 +CONFIG_IP_NF_ARPTABLES=m
493 +# CONFIG_IP_NF_ARPFILTER is not set
494 +# CONFIG_IP_NF_ARP_MANGLE is not set
495 +# CONFIG_BRIDGE_NF_EBTABLES is not set
496 +# CONFIG_IP_DCCP is not set
497 +# CONFIG_IP_SCTP is not set
498 +# CONFIG_TIPC is not set
499 +# CONFIG_ATM is not set
503 +# CONFIG_NET_DSA is not set
505 +CONFIG_VLAN_8021Q_GVRP=y
506 +# CONFIG_DECNET is not set
508 +# CONFIG_LLC2 is not set
509 +# CONFIG_IPX is not set
510 +# CONFIG_ATALK is not set
511 +# CONFIG_X25 is not set
512 +# CONFIG_LAPB is not set
513 +# CONFIG_ECONET is not set
514 +# CONFIG_WAN_ROUTER is not set
518 +# Queueing/Scheduling
520 +CONFIG_NET_SCH_CBQ=m
521 +CONFIG_NET_SCH_HTB=m
522 +CONFIG_NET_SCH_HFSC=m
523 +CONFIG_NET_SCH_PRIO=m
524 +# CONFIG_NET_SCH_MULTIQ is not set
525 +CONFIG_NET_SCH_RED=m
526 +CONFIG_NET_SCH_SFQ=m
527 +CONFIG_NET_SCH_TEQL=m
528 +CONFIG_NET_SCH_TBF=m
529 +CONFIG_NET_SCH_GRED=m
530 +CONFIG_NET_SCH_DSMARK=m
531 +CONFIG_NET_SCH_NETEM=m
532 +# CONFIG_NET_SCH_DRR is not set
533 +CONFIG_NET_SCH_INGRESS=m
539 +CONFIG_NET_CLS_BASIC=m
540 +CONFIG_NET_CLS_TCINDEX=m
541 +CONFIG_NET_CLS_ROUTE4=m
542 +CONFIG_NET_CLS_ROUTE=y
544 +CONFIG_NET_CLS_U32=m
545 +# CONFIG_CLS_U32_PERF is not set
546 +CONFIG_CLS_U32_MARK=y
547 +CONFIG_NET_CLS_RSVP=m
548 +CONFIG_NET_CLS_RSVP6=m
549 +# CONFIG_NET_CLS_FLOW is not set
551 +CONFIG_NET_EMATCH_STACK=32
552 +CONFIG_NET_EMATCH_CMP=m
553 +CONFIG_NET_EMATCH_NBYTE=m
554 +CONFIG_NET_EMATCH_U32=m
555 +CONFIG_NET_EMATCH_META=m
556 +CONFIG_NET_EMATCH_TEXT=m
557 +CONFIG_NET_CLS_ACT=y
558 +CONFIG_NET_ACT_POLICE=m
559 +CONFIG_NET_ACT_GACT=m
561 +CONFIG_NET_ACT_MIRRED=m
562 +CONFIG_NET_ACT_NAT=m
563 +CONFIG_NET_ACT_PEDIT=m
564 +CONFIG_NET_ACT_SIMP=m
565 +CONFIG_NET_ACT_SKBEDIT=m
566 +# CONFIG_NET_CLS_IND is not set
567 +CONFIG_NET_SCH_FIFO=y
568 +# CONFIG_DCB is not set
574 +# CONFIG_HAMRADIO is not set
575 +# CONFIG_CAN is not set
576 +# CONFIG_IRDA is not set
581 +CONFIG_BT_RFCOMM_TTY=y
583 +CONFIG_BT_BNEP_MC_FILTER=y
584 +CONFIG_BT_BNEP_PROTO_FILTER=y
588 +# Bluetooth device drivers
590 +CONFIG_BT_HCIBTUSB=y
591 +CONFIG_BT_HCIBTSDIO=y
593 +CONFIG_BT_HCIUART_H4=y
594 +CONFIG_BT_HCIUART_BCSP=y
595 +CONFIG_BT_HCIUART_LL=y
596 +CONFIG_BT_HCIBCM203X=m
597 +CONFIG_BT_HCIBPA10X=m
598 +CONFIG_BT_HCIBFUSB=m
600 +# CONFIG_AF_RXRPC is not set
601 +# CONFIG_PHONET is not set
603 +# CONFIG_WIRELESS is not set
604 +# CONFIG_WIMAX is not set
605 +# CONFIG_RFKILL is not set
606 +# CONFIG_NET_9P is not set
613 +# Generic Driver Options
615 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
617 +CONFIG_PREVENT_FIRMWARE_BUILD=y
619 +# CONFIG_FIRMWARE_IN_KERNEL is not set
620 +CONFIG_EXTRA_FIRMWARE=""
621 +# CONFIG_DEBUG_DRIVER is not set
622 +# CONFIG_DEBUG_DEVRES is not set
623 +# CONFIG_SYS_HYPERVISOR is not set
625 +CONFIG_PROC_EVENTS=y
627 +# CONFIG_MTD_DEBUG is not set
629 +CONFIG_MTD_PARTITIONS=y
630 +# CONFIG_MTD_TESTS is not set
631 +# CONFIG_MTD_REDBOOT_PARTS is not set
632 +CONFIG_MTD_CMDLINE_PARTS=y
633 +# CONFIG_MTD_AFS_PARTS is not set
634 +# CONFIG_MTD_AR7_PARTS is not set
637 +# User Modules And Translation Layers
640 +CONFIG_MTD_BLKDEVS=y
647 +# CONFIG_SSFDC is not set
648 +# CONFIG_MTD_OOPS is not set
651 +# RAM/ROM/Flash chip drivers
654 +CONFIG_MTD_JEDECPROBE=y
655 +CONFIG_MTD_GEN_PROBE=y
656 +# CONFIG_MTD_CFI_ADV_OPTIONS is not set
657 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
658 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
659 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
660 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
661 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
662 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
665 +# CONFIG_MTD_CFI_I4 is not set
666 +# CONFIG_MTD_CFI_I8 is not set
667 +# CONFIG_MTD_CFI_INTELEXT is not set
668 +CONFIG_MTD_CFI_AMDSTD=y
669 +CONFIG_MTD_CFI_STAA=y
670 +CONFIG_MTD_CFI_UTIL=y
673 +# CONFIG_MTD_ABSENT is not set
676 +# Mapping drivers for chip access
678 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
679 +# CONFIG_MTD_PHYSMAP is not set
680 +# CONFIG_MTD_ARM_INTEGRATOR is not set
681 +# CONFIG_MTD_IMPA7 is not set
682 +# CONFIG_MTD_PLATRAM is not set
685 +# Self-contained MTD device drivers
687 +# CONFIG_MTD_DATAFLASH is not set
688 +# CONFIG_MTD_M25P80 is not set
689 +# CONFIG_MTD_SLRAM is not set
690 +# CONFIG_MTD_PHRAM is not set
691 +# CONFIG_MTD_MTDRAM is not set
692 +# CONFIG_MTD_BLOCK2MTD is not set
695 +# Disk-On-Chip Device Drivers
697 +# CONFIG_MTD_DOC2000 is not set
698 +# CONFIG_MTD_DOC2001 is not set
699 +# CONFIG_MTD_DOC2001PLUS is not set
701 +CONFIG_MTD_NAND_VERIFY_WRITE=y
702 +# CONFIG_MTD_NAND_ECC_SMC is not set
703 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
704 +# CONFIG_MTD_NAND_GPIO is not set
705 +CONFIG_MTD_NAND_IDS=y
706 +CONFIG_MTD_NAND_S3C2410=y
707 +# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
708 +# CONFIG_MTD_NAND_S3C2410_HWECC is not set
709 +# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
710 +# CONFIG_MTD_NAND_DISKONCHIP is not set
711 +# CONFIG_MTD_NAND_NANDSIM is not set
712 +CONFIG_MTD_NAND_PLATFORM=y
713 +# CONFIG_MTD_ALAUDA is not set
714 +# CONFIG_MTD_ONENAND is not set
717 +# LPDDR flash memory drivers
720 +CONFIG_MTD_QINFO_PROBE=y
723 +# UBI - Unsorted block images
725 +# CONFIG_MTD_UBI is not set
726 +# CONFIG_PARPORT is not set
728 +# CONFIG_BLK_DEV_COW_COMMON is not set
729 +CONFIG_BLK_DEV_LOOP=y
730 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
731 +CONFIG_BLK_DEV_NBD=y
732 +# CONFIG_BLK_DEV_UB is not set
733 +CONFIG_BLK_DEV_RAM=y
734 +CONFIG_BLK_DEV_RAM_COUNT=16
735 +CONFIG_BLK_DEV_RAM_SIZE=65536
736 +# CONFIG_BLK_DEV_XIP is not set
737 +CONFIG_CDROM_PKTCDVD=m
738 +CONFIG_CDROM_PKTCDVD_BUFFERS=8
739 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set
740 +# CONFIG_ATA_OVER_ETH is not set
741 +CONFIG_MISC_DEVICES=y
742 +# CONFIG_ICS932S401 is not set
743 +# CONFIG_ENCLOSURE_SERVICES is not set
744 +# CONFIG_C2PORT is not set
749 +CONFIG_EEPROM_AT24=y
750 +# CONFIG_EEPROM_AT25 is not set
751 +# CONFIG_EEPROM_LEGACY is not set
752 +CONFIG_EEPROM_93CX6=y
754 +# CONFIG_IDE is not set
757 +# SCSI device support
759 +# CONFIG_RAID_ATTRS is not set
762 +# CONFIG_SCSI_TGT is not set
763 +# CONFIG_SCSI_NETLINK is not set
764 +# CONFIG_SCSI_PROC_FS is not set
767 +# SCSI support type (disk, tape, CD-ROM)
770 +# CONFIG_CHR_DEV_ST is not set
771 +# CONFIG_CHR_DEV_OSST is not set
772 +# CONFIG_BLK_DEV_SR is not set
774 +# CONFIG_CHR_DEV_SCH is not set
777 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
779 +# CONFIG_SCSI_MULTI_LUN is not set
780 +# CONFIG_SCSI_CONSTANTS is not set
781 +# CONFIG_SCSI_LOGGING is not set
782 +# CONFIG_SCSI_SCAN_ASYNC is not set
783 +CONFIG_SCSI_WAIT_SCAN=m
788 +# CONFIG_SCSI_SPI_ATTRS is not set
789 +# CONFIG_SCSI_FC_ATTRS is not set
790 +# CONFIG_SCSI_ISCSI_ATTRS is not set
791 +# CONFIG_SCSI_SAS_LIBSAS is not set
792 +# CONFIG_SCSI_SRP_ATTRS is not set
793 +# CONFIG_SCSI_LOWLEVEL is not set
794 +# CONFIG_SCSI_DH is not set
795 +# CONFIG_ATA is not set
796 +# CONFIG_MD is not set
798 +# CONFIG_IFB is not set
799 +# CONFIG_DUMMY is not set
800 +# CONFIG_BONDING is not set
801 +# CONFIG_MACVLAN is not set
802 +# CONFIG_EQUALIZER is not set
804 +# CONFIG_VETH is not set
805 +# CONFIG_PHYLIB is not set
806 +CONFIG_NET_ETHERNET=y
808 +# CONFIG_AX88796 is not set
809 +# CONFIG_SMC91X is not set
811 +CONFIG_DM9000_DEBUGLEVEL=4
812 +# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
813 +# CONFIG_ENC28J60 is not set
814 +# CONFIG_SMC911X is not set
815 +# CONFIG_SMSC911X is not set
816 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
817 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
818 +# CONFIG_IBM_NEW_EMAC_TAH is not set
819 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
820 +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
821 +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
822 +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
823 +# CONFIG_B44 is not set
824 +# CONFIG_NETDEV_1000 is not set
825 +# CONFIG_NETDEV_10000 is not set
830 +# CONFIG_WLAN_PRE80211 is not set
831 +# CONFIG_WLAN_80211 is not set
832 +# CONFIG_IWLWIFI_LEDS is not set
835 +# Enable WiMAX (Networking options) to see the WiMAX drivers
839 +# USB Network Adapters
841 +# CONFIG_USB_CATC is not set
842 +# CONFIG_USB_KAWETH is not set
843 +# CONFIG_USB_PEGASUS is not set
844 +# CONFIG_USB_RTL8150 is not set
845 +# CONFIG_USB_USBNET is not set
846 +# CONFIG_WAN is not set
847 +# CONFIG_PPP is not set
848 +# CONFIG_SLIP is not set
849 +# CONFIG_NETCONSOLE is not set
850 +# CONFIG_NETPOLL is not set
851 +# CONFIG_NET_POLL_CONTROLLER is not set
852 +# CONFIG_ISDN is not set
855 +# Input device support
858 +CONFIG_INPUT_FF_MEMLESS=y
859 +# CONFIG_INPUT_POLLDEV is not set
862 +# Userland interfaces
864 +CONFIG_INPUT_MOUSEDEV=y
865 +CONFIG_INPUT_MOUSEDEV_PSAUX=y
866 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
867 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
868 +# CONFIG_INPUT_JOYDEV is not set
869 +CONFIG_INPUT_EVDEV=y
870 +CONFIG_INPUT_EVBUG=y
873 +# Input Device Drivers
875 +CONFIG_INPUT_KEYBOARD=y
876 +# CONFIG_KEYBOARD_ATKBD is not set
877 +# CONFIG_KEYBOARD_SUNKBD is not set
878 +# CONFIG_KEYBOARD_LKKBD is not set
879 +# CONFIG_KEYBOARD_XTKBD is not set
880 +# CONFIG_KEYBOARD_NEWTON is not set
881 +# CONFIG_KEYBOARD_STOWAWAY is not set
882 +CONFIG_KEYBOARD_GPIO=y
883 +CONFIG_INPUT_MOUSE=y
885 +CONFIG_MOUSE_PS2_ALPS=y
886 +CONFIG_MOUSE_PS2_LOGIPS2PP=y
887 +CONFIG_MOUSE_PS2_SYNAPTICS=y
888 +CONFIG_MOUSE_PS2_TRACKPOINT=y
889 +# CONFIG_MOUSE_PS2_ELANTECH is not set
890 +# CONFIG_MOUSE_PS2_TOUCHKIT is not set
891 +# CONFIG_MOUSE_SERIAL is not set
892 +# CONFIG_MOUSE_APPLETOUCH is not set
893 +# CONFIG_MOUSE_BCM5974 is not set
894 +# CONFIG_MOUSE_VSXXXAA is not set
895 +# CONFIG_MOUSE_GPIO is not set
896 +# CONFIG_INPUT_JOYSTICK is not set
897 +# CONFIG_INPUT_TABLET is not set
898 +CONFIG_INPUT_TOUCHSCREEN=y
899 +CONFIG_TOUCHSCREEN_FILTER=y
900 +CONFIG_TOUCHSCREEN_FILTER_GROUP=y
901 +CONFIG_TOUCHSCREEN_FILTER_MEDIAN=y
902 +CONFIG_TOUCHSCREEN_FILTER_MEAN=y
903 +CONFIG_TOUCHSCREEN_FILTER_LINEAR=y
904 +# CONFIG_TOUCHSCREEN_ADS7846 is not set
905 +# CONFIG_TOUCHSCREEN_FUJITSU is not set
906 +CONFIG_TOUCHSCREEN_S3C2410=y
907 +# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
908 +# CONFIG_TOUCHSCREEN_GUNZE is not set
909 +# CONFIG_TOUCHSCREEN_ELO is not set
910 +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
911 +# CONFIG_TOUCHSCREEN_MTOUCH is not set
912 +# CONFIG_TOUCHSCREEN_INEXIO is not set
913 +# CONFIG_TOUCHSCREEN_MK712 is not set
914 +# CONFIG_TOUCHSCREEN_PENMOUNT is not set
915 +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
916 +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
917 +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
918 +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
919 +# CONFIG_TOUCHSCREEN_TSC2007 is not set
920 +# CONFIG_INPUT_MISC is not set
923 +# Hardware I/O ports
926 +CONFIG_SERIO_SERPORT=y
927 +CONFIG_SERIO_LIBPS2=y
929 +# CONFIG_GAMEPORT is not set
935 +CONFIG_CONSOLE_TRANSLATIONS=y
938 +CONFIG_VT_HW_CONSOLE_BINDING=y
940 +# CONFIG_SERIAL_NONSTANDARD is not set
945 +# CONFIG_SERIAL_8250 is not set
948 +# Non-8250 serial port support
950 +CONFIG_SERIAL_SAMSUNG=y
951 +CONFIG_SERIAL_SAMSUNG_UARTS=3
952 +CONFIG_SERIAL_SAMSUNG_CONSOLE=y
953 +CONFIG_SERIAL_S3C2440=y
954 +CONFIG_SERIAL_CORE=y
955 +CONFIG_SERIAL_CORE_CONSOLE=y
956 +CONFIG_UNIX98_PTYS=y
957 +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
958 +CONFIG_LEGACY_PTYS=y
959 +CONFIG_LEGACY_PTY_COUNT=128
960 +CONFIG_IPMI_HANDLER=m
961 +# CONFIG_IPMI_PANIC_EVENT is not set
962 +CONFIG_IPMI_DEVICE_INTERFACE=m
964 +CONFIG_IPMI_WATCHDOG=m
965 +CONFIG_IPMI_POWEROFF=m
967 +# CONFIG_R3964 is not set
968 +# CONFIG_RAW_DRIVER is not set
969 +# CONFIG_TCG_TPM is not set
971 +CONFIG_I2C_BOARDINFO=y
972 +CONFIG_I2C_CHARDEV=y
973 +CONFIG_I2C_HELPER_AUTO=y
974 +CONFIG_I2C_ALGOBIT=y
977 +# I2C Hardware Bus support
981 +# I2C system bus drivers (mostly embedded / system-on-chip)
983 +# CONFIG_I2C_GPIO is not set
984 +# CONFIG_I2C_OCORES is not set
985 +CONFIG_I2C_S3C2410=y
989 +# External I2C/SMBus adapter drivers
991 +# CONFIG_I2C_PARPORT_LIGHT is not set
992 +# CONFIG_I2C_TAOS_EVM is not set
993 +# CONFIG_I2C_TINY_USB is not set
996 +# Other I2C/SMBus bus drivers
998 +# CONFIG_I2C_PCA_PLATFORM is not set
999 +# CONFIG_I2C_STUB is not set
1002 +# Miscellaneous I2C Chip support
1004 +# CONFIG_DS1682 is not set
1005 +# CONFIG_SENSORS_PCF8574 is not set
1006 +# CONFIG_PCF8575 is not set
1007 +# CONFIG_SENSORS_PCA9539 is not set
1008 +# CONFIG_SENSORS_PCF8591 is not set
1009 +# CONFIG_SENSORS_MAX6875 is not set
1010 +CONFIG_SENSORS_TSL2550=y
1011 +# CONFIG_I2C_DEBUG_CORE is not set
1012 +# CONFIG_I2C_DEBUG_ALGO is not set
1013 +# CONFIG_I2C_DEBUG_BUS is not set
1014 +# CONFIG_I2C_DEBUG_CHIP is not set
1016 +# CONFIG_SPI_DEBUG is not set
1017 +CONFIG_SPI_MASTER=y
1020 +# SPI Master Controller Drivers
1022 +CONFIG_SPI_BITBANG=y
1023 +# CONFIG_SPI_GPIO is not set
1024 +CONFIG_SPI_S3C24XX=y
1025 +# CONFIG_SPI_S3C24XX_GPIO is not set
1028 +# SPI Protocol Masters
1030 +CONFIG_SPI_SPIDEV=y
1031 +# CONFIG_SPI_TLE62X0 is not set
1032 +CONFIG_ARCH_REQUIRE_GPIOLIB=y
1034 +# CONFIG_DEBUG_GPIO is not set
1035 +CONFIG_GPIO_SYSFS=y
1038 +# Memory mapped GPIO expanders:
1042 +# I2C GPIO expanders:
1044 +# CONFIG_GPIO_MAX732X is not set
1045 +# CONFIG_GPIO_PCA953X is not set
1046 +# CONFIG_GPIO_PCF857X is not set
1049 +# PCI GPIO expanders:
1053 +# SPI GPIO expanders:
1055 +# CONFIG_GPIO_MAX7301 is not set
1056 +# CONFIG_GPIO_MCP23S08 is not set
1057 +# CONFIG_W1 is not set
1058 +# CONFIG_POWER_SUPPLY is not set
1059 +# CONFIG_HWMON is not set
1062 +# CONFIG_WATCHDOG_NOWAYOUT is not set
1065 +# Watchdog Device Drivers
1067 +# CONFIG_SOFT_WATCHDOG is not set
1068 +CONFIG_S3C2410_WATCHDOG=y
1071 +# USB-based Watchdog Cards
1073 +# CONFIG_USBPCWATCHDOG is not set
1074 +CONFIG_SSB_POSSIBLE=y
1077 +# Sonics Silicon Backplane
1079 +# CONFIG_SSB is not set
1082 +# Multifunction device drivers
1084 +# CONFIG_MFD_CORE is not set
1085 +# CONFIG_MFD_SM501 is not set
1086 +# CONFIG_MFD_ASIC3 is not set
1087 +# CONFIG_HTC_EGPIO is not set
1088 +# CONFIG_HTC_PASIC3 is not set
1089 +# CONFIG_TPS65010 is not set
1090 +# CONFIG_TWL4030_CORE is not set
1091 +# CONFIG_MFD_TMIO is not set
1092 +# CONFIG_MFD_T7L66XB is not set
1093 +# CONFIG_MFD_TC6387XB is not set
1094 +# CONFIG_MFD_TC6393XB is not set
1095 +# CONFIG_PMIC_DA903X is not set
1096 +# CONFIG_MFD_WM8400 is not set
1097 +# CONFIG_MFD_WM8350_I2C is not set
1098 +# CONFIG_MFD_PCF50633 is not set
1101 +# Multimedia devices
1105 +# Multimedia core support
1107 +# CONFIG_VIDEO_DEV is not set
1108 +# CONFIG_DVB_CORE is not set
1109 +# CONFIG_VIDEO_MEDIA is not set
1112 +# Multimedia drivers
1114 +# CONFIG_DAB is not set
1119 +# CONFIG_VGASTATE is not set
1120 +CONFIG_VIDEO_OUTPUT_CONTROL=y
1122 +CONFIG_FIRMWARE_EDID=y
1123 +# CONFIG_FB_DDC is not set
1124 +# CONFIG_FB_BOOT_VESA_SUPPORT is not set
1125 +CONFIG_FB_CFB_FILLRECT=y
1126 +CONFIG_FB_CFB_COPYAREA=y
1127 +CONFIG_FB_CFB_IMAGEBLIT=y
1128 +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
1129 +# CONFIG_FB_SYS_FILLRECT is not set
1130 +# CONFIG_FB_SYS_COPYAREA is not set
1131 +# CONFIG_FB_SYS_IMAGEBLIT is not set
1132 +# CONFIG_FB_FOREIGN_ENDIAN is not set
1133 +# CONFIG_FB_SYS_FOPS is not set
1134 +# CONFIG_FB_SVGALIB is not set
1135 +# CONFIG_FB_MACMODES is not set
1136 +# CONFIG_FB_BACKLIGHT is not set
1137 +CONFIG_FB_MODE_HELPERS=y
1138 +CONFIG_FB_TILEBLITTING=y
1141 +# Frame buffer hardware drivers
1143 +# CONFIG_FB_UVESA is not set
1144 +# CONFIG_FB_S1D13XXX is not set
1145 +CONFIG_FB_S3C2410=y
1146 +CONFIG_FB_S3C2410_DEBUG=y
1147 +# CONFIG_FB_VIRTUAL is not set
1148 +# CONFIG_FB_METRONOME is not set
1149 +# CONFIG_FB_MB862XX is not set
1150 +CONFIG_BACKLIGHT_LCD_SUPPORT=y
1151 +CONFIG_LCD_CLASS_DEVICE=y
1152 +# CONFIG_LCD_LTV350QV is not set
1153 +# CONFIG_LCD_ILI9320 is not set
1154 +# CONFIG_LCD_TDO24M is not set
1155 +# CONFIG_LCD_VGG2432A4 is not set
1156 +CONFIG_LCD_PLATFORM=y
1157 +CONFIG_BACKLIGHT_CLASS_DEVICE=y
1158 +# CONFIG_BACKLIGHT_GENERIC is not set
1159 +CONFIG_BACKLIGHT_PWM=y
1162 +# Display device support
1164 +CONFIG_DISPLAY_SUPPORT=y
1167 +# Display hardware drivers
1171 +# Console display driver support
1173 +# CONFIG_VGA_CONSOLE is not set
1174 +CONFIG_DUMMY_CONSOLE=y
1175 +CONFIG_FRAMEBUFFER_CONSOLE=y
1176 +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
1177 +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
1179 +# CONFIG_FONT_8x8 is not set
1180 +# CONFIG_FONT_8x16 is not set
1181 +# CONFIG_FONT_6x11 is not set
1182 +# CONFIG_FONT_7x14 is not set
1183 +# CONFIG_FONT_PEARL_8x8 is not set
1184 +# CONFIG_FONT_ACORN_8x8 is not set
1185 +CONFIG_FONT_MINI_4x6=y
1186 +# CONFIG_FONT_SUN8x16 is not set
1187 +# CONFIG_FONT_SUN12x22 is not set
1188 +# CONFIG_FONT_10x18 is not set
1190 +# CONFIG_LOGO_LINUX_MONO is not set
1191 +# CONFIG_LOGO_LINUX_VGA16 is not set
1192 +# CONFIG_LOGO_LINUX_CLUT224 is not set
1193 +CONFIG_LOGO_ARMWORKS_CLUT224=y
1195 +CONFIG_SOUND_OSS_CORE=y
1200 +CONFIG_SND_RAWMIDI=m
1201 +CONFIG_SND_SEQUENCER=m
1202 +CONFIG_SND_SEQ_DUMMY=m
1203 +CONFIG_SND_OSSEMUL=y
1204 +CONFIG_SND_MIXER_OSS=m
1205 +CONFIG_SND_PCM_OSS=m
1206 +CONFIG_SND_PCM_OSS_PLUGINS=y
1207 +CONFIG_SND_SEQUENCER_OSS=y
1208 +CONFIG_SND_DYNAMIC_MINORS=y
1209 +CONFIG_SND_SUPPORT_OLD_API=y
1210 +CONFIG_SND_VERBOSE_PROCFS=y
1211 +# CONFIG_SND_VERBOSE_PRINTK is not set
1212 +# CONFIG_SND_DEBUG is not set
1213 +CONFIG_SND_MPU401_UART=m
1214 +CONFIG_SND_DRIVERS=y
1216 +CONFIG_SND_VIRMIDI=m
1218 +CONFIG_SND_SERIAL_U16550=m
1219 +CONFIG_SND_MPU401=m
1223 +CONFIG_SND_USB_AUDIO=m
1224 +CONFIG_SND_USB_CAIAQ=m
1225 +CONFIG_SND_USB_CAIAQ_INPUT=y
1227 +CONFIG_SND_S3C24XX_SOC=y
1228 +CONFIG_SND_S3C24XX_SOC_I2S=y
1229 +# CONFIG_SND_S3C24XX_SOC_LN2440SBC_ALC650 is not set
1230 +CONFIG_SND_S3C24XX_SOC_S3C24XX_UDA134X=y
1231 +CONFIG_SND_SOC_I2C_AND_SPI=y
1232 +# CONFIG_SND_SOC_ALL_CODECS is not set
1233 +CONFIG_SND_SOC_L3=y
1234 +CONFIG_SND_SOC_UDA134X=y
1235 +# CONFIG_SOUND_PRIME is not set
1236 +CONFIG_HID_SUPPORT=y
1238 +# CONFIG_HID_DEBUG is not set
1242 +# USB Input Devices
1246 +CONFIG_USB_HIDDEV=y
1249 +# Special HID drivers
1251 +CONFIG_HID_COMPAT=y
1252 +CONFIG_HID_A4TECH=y
1254 +CONFIG_HID_BELKIN=y
1255 +CONFIG_HID_CHERRY=y
1256 +CONFIG_HID_CHICONY=y
1257 +CONFIG_HID_CYPRESS=y
1259 +CONFIG_HID_GYRATION=y
1260 +CONFIG_HID_LOGITECH=y
1261 +# CONFIG_LOGITECH_FF is not set
1262 +# CONFIG_LOGIRUMBLEPAD2_FF is not set
1263 +CONFIG_HID_MICROSOFT=y
1264 +CONFIG_HID_MONTEREY=y
1266 +CONFIG_HID_PANTHERLORD=y
1267 +# CONFIG_PANTHERLORD_FF is not set
1268 +CONFIG_HID_PETALYNX=y
1269 +CONFIG_HID_SAMSUNG=y
1271 +CONFIG_HID_SUNPLUS=y
1272 +# CONFIG_GREENASIA_FF is not set
1273 +CONFIG_HID_TOPSEED=y
1274 +# CONFIG_THRUSTMASTER_FF is not set
1275 +# CONFIG_ZEROPLUS_FF is not set
1276 +CONFIG_USB_SUPPORT=y
1277 +CONFIG_USB_ARCH_HAS_HCD=y
1278 +CONFIG_USB_ARCH_HAS_OHCI=y
1279 +# CONFIG_USB_ARCH_HAS_EHCI is not set
1281 +# CONFIG_USB_DEBUG is not set
1282 +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
1285 +# Miscellaneous USB options
1287 +CONFIG_USB_DEVICEFS=y
1288 +# CONFIG_USB_DEVICE_CLASS is not set
1289 +# CONFIG_USB_DYNAMIC_MINORS is not set
1290 +# CONFIG_USB_SUSPEND is not set
1291 +# CONFIG_USB_OTG is not set
1292 +# CONFIG_USB_MON is not set
1293 +# CONFIG_USB_WUSB is not set
1294 +# CONFIG_USB_WUSB_CBAF is not set
1297 +# USB Host Controller Drivers
1299 +# CONFIG_USB_C67X00_HCD is not set
1300 +# CONFIG_USB_OXU210HP_HCD is not set
1301 +# CONFIG_USB_ISP116X_HCD is not set
1302 +CONFIG_USB_OHCI_HCD=y
1303 +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
1304 +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
1305 +CONFIG_USB_OHCI_LITTLE_ENDIAN=y
1306 +# CONFIG_USB_SL811_HCD is not set
1307 +# CONFIG_USB_R8A66597_HCD is not set
1308 +# CONFIG_USB_HWA_HCD is not set
1309 +# CONFIG_USB_MUSB_HDRC is not set
1310 +# CONFIG_USB_GADGET_MUSB_HDRC is not set
1313 +# USB Device Class drivers
1316 +# CONFIG_USB_PRINTER is not set
1318 +# CONFIG_USB_TMC is not set
1321 +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
1325 +# see USB_STORAGE Help for more information
1327 +CONFIG_USB_STORAGE=y
1328 +# CONFIG_USB_STORAGE_DEBUG is not set
1329 +CONFIG_USB_STORAGE_DATAFAB=y
1330 +# CONFIG_USB_STORAGE_FREECOM is not set
1331 +CONFIG_USB_STORAGE_ISD200=y
1332 +CONFIG_USB_STORAGE_USBAT=y
1333 +CONFIG_USB_STORAGE_SDDR09=y
1334 +CONFIG_USB_STORAGE_SDDR55=y
1335 +CONFIG_USB_STORAGE_JUMPSHOT=y
1336 +CONFIG_USB_STORAGE_ALAUDA=y
1337 +# CONFIG_USB_STORAGE_ONETOUCH is not set
1338 +# CONFIG_USB_STORAGE_KARMA is not set
1339 +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
1340 +CONFIG_USB_LIBUSUAL=y
1343 +# USB Imaging devices
1345 +# CONFIG_USB_MDC800 is not set
1346 +# CONFIG_USB_MICROTEK is not set
1351 +# CONFIG_USB_SERIAL is not set
1354 +# USB Miscellaneous drivers
1356 +# CONFIG_USB_EMI62 is not set
1357 +# CONFIG_USB_EMI26 is not set
1358 +# CONFIG_USB_ADUTUX is not set
1359 +# CONFIG_USB_SEVSEG is not set
1360 +# CONFIG_USB_RIO500 is not set
1361 +# CONFIG_USB_LEGOTOWER is not set
1362 +# CONFIG_USB_LCD is not set
1363 +# CONFIG_USB_BERRY_CHARGE is not set
1364 +# CONFIG_USB_LED is not set
1365 +# CONFIG_USB_CYPRESS_CY7C63 is not set
1366 +# CONFIG_USB_CYTHERM is not set
1367 +# CONFIG_USB_PHIDGET is not set
1368 +# CONFIG_USB_IDMOUSE is not set
1369 +# CONFIG_USB_FTDI_ELAN is not set
1370 +# CONFIG_USB_APPLEDISPLAY is not set
1371 +# CONFIG_USB_LD is not set
1372 +# CONFIG_USB_TRANCEVIBRATOR is not set
1373 +# CONFIG_USB_IOWARRIOR is not set
1374 +# CONFIG_USB_TEST is not set
1375 +# CONFIG_USB_ISIGHTFW is not set
1376 +# CONFIG_USB_VST is not set
1377 +CONFIG_USB_GADGET=y
1378 +# CONFIG_USB_GADGET_DEBUG is not set
1379 +# CONFIG_USB_GADGET_DEBUG_FILES is not set
1380 +# CONFIG_USB_GADGET_DEBUG_FS is not set
1381 +CONFIG_USB_GADGET_VBUS_DRAW=2
1382 +CONFIG_USB_GADGET_SELECTED=y
1383 +# CONFIG_USB_GADGET_AT91 is not set
1384 +# CONFIG_USB_GADGET_ATMEL_USBA is not set
1385 +# CONFIG_USB_GADGET_FSL_USB2 is not set
1386 +# CONFIG_USB_GADGET_LH7A40X is not set
1387 +# CONFIG_USB_GADGET_OMAP is not set
1388 +# CONFIG_USB_GADGET_PXA25X is not set
1389 +# CONFIG_USB_GADGET_PXA27X is not set
1390 +CONFIG_USB_GADGET_S3C2410=y
1391 +CONFIG_USB_S3C2410=y
1392 +# CONFIG_USB_S3C2410_DEBUG is not set
1393 +# CONFIG_USB_GADGET_IMX is not set
1394 +# CONFIG_USB_GADGET_M66592 is not set
1395 +# CONFIG_USB_GADGET_AMD5536UDC is not set
1396 +# CONFIG_USB_GADGET_FSL_QE is not set
1397 +# CONFIG_USB_GADGET_CI13XXX is not set
1398 +# CONFIG_USB_GADGET_NET2280 is not set
1399 +# CONFIG_USB_GADGET_GOKU is not set
1400 +# CONFIG_USB_GADGET_DUMMY_HCD is not set
1401 +# CONFIG_USB_GADGET_DUALSPEED is not set
1404 +CONFIG_USB_ETH_RNDIS=y
1405 +CONFIG_USB_GADGETFS=m
1406 +CONFIG_USB_FILE_STORAGE=m
1407 +# CONFIG_USB_FILE_STORAGE_TEST is not set
1408 +CONFIG_USB_G_SERIAL=m
1409 +# CONFIG_USB_MIDI_GADGET is not set
1410 +# CONFIG_USB_G_PRINTER is not set
1411 +CONFIG_USB_CDC_COMPOSITE=m
1414 +# OTG and related infrastructure
1416 +# CONFIG_USB_GPIO_VBUS is not set
1418 +# CONFIG_MMC_DEBUG is not set
1419 +# CONFIG_MMC_UNSAFE_RESUME is not set
1422 +# MMC/SD/SDIO Card Drivers
1425 +CONFIG_MMC_BLOCK_BOUNCE=y
1427 +# CONFIG_MMC_TEST is not set
1430 +# MMC/SD/SDIO Host Controller Drivers
1432 +# CONFIG_MMC_SDHCI is not set
1433 +# CONFIG_MMC_SPI is not set
1435 +# CONFIG_MEMSTICK is not set
1436 +# CONFIG_ACCESSIBILITY is not set
1438 +CONFIG_LEDS_CLASS=y
1443 +CONFIG_LEDS_S3C24XX=y
1444 +# CONFIG_LEDS_PCA9532 is not set
1446 +# CONFIG_LEDS_PCA955X is not set
1451 +CONFIG_LEDS_TRIGGERS=y
1452 +CONFIG_LEDS_TRIGGER_TIMER=y
1453 +CONFIG_LEDS_TRIGGER_HEARTBEAT=y
1454 +CONFIG_LEDS_TRIGGER_BACKLIGHT=y
1455 +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
1458 +CONFIG_RTC_HCTOSYS=y
1459 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
1460 +# CONFIG_RTC_DEBUG is not set
1465 +CONFIG_RTC_INTF_SYSFS=y
1466 +CONFIG_RTC_INTF_PROC=y
1467 +CONFIG_RTC_INTF_DEV=y
1468 +CONFIG_RTC_INTF_DEV_UIE_EMUL=y
1469 +# CONFIG_RTC_DRV_TEST is not set
1474 +# CONFIG_RTC_DRV_DS1307 is not set
1475 +# CONFIG_RTC_DRV_DS1374 is not set
1476 +# CONFIG_RTC_DRV_DS1672 is not set
1477 +# CONFIG_RTC_DRV_MAX6900 is not set
1478 +# CONFIG_RTC_DRV_RS5C372 is not set
1479 +# CONFIG_RTC_DRV_ISL1208 is not set
1480 +# CONFIG_RTC_DRV_X1205 is not set
1481 +# CONFIG_RTC_DRV_PCF8563 is not set
1482 +# CONFIG_RTC_DRV_PCF8583 is not set
1483 +# CONFIG_RTC_DRV_M41T80 is not set
1484 +# CONFIG_RTC_DRV_S35390A is not set
1485 +# CONFIG_RTC_DRV_FM3130 is not set
1486 +# CONFIG_RTC_DRV_RX8581 is not set
1491 +# CONFIG_RTC_DRV_M41T94 is not set
1492 +# CONFIG_RTC_DRV_DS1305 is not set
1493 +# CONFIG_RTC_DRV_DS1390 is not set
1494 +# CONFIG_RTC_DRV_MAX6902 is not set
1495 +# CONFIG_RTC_DRV_R9701 is not set
1496 +# CONFIG_RTC_DRV_RS5C348 is not set
1497 +# CONFIG_RTC_DRV_DS3234 is not set
1500 +# Platform RTC drivers
1502 +# CONFIG_RTC_DRV_CMOS is not set
1503 +# CONFIG_RTC_DRV_DS1286 is not set
1504 +# CONFIG_RTC_DRV_DS1511 is not set
1505 +# CONFIG_RTC_DRV_DS1553 is not set
1506 +# CONFIG_RTC_DRV_DS1742 is not set
1507 +# CONFIG_RTC_DRV_STK17TA8 is not set
1508 +# CONFIG_RTC_DRV_M48T86 is not set
1509 +# CONFIG_RTC_DRV_M48T35 is not set
1510 +# CONFIG_RTC_DRV_M48T59 is not set
1511 +# CONFIG_RTC_DRV_BQ4802 is not set
1512 +# CONFIG_RTC_DRV_V3020 is not set
1515 +# on-CPU RTC drivers
1517 +CONFIG_RTC_DRV_S3C=y
1518 +CONFIG_DMADEVICES=y
1523 +# CONFIG_REGULATOR is not set
1524 +# CONFIG_UIO is not set
1525 +# CONFIG_STAGING is not set
1531 +CONFIG_EXT2_FS_XATTR=y
1532 +CONFIG_EXT2_FS_POSIX_ACL=y
1533 +CONFIG_EXT2_FS_SECURITY=y
1534 +# CONFIG_EXT2_FS_XIP is not set
1536 +CONFIG_EXT3_FS_XATTR=y
1537 +CONFIG_EXT3_FS_POSIX_ACL=y
1538 +CONFIG_EXT3_FS_SECURITY=y
1539 +# CONFIG_EXT4_FS is not set
1541 +# CONFIG_JBD_DEBUG is not set
1542 +CONFIG_FS_MBCACHE=y
1543 +# CONFIG_REISERFS_FS is not set
1544 +# CONFIG_JFS_FS is not set
1545 +CONFIG_FS_POSIX_ACL=y
1546 +CONFIG_FILE_LOCKING=y
1547 +# CONFIG_XFS_FS is not set
1548 +# CONFIG_GFS2_FS is not set
1549 +# CONFIG_OCFS2_FS is not set
1550 +# CONFIG_BTRFS_FS is not set
1553 +CONFIG_INOTIFY_USER=y
1554 +# CONFIG_QUOTA is not set
1556 +CONFIG_AUTOFS4_FS=y
1557 +# CONFIG_FUSE_FS is not set
1558 +CONFIG_GENERIC_ACL=y
1561 +# CD-ROM/DVD Filesystems
1563 +# CONFIG_ISO9660_FS is not set
1564 +# CONFIG_UDF_FS is not set
1567 +# DOS/FAT/NT Filesystems
1572 +CONFIG_FAT_DEFAULT_CODEPAGE=437
1573 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
1574 +# CONFIG_NTFS_FS is not set
1577 +# Pseudo filesystems
1580 +CONFIG_PROC_SYSCTL=y
1581 +CONFIG_PROC_PAGE_MONITOR=y
1584 +CONFIG_TMPFS_POSIX_ACL=y
1585 +# CONFIG_HUGETLB_PAGE is not set
1586 +CONFIG_CONFIGFS_FS=m
1587 +CONFIG_MISC_FILESYSTEMS=y
1588 +# CONFIG_ADFS_FS is not set
1589 +# CONFIG_AFFS_FS is not set
1590 +# CONFIG_ECRYPT_FS is not set
1591 +# CONFIG_HFS_FS is not set
1592 +# CONFIG_HFSPLUS_FS is not set
1593 +# CONFIG_BEFS_FS is not set
1594 +# CONFIG_BFS_FS is not set
1595 +# CONFIG_EFS_FS is not set
1597 +CONFIG_JFFS2_FS_DEBUG=0
1598 +CONFIG_JFFS2_FS_WRITEBUFFER=y
1599 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
1600 +# CONFIG_JFFS2_SUMMARY is not set
1601 +# CONFIG_JFFS2_FS_XATTR is not set
1602 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
1603 +CONFIG_JFFS2_ZLIB=y
1604 +# CONFIG_JFFS2_LZO is not set
1605 +CONFIG_JFFS2_RTIME=y
1606 +# CONFIG_JFFS2_RUBIN is not set
1608 +# CONFIG_SQUASHFS is not set
1609 +# CONFIG_VXFS_FS is not set
1610 +# CONFIG_MINIX_FS is not set
1611 +# CONFIG_OMFS_FS is not set
1612 +# CONFIG_HPFS_FS is not set
1613 +# CONFIG_QNX4FS_FS is not set
1615 +# CONFIG_SYSV_FS is not set
1616 +# CONFIG_UFS_FS is not set
1617 +CONFIG_NETWORK_FILESYSTEMS=y
1620 +CONFIG_NFS_V3_ACL=y
1623 +# CONFIG_NFSD is not set
1626 +CONFIG_NFS_ACL_SUPPORT=y
1627 +CONFIG_NFS_COMMON=y
1629 +CONFIG_SUNRPC_GSS=y
1630 +# CONFIG_SUNRPC_REGISTER_V4 is not set
1631 +CONFIG_RPCSEC_GSS_KRB5=y
1632 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
1633 +# CONFIG_SMB_FS is not set
1634 +# CONFIG_CIFS is not set
1635 +# CONFIG_NCP_FS is not set
1636 +# CONFIG_CODA_FS is not set
1637 +# CONFIG_AFS_FS is not set
1642 +CONFIG_PARTITION_ADVANCED=y
1643 +# CONFIG_ACORN_PARTITION is not set
1644 +# CONFIG_OSF_PARTITION is not set
1645 +# CONFIG_AMIGA_PARTITION is not set
1646 +# CONFIG_ATARI_PARTITION is not set
1647 +# CONFIG_MAC_PARTITION is not set
1648 +CONFIG_MSDOS_PARTITION=y
1649 +CONFIG_BSD_DISKLABEL=y
1650 +CONFIG_MINIX_SUBPARTITION=y
1651 +CONFIG_SOLARIS_X86_PARTITION=y
1652 +CONFIG_UNIXWARE_DISKLABEL=y
1653 +CONFIG_LDM_PARTITION=y
1654 +# CONFIG_LDM_DEBUG is not set
1655 +# CONFIG_SGI_PARTITION is not set
1656 +# CONFIG_ULTRIX_PARTITION is not set
1657 +# CONFIG_SUN_PARTITION is not set
1658 +# CONFIG_KARMA_PARTITION is not set
1659 +CONFIG_EFI_PARTITION=y
1660 +# CONFIG_SYSV68_PARTITION is not set
1662 +CONFIG_NLS_DEFAULT="cp437"
1663 +CONFIG_NLS_CODEPAGE_437=m
1664 +CONFIG_NLS_CODEPAGE_737=m
1665 +CONFIG_NLS_CODEPAGE_775=m
1666 +CONFIG_NLS_CODEPAGE_850=m
1667 +CONFIG_NLS_CODEPAGE_852=m
1668 +CONFIG_NLS_CODEPAGE_855=m
1669 +CONFIG_NLS_CODEPAGE_857=m
1670 +CONFIG_NLS_CODEPAGE_860=m
1671 +CONFIG_NLS_CODEPAGE_861=m
1672 +CONFIG_NLS_CODEPAGE_862=m
1673 +CONFIG_NLS_CODEPAGE_863=m
1674 +CONFIG_NLS_CODEPAGE_864=m
1675 +CONFIG_NLS_CODEPAGE_865=m
1676 +CONFIG_NLS_CODEPAGE_866=m
1677 +CONFIG_NLS_CODEPAGE_869=m
1678 +CONFIG_NLS_CODEPAGE_936=m
1679 +CONFIG_NLS_CODEPAGE_950=m
1680 +CONFIG_NLS_CODEPAGE_932=m
1681 +CONFIG_NLS_CODEPAGE_949=m
1682 +CONFIG_NLS_CODEPAGE_874=m
1683 +CONFIG_NLS_ISO8859_8=m
1684 +CONFIG_NLS_CODEPAGE_1250=m
1685 +CONFIG_NLS_CODEPAGE_1251=m
1687 +CONFIG_NLS_ISO8859_1=m
1688 +CONFIG_NLS_ISO8859_2=m
1689 +CONFIG_NLS_ISO8859_3=m
1690 +CONFIG_NLS_ISO8859_4=m
1691 +CONFIG_NLS_ISO8859_5=m
1692 +CONFIG_NLS_ISO8859_6=m
1693 +CONFIG_NLS_ISO8859_7=m
1694 +CONFIG_NLS_ISO8859_9=m
1695 +CONFIG_NLS_ISO8859_13=m
1696 +CONFIG_NLS_ISO8859_14=m
1697 +CONFIG_NLS_ISO8859_15=m
1698 +CONFIG_NLS_KOI8_R=m
1699 +CONFIG_NLS_KOI8_U=m
1701 +# CONFIG_DLM is not set
1706 +# CONFIG_PRINTK_TIME is not set
1707 +# CONFIG_ENABLE_WARN_DEPRECATED is not set
1708 +# CONFIG_ENABLE_MUST_CHECK is not set
1709 +CONFIG_FRAME_WARN=1024
1710 +# CONFIG_MAGIC_SYSRQ is not set
1711 +# CONFIG_UNUSED_SYMBOLS is not set
1713 +# CONFIG_HEADERS_CHECK is not set
1714 +CONFIG_DEBUG_KERNEL=y
1715 +# CONFIG_DEBUG_SHIRQ is not set
1716 +CONFIG_DETECT_SOFTLOCKUP=y
1717 +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
1718 +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
1719 +# CONFIG_SCHED_DEBUG is not set
1720 +# CONFIG_SCHEDSTATS is not set
1721 +# CONFIG_TIMER_STATS is not set
1722 +# CONFIG_DEBUG_OBJECTS is not set
1723 +# CONFIG_SLUB_DEBUG_ON is not set
1724 +# CONFIG_SLUB_STATS is not set
1725 +CONFIG_DEBUG_PREEMPT=y
1726 +# CONFIG_DEBUG_RT_MUTEXES is not set
1727 +# CONFIG_RT_MUTEX_TESTER is not set
1728 +# CONFIG_DEBUG_SPINLOCK is not set
1729 +# CONFIG_DEBUG_MUTEXES is not set
1730 +# CONFIG_DEBUG_LOCK_ALLOC is not set
1731 +# CONFIG_PROVE_LOCKING is not set
1732 +# CONFIG_LOCK_STAT is not set
1733 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
1734 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
1735 +# CONFIG_DEBUG_KOBJECT is not set
1736 +CONFIG_DEBUG_BUGVERBOSE=y
1737 +CONFIG_DEBUG_INFO=y
1738 +# CONFIG_DEBUG_VM is not set
1739 +# CONFIG_DEBUG_WRITECOUNT is not set
1740 +CONFIG_DEBUG_MEMORY_INIT=y
1741 +# CONFIG_DEBUG_LIST is not set
1742 +# CONFIG_DEBUG_SG is not set
1743 +# CONFIG_DEBUG_NOTIFIERS is not set
1744 +CONFIG_FRAME_POINTER=y
1745 +# CONFIG_BOOT_PRINTK_DELAY is not set
1746 +# CONFIG_RCU_TORTURE_TEST is not set
1747 +# CONFIG_RCU_CPU_STALL_DETECTOR is not set
1748 +# CONFIG_BACKTRACE_SELF_TEST is not set
1749 +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
1750 +# CONFIG_FAULT_INJECTION is not set
1751 +# CONFIG_LATENCYTOP is not set
1752 +CONFIG_SYSCTL_SYSCALL_CHECK=y
1753 +CONFIG_HAVE_FUNCTION_TRACER=y
1758 +# CONFIG_FUNCTION_TRACER is not set
1759 +# CONFIG_SCHED_TRACER is not set
1760 +# CONFIG_CONTEXT_SWITCH_TRACER is not set
1761 +# CONFIG_BOOT_TRACER is not set
1762 +# CONFIG_TRACE_BRANCH_PROFILING is not set
1763 +# CONFIG_STACK_TRACER is not set
1764 +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
1765 +# CONFIG_SAMPLES is not set
1766 +CONFIG_HAVE_ARCH_KGDB=y
1767 +# CONFIG_KGDB is not set
1768 +CONFIG_DEBUG_USER=y
1769 +# CONFIG_DEBUG_ERRORS is not set
1770 +# CONFIG_DEBUG_STACK_USAGE is not set
1771 +# CONFIG_DEBUG_LL is not set
1772 +CONFIG_DEBUG_S3C_UART=0
1778 +# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
1779 +# CONFIG_SECURITY is not set
1780 +# CONFIG_SECURITYFS is not set
1781 +CONFIG_SECURITY_FILE_CAPABILITIES=y
1785 +# Crypto core or helper
1787 +CONFIG_CRYPTO_FIPS=y
1788 +CONFIG_CRYPTO_ALGAPI=y
1789 +CONFIG_CRYPTO_ALGAPI2=y
1790 +CONFIG_CRYPTO_AEAD=m
1791 +CONFIG_CRYPTO_AEAD2=y
1792 +CONFIG_CRYPTO_BLKCIPHER=y
1793 +CONFIG_CRYPTO_BLKCIPHER2=y
1794 +CONFIG_CRYPTO_HASH=y
1795 +CONFIG_CRYPTO_HASH2=y
1796 +CONFIG_CRYPTO_RNG=m
1797 +CONFIG_CRYPTO_RNG2=y
1798 +CONFIG_CRYPTO_MANAGER=y
1799 +CONFIG_CRYPTO_MANAGER2=y
1800 +CONFIG_CRYPTO_GF128MUL=m
1801 +CONFIG_CRYPTO_NULL=m
1802 +CONFIG_CRYPTO_CRYPTD=m
1803 +CONFIG_CRYPTO_AUTHENC=m
1804 +CONFIG_CRYPTO_TEST=m
1807 +# Authenticated Encryption with Associated Data
1809 +CONFIG_CRYPTO_CCM=m
1810 +CONFIG_CRYPTO_GCM=m
1811 +CONFIG_CRYPTO_SEQIV=m
1816 +CONFIG_CRYPTO_CBC=y
1817 +CONFIG_CRYPTO_CTR=m
1818 +CONFIG_CRYPTO_CTS=m
1819 +CONFIG_CRYPTO_ECB=m
1820 +CONFIG_CRYPTO_LRW=m
1821 +CONFIG_CRYPTO_PCBC=m
1822 +CONFIG_CRYPTO_XTS=m
1827 +CONFIG_CRYPTO_HMAC=y
1828 +CONFIG_CRYPTO_XCBC=m
1833 +CONFIG_CRYPTO_CRC32C=m
1834 +CONFIG_CRYPTO_MD4=m
1835 +CONFIG_CRYPTO_MD5=y
1836 +CONFIG_CRYPTO_MICHAEL_MIC=m
1837 +CONFIG_CRYPTO_RMD128=m
1838 +CONFIG_CRYPTO_RMD160=m
1839 +CONFIG_CRYPTO_RMD256=m
1840 +CONFIG_CRYPTO_RMD320=m
1841 +CONFIG_CRYPTO_SHA1=m
1842 +CONFIG_CRYPTO_SHA256=m
1843 +CONFIG_CRYPTO_SHA512=m
1844 +CONFIG_CRYPTO_TGR192=m
1845 +CONFIG_CRYPTO_WP512=m
1850 +CONFIG_CRYPTO_AES=m
1851 +CONFIG_CRYPTO_ANUBIS=m
1852 +CONFIG_CRYPTO_ARC4=m
1853 +CONFIG_CRYPTO_BLOWFISH=m
1854 +CONFIG_CRYPTO_CAMELLIA=m
1855 +CONFIG_CRYPTO_CAST5=m
1856 +CONFIG_CRYPTO_CAST6=m
1857 +CONFIG_CRYPTO_DES=y
1858 +CONFIG_CRYPTO_FCRYPT=m
1859 +CONFIG_CRYPTO_KHAZAD=m
1860 +CONFIG_CRYPTO_SALSA20=m
1861 +CONFIG_CRYPTO_SEED=m
1862 +CONFIG_CRYPTO_SERPENT=m
1863 +CONFIG_CRYPTO_TEA=m
1864 +CONFIG_CRYPTO_TWOFISH=m
1865 +CONFIG_CRYPTO_TWOFISH_COMMON=m
1870 +CONFIG_CRYPTO_DEFLATE=m
1871 +CONFIG_CRYPTO_LZO=m
1874 +# Random Number Generation
1876 +CONFIG_CRYPTO_ANSI_CPRNG=m
1882 +CONFIG_BITREVERSE=y
1883 +CONFIG_GENERIC_FIND_LAST_BIT=y
1886 +CONFIG_CRC_T10DIF=y
1891 +CONFIG_ZLIB_INFLATE=y
1892 +CONFIG_ZLIB_DEFLATE=y
1893 +CONFIG_LZO_COMPRESS=m
1894 +CONFIG_LZO_DECOMPRESS=m
1895 +CONFIG_TEXTSEARCH=y
1896 +CONFIG_TEXTSEARCH_KMP=m
1897 +CONFIG_TEXTSEARCH_BM=m
1898 +CONFIG_TEXTSEARCH_FSM=m
1902 diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h
1903 index a58378c..ce3b36e 100644
1904 --- a/arch/arm/include/asm/elf.h
1905 +++ b/arch/arm/include/asm/elf.h
1906 @@ -50,6 +50,7 @@ typedef struct user_fp elf_fpregset_t;
1907 #define R_ARM_ABS32 2
1908 #define R_ARM_CALL 28
1909 #define R_ARM_JUMP24 29
1910 +#define R_ARM_V4BX 40
1913 * These are used to set parameters in the core dumps.
1914 diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
1915 index dab48f2..fa03392 100644
1916 --- a/arch/arm/kernel/module.c
1917 +++ b/arch/arm/kernel/module.c
1918 @@ -132,6 +132,13 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
1919 *(u32 *)loc |= offset & 0x00ffffff;
1922 +#ifdef CONFIG_CPU_ARM920T
1923 + /* modern toolchain generate V4BX for the modules, and there is no
1924 + * way to skip them being generated in the .ko, so in our case, we just
1925 + * can ignore them */
1926 + case R_ARM_V4BX: /* Ignore these sections */
1930 printk(KERN_ERR "%s: unknown relocation: %u\n",
1931 module->name, ELF32_R_TYPE(rel->r_info));
1932 diff --git a/arch/arm/mach-s3c2410/include/mach/ts.h b/arch/arm/mach-s3c2410/include/mach/ts.h
1933 new file mode 100644
1934 index 0000000..1b451ea
1936 +++ b/arch/arm/mach-s3c2410/include/mach/ts.h
1938 +/* arch/arm/mach-s3c2410/include/mach/ts.h
1940 + * Copyright (c) 2005 Arnaud Patard <arnaud.patard@rtp-net.org>
1943 + * This program is free software; you can redistribute it and/or modify
1944 + * it under the terms of the GNU General Public License version 2 as
1945 + * published by the Free Software Foundation.
1949 + * 24-Mar-2005 RTP Created file
1950 + * 03-Aug-2005 RTP Renamed to ts.h
1953 +#ifndef __ASM_ARM_TS_H
1954 +#define __ASM_ARM_TS_H
1956 +#include <../drivers/input/touchscreen/ts_filter.h>
1958 +struct s3c2410_ts_mach_info {
1961 + /* array of pointers to filter APIs we want to use, in order
1962 + * ends on first NULL, all NULL is OK
1964 + struct ts_filter_api *filter_sequence[MAX_TS_FILTER_CHAIN];
1965 + /* array of configuration ints, one for each filter above */
1966 + void *filter_config[MAX_TS_FILTER_CHAIN];
1969 +void set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info);
1971 +#endif /* __ASM_ARM_TS_H */
1973 diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig
1974 index cde5ae9..7953c22 100644
1975 --- a/arch/arm/mach-s3c2440/Kconfig
1976 +++ b/arch/arm/mach-s3c2440/Kconfig
1977 @@ -79,5 +79,15 @@ config MACH_AT2440EVB
1979 Say Y here if you are using the AT2440EVB development board
1981 +config MACH_MINI2440
1982 + bool "MINI2440 development board"
1983 + select CPU_S3C2440
1984 + select EEPROM_AT24
1985 + select BACKLIGHT_PWM
1986 + select SND_S3C24XX_SOC_S3C24XX_UDA134X
1988 + Say Y here to select support for the MINI2440. Is a 10cm x 10cm board
1989 + available via various sources. It can come with a 3.5" or 7" touch LCD.
1993 diff --git a/arch/arm/mach-s3c2440/Makefile b/arch/arm/mach-s3c2440/Makefile
1994 index 0b4440e..bfadcf6 100644
1995 --- a/arch/arm/mach-s3c2440/Makefile
1996 +++ b/arch/arm/mach-s3c2440/Makefile
1997 @@ -22,3 +22,4 @@ obj-$(CONFIG_MACH_RX3715) += mach-rx3715.o
1998 obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o
1999 obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
2000 obj-$(CONFIG_MACH_AT2440EVB) += mach-at2440evb.o
2001 +obj-$(CONFIG_MACH_MINI2440) += mach-mini2440.o
2002 diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c
2003 new file mode 100644
2004 index 0000000..5ff1457
2006 +++ b/arch/arm/mach-s3c2440/mach-mini2440.c
2008 +/* linux/arch/arm/mach-s3c2440/mach-mini2440.c
2010 + * Copyright (c) 2008 Ramax Lo <ramaxlo@gmail.com>
2011 + * Based on mach-anubis.c by Ben Dooks <ben@simtec.co.uk>
2012 + * and modifications by SBZ <sbz@spgui.org> and
2013 + * Weibing <http://weibing.blogbus.com>
2014 + * Michel Pollet <buserror@gmail.com>
2016 + * For product information, visit http://www.arm9e.com/
2018 + * This program is free software; you can redistribute it and/or modify
2019 + * it under the terms of the GNU General Public License version 2 as
2020 + * published by the Free Software Foundation.
2023 +#include <linux/kernel.h>
2024 +#include <linux/types.h>
2025 +#include <linux/interrupt.h>
2026 +#include <linux/list.h>
2027 +#include <linux/timer.h>
2028 +#include <linux/init.h>
2029 +#include <linux/io.h>
2030 +#include <linux/serial_core.h>
2031 +#include <linux/dm9000.h>
2032 +#include <linux/i2c/at24.h>
2033 +#include <linux/platform_device.h>
2034 +#include <linux/gpio_keys.h>
2035 +#include <linux/i2c.h>
2036 +#include <linux/mmc/host.h>
2037 +#include <linux/pwm_backlight.h>
2039 +#include <asm/mach/arch.h>
2040 +#include <asm/mach/map.h>
2042 +#include <mach/hardware.h>
2043 +#include <mach/fb.h>
2044 +#include <asm/mach-types.h>
2046 +#include <plat/regs-serial.h>
2047 +#include <mach/regs-gpio.h>
2048 +#include <mach/leds-gpio.h>
2049 +#include <mach/regs-mem.h>
2050 +#include <mach/regs-lcd.h>
2051 +#include <plat/nand.h>
2052 +#include <plat/iic.h>
2053 +#include <plat/mci.h>
2054 +#include <mach/ts.h>
2055 +#include <mach/irqs.h>
2057 +#include <plat/regs-serial.h>
2058 +#include <mach/regs-gpio.h>
2059 +#include <mach/regs-mem.h>
2060 +#include <mach/regs-lcd.h>
2062 +#include <linux/mtd/mtd.h>
2063 +#include <linux/mtd/nand.h>
2064 +#include <linux/mtd/nand_ecc.h>
2065 +#include <linux/mtd/partitions.h>
2067 +#include <plat/clock.h>
2068 +#include <plat/devs.h>
2069 +#include <plat/cpu.h>
2071 +#include <sound/s3c24xx_uda134x.h>
2073 +#ifdef CONFIG_TOUCHSCREEN_FILTER
2074 +#include <../drivers/input/touchscreen/ts_filter_linear.h>
2075 +#include <../drivers/input/touchscreen/ts_filter_mean.h>
2076 +#include <../drivers/input/touchscreen/ts_filter_median.h>
2077 +#include <../drivers/input/touchscreen/ts_filter_group.h>
2080 +#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
2082 +static struct map_desc mini2440_iodesc[] __initdata = {
2083 + /* nothing to declare, move along */
2086 +#define UCON S3C2410_UCON_DEFAULT
2087 +#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
2088 +#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
2091 +static struct s3c2410_uartcfg mini2440_uartcfgs[] __initdata = {
2115 +/* touchscreen configuration */
2116 +#ifdef CONFIG_TOUCHSCREEN_FILTER
2117 +static struct ts_filter_linear_configuration mini2440_ts_linear_config = {
2120 + 1, /* y proportion */
2127 + 1 /* common divisor */
2133 +static struct ts_filter_group_configuration mini2440_ts_group_config = {
2135 + .close_enough = 10,
2136 + .threshold = 6, /* at least half of the points in a group */
2140 +static struct ts_filter_median_configuration mini2440_ts_median_config = {
2142 + .decimation_below = 3,
2143 + .decimation_threshold = 8 * 3,
2144 + .decimation_above = 4,
2147 +static struct ts_filter_mean_configuration mini2440_ts_mean_config = {
2148 + .bits_filter_length = 2, /* 4 points */
2151 +static struct s3c2410_ts_mach_info mini2440_ts_cfg = {
2153 + .presc = 0xff, /* slow as we can go */
2154 + .filter_sequence = {
2155 + [0] = &ts_filter_group_api,
2156 + [1] = &ts_filter_median_api,
2157 + [2] = &ts_filter_mean_api,
2158 + [3] = &ts_filter_linear_api,
2160 + .filter_config = {
2161 + [0] = &mini2440_ts_group_config,
2162 + [1] = &mini2440_ts_median_config,
2163 + [2] = &mini2440_ts_mean_config,
2164 + [3] = &mini2440_ts_linear_config,
2167 +#else /* !CONFIG_TOUCHSCREEN_FILTER */
2168 +static struct s3c2410_ts_mach_info mini2440_ts_cfg = {
2170 + .presc = 0xff, /* slow as we can go */
2174 +/* LCD driver info */
2176 +/* LCD timing and setup */
2178 +#define _LCD_DECLARE(_xres,margin_left,margin_right,hsync, _yres,margin_top,margin_bottom,vsync, refresh) \
2181 + .height = _yres, \
2183 + .left_margin = margin_left, \
2184 + .right_margin = margin_right, \
2185 + .upper_margin = margin_top, \
2186 + .lower_margin = margin_bottom, \
2187 + .hsync_len = hsync, \
2188 + .vsync_len = vsync, \
2189 + .pixclock = (1000000000000LL / \
2191 + (hsync + margin_left + _xres + margin_right) * \
2192 + (vsync + margin_top + _yres + margin_bottom))), \
2194 + .type = (S3C2410_LCDCON1_TFT16BPP |\
2195 + S3C2410_LCDCON1_TFT),
2197 +struct s3c2410fb_display mini2440_lcd_cfg[] __initdata = {
2198 + [0] = { // mini2440 + 3.5" TFT + touchscreen
2200 + 240, 21, 38, 6, // x timing
2201 + 320, 2, 6, 2, // y timing
2202 + 60) // refresh rate
2203 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2204 + S3C2410_LCDCON5_INVVLINE |\
2205 + S3C2410_LCDCON5_INVVFRAME |\
2206 + S3C2410_LCDCON5_INVVDEN |\
2207 + S3C2410_LCDCON5_PWREN),
2209 + [1] = { // mini2440 + 7" TFT + touchscreen
2211 + 800, 41, 68, 32, // x timing
2212 + 480, 26, 6, 2, // y timing
2213 + 40) // refresh rate
2214 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2215 + S3C2410_LCDCON5_INVVLINE |\
2216 + S3C2410_LCDCON5_INVVFRAME |\
2217 + S3C2410_LCDCON5_INVVDEN |\
2218 + S3C2410_LCDCON5_PWREN),
2220 + /* VGA all share the timings
2221 + * NOTE: The VGA board seems to always output at 1024x768
2222 + * unless you add the dip-switch block. The smaller resolution
2223 + * WILL work, but be displayed in the top/left corner on the VGA screen
2227 + 1024, 1, 2, 2, // y timing
2228 + 768, 200, 16, 16, // x timing
2229 + 24) // refresh rate, maximum stable, tested with the FPGA shield
2230 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2231 + S3C2410_LCDCON5_HWSWP),
2235 + 800, 1, 2, 2, // y timing
2236 + 600, 200, 16, 16, // x timing
2237 + 24) // refresh rate, maximum stable, tested with the FPGA shield
2238 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2239 + S3C2410_LCDCON5_HWSWP),
2243 + 640, 1, 2, 2, // y timing
2244 + 480, 200, 16, 16, // x timing
2245 + 24) // refresh rate, maximum stable, tested with the FPGA shield
2246 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2247 + S3C2410_LCDCON5_HWSWP),
2251 +/* todo - put into gpio header */
2253 +#define S3C2410_GPCCON_MASK(x) (3 << ((x) * 2))
2254 +#define S3C2410_GPDCON_MASK(x) (3 << ((x) * 2))
2256 +struct s3c2410fb_mach_info mini2440_fb_info __initdata = {
2257 + .displays = &mini2440_lcd_cfg[0],
2258 + .num_displays = 1,
2259 + .default_display = 0,
2261 + /* Enable VD[2..7], VD[10..15], VD[18..23] and VCLK, syncs, VDEN
2262 + * and disable the pull down resistors on pins we are using for LCD
2265 + .gpcup = (0xf << 1) | (0x3f << 10),
2267 + .gpccon = (S3C2410_GPC1_VCLK | S3C2410_GPC2_VLINE |
2268 + S3C2410_GPC3_VFRAME | S3C2410_GPC4_VM |
2269 + S3C2410_GPC10_VD2 | S3C2410_GPC11_VD3 |
2270 + S3C2410_GPC12_VD4 | S3C2410_GPC13_VD5 |
2271 + S3C2410_GPC14_VD6 | S3C2410_GPC15_VD7),
2273 + .gpccon_mask = (S3C2410_GPCCON_MASK(1) | S3C2410_GPCCON_MASK(2) |
2274 + S3C2410_GPCCON_MASK(3) | S3C2410_GPCCON_MASK(4) |
2275 + S3C2410_GPCCON_MASK(10) | S3C2410_GPCCON_MASK(11) |
2276 + S3C2410_GPCCON_MASK(12) | S3C2410_GPCCON_MASK(13) |
2277 + S3C2410_GPCCON_MASK(14) | S3C2410_GPCCON_MASK(15)),
2279 + .gpdup = (0x3f << 2) | (0x3f << 10),
2281 + .gpdcon = (S3C2410_GPD2_VD10 | S3C2410_GPD3_VD11 |
2282 + S3C2410_GPD4_VD12 | S3C2410_GPD5_VD13 |
2283 + S3C2410_GPD6_VD14 | S3C2410_GPD7_VD15 |
2284 + S3C2410_GPD10_VD18 | S3C2410_GPD11_VD19 |
2285 + S3C2410_GPD12_VD20 | S3C2410_GPD13_VD21 |
2286 + S3C2410_GPD14_VD22 | S3C2410_GPD15_VD23),
2288 + .gpdcon_mask = (S3C2410_GPDCON_MASK(2) | S3C2410_GPDCON_MASK(3) |
2289 + S3C2410_GPDCON_MASK(4) | S3C2410_GPDCON_MASK(5) |
2290 + S3C2410_GPDCON_MASK(6) | S3C2410_GPDCON_MASK(7) |
2291 + S3C2410_GPDCON_MASK(10) | S3C2410_GPDCON_MASK(11)|
2292 + S3C2410_GPDCON_MASK(12) | S3C2410_GPDCON_MASK(13)|
2293 + S3C2410_GPDCON_MASK(14) | S3C2410_GPDCON_MASK(15)),
2298 +static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {
2299 + .gpio_detect = S3C2410_GPG8,
2300 + .set_power = NULL,
2301 + .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,
2304 +/* NAND Flash on MINI2440 board */
2306 +static struct mtd_partition mini2440_default_nand_part[] = {
2313 + .name = "u-boot-env",
2315 + .offset = SZ_256K,
2319 + .size = 0x00500000, /* 5 megabytes, for a kernel with no modules */
2320 + .offset = SZ_256K + SZ_128K,
2324 + .offset = SZ_256K + SZ_128K + 0x00500000,
2325 + .size = MTDPART_SIZ_FULL,
2329 +static struct s3c2410_nand_set mini2440_nand_sets[] = {
2333 + .nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
2334 + .partitions = mini2440_default_nand_part,
2338 +static struct s3c2410_platform_nand mini2440_nand_info = {
2339 + .tacls = 0, // was 25,
2340 + .twrph0 = 25, // 55,
2341 + .twrph1 = 15, // 40,
2342 + .nr_sets = ARRAY_SIZE(mini2440_nand_sets),
2343 + .sets = mini2440_nand_sets,
2346 +/* DM9000AEP 10/100 ethernet controller */
2348 +static struct resource mini2440_dm9k_resource[] = {
2350 + .start = MACH_MINI2440_DM9K_BASE,
2351 + .end = MACH_MINI2440_DM9K_BASE + 3,
2352 + .flags = IORESOURCE_MEM
2355 + .start = MACH_MINI2440_DM9K_BASE + 4,
2356 + .end = MACH_MINI2440_DM9K_BASE + 7,
2357 + .flags = IORESOURCE_MEM
2360 + .start = IRQ_EINT7,
2362 + .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
2366 +static struct dm9000_plat_data mini2440_dm9k_pdata = {
2367 + .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
2370 +static struct platform_device mini2440_device_eth = {
2373 + .num_resources = ARRAY_SIZE(mini2440_dm9k_resource),
2374 + .resource = mini2440_dm9k_resource,
2376 + .platform_data = &mini2440_dm9k_pdata,
2382 +static int mini2440_backlight_init(struct device *dev)
2387 + * Cut the power to the LCD if brightness reaches 0
2389 +static int mini2440_backlight_notify(int brightness)
2392 + s3c2410_gpio_setpin(S3C2410_GPB1, 1);
2393 + s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_TOUT1); // pwm backlight
2394 +// s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_OUTP); // pwm backlight
2395 + s3c2410_gpio_setpin(S3C2410_GPG4, 1);
2396 + s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_LCDPWREN);
2398 + s3c2410_gpio_setpin(S3C2410_GPB1, 0);
2399 + s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_OUTP);
2400 + s3c2410_gpio_setpin(S3C2410_GPG4, 0);
2401 + s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);
2403 + return brightness;
2406 +static struct platform_pwm_backlight_data mini2440_backlight_data = {
2408 + .max_brightness = 1023,
2409 + .dft_brightness = 900,
2410 + .pwm_period_ns = 4000000, /* Fl = 250Hz PWM */
2411 + .init = mini2440_backlight_init,
2412 + .notify = mini2440_backlight_notify,
2415 +static struct platform_device mini2440_backlight_device = {
2416 + .name = "pwm-backlight",
2418 + .platform_data = &mini2440_backlight_data,
2424 +static struct s3c24xx_led_platdata mini2440_led1_pdata = {
2426 + .gpio = S3C2410_GPB5,
2427 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2428 + .def_trigger = "heartbeat",
2431 +static struct s3c24xx_led_platdata mini2440_led2_pdata = {
2433 + .gpio = S3C2410_GPB6,
2434 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2435 + .def_trigger = "nand-disk",
2438 +static struct s3c24xx_led_platdata mini2440_led3_pdata = {
2440 + .gpio = S3C2410_GPB7,
2441 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2442 + .def_trigger = "mmc0",
2445 +static struct s3c24xx_led_platdata mini2440_led4_pdata = {
2447 + .gpio = S3C2410_GPB8,
2448 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2449 + .def_trigger = "",
2452 +static struct platform_device mini2440_led1 = {
2453 + .name = "s3c24xx_led",
2456 + .platform_data = &mini2440_led1_pdata,
2460 +static struct platform_device mini2440_led2 = {
2461 + .name = "s3c24xx_led",
2464 + .platform_data = &mini2440_led2_pdata,
2468 +static struct platform_device mini2440_led3 = {
2469 + .name = "s3c24xx_led",
2472 + .platform_data = &mini2440_led3_pdata,
2476 +static struct platform_device mini2440_led4 = {
2477 + .name = "s3c24xx_led",
2480 + .platform_data = &mini2440_led4_pdata,
2486 +static struct s3c24xx_uda134x_platform_data mini2440_audio_pins __initdata = {
2487 + .l3_clk = S3C2410_GPB4,
2488 + .l3_mode = S3C2410_GPB2,
2489 + .l3_data = S3C2410_GPB3,
2490 + .model = UDA134X_UDA1341
2493 +static struct platform_device mini2440_audio = {
2494 + .name = "s3c24xx_uda134x",
2497 + .platform_data = &mini2440_audio_pins,
2506 +static struct at24_platform_data at24c08 = {
2507 + .byte_len = (8*1024) / 8,
2509 + .flags = AT24_FLAG_ADDR16,
2512 +static struct i2c_board_info mini2440_i2c_devs[] __initdata = {
2514 + I2C_BOARD_INFO("at24c08", 0x50),
2515 + .platform_data = &at24c08,
2520 + * mini2440_features string
2522 + * t = Touchscreen present
2523 + * b = PWM backlight control
2525 + * 0-9 LCD configuration
2528 +static char mini2440_features_str[12] __initdata = "0tb";
2530 +static int __init mini2440_features_setup(char *str)
2533 + strlcpy(mini2440_features_str, str, sizeof(mini2440_features_str));
2537 +__setup("mini2440=", mini2440_features_setup);
2539 +static struct platform_device *mini2440_devices[] __initdata = {
2542 +// &s3c_device_adc, // ADC doesn't like living with touchscreen !
2545 + &mini2440_device_eth,
2554 +// &s3c_device_timer[0], // buzzer pwm, no API for it
2555 + /* remaining devices are optional */
2558 +static void __init mini2440_map_io(void)
2560 + s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));
2561 + s3c24xx_init_clocks(12000000);
2562 + s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs));
2564 + s3c_device_nand.dev.platform_data = &mini2440_nand_info;
2565 + s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;
2568 +static void __init mini2440_init(void)
2570 + struct platform_device *optionals[8];
2572 + int lcd_index = -1;
2575 + s3c2410_gpio_cfgpin(S3C2410_GPC0, S3C2410_GPC0_LEND);
2577 + s3c2410_gpio_pullup(S3C2410_GPB1, 0); // remove pullup on PWM backlight
2578 + s3c2410_gpio_setpin(S3C2410_GPB1, 0);
2579 + s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_TOUT1);
2581 + printk(KERN_INFO "MINI2440: Option string mini2440=%s\n", mini2440_features_str);
2585 + char * fp = mini2440_features_str;
2589 + case '0'...'9': /* tft screen */
2590 + if (done & (1 << 0))
2591 + printk(KERN_INFO "MINI2440: '%c' ignored, screen type already set\n", f);
2594 + if (li >= ARRAY_SIZE(mini2440_lcd_cfg))
2595 + printk(KERN_INFO "MINI2440: '%c' out of range for LCD mode\n", f);
2597 + optionals[count++] = &s3c_device_lcd;
2604 + if (done & (1 << 1))
2605 + printk(KERN_INFO "MINI2440: '%c' ignored, backlight already set\n", f);
2607 + optionals[count++] = &s3c_device_timer[1]; // need this timer for the backlight
2608 + optionals[count++] = &mini2440_backlight_device;
2613 + if (done & (1 << 2))
2614 + printk(KERN_INFO "MINI2440: '%c' ignored, touchscreen already set\n", f);
2616 + optionals[count++] = &s3c_device_ts;
2620 + if (done & (1 << 2))
2621 + printk(KERN_INFO "MINI2440: '%c' ignored, camera already registered\n", f);
2623 + optionals[count++] = &s3c_device_camif;
2629 + if (lcd_index != -1) {
2631 + mini2440_fb_info.displays = &mini2440_lcd_cfg[lcd_index];
2632 + printk(KERN_INFO "MINI2440: LCD");
2633 + for (li = 0; li < ARRAY_SIZE(mini2440_lcd_cfg); li++)
2634 + if (li == lcd_index)
2635 + printk(" [%d:%dx%d]", li, mini2440_lcd_cfg[li].width, mini2440_lcd_cfg[li].height);
2637 + printk(" %d:%dx%d", li, mini2440_lcd_cfg[li].width, mini2440_lcd_cfg[li].height);
2639 + s3c24xx_fb_set_platdata(&mini2440_fb_info);
2641 + s3c_i2c0_set_platdata(NULL);
2643 + set_s3c2410ts_info(&mini2440_ts_cfg);
2645 + platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
2646 + if (count) /* the optional features */
2647 + platform_add_devices(optionals, count);
2649 + i2c_register_board_info(0, mini2440_i2c_devs, ARRAY_SIZE(mini2440_i2c_devs));
2653 +MACHINE_START(MINI2440, "MINI2440")
2654 + .phys_io = S3C2410_PA_UART,
2655 + .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
2656 + .boot_params = S3C2410_SDRAM_PA + 0x100,
2657 + .map_io = mini2440_map_io,
2658 + .init_machine = mini2440_init,
2659 + .init_irq = s3c24xx_init_irq,
2660 + .timer = &s3c24xx_timer,
2662 diff --git a/arch/arm/plat-s3c/include/plat/devs.h b/arch/arm/plat-s3c/include/plat/devs.h
2663 index 6b1b523..cf160ab 100644
2664 --- a/arch/arm/plat-s3c/include/plat/devs.h
2665 +++ b/arch/arm/plat-s3c/include/plat/devs.h
2666 @@ -45,10 +45,11 @@ extern struct platform_device s3c_device_nand;
2668 extern struct platform_device s3c_device_usbgadget;
2670 +extern struct platform_device s3c_device_ts;
2672 /* s3c2440 specific devices */
2674 #ifdef CONFIG_CPU_S3C2440
2676 extern struct platform_device s3c_device_camif;
2679 diff --git a/arch/arm/plat-s3c24xx/devs.c b/arch/arm/plat-s3c24xx/devs.c
2680 index 16ac01d..a3f8102 100644
2681 --- a/arch/arm/plat-s3c24xx/devs.c
2682 +++ b/arch/arm/plat-s3c24xx/devs.c
2684 #include <asm/mach/irq.h>
2685 #include <mach/fb.h>
2686 #include <mach/hardware.h>
2687 +#include <mach/ts.h>
2688 +#include <asm/io.h>
2689 #include <asm/irq.h>
2691 #include <plat/regs-serial.h>
2692 @@ -229,6 +231,23 @@ struct platform_device s3c_device_nand = {
2694 EXPORT_SYMBOL(s3c_device_nand);
2697 +struct platform_device s3c_device_ts = {
2698 + .name = "s3c2410-ts",
2702 +EXPORT_SYMBOL(s3c_device_ts);
2704 +static struct s3c2410_ts_mach_info s3c2410ts_info;
2706 +void set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
2708 + memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(struct s3c2410_ts_mach_info));
2709 + s3c_device_ts.dev.platform_data = &s3c2410ts_info;
2711 +EXPORT_SYMBOL(set_s3c2410ts_info);
2713 /* USB Device (Gadget)*/
2715 static struct resource s3c_usbgadget_resource[] = {
2716 diff --git a/arch/arm/plat-s3c24xx/s3c244x.c b/arch/arm/plat-s3c24xx/s3c244x.c
2717 index c1de6bb..df78a15 100644
2718 --- a/arch/arm/plat-s3c24xx/s3c244x.c
2719 +++ b/arch/arm/plat-s3c24xx/s3c244x.c
2720 @@ -59,6 +59,8 @@ void __init s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no)
2721 s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
2724 +extern struct platform_device s3c_device_ts;
2726 void __init s3c244x_map_io(void)
2728 /* register our io-tables */
2729 @@ -70,6 +72,7 @@ void __init s3c244x_map_io(void)
2730 s3c_device_sdi.name = "s3c2440-sdi";
2731 s3c_device_i2c0.name = "s3c2440-i2c";
2732 s3c_device_nand.name = "s3c2440-nand";
2733 + s3c_device_ts.name = "s3c2440-ts";
2734 s3c_device_usbgadget.name = "s3c2440-usbgadget";
2737 diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
2738 index bb6486a..75ff0a8 100644
2739 --- a/drivers/input/touchscreen/Kconfig
2740 +++ b/drivers/input/touchscreen/Kconfig
2741 @@ -11,6 +11,54 @@ menuconfig INPUT_TOUCHSCREEN
2743 if INPUT_TOUCHSCREEN
2745 +menuconfig TOUCHSCREEN_FILTER
2746 + boolean "Touchscreen Filtering"
2747 + depends on INPUT_TOUCHSCREEN
2748 + select TOUCHSCREEN_FILTER_GROUP
2749 + select TOUCHSCREEN_FILTER_MEDIAN
2750 + select TOUCHSCREEN_FILTER_MEAN
2751 + select TOUCHSCREEN_FILTER_LINEAR
2753 + Select this to include kernel touchscreen filter support. The filters
2754 + can be combined in any order in your machine init and the parameters
2755 + for them can also be set there.
2757 +if TOUCHSCREEN_FILTER
2759 +config TOUCHSCREEN_FILTER_GROUP
2760 + bool "Group Touchscreen Filter"
2761 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2764 + Say Y here if you want to use the Group touchscreen filter, it
2765 + avoids using atypical samples.
2767 +config TOUCHSCREEN_FILTER_MEDIAN
2768 + bool "Median Average Touchscreen Filter"
2769 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2772 + Say Y here if you want to use the Median touchscreen filter, it's
2773 + highly effective if you data is noisy with occasional excursions.
2775 +config TOUCHSCREEN_FILTER_MEAN
2776 + bool "Mean Average Touchscreen Filter"
2777 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2780 + Say Y here if you want to use the Mean touchscreen filter, it
2781 + can further improve decent quality data by removing jitter
2783 +config TOUCHSCREEN_FILTER_LINEAR
2784 + bool "Linear Touchscreen Filter"
2785 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2788 + Say Y here if you want to use the Linear touchscreen filter, it
2789 + enables the use of calibration data for the touchscreen.
2793 config TOUCHSCREEN_ADS7846
2794 tristate "ADS7846/TSC2046 and ADS7843 based touchscreens"
2795 depends on SPI_MASTER
2796 @@ -79,6 +127,24 @@ config TOUCHSCREEN_FUJITSU
2797 To compile this driver as a module, choose M here: the
2798 module will be called fujitsu-ts.
2800 +config TOUCHSCREEN_S3C2410
2801 + tristate "Samsung S3C2410 touchscreen input driver"
2802 + depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN
2805 + Say Y here if you have the s3c2410 touchscreen.
2809 + To compile this driver as a module, choose M here: the
2810 + module will be called s3c2410_ts.
2812 +config TOUCHSCREEN_S3C2410_DEBUG
2813 + boolean "Samsung S3C2410 touchscreen debug messages"
2814 + depends on TOUCHSCREEN_S3C2410
2816 + Select this if you want debug messages
2818 config TOUCHSCREEN_GUNZE
2819 tristate "Gunze AHL-51S touchscreen"
2821 diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
2822 index d3375af..4b0a03e 100644
2823 --- a/drivers/input/touchscreen/Makefile
2824 +++ b/drivers/input/touchscreen/Makefile
2825 @@ -34,3 +34,9 @@ wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9705) += wm9705.o
2826 wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9712) += wm9712.o
2827 wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9713) += wm9713.o
2828 obj-$(CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE) += mainstone-wm97xx.o
2829 +obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
2830 +obj-$(CONFIG_TOUCHSCREEN_FILTER) += ts_filter.o
2831 +obj-$(CONFIG_TOUCHSCREEN_FILTER_GROUP) += ts_filter_group.o
2832 +obj-$(CONFIG_TOUCHSCREEN_FILTER_LINEAR) += ts_filter_linear.o
2833 +obj-$(CONFIG_TOUCHSCREEN_FILTER_MEDIAN) += ts_filter_median.o
2834 +obj-$(CONFIG_TOUCHSCREEN_FILTER_MEAN) += ts_filter_mean.o
2835 diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
2836 new file mode 100644
2837 index 0000000..ea0777c
2839 +++ b/drivers/input/touchscreen/s3c2410_ts.c
2842 + * This program is free software; you can redistribute it and/or modify
2843 + * it under the terms of the GNU General Public License as published by
2844 + * the Free Software Foundation; either version 2 of the License, or
2845 + * (at your option) any later version.
2847 + * This program is distributed in the hope that it will be useful,
2848 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2849 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2850 + * GNU General Public License for more details.
2852 + * You should have received a copy of the GNU General Public License
2853 + * along with this program; if not, write to the Free Software
2854 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2856 + * Copyright (c) 2004 Arnaud Patard <arnaud.patard@rtp-net.org>
2857 + * iPAQ H1940 touchscreen support
2861 + * 2004-09-05: Herbert Pötzl <herbert@13thfloor.at>
2862 + * - added clock (de-)allocation code
2864 + * 2005-03-06: Arnaud Patard <arnaud.patard@rtp-net.org>
2865 + * - h1940_ -> s3c2410 (this driver is now also used on the n30
2867 + * - Debug messages are now enabled with the config option
2868 + * TOUCHSCREEN_S3C2410_DEBUG
2869 + * - Changed the way the value are read
2870 + * - Input subsystem should now work
2871 + * - Use ioremap and readl/writel
2873 + * 2005-03-23: Arnaud Patard <arnaud.patard@rtp-net.org>
2874 + * - Make use of some undocumented features of the touchscreen
2877 + * 2007-05-23: Harald Welte <laforge@openmoko.org>
2878 + * - Add proper support for S32440
2880 + * 2008-06-23: Andy Green <andy@openmoko.com>
2881 + * - removed averaging system
2882 + * - added generic Touchscreen filter stuff
2884 + * 2008-11-27: Nelson Castillo <arhuaco@freaks-unidos.net>
2885 + * - improve interrupt handling
2888 +#include <linux/errno.h>
2889 +#include <linux/kernel.h>
2890 +#include <linux/module.h>
2891 +#include <linux/slab.h>
2892 +#include <linux/input.h>
2893 +#include <linux/init.h>
2894 +#include <linux/serio.h>
2895 +#include <linux/timer.h>
2896 +#include <linux/kfifo.h>
2897 +#include <linux/delay.h>
2898 +#include <linux/platform_device.h>
2899 +#include <linux/clk.h>
2900 +#include <asm/io.h>
2901 +#include <asm/irq.h>
2903 +#include <mach/regs-gpio.h>
2904 +#include <mach/ts.h>
2906 +#include <plat/regs-adc.h>
2908 +#include "ts_filter.h"
2910 +/* For ts.dev.id.version */
2911 +#define S3C2410TSVERSION 0x0101
2913 +#define TSC_SLEEP (S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_XY_PST(0))
2915 +#define WAIT4INT(x) (((x)<<8) | \
2916 + S3C2410_ADCTSC_YM_SEN | \
2917 + S3C2410_ADCTSC_YP_SEN | \
2918 + S3C2410_ADCTSC_XP_SEN | \
2919 + S3C2410_ADCTSC_XY_PST(3))
2921 +#define AUTOPST (S3C2410_ADCTSC_YM_SEN | \
2922 + S3C2410_ADCTSC_YP_SEN | \
2923 + S3C2410_ADCTSC_XP_SEN | \
2924 + S3C2410_ADCTSC_AUTO_PST | \
2925 + S3C2410_ADCTSC_XY_PST(0))
2927 +#define DEBUG_LVL KERN_DEBUG
2929 +MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
2930 +MODULE_DESCRIPTION("s3c2410 touchscreen driver");
2931 +MODULE_LICENSE("GPL");
2934 + * Definitions & global arrays.
2937 +static char *s3c2410ts_name = "s3c2410 TouchScreen";
2939 +#define TS_RELEASE_TIMEOUT (HZ >> 7 ? HZ >> 7 : 1) /* 8ms (5ms if HZ is 200) */
2940 +#define TS_EVENT_FIFO_SIZE (2 << 6) /* must be a power of 2 */
2942 +#define TS_STATE_STANDBY 0 /* initial state */
2943 +#define TS_STATE_PRESSED 1
2944 +#define TS_STATE_RELEASE_PENDING 2
2945 +#define TS_STATE_RELEASE 3
2948 + * Per-touchscreen data.
2952 + struct input_dev *dev;
2953 + struct ts_filter *tsf[MAX_TS_FILTER_CHAIN];
2954 + int coords[2]; /* just X and Y for us */
2957 + struct kfifo *event_fifo;
2960 +static struct s3c2410ts ts;
2962 +static void __iomem *base_addr;
2965 + * A few low level functions.
2968 +static inline void s3c2410_ts_connect(void)
2970 + s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);
2971 + s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);
2972 + s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);
2973 + s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
2976 +static void s3c2410_ts_start_adc_conversion(void)
2978 + writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST,
2979 + base_addr + S3C2410_ADCTSC);
2980 + writel(readl(base_addr + S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START,
2981 + base_addr + S3C2410_ADCCON);
2985 + * Just send the input events.
2988 +enum ts_input_event {IE_DOWN = 0, IE_UP};
2990 +static void ts_input_report(int event, int coords[])
2992 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
2993 + static char *s[] = {"down", "up"};
2994 + struct timeval tv;
2996 + do_gettimeofday(&tv);
2999 + if (event == IE_DOWN) {
3000 + input_report_abs(ts.dev, ABS_X, coords[0]);
3001 + input_report_abs(ts.dev, ABS_Y, coords[1]);
3002 + input_report_key(ts.dev, BTN_TOUCH, 1);
3003 + input_report_abs(ts.dev, ABS_PRESSURE, 1);
3005 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3006 + printk(DEBUG_LVL "T:%06d %6s (X:%03d, Y:%03d)\n",
3007 + (int)tv.tv_usec, s[event], coords[0], coords[1]);
3010 + input_report_key(ts.dev, BTN_TOUCH, 0);
3011 + input_report_abs(ts.dev, ABS_PRESSURE, 0);
3013 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3014 + printk(DEBUG_LVL "T:%06d %6s\n",
3015 + (int)tv.tv_usec, s[event]);
3019 + input_sync(ts.dev);
3023 + * Manage the state of the touchscreen.
3026 +static void event_send_timer_f(unsigned long data);
3028 +static struct timer_list event_send_timer =
3029 + TIMER_INITIALIZER(event_send_timer_f, 0, 0);
3031 +static void event_send_timer_f(unsigned long data)
3033 + static int noop_counter;
3036 + while (__kfifo_get(ts.event_fifo, (unsigned char *)&event_type,
3040 + switch (event_type) {
3042 + if (ts.state == TS_STATE_RELEASE_PENDING)
3043 + /* Ignore short UP event */
3044 + ts.state = TS_STATE_PRESSED;
3048 + ts.state = TS_STATE_RELEASE_PENDING;
3052 + if (ts.is_down) /* stylus_action needs a conversion */
3053 + s3c2410_ts_start_adc_conversion();
3055 + if (unlikely(__kfifo_get(ts.event_fifo,
3056 + (unsigned char *)buf,
3058 + != sizeof(int) * 2))
3059 + goto ts_exit_error;
3061 + ts_input_report(IE_DOWN, buf);
3062 + ts.state = TS_STATE_PRESSED;
3066 + goto ts_exit_error;
3072 + if (noop_counter++ >= 1) {
3074 + if (ts.state == TS_STATE_RELEASE_PENDING) {
3075 + /* We delay the UP event for a
3076 + * while to avoid jitter. If we get a DOWN
3077 + * event we do not send it. */
3079 + ts_input_report(IE_UP, NULL);
3080 + ts.state = TS_STATE_STANDBY;
3083 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3086 + mod_timer(&event_send_timer, jiffies + TS_RELEASE_TIMEOUT);
3091 +ts_exit_error: /* should not happen unless we have a bug */
3092 + printk(KERN_ERR __FILE__ ": event_send_timer_f failed\n");
3096 + * Manage interrupts.
3099 +static irqreturn_t stylus_updown(int irq, void *dev_id)
3101 + unsigned long data0;
3102 + unsigned long data1;
3105 + data0 = readl(base_addr+S3C2410_ADCDAT0);
3106 + data1 = readl(base_addr+S3C2410_ADCDAT1);
3108 + ts.is_down = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) &&
3109 + (!(data1 & S3C2410_ADCDAT0_UPDOWN));
3111 + event_type = ts.is_down ? 'D' : 'U';
3113 + if (unlikely(__kfifo_put(ts.event_fifo, (unsigned char *)&event_type,
3114 + sizeof(int)) != sizeof(int))) /* should not happen */
3115 + printk(KERN_ERR __FILE__": stylus_updown lost event!\n");
3118 + s3c2410_ts_start_adc_conversion();
3120 + writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
3122 + mod_timer(&event_send_timer, jiffies + 1);
3124 + return IRQ_HANDLED;
3127 +static irqreturn_t stylus_action(int irq, void *dev_id)
3131 + /* grab the ADC results */
3132 + ts.coords[0] = readl(base_addr + S3C2410_ADCDAT0) &
3133 + S3C2410_ADCDAT0_XPDATA_MASK;
3134 + ts.coords[1] = readl(base_addr + S3C2410_ADCDAT1) &
3135 + S3C2410_ADCDAT1_YPDATA_MASK;
3137 + if (ts.tsf[0]) { /* filtering is enabled, don't use raw directly */
3138 + switch ((ts.tsf[0]->api->process)(ts.tsf[0], &ts.coords[0])) {
3140 + * no real sample came out of processing yet,
3141 + * get another raw result to feed it
3143 + s3c2410_ts_start_adc_conversion();
3144 + return IRQ_HANDLED;
3145 + case 1: /* filters are ready to deliver a sample */
3146 + (ts.tsf[0]->api->scale)(ts.tsf[0], &ts.coords[0]);
3149 + /* error in filters, ignore the event */
3150 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3151 + writel(WAIT4INT(1), base_addr + S3C2410_ADCTSC);
3152 + return IRQ_HANDLED;
3154 + printk(KERN_ERR":stylus_action error\n");
3158 + /* We use a buffer because want an atomic operation */
3160 + buf[1] = ts.coords[0];
3161 + buf[2] = ts.coords[1];
3163 + if (unlikely(__kfifo_put(ts.event_fifo, (unsigned char *)buf,
3164 + sizeof(int) * 3) != sizeof(int) * 3))
3165 + /* should not happen */
3166 + printk(KERN_ERR":stylus_action error\n");
3168 + writel(WAIT4INT(1), base_addr + S3C2410_ADCTSC);
3169 + mod_timer(&event_send_timer, jiffies + 1);
3171 + return IRQ_HANDLED;
3174 +static struct clk *adc_clock;
3177 + * The functions for inserting/removing us as a module.
3180 +static int __init s3c2410ts_probe(struct platform_device *pdev)
3183 + struct s3c2410_ts_mach_info *info;
3184 + struct input_dev *input_dev;
3187 + dev_info(&pdev->dev, "Starting\n");
3189 + info = (struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
3193 + dev_err(&pdev->dev, "Hm... too bad: no platform data for ts\n");
3197 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3198 + printk(DEBUG_LVL "Entering s3c2410ts_init\n");
3201 + adc_clock = clk_get(NULL, "adc");
3203 + dev_err(&pdev->dev, "failed to get adc clock source\n");
3206 + clk_enable(adc_clock);
3208 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3209 + printk(DEBUG_LVL "got and enabled clock\n");
3212 + base_addr = ioremap(S3C2410_PA_ADC,0x20);
3213 + if (base_addr == NULL) {
3214 + dev_err(&pdev->dev, "Failed to remap register block\n");
3220 + /* If we acutally are a S3C2410: Configure GPIOs */
3221 + if (!strcmp(pdev->name, "s3c2410-ts"))
3222 + s3c2410_ts_connect();
3224 + if ((info->presc & 0xff) > 0)
3225 + writel(S3C2410_ADCCON_PRSCEN |
3226 + S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
3227 + base_addr + S3C2410_ADCCON);
3229 + writel(0, base_addr+S3C2410_ADCCON);
3231 + /* Initialise registers */
3232 + if ((info->delay & 0xffff) > 0)
3233 + writel(info->delay & 0xffff, base_addr + S3C2410_ADCDLY);
3235 + writel(WAIT4INT(0), base_addr + S3C2410_ADCTSC);
3237 + /* Initialise input stuff */
3238 + memset(&ts, 0, sizeof(struct s3c2410ts));
3239 + input_dev = input_allocate_device();
3242 + dev_err(&pdev->dev, "Unable to allocate the input device\n");
3247 + ts.dev = input_dev;
3248 + ts.dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) |
3250 + ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
3251 + input_set_abs_params(ts.dev, ABS_X, 0, 0x3FF, 0, 0);
3252 + input_set_abs_params(ts.dev, ABS_Y, 0, 0x3FF, 0, 0);
3253 + input_set_abs_params(ts.dev, ABS_PRESSURE, 0, 1, 0, 0);
3255 + ts.dev->name = s3c2410ts_name;
3256 + ts.dev->id.bustype = BUS_RS232;
3257 + ts.dev->id.vendor = 0xDEAD;
3258 + ts.dev->id.product = 0xBEEF;
3259 + ts.dev->id.version = S3C2410TSVERSION;
3260 + ts.state = TS_STATE_STANDBY;
3261 + ts.event_fifo = kfifo_alloc(TS_EVENT_FIFO_SIZE, GFP_KERNEL, NULL);
3262 + if (IS_ERR(ts.event_fifo)) {
3267 + /* create the filter chain set up for the 2 coordinates we produce */
3268 + ret = ts_filter_create_chain(
3269 + pdev, (struct ts_filter_api **)&info->filter_sequence,
3270 + (void *)&info->filter_config, ts.tsf, ARRAY_SIZE(ts.coords));
3272 + dev_info(&pdev->dev, "%d filter(s) initialized\n", ret);
3273 + else /* this is OK, just means there won't be any filtering */
3274 + dev_info(&pdev->dev, "Unfiltered output selected\n");
3277 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3279 + dev_info(&pdev->dev, "No filtering\n");
3282 + if (request_irq(IRQ_ADC, stylus_action, IRQF_SAMPLE_RANDOM,
3283 + "s3c2410_action", ts.dev)) {
3284 + dev_err(&pdev->dev, "Could not allocate ts IRQ_ADC !\n");
3285 + iounmap(base_addr);
3289 + if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
3290 + "s3c2410_action", ts.dev)) {
3291 + dev_err(&pdev->dev, "Could not allocate ts IRQ_TC !\n");
3292 + free_irq(IRQ_ADC, ts.dev);
3293 + iounmap(base_addr);
3298 + dev_info(&pdev->dev, "successfully loaded\n");
3300 + /* All went ok, so register to the input system */
3301 + rc = input_register_device(ts.dev);
3310 + free_irq(IRQ_TC, ts.dev);
3311 + free_irq(IRQ_ADC, ts.dev);
3312 + clk_disable(adc_clock);
3313 + iounmap(base_addr);
3314 + disable_irq(IRQ_TC);
3316 + disable_irq(IRQ_ADC);
3318 + ts_filter_destroy_chain(pdev, ts.tsf);
3319 + kfifo_free(ts.event_fifo);
3321 + input_unregister_device(ts.dev);
3323 + iounmap(base_addr);
3329 +static int s3c2410ts_remove(struct platform_device *pdev)
3331 + disable_irq(IRQ_ADC);
3332 + disable_irq(IRQ_TC);
3333 + free_irq(IRQ_TC,ts.dev);
3334 + free_irq(IRQ_ADC,ts.dev);
3337 + clk_disable(adc_clock);
3338 + clk_put(adc_clock);
3342 + input_unregister_device(ts.dev);
3343 + iounmap(base_addr);
3345 + ts_filter_destroy_chain(pdev, ts.tsf);
3347 + kfifo_free(ts.event_fifo);
3353 +static int s3c2410ts_suspend(struct platform_device *pdev, pm_message_t state)
3355 + writel(TSC_SLEEP, base_addr+S3C2410_ADCTSC);
3356 + writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_STDBM,
3357 + base_addr+S3C2410_ADCCON);
3359 + disable_irq(IRQ_ADC);
3360 + disable_irq(IRQ_TC);
3362 + clk_disable(adc_clock);
3367 +static int s3c2410ts_resume(struct platform_device *pdev)
3369 + struct s3c2410_ts_mach_info *info =
3370 + ( struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
3372 + clk_enable(adc_clock);
3376 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3378 + enable_irq(IRQ_ADC);
3379 + enable_irq(IRQ_TC);
3381 + if ((info->presc&0xff) > 0)
3382 + writel(S3C2410_ADCCON_PRSCEN |
3383 + S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
3384 + base_addr+S3C2410_ADCCON);
3386 + writel(0,base_addr+S3C2410_ADCCON);
3388 + /* Initialise registers */
3389 + if ((info->delay & 0xffff) > 0)
3390 + writel(info->delay & 0xffff, base_addr+S3C2410_ADCDLY);
3392 + writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
3398 +#define s3c2410ts_suspend NULL
3399 +#define s3c2410ts_resume NULL
3402 +static struct platform_driver s3c2410ts_driver = {
3404 + .name = "s3c2410-ts",
3405 + .owner = THIS_MODULE,
3407 + .probe = s3c2410ts_probe,
3408 + .remove = s3c2410ts_remove,
3409 + .suspend = s3c2410ts_suspend,
3410 + .resume = s3c2410ts_resume,
3414 +static struct platform_driver s3c2440ts_driver = {
3416 + .name = "s3c2440-ts",
3417 + .owner = THIS_MODULE,
3419 + .probe = s3c2410ts_probe,
3420 + .remove = s3c2410ts_remove,
3421 + .suspend = s3c2410ts_suspend,
3422 + .resume = s3c2410ts_resume,
3426 +static int __init s3c2410ts_init(void)
3430 + rc = platform_driver_register(&s3c2410ts_driver);
3434 + rc = platform_driver_register(&s3c2440ts_driver);
3436 + platform_driver_unregister(&s3c2410ts_driver);
3441 +static void __exit s3c2410ts_exit(void)
3443 + platform_driver_unregister(&s3c2440ts_driver);
3444 + platform_driver_unregister(&s3c2410ts_driver);
3447 +module_init(s3c2410ts_init);
3448 +module_exit(s3c2410ts_exit);
3450 diff --git a/drivers/input/touchscreen/ts_filter.c b/drivers/input/touchscreen/ts_filter.c
3451 new file mode 100644
3452 index 0000000..832844d
3454 +++ b/drivers/input/touchscreen/ts_filter.c
3457 + * This program is free software; you can redistribute it and/or modify
3458 + * it under the terms of the GNU General Public License as published by
3459 + * the Free Software Foundation; either version 2 of the License, or
3460 + * (at your option) any later version.
3462 + * This program is distributed in the hope that it will be useful,
3463 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
3464 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3465 + * GNU General Public License for more details.
3467 + * You should have received a copy of the GNU General Public License
3468 + * along with this program; if not, write to the Free Software
3469 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3471 + * Copyright (c) 2008 Andy Green <andy@openmoko.com>
3474 +#include <linux/kernel.h>
3475 +#include <linux/device.h>
3476 +#include "ts_filter.h"
3478 +static DEFINE_MUTEX(chain_mutex);
3480 +int ts_filter_create_chain(struct platform_device *pdev,
3481 + struct ts_filter_api **api, void **config,
3482 + struct ts_filter **arr, int count_coords)
3485 + struct ts_filter *last = NULL;
3490 + mutex_lock(&chain_mutex);
3493 + *arr = ((*api)->create)(pdev, *config++, count_coords);
3495 + printk(KERN_ERR "Filter %d failed init\n", count);
3498 + (*arr)->api = *api++;
3500 + last->next = *arr;
3506 + mutex_unlock(&chain_mutex);
3510 +EXPORT_SYMBOL_GPL(ts_filter_create_chain);
3512 +void ts_filter_destroy_chain(struct platform_device *pdev,
3513 + struct ts_filter **arr)
3515 + struct ts_filter **first = arr;
3517 + mutex_lock(&chain_mutex);
3520 + ((*arr)->api->destroy)(pdev, *arr);
3525 + mutex_unlock(&chain_mutex);
3527 +EXPORT_SYMBOL_GPL(ts_filter_destroy_chain);
3529 diff --git a/drivers/input/touchscreen/ts_filter.h b/drivers/input/touchscreen/ts_filter.h
3530 new file mode 100644
3531 index 0000000..3746e45
3533 +++ b/drivers/input/touchscreen/ts_filter.h
3535 +#ifndef __TS_FILTER_H__
3536 +#define __TS_FILTER_H__
3539 + * Touchscreen filter.
3541 + * (c) 2008 Andy Green <andy@openmoko.com>
3544 +#include <linux/platform_device.h>
3546 +#define MAX_TS_FILTER_CHAIN 8 /* Max. filters we can chain up. */
3547 +#define MAX_TS_FILTER_COORDS 3 /* X, Y and Z (pressure). */
3551 +/* Operations that a filter can perform. */
3553 +struct ts_filter_api {
3554 + struct ts_filter * (*create)(struct platform_device *pdev, void *config,
3555 + int count_coords);
3556 + void (*destroy)(struct platform_device *pdev, struct ts_filter *filter);
3557 + void (*clear)(struct ts_filter *filter);
3558 + int (*process)(struct ts_filter *filter, int *coords);
3559 + void (*scale)(struct ts_filter *filter, int *coords);
3563 + * This is the common part of all filters.
3564 + * We use this type as an otherwise opaque handle on to
3565 + * the actual filter. Therefore you need one of these
3566 + * at the start of your actual filter struct.
3570 + struct ts_filter *next; /* Next in chain. */
3571 + struct ts_filter_api *api; /* Operations to use for this object. */
3573 + int coords[MAX_TS_FILTER_COORDS];
3577 + * Helper to create a filter chain from an array of API pointers and
3578 + * array of config ints. Leaves pointers to created filters in arr
3579 + * array and fills in ->next pointers to create the chain.
3582 +#ifdef CONFIG_TOUCHSCREEN_FILTER
3583 +extern int ts_filter_create_chain(struct platform_device *pdev,
3584 + struct ts_filter_api **api, void **config,
3585 + struct ts_filter **arr, int count_coords);
3587 +/* Helper to destroy a whole chain from the list of filter pointers. */
3589 +extern void ts_filter_destroy_chain(struct platform_device *pdev,
3590 + struct ts_filter **arr);
3592 +#define ts_filter_create_chain(pdev, api, config, arr, count_coords) (0)
3593 +#define ts_filter_destroy_chain(pdev, arr) do { } while (0)
3597 diff --git a/drivers/input/touchscreen/ts_filter_group.c b/drivers/input/touchscreen/ts_filter_group.c
3598 new file mode 100644
3599 index 0000000..f2ecd92
3601 +++ b/drivers/input/touchscreen/ts_filter_group.c
3604 + * This program is free software; you can redistribute it and/or modify
3605 + * it under the terms of the GNU General Public License as published by
3606 + * the Free Software Foundation; either version 2 of the License, or
3607 + * (at your option) any later version.
3609 + * This program is distributed in the hope that it will be useful,
3610 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
3611 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3612 + * GNU General Public License for more details.
3614 + * You should have received a copy of the GNU General Public License
3615 + * along with this program; if not, write to the Free Software
3616 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3618 + * Copyright (C) 2008 by Openmoko, Inc.
3619 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
3620 + * All rights reserved.
3622 + * This filter is useful to reject samples that are not reliable. We consider
3623 + * that a sample is not reliable if it deviates form the Majority.
3625 + * 1) We collect S samples.
3627 + * 2) For each dimension:
3629 + * - We sort the points.
3630 + * - Points that are "close enough" are considered to be in the same set.
3631 + * - We choose the set with more elements. If more than "threshold"
3632 + * points are in this set we use the first and the last point of the set
3633 + * to define the valid range for this dimension [min, max], otherwise we
3634 + * discard all the points and go to step 1.
3636 + * 3) We consider the unsorted S samples and try to feed them to the next
3637 + * filter in the chain. If one of the points of each sample
3638 + * is not in the allowed range for its dimension, we discard the sample.
3642 +#include <linux/kernel.h>
3643 +#include <linux/slab.h>
3644 +#include <linux/sort.h>
3645 +#include "ts_filter_group.h"
3647 +static void ts_filter_group_clear_internal(struct ts_filter_group *tsfg,
3651 + tsfg->tries_left = attempts;
3654 +static void ts_filter_group_clear(struct ts_filter *tsf)
3656 + struct ts_filter_group *tsfg = (struct ts_filter_group *)tsf;
3658 + ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
3660 + if (tsf->next) /* chain */
3661 + (tsf->next->api->clear)(tsf->next);
3664 +static struct ts_filter *ts_filter_group_create(struct platform_device *pdev,
3665 + void *conf, int count_coords)
3667 + struct ts_filter_group *tsfg;
3670 + BUG_ON((count_coords < 1) || (count_coords > MAX_TS_FILTER_COORDS));
3672 + tsfg = kzalloc(sizeof(struct ts_filter_group), GFP_KERNEL);
3676 + tsfg->config = (struct ts_filter_group_configuration *)conf;
3677 + tsfg->tsf.count_coords = count_coords;
3679 + BUG_ON(tsfg->config->attempts <= 0);
3681 + tsfg->samples[0] = kmalloc((2 + count_coords) * sizeof(int) *
3682 + tsfg->config->extent, GFP_KERNEL);
3683 + if (!tsfg->samples[0]) {
3687 + for (i = 1; i < count_coords; ++i)
3688 + tsfg->samples[i] = tsfg->samples[0] + i * tsfg->config->extent;
3689 + tsfg->sorted_samples = tsfg->samples[0] + count_coords *
3690 + tsfg->config->extent;
3691 + tsfg->group_size = tsfg->samples[0] + (1 + count_coords) *
3692 + tsfg->config->extent;
3694 + ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
3696 + printk(KERN_INFO" Created group ts filter len %d depth %d close %d "
3697 + "thresh %d\n", tsfg->config->extent, count_coords,
3698 + tsfg->config->close_enough, tsfg->config->threshold);
3700 + return &tsfg->tsf;
3703 +static void ts_filter_group_destroy(struct platform_device *pdev,
3704 + struct ts_filter *tsf)
3706 + struct ts_filter_group *tsfg = (struct ts_filter_group *)tsf;
3708 + kfree(tsfg->samples[0]); /* first guy has pointer from kmalloc */
3712 +static void ts_filter_group_scale(struct ts_filter *tsf, int *coords)
3715 + (tsf->next->api->scale)(tsf->next, coords);
3718 +static int int_cmp(const void *_a, const void *_b)
3720 + const int *a = _a;
3721 + const int *b = _b;
3730 +static int ts_filter_group_process(struct ts_filter *tsf, int *coords)
3732 + struct ts_filter_group *tsfg = (struct ts_filter_group *)tsf;
3735 + int ret = 0; /* ask for more samples by default */
3737 + BUG_ON(tsfg->N >= tsfg->config->extent);
3739 + for (n = 0; n < tsf->count_coords; n++)
3740 + tsfg->samples[n][tsfg->N] = coords[n];
3742 + if (++tsfg->N < tsfg->config->extent)
3743 + return 0; /* we meed more samples */
3745 + for (n = 0; n < tsfg->tsf.count_coords; n++) {
3746 + int *v = tsfg->sorted_samples;
3752 + memcpy(v, tsfg->samples[n], tsfg->N * sizeof(int));
3753 + sort(v, tsfg->N, sizeof(int), int_cmp, NULL);
3755 + tsfg->group_size[0] = 1;
3756 + for (i = 1; i < tsfg->N; ++i) {
3757 + if (v[i] - v[i - 1] <= tsfg->config->close_enough)
3758 + tsfg->group_size[ngroups]++;
3760 + tsfg->group_size[++ngroups] = 1;
3764 + best_size = tsfg->group_size[0];
3765 + for (i = 1; i < ngroups; i++) {
3766 + idx += tsfg->group_size[i - 1];
3767 + if (best_size < tsfg->group_size[i]) {
3768 + best_size = tsfg->group_size[i];
3773 + if (best_size < tsfg->config->threshold) {
3774 + /* this set is not good enough for us */
3775 + if (--tsfg->tries_left) {
3776 + ts_filter_group_clear_internal
3777 + (tsfg, tsfg->tries_left);
3778 + return 0; /* ask for more samples */
3780 + return -1; /* we give up */
3783 + tsfg->range_min[n] = v[best_idx];
3784 + tsfg->range_max[n] = v[best_idx + best_size - 1];
3787 + for (i = 0; i < tsfg->N; ++i) {
3790 + for (n = 0; n < tsfg->tsf.count_coords; ++n) {
3791 + coords[n] = tsfg->samples[n][i];
3792 + if (coords[n] < tsfg->range_min[n] ||
3793 + coords[n] > tsfg->range_max[n])
3797 + if (n != tsfg->tsf.count_coords) /* sample not OK */
3801 + r = (tsf->next->api->process)(tsf->next, coords);
3806 + } else if (i == tsfg->N - 1) {
3811 + ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
3816 +struct ts_filter_api ts_filter_group_api = {
3817 + .create = ts_filter_group_create,
3818 + .destroy = ts_filter_group_destroy,
3819 + .clear = ts_filter_group_clear,
3820 + .process = ts_filter_group_process,
3821 + .scale = ts_filter_group_scale,
3824 diff --git a/drivers/input/touchscreen/ts_filter_group.h b/drivers/input/touchscreen/ts_filter_group.h
3825 new file mode 100644
3826 index 0000000..c411080
3828 +++ b/drivers/input/touchscreen/ts_filter_group.h
3830 +#ifndef __TS_FILTER_GROUP_H__
3831 +#define __TS_FILTER_GROUP_H__
3833 +#include "ts_filter.h"
3836 + * Touchscreen group filter.
3838 + * Copyright (C) 2008 by Openmoko, Inc.
3839 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
3843 +struct ts_filter_group_configuration {
3850 +struct ts_filter_group {
3851 + struct ts_filter tsf;
3852 + struct ts_filter_group_configuration *config;
3854 + int N; /* How many samples we have */
3855 + int *samples[MAX_TS_FILTER_COORDS]; /* the samples, our input */
3857 + int *group_size; /* used for temporal computations */
3858 + int *sorted_samples; /* used for temporal computations */
3860 + int range_max[MAX_TS_FILTER_COORDS]; /* max computed ranges */
3861 + int range_min[MAX_TS_FILTER_COORDS]; /* min computed ranges */
3863 + int tries_left; /* We finish if we don't get enough samples */
3866 +extern struct ts_filter_api ts_filter_group_api;
3869 diff --git a/drivers/input/touchscreen/ts_filter_linear.c b/drivers/input/touchscreen/ts_filter_linear.c
3870 new file mode 100644
3871 index 0000000..c336252
3873 +++ b/drivers/input/touchscreen/ts_filter_linear.c
3876 + * This program is free software; you can redistribute it and/or modify
3877 + * it under the terms of the GNU General Public License as published by
3878 + * the Free Software Foundation; version 2 of the License, or
3879 + * (at your option) any later version.
3881 + * This program is distributed in the hope that it will be useful,
3882 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
3883 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3884 + * GNU General Public License for more details.
3886 + * You should have received a copy of the GNU General Public License
3887 + * along with this program; if not, write to the Free Software
3888 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3890 + * Copyright (C) 2008 by Openmoko, Inc.
3891 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
3892 + * All rights reserved.
3894 + * Linearly scale touchscreen values.
3896 + * Expose the TS_FILTER_LINEAR_NCONSTANTS for the linear transformation
3901 +#include "ts_filter_linear.h"
3902 +#include <linux/kernel.h>
3903 +#include <linux/slab.h>
3904 +#include <linux/string.h>
3907 +/* sysfs functions */
3910 +static ssize_t const_attr_show(struct kobject *kobj,
3911 + struct attribute *attr,
3914 + struct const_attribute *a = to_const_attr(attr);
3916 + return a->show(to_const_obj(kobj), a, buf);
3919 +static ssize_t const_attr_store(struct kobject *kobj,
3920 + struct attribute *attr,
3921 + const char *buf, size_t len)
3923 + struct const_attribute *a = to_const_attr(attr);
3925 + return a->store(to_const_obj(kobj), a, buf, len);
3928 +static struct sysfs_ops const_sysfs_ops = {
3929 + .show = const_attr_show,
3930 + .store = const_attr_store,
3933 +static void const_release(struct kobject *kobj)
3935 + kfree(to_const_obj(kobj)->tsfl);
3938 +static ssize_t const_show(struct const_obj *obj, struct const_attribute *attr,
3943 + sscanf(attr->attr.name, "%d", &who);
3944 + return sprintf(buf, "%d\n", obj->tsfl->constants[who]);
3947 +static ssize_t const_store(struct const_obj *obj, struct const_attribute *attr,
3948 + const char *buf, size_t count)
3952 + sscanf(attr->attr.name, "%d", &who);
3953 + sscanf(buf, "%d", &obj->tsfl->constants[who]);
3957 +/* filter functions */
3959 +static struct ts_filter *ts_filter_linear_create(struct platform_device *pdev,
3960 + void *conf, int count_coords)
3962 + struct ts_filter_linear *tsfl;
3966 + tsfl = kzalloc(sizeof(struct ts_filter_linear), GFP_KERNEL);
3970 + tsfl->config = (struct ts_filter_linear_configuration *)conf;
3971 + tsfl->tsf.count_coords = count_coords;
3973 + for (i = 0; i < TS_FILTER_LINEAR_NCONSTANTS; ++i) {
3974 + tsfl->constants[i] = tsfl->config->constants[i];
3977 + sprintf(tsfl->attr_names[i], "%d", i);
3978 + tsfl->kattrs[i].attr.name = tsfl->attr_names[i];
3979 + tsfl->kattrs[i].attr.mode = 0666;
3980 + tsfl->kattrs[i].show = const_show;
3981 + tsfl->kattrs[i].store = const_store;
3982 + tsfl->attrs[i] = &tsfl->kattrs[i].attr;
3984 + tsfl->attrs[i] = NULL;
3986 + tsfl->const_ktype.sysfs_ops = &const_sysfs_ops;
3987 + tsfl->const_ktype.release = const_release;
3988 + tsfl->const_ktype.default_attrs = tsfl->attrs;
3989 + tsfl->c_obj.tsfl = tsfl; /* kernel frees tsfl in const_release */
3991 + ret = kobject_init_and_add(&tsfl->c_obj.kobj, &tsfl->const_ktype,
3992 + &pdev->dev.kobj, "calibration");
3994 + kobject_put(&tsfl->c_obj.kobj);
3998 + printk(KERN_INFO" Created Linear ts filter depth %d\n", count_coords);
4000 + return &tsfl->tsf;
4003 +static void ts_filter_linear_destroy(struct platform_device *pdev,
4004 + struct ts_filter *tsf)
4006 + struct ts_filter_linear *tsfl = (struct ts_filter_linear *)tsf;
4008 + /* kernel frees tsfl in const_release */
4009 + kobject_put(&tsfl->c_obj.kobj);
4012 +static void ts_filter_linear_clear(struct ts_filter *tsf)
4014 + if (tsf->next) /* chain */
4015 + (tsf->next->api->clear)(tsf->next);
4019 +static void ts_filter_linear_scale(struct ts_filter *tsf, int *coords)
4021 + struct ts_filter_linear *tsfl = (struct ts_filter_linear *)tsf;
4022 + int *k = tsfl->constants;
4023 + int c0 = coords[tsfl->config->coord0];
4024 + int c1 = coords[tsfl->config->coord1];
4026 + coords[tsfl->config->coord0] = (k[2] + k[0] * c0 + k[1] * c1) / k[6];
4027 + coords[tsfl->config->coord1] = (k[5] + k[3] * c0 + k[4] * c1) / k[6];
4030 + (tsf->next->api->scale)(tsf->next, coords);
4033 +static int ts_filter_linear_process(struct ts_filter *tsf, int *coords)
4036 + return (tsf->next->api->process)(tsf->next, coords);
4041 +struct ts_filter_api ts_filter_linear_api = {
4042 + .create = ts_filter_linear_create,
4043 + .destroy = ts_filter_linear_destroy,
4044 + .clear = ts_filter_linear_clear,
4045 + .process = ts_filter_linear_process,
4046 + .scale = ts_filter_linear_scale,
4048 diff --git a/drivers/input/touchscreen/ts_filter_linear.h b/drivers/input/touchscreen/ts_filter_linear.h
4049 new file mode 100644
4050 index 0000000..fc27cf7
4052 +++ b/drivers/input/touchscreen/ts_filter_linear.h
4054 +#ifndef __TS_FILTER_LINEAR_H__
4055 +#define __TS_FILTER_LINEAR_H__
4057 +#include "ts_filter.h"
4058 +#include <linux/kobject.h>
4061 + * Touchscreen linear filter.
4063 + * Copyright (C) 2008 by Openmoko, Inc.
4064 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
4068 +#define TS_FILTER_LINEAR_NCONSTANTS 7
4072 +struct ts_filter_linear;
4075 + struct ts_filter_linear *tsfl;
4076 + struct kobject kobj;
4079 +#define to_const_obj(x) container_of(x, struct const_obj, kobj)
4081 +struct const_attribute {
4082 + struct attribute attr;
4083 + ssize_t (*show)(struct const_obj *const, struct const_attribute *attr,
4085 + ssize_t (*store)(struct const_obj *const, struct const_attribute *attr,
4086 + const char *buf, size_t count);
4089 +#define to_const_attr(x) container_of(x, struct const_attribute, attr)
4091 +/* filter configuration */
4093 +struct ts_filter_linear_configuration {
4094 + int constants[TS_FILTER_LINEAR_NCONSTANTS];
4101 +struct ts_filter_linear {
4102 + struct ts_filter tsf;
4103 + struct ts_filter_linear_configuration *config;
4105 + int constants[TS_FILTER_LINEAR_NCONSTANTS];
4108 + struct const_obj c_obj;
4109 + struct kobj_type const_ktype;
4110 + struct const_attribute kattrs[TS_FILTER_LINEAR_NCONSTANTS];
4111 + struct attribute *attrs[TS_FILTER_LINEAR_NCONSTANTS + 1];
4112 + char attr_names[TS_FILTER_LINEAR_NCONSTANTS][2];
4115 +extern struct ts_filter_api ts_filter_linear_api;
4118 diff --git a/drivers/input/touchscreen/ts_filter_mean.c b/drivers/input/touchscreen/ts_filter_mean.c
4119 new file mode 100644
4120 index 0000000..e4e0f2a
4122 +++ b/drivers/input/touchscreen/ts_filter_mean.c
4125 + * This program is free software; you can redistribute it and/or modify
4126 + * it under the terms of the GNU General Public License as published by
4127 + * the Free Software Foundation; either version 2 of the License, or
4128 + * (at your option) any later version.
4130 + * This program is distributed in the hope that it will be useful,
4131 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4132 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4133 + * GNU General Public License for more details.
4135 + * You should have received a copy of the GNU General Public License
4136 + * along with this program; if not, write to the Free Software
4137 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4139 + * Copyright (c) 2008 Andy Green <andy@openmoko.com>
4142 + * Mean has no effect if the samples are changing by more that the
4143 + * threshold set by averaging_threshold in the configuration.
4145 + * However while samples come in that don't go outside this threshold from
4146 + * the last reported sample, Mean replaces the samples with a simple mean
4147 + * of a configurable number of samples (set by bits_filter_length in config,
4148 + * which is 2^n, so 5 there makes 32 sample averaging).
4150 + * Mean works well if the input data is already good quality, reducing + / - 1
4151 + * sample jitter when the stylus is still, or moving very slowly, without
4152 + * introducing abrupt transitions or reducing ability to follow larger
4153 + * movements. If you set the threshold higher than the dynamic range of the
4154 + * coordinates, you can just use it as a simple mean average.
4157 +#include <linux/errno.h>
4158 +#include <linux/kernel.h>
4159 +#include <linux/slab.h>
4160 +#include "ts_filter_mean.h"
4162 +static void ts_filter_mean_clear_internal(struct ts_filter *tsf)
4164 + struct ts_filter_mean *tsfs = (struct ts_filter_mean *)tsf;
4167 + for (n = 0; n < tsfs->tsf.count_coords; n++) {
4168 + tsfs->fhead[n] = 0;
4169 + tsfs->ftail[n] = 0;
4170 + tsfs->lowpass[n] = 0;
4174 +static void ts_filter_mean_clear(struct ts_filter *tsf)
4176 + ts_filter_mean_clear_internal(tsf);
4178 + if (tsf->next) /* chain */
4179 + (tsf->next->api->clear)(tsf->next);
4182 +static struct ts_filter *ts_filter_mean_create(struct platform_device *pdev,
4183 + void *config, int count_coords)
4187 + struct ts_filter_mean *tsfs = kzalloc(
4188 + sizeof(struct ts_filter_mean), GFP_KERNEL);
4193 + BUG_ON((count_coords < 1) || (count_coords > MAX_TS_FILTER_COORDS));
4194 + tsfs->tsf.count_coords = count_coords;
4196 + tsfs->config = (struct ts_filter_mean_configuration *)config;
4198 + tsfs->config->extent = 1 << tsfs->config->bits_filter_length;
4199 + BUG_ON((tsfs->config->extent > 256) || (!tsfs->config->extent));
4201 + p = kmalloc(tsfs->config->extent * sizeof(int) * count_coords,
4206 + for (n = 0; n < count_coords; n++) {
4207 + tsfs->fifo[n] = p;
4208 + p += tsfs->config->extent;
4211 + if (!tsfs->config->averaging_threshold)
4212 + tsfs->config->averaging_threshold = 0xffff; /* always active */
4214 + ts_filter_mean_clear_internal(&tsfs->tsf);
4216 + printk(KERN_INFO" Created Mean ts filter len %d depth %d thresh %d\n",
4217 + tsfs->config->extent, count_coords,
4218 + tsfs->config->averaging_threshold);
4220 + return &tsfs->tsf;
4223 +static void ts_filter_mean_destroy(struct platform_device *pdev,
4224 + struct ts_filter *tsf)
4226 + struct ts_filter_mean *tsfs = (struct ts_filter_mean *)tsf;
4228 + kfree(tsfs->fifo[0]); /* first guy has pointer from kmalloc */
4232 +static void ts_filter_mean_scale(struct ts_filter *tsf, int *coords)
4234 + if (tsf->next) /* chain */
4235 + (tsf->next->api->scale)(tsf->next, coords);
4239 + * Give us the raw sample data in x and y, and if we return 1 then you can
4240 + * get a filtered coordinate from tsm->x and tsm->y. If we return 0 you didn't
4241 + * fill the filter with samples yet.
4244 +static int ts_filter_mean_process(struct ts_filter *tsf, int *coords)
4246 + struct ts_filter_mean *tsfs = (struct ts_filter_mean *)tsf;
4250 + for (n = 0; n < tsf->count_coords; n++) {
4253 + * Has he moved far enough away that we should abandon current
4254 + * low pass filtering state?
4256 + if ((coords[n] < (tsfs->reported[n] -
4257 + tsfs->config->averaging_threshold)) ||
4258 + (coords[n] > (tsfs->reported[n] +
4259 + tsfs->config->averaging_threshold))) {
4260 + tsfs->fhead[n] = 0;
4261 + tsfs->ftail[n] = 0;
4262 + tsfs->lowpass[n] = 0;
4265 + /* capture this sample into fifo and sum */
4266 + tsfs->fifo[n][tsfs->fhead[n]++] = coords[n];
4267 + if (tsfs->fhead[n] == tsfs->config->extent)
4268 + tsfs->fhead[n] = 0;
4269 + tsfs->lowpass[n] += coords[n];
4271 + /* adjust the sum into an average and use that*/
4272 + len = (tsfs->fhead[n] - tsfs->ftail[n]) &
4273 + (tsfs->config->extent - 1);
4274 + coords[n] = (tsfs->lowpass[n] + (len >> 1)) / len;
4275 + tsfs->reported[n] = coords[n];
4277 + /* remove oldest sample if we are full */
4278 + if (len == (tsfs->config->extent - 1)) {
4279 + tsfs->lowpass[n] -= tsfs->fifo[n][tsfs->ftail[n]++];
4280 + if (tsfs->ftail[n] == tsfs->config->extent)
4281 + tsfs->ftail[n] = 0;
4285 + if (tsf->next) /* chain */
4286 + return (tsf->next->api->process)(tsf->next, coords);
4291 +struct ts_filter_api ts_filter_mean_api = {
4292 + .create = ts_filter_mean_create,
4293 + .destroy = ts_filter_mean_destroy,
4294 + .clear = ts_filter_mean_clear,
4295 + .process = ts_filter_mean_process,
4296 + .scale = ts_filter_mean_scale,
4298 diff --git a/drivers/input/touchscreen/ts_filter_mean.h b/drivers/input/touchscreen/ts_filter_mean.h
4299 new file mode 100644
4300 index 0000000..44c506c
4302 +++ b/drivers/input/touchscreen/ts_filter_mean.h
4304 +#ifndef __TS_FILTER_MEAN_H__
4305 +#define __TS_FILTER_MEAN_H__
4307 +#include "ts_filter.h"
4310 + * Touchscreen filter.
4314 + * (c) 2008 Andy Green <andy@openmoko.com>
4317 +struct ts_filter_mean_configuration {
4318 + int bits_filter_length;
4319 + int averaging_threshold;
4324 +struct ts_filter_mean {
4325 + struct ts_filter tsf;
4326 + struct ts_filter_mean_configuration *config;
4328 + int reported[MAX_TS_FILTER_COORDS];
4329 + int lowpass[MAX_TS_FILTER_COORDS];
4330 + int *fifo[MAX_TS_FILTER_COORDS];
4331 + int fhead[MAX_TS_FILTER_COORDS];
4332 + int ftail[MAX_TS_FILTER_COORDS];
4335 +extern struct ts_filter_api ts_filter_mean_api;
4338 diff --git a/drivers/input/touchscreen/ts_filter_median.c b/drivers/input/touchscreen/ts_filter_median.c
4339 new file mode 100644
4340 index 0000000..b3b6a9c
4342 +++ b/drivers/input/touchscreen/ts_filter_median.c
4345 + * This program is free software; you can redistribute it and/or modify
4346 + * it under the terms of the GNU General Public License as published by
4347 + * the Free Software Foundation; either version 2 of the License, or
4348 + * (at your option) any later version.
4350 + * This program is distributed in the hope that it will be useful,
4351 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4352 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4353 + * GNU General Public License for more details.
4355 + * You should have received a copy of the GNU General Public License
4356 + * along with this program; if not, write to the Free Software
4357 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4359 + * Copyright (c) 2008 Andy Green <andy@openmoko.com>
4362 + * Median averaging stuff. We sort incoming raw samples into an array of
4363 + * MEDIAN_SIZE length, discarding the oldest sample each time once we are full.
4364 + * We then return the sum of the middle three samples for X and Y. It means
4365 + * the final result must be divided by (3 * scaling factor) to correct for
4366 + * avoiding the repeated /3.
4368 + * This strongly rejects brief excursions away from a central point that is
4369 + * sticky in time compared to the excursion duration.
4371 + * Thanks to Dale Schumacher (who wrote some example code) and Carl-Daniel
4372 + * Halifinger who pointed out this would be a good method.
4375 +#include <linux/errno.h>
4376 +#include <linux/kernel.h>
4377 +#include <linux/slab.h>
4378 +#include "ts_filter_median.h"
4380 +static void ts_filter_median_insert(int *p, int sample, int count)
4384 + /* search through what we got so far to find where to put sample */
4385 + for (n = 0; n < count; n++)
4386 + /* we met somebody bigger than us? */
4387 + if (sample < p[n]) {
4388 + /* starting from the end, push bigger guys down one */
4389 + for (count--; count >= n; count--)
4390 + p[count + 1] = p[count];
4391 + p[n] = sample; /* and put us in place of first bigger */
4395 + p[count] = sample; /* nobody was bigger than us, add us on the end */
4398 +static void ts_filter_median_del(int *p, int value, int count)
4402 + for (index = 0; index < count; index++)
4403 + if (p[index] == value) {
4404 + for (; index < count; index++)
4405 + p[index] = p[index + 1];
4411 +static void ts_filter_median_clear_internal(struct ts_filter *tsf)
4413 + struct ts_filter_median *tsfm = (struct ts_filter_median *)tsf;
4419 +static void ts_filter_median_clear(struct ts_filter *tsf)
4421 + ts_filter_median_clear_internal(tsf);
4423 + if (tsf->next) /* chain */
4424 + (tsf->next->api->clear)(tsf->next);
4427 +static struct ts_filter *ts_filter_median_create(struct platform_device *pdev,
4428 + void *conf, int count_coords)
4432 + struct ts_filter_median *tsfm = kzalloc(sizeof(struct ts_filter_median),
4438 + tsfm->config = (struct ts_filter_median_configuration *)conf;
4439 + BUG_ON((count_coords < 1) || (count_coords > MAX_TS_FILTER_COORDS));
4440 + tsfm->tsf.count_coords = count_coords;
4442 + tsfm->config->midpoint = (tsfm->config->extent >> 1) + 1;
4444 + p = kmalloc(2 * count_coords * sizeof(int) * (tsfm->config->extent + 1),
4451 + for (n = 0; n < count_coords; n++) {
4452 + tsfm->sort[n] = p;
4453 + p += tsfm->config->extent + 1;
4454 + tsfm->fifo[n] = p;
4455 + p += tsfm->config->extent + 1;
4458 + ts_filter_median_clear_internal(&tsfm->tsf);
4460 + printk(KERN_INFO" Created Median ts filter len %d depth %d dec %d\n",
4461 + tsfm->config->extent, count_coords,
4462 + tsfm->config->decimation_threshold);
4464 + return &tsfm->tsf;
4467 +static void ts_filter_median_destroy(struct platform_device *pdev,
4468 + struct ts_filter *tsf)
4470 + struct ts_filter_median *tsfm = (struct ts_filter_median *)tsf;
4472 + kfree(tsfm->sort[0]); /* first guy has pointer from kmalloc */
4476 +static void ts_filter_median_scale(struct ts_filter *tsf, int *coords)
4480 + for (n = 0; n < tsf->count_coords; n++)
4481 + coords[n] = (coords[n] + 2) / 3;
4483 + if (tsf->next) /* chain */
4484 + (tsf->next->api->scale)(tsf->next, coords);
4488 + * Give us the raw sample data coords, and if we return 1 then you can
4489 + * get a filtered coordinate from coords. If we return 0 you didn't
4490 + * fill all the filters with samples yet.
4493 +static int ts_filter_median_process(struct ts_filter *tsf, int *coords)
4495 + struct ts_filter_median *tsfm = (struct ts_filter_median *)tsf;
4499 + for (n = 0; n < tsf->count_coords; n++) {
4500 + /* grab copy in insertion order to remove when oldest */
4501 + tsfm->fifo[n][tsfm->pos] = coords[n];
4502 + /* insert these samples in sorted order in the median arrays */
4503 + ts_filter_median_insert(tsfm->sort[n], coords[n], tsfm->valid);
4505 + /* move us on in the fifo */
4506 + if (++tsfm->pos == (tsfm->config->extent + 1))
4509 + /* we have finished a median sampling? */
4510 + if (++tsfm->valid != tsfm->config->extent)
4511 + return 0; /* no valid sample to use */
4513 + /* discard the oldest sample in median sorted array */
4517 + * Sum the middle 3 in the median sorted arrays. We don't divide back
4518 + * down which increases the sum resolution by a factor of 3 until the
4519 + * scale API is called.
4521 + for (n = 0; n < tsfm->tsf.count_coords; n++)
4522 + /* perform the deletion of the oldest sample */
4523 + ts_filter_median_del(tsfm->sort[n], tsfm->fifo[n][tsfm->pos],
4526 + tsfm->decimation_count--;
4527 + if (tsfm->decimation_count >= 0)
4530 + for (n = 0; n < tsfm->tsf.count_coords; n++) {
4531 + /* give the coordinate result from summing median 3 */
4532 + coords[n] = tsfm->sort[n][tsfm->config->midpoint - 1] +
4533 + tsfm->sort[n][tsfm->config->midpoint] +
4534 + tsfm->sort[n][tsfm->config->midpoint + 1]
4537 + movement += abs(tsfm->last_issued[n] - coords[n]);
4540 + if (movement > tsfm->config->decimation_threshold) /* fast */
4541 + tsfm->decimation_count = tsfm->config->decimation_above;
4543 + tsfm->decimation_count = tsfm->config->decimation_below;
4545 + memcpy(&tsfm->last_issued[0], coords,
4546 + tsfm->tsf.count_coords * sizeof(int));
4548 + if (tsf->next) /* chain */
4549 + return (tsf->next->api->process)(tsf->next, coords);
4554 +struct ts_filter_api ts_filter_median_api = {
4555 + .create = ts_filter_median_create,
4556 + .destroy = ts_filter_median_destroy,
4557 + .clear = ts_filter_median_clear,
4558 + .process = ts_filter_median_process,
4559 + .scale = ts_filter_median_scale,
4561 diff --git a/drivers/input/touchscreen/ts_filter_median.h b/drivers/input/touchscreen/ts_filter_median.h
4562 new file mode 100644
4563 index 0000000..8f25e27
4565 +++ b/drivers/input/touchscreen/ts_filter_median.h
4567 +#ifndef __TS_FILTER_MEDIAN_H__
4568 +#define __TS_FILTER_MEDIAN_H__
4570 +#include "ts_filter.h"
4573 + * Touchscreen filter.
4577 + * (c) 2008 Andy Green <andy@openmoko.com>
4580 +struct ts_filter_median_configuration {
4583 + int decimation_threshold;
4584 + int decimation_above;
4585 + int decimation_below;
4588 +struct ts_filter_median {
4589 + struct ts_filter tsf;
4590 + struct ts_filter_median_configuration *config;
4592 + int decimation_count;
4593 + int last_issued[MAX_TS_FILTER_COORDS];
4594 + int valid; /* how many samples in the sort buffer are valid */
4595 + int *sort[MAX_TS_FILTER_COORDS]; /* samples taken for median */
4596 + int *fifo[MAX_TS_FILTER_COORDS]; /* samples taken for median */
4597 + int pos; /* where we are in the fifo sample memory */
4600 +extern struct ts_filter_api ts_filter_median_api;
4603 diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
4604 index 26fc098..2449230 100644
4605 --- a/drivers/mmc/core/sd.c
4606 +++ b/drivers/mmc/core/sd.c
4607 @@ -449,6 +449,11 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
4611 +#ifdef CONFIG_MACH_MINI2440
4612 + /* Prevents the -110 error at startup/insertion */
4617 * Fetch switch information from card.
4619 diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig
4620 index 39ac49e..34834ed 100644
4621 --- a/drivers/video/logo/Kconfig
4622 +++ b/drivers/video/logo/Kconfig
4623 @@ -82,4 +82,9 @@ config LOGO_M32R_CLUT224
4627 +config LOGO_ARMWORKS_CLUT224
4628 + bool "Armworks 224-color logo"
4629 + depends on MACH_MINI2440
4633 diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile
4634 index b91251d..4d0423f 100644
4635 --- a/drivers/video/logo/Makefile
4636 +++ b/drivers/video/logo/Makefile
4637 @@ -15,6 +15,7 @@ obj-$(CONFIG_LOGO_SUPERH_MONO) += logo_superh_mono.o
4638 obj-$(CONFIG_LOGO_SUPERH_VGA16) += logo_superh_vga16.o
4639 obj-$(CONFIG_LOGO_SUPERH_CLUT224) += logo_superh_clut224.o
4640 obj-$(CONFIG_LOGO_M32R_CLUT224) += logo_m32r_clut224.o
4641 +obj-$(CONFIG_LOGO_ARMWORKS_CLUT224) += logo_armworks_clut224.o
4643 obj-$(CONFIG_SPU_BASE) += logo_spe_clut224.o
4645 diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c
4646 index 2e85a2b..40b5e31 100644
4647 --- a/drivers/video/logo/logo.c
4648 +++ b/drivers/video/logo/logo.c
4649 @@ -35,6 +35,7 @@ extern const struct linux_logo logo_superh_mono;
4650 extern const struct linux_logo logo_superh_vga16;
4651 extern const struct linux_logo logo_superh_clut224;
4652 extern const struct linux_logo logo_m32r_clut224;
4653 +extern const struct linux_logo logo_armworks_clut224;
4656 module_param(nologo, bool, 0);
4657 @@ -115,6 +116,10 @@ const struct linux_logo * __init_refok fb_find_logo(int depth)
4658 /* M32R Linux logo */
4659 logo = &logo_m32r_clut224;
4661 +#ifdef CONFIG_LOGO_ARMWORKS_CLUT224
4662 + /* ARMWorks Linux logo */
4663 + logo = &logo_armworks_clut224;
4668 diff --git a/drivers/video/logo/logo_armworks_clut224.ppm b/drivers/video/logo/logo_armworks_clut224.ppm
4669 new file mode 100644
4670 index 0000000..a632167
4672 +++ b/drivers/video/logo/logo_armworks_clut224.ppm
4675 +# CREATOR: GIMP PNM Filter Version 1.1