1 diff --git a/Makefile b/Makefile
2 index df6ce3e..0addac9 100644
5 @@ -190,8 +190,11 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
6 # Default value for CROSS_COMPILE is not to prefix executables
7 # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
8 export KBUILD_BUILDHOST := $(SUBARCH)
15 +CROSS_COMPILE ?= /opt/build/arm-gcc/arm-angstrom-linux-gnueabi-
17 # Architecture as present in compile.h
18 UTS_MACHINE := $(ARCH)
19 diff --git a/arch/arm/Makefile b/arch/arm/Makefile
20 index 24e0f01..f47f9c9 100644
21 --- a/arch/arm/Makefile
22 +++ b/arch/arm/Makefile
23 @@ -68,7 +68,7 @@ tune-$(CONFIG_CPU_ARM740T) :=-mtune=arm7tdmi
24 tune-$(CONFIG_CPU_ARM9TDMI) :=-mtune=arm9tdmi
25 tune-$(CONFIG_CPU_ARM940T) :=-mtune=arm9tdmi
26 tune-$(CONFIG_CPU_ARM946E) :=$(call cc-option,-mtune=arm9e,-mtune=arm9tdmi)
27 -tune-$(CONFIG_CPU_ARM920T) :=-mtune=arm9tdmi
28 +tune-$(CONFIG_CPU_ARM920T) :=-mtune=arm920t
29 tune-$(CONFIG_CPU_ARM922T) :=-mtune=arm9tdmi
30 tune-$(CONFIG_CPU_ARM925T) :=-mtune=arm9tdmi
31 tune-$(CONFIG_CPU_ARM926T) :=-mtune=arm9tdmi
32 diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile
33 index da226ab..f260407 100644
34 --- a/arch/arm/boot/Makefile
35 +++ b/arch/arm/boot/Makefile
36 @@ -55,6 +55,8 @@ $(obj)/compressed/vmlinux: $(obj)/Image FORCE
38 $(obj)/zImage: $(obj)/compressed/vmlinux FORCE
39 $(call if_changed,objcopy)
40 + mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d $(obj)/zImage /tftpboot/uImage
41 + dd bs=512 if=/tftpboot/uImage of=/tftpboot/uImage-nand512 conv=sync
42 @echo ' Kernel: $@ is ready'
45 diff --git a/arch/arm/configs/mini2440_defconfig b/arch/arm/configs/mini2440_defconfig
47 index 0000000..03d2b24
49 +++ b/arch/arm/configs/mini2440_defconfig
52 +# Automatically generated make config: don't edit
53 +# Linux kernel version: 2.6.29-rc5
54 +# Tue Feb 17 15:40:14 2009
58 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
59 +CONFIG_GENERIC_GPIO=y
60 +# CONFIG_GENERIC_TIME is not set
61 +# CONFIG_GENERIC_CLOCKEVENTS is not set
64 +CONFIG_GENERIC_HARDIRQS=y
65 +CONFIG_STACKTRACE_SUPPORT=y
66 +CONFIG_HAVE_LATENCYTOP_SUPPORT=y
67 +CONFIG_LOCKDEP_SUPPORT=y
68 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
69 +CONFIG_HARDIRQS_SW_RESEND=y
70 +CONFIG_GENERIC_IRQ_PROBE=y
71 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
72 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
73 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
74 +CONFIG_GENERIC_HWEIGHT=y
75 +CONFIG_GENERIC_CALIBRATE_DELAY=y
76 +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
77 +CONFIG_VECTORS_BASE=0xffff0000
78 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
83 +CONFIG_EXPERIMENTAL=y
84 +CONFIG_BROKEN_ON_SMP=y
86 +CONFIG_INIT_ENV_ARG_LIMIT=32
87 +CONFIG_LOCALVERSION="-michel"
88 +# CONFIG_LOCALVERSION_AUTO is not set
91 +CONFIG_SYSVIPC_SYSCTL=y
92 +CONFIG_POSIX_MQUEUE=y
93 +CONFIG_BSD_PROCESS_ACCT=y
94 +CONFIG_BSD_PROCESS_ACCT_V3=y
96 +# CONFIG_TASK_DELAY_ACCT is not set
98 +CONFIG_TASK_IO_ACCOUNTING=y
104 +CONFIG_CLASSIC_RCU=y
105 +# CONFIG_TREE_RCU is not set
106 +# CONFIG_PREEMPT_RCU is not set
107 +# CONFIG_TREE_RCU_TRACE is not set
108 +# CONFIG_PREEMPT_RCU_TRACE is not set
109 +# CONFIG_IKCONFIG is not set
110 +CONFIG_LOG_BUF_SHIFT=17
111 +CONFIG_GROUP_SCHED=y
112 +CONFIG_FAIR_GROUP_SCHED=y
113 +CONFIG_RT_GROUP_SCHED=y
114 +# CONFIG_USER_SCHED is not set
115 +CONFIG_CGROUP_SCHED=y
117 +# CONFIG_CGROUP_DEBUG is not set
119 +# CONFIG_CGROUP_FREEZER is not set
120 +# CONFIG_CGROUP_DEVICE is not set
121 +CONFIG_CGROUP_CPUACCT=y
122 +CONFIG_RESOURCE_COUNTERS=y
123 +CONFIG_CGROUP_MEM_RES_CTLR=y
124 +# CONFIG_CGROUP_MEM_RES_CTLR_SWAP is not set
126 +# CONFIG_SYSFS_DEPRECATED_V2 is not set
131 +# CONFIG_USER_NS is not set
132 +# CONFIG_PID_NS is not set
133 +# CONFIG_NET_NS is not set
134 +CONFIG_BLK_DEV_INITRD=y
135 +CONFIG_INITRAMFS_SOURCE=""
136 +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
138 +# CONFIG_EMBEDDED is not set
140 +CONFIG_SYSCTL_SYSCALL=y
142 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
147 +# CONFIG_COMPAT_BRK is not set
150 +CONFIG_ANON_INODES=y
157 +CONFIG_VM_EVENT_COUNTERS=y
159 +# CONFIG_SLAB is not set
161 +# CONFIG_SLOB is not set
163 +CONFIG_TRACEPOINTS=y
166 +CONFIG_HAVE_OPROFILE=y
169 +CONFIG_HAVE_KPROBES=y
170 +CONFIG_HAVE_KRETPROBES=y
172 +CONFIG_HAVE_GENERIC_DMA_COHERENT=y
177 +# CONFIG_MODULE_FORCE_LOAD is not set
178 +CONFIG_MODULE_UNLOAD=y
179 +# CONFIG_MODULE_FORCE_UNLOAD is not set
180 +CONFIG_MODVERSIONS=y
181 +CONFIG_MODULE_SRCVERSION_ALL=y
184 +CONFIG_BLK_DEV_IO_TRACE=y
185 +# CONFIG_BLK_DEV_BSG is not set
186 +CONFIG_BLK_DEV_INTEGRITY=y
191 +CONFIG_IOSCHED_NOOP=y
193 +CONFIG_IOSCHED_DEADLINE=y
194 +CONFIG_IOSCHED_CFQ=y
195 +# CONFIG_DEFAULT_AS is not set
196 +# CONFIG_DEFAULT_DEADLINE is not set
197 +CONFIG_DEFAULT_CFQ=y
198 +# CONFIG_DEFAULT_NOOP is not set
199 +CONFIG_DEFAULT_IOSCHED="cfq"
205 +# CONFIG_ARCH_AAEC2000 is not set
206 +# CONFIG_ARCH_INTEGRATOR is not set
207 +# CONFIG_ARCH_REALVIEW is not set
208 +# CONFIG_ARCH_VERSATILE is not set
209 +# CONFIG_ARCH_AT91 is not set
210 +# CONFIG_ARCH_CLPS711X is not set
211 +# CONFIG_ARCH_EBSA110 is not set
212 +# CONFIG_ARCH_EP93XX is not set
213 +# CONFIG_ARCH_FOOTBRIDGE is not set
214 +# CONFIG_ARCH_NETX is not set
215 +# CONFIG_ARCH_H720X is not set
216 +# CONFIG_ARCH_IMX is not set
217 +# CONFIG_ARCH_IOP13XX is not set
218 +# CONFIG_ARCH_IOP32X is not set
219 +# CONFIG_ARCH_IOP33X is not set
220 +# CONFIG_ARCH_IXP23XX is not set
221 +# CONFIG_ARCH_IXP2000 is not set
222 +# CONFIG_ARCH_IXP4XX is not set
223 +# CONFIG_ARCH_L7200 is not set
224 +# CONFIG_ARCH_KIRKWOOD is not set
225 +# CONFIG_ARCH_KS8695 is not set
226 +# CONFIG_ARCH_NS9XXX is not set
227 +# CONFIG_ARCH_LOKI is not set
228 +# CONFIG_ARCH_MV78XX0 is not set
229 +# CONFIG_ARCH_MXC is not set
230 +# CONFIG_ARCH_ORION5X is not set
231 +# CONFIG_ARCH_PNX4008 is not set
232 +# CONFIG_ARCH_PXA is not set
233 +# CONFIG_ARCH_RPC is not set
234 +# CONFIG_ARCH_SA1100 is not set
235 +CONFIG_ARCH_S3C2410=y
236 +# CONFIG_ARCH_S3C64XX is not set
237 +# CONFIG_ARCH_SHARK is not set
238 +# CONFIG_ARCH_LH7A40X is not set
239 +# CONFIG_ARCH_DAVINCI is not set
240 +# CONFIG_ARCH_OMAP is not set
241 +# CONFIG_ARCH_MSM is not set
242 +# CONFIG_ARCH_W90X900 is not set
243 +CONFIG_PLAT_S3C24XX=y
244 +CONFIG_S3C2410_CLOCK=y
245 +CONFIG_CPU_S3C244X=y
246 +CONFIG_S3C24XX_PWM=y
247 +CONFIG_S3C24XX_GPIO_EXTRA=0
248 +CONFIG_S3C2410_DMA=y
249 +# CONFIG_S3C2410_DMA_DEBUG is not set
250 +CONFIG_S3C24XX_ADC=y
252 +CONFIG_CPU_LLSERIAL_S3C2440_ONLY=y
253 +CONFIG_CPU_LLSERIAL_S3C2440=y
258 +# CONFIG_S3C_BOOT_WATCHDOG is not set
259 +# CONFIG_S3C_BOOT_ERROR_RESET is not set
260 +CONFIG_S3C_BOOT_UART_FORCE_FIFO=y
265 +# CONFIG_S3C2410_PM_DEBUG is not set
266 +# CONFIG_S3C2410_PM_CHECK is not set
267 +CONFIG_S3C_LOWLEVEL_UART_PORT=0
268 +CONFIG_S3C_GPIO_SPACE=0
274 +CONFIG_S3C2410_GPIO=y
279 +# CONFIG_ARCH_SMDK2410 is not set
280 +# CONFIG_ARCH_H1940 is not set
281 +# CONFIG_MACH_N30 is not set
282 +# CONFIG_ARCH_BAST is not set
283 +# CONFIG_MACH_OTOM is not set
284 +# CONFIG_MACH_AML_M5900 is not set
285 +# CONFIG_MACH_TCT_HAMMER is not set
286 +# CONFIG_MACH_VR1000 is not set
287 +# CONFIG_MACH_QT2410 is not set
292 +# CONFIG_MACH_JIVE is not set
293 +# CONFIG_MACH_SMDK2413 is not set
294 +# CONFIG_MACH_SMDK2412 is not set
295 +# CONFIG_MACH_VSTMS is not set
296 +CONFIG_CPU_S3C2440=y
297 +CONFIG_S3C2440_DMA=y
302 +# CONFIG_MACH_ANUBIS is not set
303 +# CONFIG_MACH_OSIRIS is not set
304 +# CONFIG_MACH_RX3715 is not set
305 +# CONFIG_ARCH_S3C2440 is not set
306 +# CONFIG_MACH_NEXCODER_2440 is not set
307 +# CONFIG_MACH_AT2440EVB is not set
308 +CONFIG_MACH_MINI2440=y
317 +# CONFIG_MACH_SMDK2443 is not set
323 +CONFIG_CPU_ARM920T=y
325 +CONFIG_CPU_ABRT_EV4T=y
326 +CONFIG_CPU_PABRT_NOIFAR=y
327 +CONFIG_CPU_CACHE_V4WT=y
328 +CONFIG_CPU_CACHE_VIVT=y
329 +CONFIG_CPU_COPY_V4WB=y
330 +CONFIG_CPU_TLB_V4WBI=y
332 +CONFIG_CPU_CP15_MMU=y
335 +# Processor Features
338 +# CONFIG_CPU_ICACHE_DISABLE is not set
339 +# CONFIG_CPU_DCACHE_DISABLE is not set
340 +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
341 +# CONFIG_OUTER_CACHE is not set
346 +# CONFIG_PCI_SYSCALL is not set
347 +# CONFIG_ARCH_SUPPORTS_MSI is not set
348 +# CONFIG_PCCARD is not set
354 +# CONFIG_VMSPLIT_2G is not set
355 +# CONFIG_VMSPLIT_1G is not set
356 +CONFIG_PAGE_OFFSET=0xC0000000
360 +CONFIG_OABI_COMPAT=y
361 +CONFIG_ARCH_FLATMEM_HAS_HOLES=y
362 +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
363 +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
364 +CONFIG_SELECT_MEMORY_MODEL=y
365 +CONFIG_FLATMEM_MANUAL=y
366 +# CONFIG_DISCONTIGMEM_MANUAL is not set
367 +# CONFIG_SPARSEMEM_MANUAL is not set
369 +CONFIG_FLAT_NODE_MEM_MAP=y
370 +CONFIG_PAGEFLAGS_EXTENDED=y
371 +CONFIG_SPLIT_PTLOCK_CPUS=4096
372 +# CONFIG_PHYS_ADDR_T_64BIT is not set
373 +CONFIG_ZONE_DMA_FLAG=0
374 +CONFIG_VIRT_TO_BUS=y
375 +CONFIG_UNEVICTABLE_LRU=y
376 +CONFIG_ALIGNMENT_TRAP=y
381 +CONFIG_ZBOOT_ROM_TEXT=0
382 +CONFIG_ZBOOT_ROM_BSS=0
384 +# CONFIG_XIP_KERNEL is not set
389 +# CPU Power Management
392 +CONFIG_CPU_IDLE_GOV_LADDER=y
395 +# Floating point emulation
399 +# At least one emulation must be selected
402 +CONFIG_FPE_NWFPE_XP=y
403 +CONFIG_FPE_FASTFPE=y
406 +# Userspace binary formats
409 +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
411 +CONFIG_BINFMT_AOUT=m
412 +CONFIG_BINFMT_MISC=m
415 +# Power management options
418 +# CONFIG_PM_DEBUG is not set
421 +CONFIG_SUSPEND_FREEZER=y
422 +CONFIG_APM_EMULATION=y
423 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
427 +# Networking options
429 +CONFIG_COMPAT_NET_DEV_OPS=y
431 +CONFIG_PACKET_MMAP=y
435 +# CONFIG_XFRM_SUB_POLICY is not set
436 +# CONFIG_XFRM_MIGRATE is not set
437 +# CONFIG_XFRM_STATISTICS is not set
439 +# CONFIG_NET_KEY_MIGRATE is not set
441 +CONFIG_IP_MULTICAST=y
442 +CONFIG_IP_ADVANCED_ROUTER=y
443 +CONFIG_ASK_IP_FIB_HASH=y
444 +# CONFIG_IP_FIB_TRIE is not set
445 +CONFIG_IP_FIB_HASH=y
446 +CONFIG_IP_MULTIPLE_TABLES=y
447 +CONFIG_IP_ROUTE_MULTIPATH=y
448 +CONFIG_IP_ROUTE_VERBOSE=y
450 +CONFIG_IP_PNP_DHCP=y
451 +CONFIG_IP_PNP_BOOTP=y
452 +CONFIG_IP_PNP_RARP=y
453 +# CONFIG_NET_IPIP is not set
454 +# CONFIG_NET_IPGRE is not set
456 +CONFIG_IP_PIMSM_V1=y
457 +CONFIG_IP_PIMSM_V2=y
458 +# CONFIG_ARPD is not set
459 +CONFIG_SYN_COOKIES=y
460 +# CONFIG_INET_AH is not set
461 +# CONFIG_INET_ESP is not set
462 +# CONFIG_INET_IPCOMP is not set
463 +# CONFIG_INET_XFRM_TUNNEL is not set
464 +# CONFIG_INET_TUNNEL is not set
465 +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
466 +# CONFIG_INET_XFRM_MODE_TUNNEL is not set
467 +# CONFIG_INET_XFRM_MODE_BEET is not set
468 +# CONFIG_INET_LRO is not set
470 +CONFIG_INET_TCP_DIAG=y
471 +CONFIG_TCP_CONG_ADVANCED=y
472 +CONFIG_TCP_CONG_BIC=m
473 +CONFIG_TCP_CONG_CUBIC=y
474 +CONFIG_TCP_CONG_WESTWOOD=m
475 +CONFIG_TCP_CONG_HTCP=m
476 +CONFIG_TCP_CONG_HSTCP=m
477 +CONFIG_TCP_CONG_HYBLA=m
478 +CONFIG_TCP_CONG_VEGAS=m
479 +CONFIG_TCP_CONG_SCALABLE=m
480 +CONFIG_TCP_CONG_LP=m
481 +CONFIG_TCP_CONG_VENO=m
482 +CONFIG_TCP_CONG_YEAH=m
483 +CONFIG_TCP_CONG_ILLINOIS=m
484 +# CONFIG_DEFAULT_BIC is not set
485 +CONFIG_DEFAULT_CUBIC=y
486 +# CONFIG_DEFAULT_HTCP is not set
487 +# CONFIG_DEFAULT_VEGAS is not set
488 +# CONFIG_DEFAULT_WESTWOOD is not set
489 +# CONFIG_DEFAULT_RENO is not set
490 +CONFIG_DEFAULT_TCP_CONG="cubic"
492 +# CONFIG_IPV6 is not set
493 +CONFIG_NETWORK_SECMARK=y
495 +# CONFIG_NETFILTER_DEBUG is not set
496 +CONFIG_NETFILTER_ADVANCED=y
497 +CONFIG_BRIDGE_NETFILTER=y
500 +# Core Netfilter Configuration
502 +# CONFIG_NETFILTER_NETLINK_QUEUE is not set
503 +# CONFIG_NETFILTER_NETLINK_LOG is not set
504 +# CONFIG_NF_CONNTRACK is not set
505 +CONFIG_NETFILTER_XTABLES=m
506 +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
507 +# CONFIG_NETFILTER_XT_TARGET_MARK is not set
508 +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
509 +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
510 +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
511 +# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set
512 +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
513 +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
514 +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
515 +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
516 +# CONFIG_NETFILTER_XT_MATCH_ESP is not set
517 +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
518 +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
519 +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
520 +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
521 +# CONFIG_NETFILTER_XT_MATCH_MAC is not set
522 +# CONFIG_NETFILTER_XT_MATCH_MARK is not set
523 +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
524 +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
525 +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
526 +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
527 +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
528 +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
529 +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
530 +# CONFIG_NETFILTER_XT_MATCH_REALM is not set
531 +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
532 +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
533 +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
534 +# CONFIG_NETFILTER_XT_MATCH_STRING is not set
535 +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
536 +# CONFIG_NETFILTER_XT_MATCH_TIME is not set
537 +# CONFIG_NETFILTER_XT_MATCH_U32 is not set
538 +# CONFIG_IP_VS is not set
541 +# IP: Netfilter Configuration
543 +# CONFIG_NF_DEFRAG_IPV4 is not set
544 +CONFIG_IP_NF_QUEUE=y
545 +# CONFIG_IP_NF_IPTABLES is not set
546 +CONFIG_IP_NF_ARPTABLES=m
547 +# CONFIG_IP_NF_ARPFILTER is not set
548 +# CONFIG_IP_NF_ARP_MANGLE is not set
549 +# CONFIG_BRIDGE_NF_EBTABLES is not set
550 +# CONFIG_IP_DCCP is not set
551 +# CONFIG_IP_SCTP is not set
552 +# CONFIG_TIPC is not set
553 +# CONFIG_ATM is not set
557 +# CONFIG_NET_DSA is not set
559 +CONFIG_VLAN_8021Q_GVRP=y
560 +# CONFIG_DECNET is not set
562 +# CONFIG_LLC2 is not set
563 +# CONFIG_IPX is not set
564 +# CONFIG_ATALK is not set
565 +# CONFIG_X25 is not set
566 +# CONFIG_LAPB is not set
567 +# CONFIG_ECONET is not set
568 +# CONFIG_WAN_ROUTER is not set
572 +# Queueing/Scheduling
574 +CONFIG_NET_SCH_CBQ=m
575 +CONFIG_NET_SCH_HTB=m
576 +CONFIG_NET_SCH_HFSC=m
577 +CONFIG_NET_SCH_PRIO=m
578 +# CONFIG_NET_SCH_MULTIQ is not set
579 +CONFIG_NET_SCH_RED=m
580 +CONFIG_NET_SCH_SFQ=m
581 +CONFIG_NET_SCH_TEQL=m
582 +CONFIG_NET_SCH_TBF=m
583 +CONFIG_NET_SCH_GRED=m
584 +CONFIG_NET_SCH_DSMARK=m
585 +CONFIG_NET_SCH_NETEM=m
586 +# CONFIG_NET_SCH_DRR is not set
587 +CONFIG_NET_SCH_INGRESS=m
593 +CONFIG_NET_CLS_BASIC=m
594 +CONFIG_NET_CLS_TCINDEX=m
595 +CONFIG_NET_CLS_ROUTE4=m
596 +CONFIG_NET_CLS_ROUTE=y
598 +CONFIG_NET_CLS_U32=m
599 +# CONFIG_CLS_U32_PERF is not set
600 +CONFIG_CLS_U32_MARK=y
601 +CONFIG_NET_CLS_RSVP=m
602 +CONFIG_NET_CLS_RSVP6=m
603 +# CONFIG_NET_CLS_FLOW is not set
604 +# CONFIG_NET_CLS_CGROUP is not set
606 +CONFIG_NET_EMATCH_STACK=32
607 +CONFIG_NET_EMATCH_CMP=m
608 +CONFIG_NET_EMATCH_NBYTE=m
609 +CONFIG_NET_EMATCH_U32=m
610 +CONFIG_NET_EMATCH_META=m
611 +CONFIG_NET_EMATCH_TEXT=m
612 +CONFIG_NET_CLS_ACT=y
613 +CONFIG_NET_ACT_POLICE=m
614 +CONFIG_NET_ACT_GACT=m
616 +CONFIG_NET_ACT_MIRRED=m
617 +CONFIG_NET_ACT_NAT=m
618 +CONFIG_NET_ACT_PEDIT=m
619 +CONFIG_NET_ACT_SIMP=m
620 +CONFIG_NET_ACT_SKBEDIT=m
621 +# CONFIG_NET_CLS_IND is not set
622 +CONFIG_NET_SCH_FIFO=y
623 +# CONFIG_DCB is not set
629 +CONFIG_NET_TCPPROBE=m
630 +# CONFIG_HAMRADIO is not set
631 +# CONFIG_CAN is not set
632 +# CONFIG_IRDA is not set
637 +CONFIG_BT_RFCOMM_TTY=y
639 +CONFIG_BT_BNEP_MC_FILTER=y
640 +CONFIG_BT_BNEP_PROTO_FILTER=y
644 +# Bluetooth device drivers
646 +CONFIG_BT_HCIBTUSB=y
647 +CONFIG_BT_HCIBTSDIO=y
649 +CONFIG_BT_HCIUART_H4=y
650 +CONFIG_BT_HCIUART_BCSP=y
651 +CONFIG_BT_HCIUART_LL=y
652 +CONFIG_BT_HCIBCM203X=m
653 +CONFIG_BT_HCIBPA10X=m
654 +CONFIG_BT_HCIBFUSB=m
656 +# CONFIG_AF_RXRPC is not set
657 +# CONFIG_PHONET is not set
659 +# CONFIG_WIRELESS is not set
660 +# CONFIG_WIMAX is not set
661 +# CONFIG_RFKILL is not set
662 +# CONFIG_NET_9P is not set
669 +# Generic Driver Options
671 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
673 +CONFIG_PREVENT_FIRMWARE_BUILD=y
675 +# CONFIG_FIRMWARE_IN_KERNEL is not set
676 +CONFIG_EXTRA_FIRMWARE=""
677 +# CONFIG_SYS_HYPERVISOR is not set
679 +CONFIG_PROC_EVENTS=y
681 +# CONFIG_MTD_DEBUG is not set
683 +CONFIG_MTD_PARTITIONS=y
684 +# CONFIG_MTD_TESTS is not set
685 +# CONFIG_MTD_REDBOOT_PARTS is not set
686 +CONFIG_MTD_CMDLINE_PARTS=y
687 +# CONFIG_MTD_AFS_PARTS is not set
688 +# CONFIG_MTD_AR7_PARTS is not set
691 +# User Modules And Translation Layers
694 +CONFIG_MTD_BLKDEVS=y
701 +# CONFIG_SSFDC is not set
702 +# CONFIG_MTD_OOPS is not set
705 +# RAM/ROM/Flash chip drivers
708 +CONFIG_MTD_JEDECPROBE=y
709 +CONFIG_MTD_GEN_PROBE=y
710 +# CONFIG_MTD_CFI_ADV_OPTIONS is not set
711 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
712 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
713 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
714 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
715 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
716 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
719 +# CONFIG_MTD_CFI_I4 is not set
720 +# CONFIG_MTD_CFI_I8 is not set
721 +# CONFIG_MTD_CFI_INTELEXT is not set
722 +CONFIG_MTD_CFI_AMDSTD=y
723 +CONFIG_MTD_CFI_STAA=y
724 +CONFIG_MTD_CFI_UTIL=y
727 +# CONFIG_MTD_ABSENT is not set
730 +# Mapping drivers for chip access
732 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
733 +# CONFIG_MTD_PHYSMAP is not set
734 +# CONFIG_MTD_ARM_INTEGRATOR is not set
735 +# CONFIG_MTD_IMPA7 is not set
736 +# CONFIG_MTD_PLATRAM is not set
739 +# Self-contained MTD device drivers
741 +# CONFIG_MTD_DATAFLASH is not set
742 +# CONFIG_MTD_M25P80 is not set
743 +# CONFIG_MTD_SLRAM is not set
744 +# CONFIG_MTD_PHRAM is not set
745 +# CONFIG_MTD_MTDRAM is not set
746 +# CONFIG_MTD_BLOCK2MTD is not set
749 +# Disk-On-Chip Device Drivers
751 +# CONFIG_MTD_DOC2000 is not set
752 +# CONFIG_MTD_DOC2001 is not set
753 +# CONFIG_MTD_DOC2001PLUS is not set
755 +CONFIG_MTD_NAND_VERIFY_WRITE=y
756 +# CONFIG_MTD_NAND_ECC_SMC is not set
757 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
758 +# CONFIG_MTD_NAND_GPIO is not set
759 +CONFIG_MTD_NAND_IDS=y
760 +CONFIG_MTD_NAND_S3C2410=y
761 +# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
762 +# CONFIG_MTD_NAND_S3C2410_HWECC is not set
763 +# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
764 +# CONFIG_MTD_NAND_DISKONCHIP is not set
765 +# CONFIG_MTD_NAND_NANDSIM is not set
766 +CONFIG_MTD_NAND_PLATFORM=y
767 +# CONFIG_MTD_ALAUDA is not set
768 +# CONFIG_MTD_ONENAND is not set
771 +# LPDDR flash memory drivers
774 +CONFIG_MTD_QINFO_PROBE=y
777 +# UBI - Unsorted block images
779 +# CONFIG_MTD_UBI is not set
780 +# CONFIG_PARPORT is not set
782 +# CONFIG_BLK_DEV_COW_COMMON is not set
783 +CONFIG_BLK_DEV_LOOP=y
784 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
785 +CONFIG_BLK_DEV_NBD=y
786 +# CONFIG_BLK_DEV_UB is not set
787 +CONFIG_BLK_DEV_RAM=y
788 +CONFIG_BLK_DEV_RAM_COUNT=16
789 +CONFIG_BLK_DEV_RAM_SIZE=65536
790 +# CONFIG_BLK_DEV_XIP is not set
791 +CONFIG_CDROM_PKTCDVD=m
792 +CONFIG_CDROM_PKTCDVD_BUFFERS=8
793 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set
794 +# CONFIG_ATA_OVER_ETH is not set
795 +CONFIG_MISC_DEVICES=y
796 +# CONFIG_ICS932S401 is not set
797 +# CONFIG_ENCLOSURE_SERVICES is not set
798 +# CONFIG_C2PORT is not set
803 +CONFIG_EEPROM_AT24=y
804 +# CONFIG_EEPROM_AT25 is not set
805 +# CONFIG_EEPROM_LEGACY is not set
806 +CONFIG_EEPROM_93CX6=y
808 +# CONFIG_IDE is not set
811 +# SCSI device support
813 +# CONFIG_RAID_ATTRS is not set
816 +# CONFIG_SCSI_TGT is not set
817 +# CONFIG_SCSI_NETLINK is not set
818 +# CONFIG_SCSI_PROC_FS is not set
821 +# SCSI support type (disk, tape, CD-ROM)
824 +# CONFIG_CHR_DEV_ST is not set
825 +# CONFIG_CHR_DEV_OSST is not set
826 +# CONFIG_BLK_DEV_SR is not set
828 +# CONFIG_CHR_DEV_SCH is not set
831 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
833 +# CONFIG_SCSI_MULTI_LUN is not set
834 +# CONFIG_SCSI_CONSTANTS is not set
835 +# CONFIG_SCSI_LOGGING is not set
836 +# CONFIG_SCSI_SCAN_ASYNC is not set
837 +CONFIG_SCSI_WAIT_SCAN=m
842 +# CONFIG_SCSI_SPI_ATTRS is not set
843 +# CONFIG_SCSI_FC_ATTRS is not set
844 +# CONFIG_SCSI_ISCSI_ATTRS is not set
845 +# CONFIG_SCSI_SAS_LIBSAS is not set
846 +# CONFIG_SCSI_SRP_ATTRS is not set
847 +# CONFIG_SCSI_LOWLEVEL is not set
848 +# CONFIG_SCSI_DH is not set
849 +# CONFIG_ATA is not set
850 +# CONFIG_MD is not set
852 +# CONFIG_IFB is not set
853 +# CONFIG_DUMMY is not set
854 +# CONFIG_BONDING is not set
855 +# CONFIG_MACVLAN is not set
856 +# CONFIG_EQUALIZER is not set
858 +# CONFIG_VETH is not set
859 +# CONFIG_PHYLIB is not set
860 +CONFIG_NET_ETHERNET=y
862 +# CONFIG_AX88796 is not set
863 +# CONFIG_SMC91X is not set
865 +CONFIG_DM9000_DEBUGLEVEL=4
866 +# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
867 +# CONFIG_ENC28J60 is not set
868 +# CONFIG_SMC911X is not set
869 +# CONFIG_SMSC911X is not set
870 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
871 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
872 +# CONFIG_IBM_NEW_EMAC_TAH is not set
873 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
874 +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
875 +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
876 +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
877 +# CONFIG_B44 is not set
878 +# CONFIG_NETDEV_1000 is not set
879 +# CONFIG_NETDEV_10000 is not set
884 +# CONFIG_WLAN_PRE80211 is not set
885 +# CONFIG_WLAN_80211 is not set
886 +# CONFIG_IWLWIFI_LEDS is not set
889 +# Enable WiMAX (Networking options) to see the WiMAX drivers
893 +# USB Network Adapters
895 +# CONFIG_USB_CATC is not set
896 +# CONFIG_USB_KAWETH is not set
897 +# CONFIG_USB_PEGASUS is not set
898 +# CONFIG_USB_RTL8150 is not set
899 +# CONFIG_USB_USBNET is not set
900 +# CONFIG_WAN is not set
901 +# CONFIG_PPP is not set
902 +# CONFIG_SLIP is not set
903 +# CONFIG_NETCONSOLE is not set
904 +# CONFIG_NETPOLL is not set
905 +# CONFIG_NET_POLL_CONTROLLER is not set
906 +# CONFIG_ISDN is not set
909 +# Input device support
912 +CONFIG_INPUT_FF_MEMLESS=y
913 +# CONFIG_INPUT_POLLDEV is not set
916 +# Userland interfaces
918 +CONFIG_INPUT_MOUSEDEV=y
919 +CONFIG_INPUT_MOUSEDEV_PSAUX=y
920 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
921 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
922 +# CONFIG_INPUT_JOYDEV is not set
923 +CONFIG_INPUT_EVDEV=y
924 +CONFIG_INPUT_EVBUG=y
927 +# Input Device Drivers
929 +CONFIG_INPUT_KEYBOARD=y
930 +# CONFIG_KEYBOARD_ATKBD is not set
931 +# CONFIG_KEYBOARD_SUNKBD is not set
932 +# CONFIG_KEYBOARD_LKKBD is not set
933 +# CONFIG_KEYBOARD_XTKBD is not set
934 +# CONFIG_KEYBOARD_NEWTON is not set
935 +# CONFIG_KEYBOARD_STOWAWAY is not set
936 +CONFIG_KEYBOARD_GPIO=y
937 +CONFIG_INPUT_MOUSE=y
939 +CONFIG_MOUSE_PS2_ALPS=y
940 +CONFIG_MOUSE_PS2_LOGIPS2PP=y
941 +CONFIG_MOUSE_PS2_SYNAPTICS=y
942 +CONFIG_MOUSE_PS2_LIFEBOOK=y
943 +CONFIG_MOUSE_PS2_TRACKPOINT=y
944 +# CONFIG_MOUSE_PS2_ELANTECH is not set
945 +# CONFIG_MOUSE_PS2_TOUCHKIT is not set
946 +# CONFIG_MOUSE_SERIAL is not set
947 +# CONFIG_MOUSE_APPLETOUCH is not set
948 +# CONFIG_MOUSE_BCM5974 is not set
949 +# CONFIG_MOUSE_VSXXXAA is not set
950 +# CONFIG_MOUSE_GPIO is not set
951 +# CONFIG_INPUT_JOYSTICK is not set
952 +# CONFIG_INPUT_TABLET is not set
953 +CONFIG_INPUT_TOUCHSCREEN=y
954 +CONFIG_TOUCHSCREEN_FILTER=y
955 +CONFIG_TOUCHSCREEN_FILTER_GROUP=y
956 +CONFIG_TOUCHSCREEN_FILTER_MEDIAN=y
957 +CONFIG_TOUCHSCREEN_FILTER_MEAN=y
958 +CONFIG_TOUCHSCREEN_FILTER_LINEAR=y
959 +# CONFIG_TOUCHSCREEN_ADS7846 is not set
960 +# CONFIG_TOUCHSCREEN_FUJITSU is not set
961 +CONFIG_TOUCHSCREEN_S3C2410=y
962 +# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
963 +# CONFIG_TOUCHSCREEN_GUNZE is not set
964 +# CONFIG_TOUCHSCREEN_ELO is not set
965 +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
966 +# CONFIG_TOUCHSCREEN_MTOUCH is not set
967 +# CONFIG_TOUCHSCREEN_INEXIO is not set
968 +# CONFIG_TOUCHSCREEN_MK712 is not set
969 +# CONFIG_TOUCHSCREEN_PENMOUNT is not set
970 +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
971 +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
972 +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
973 +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
974 +# CONFIG_TOUCHSCREEN_TSC2007 is not set
975 +# CONFIG_INPUT_MISC is not set
978 +# Hardware I/O ports
981 +CONFIG_SERIO_SERPORT=y
982 +CONFIG_SERIO_LIBPS2=y
984 +# CONFIG_GAMEPORT is not set
990 +CONFIG_CONSOLE_TRANSLATIONS=y
993 +CONFIG_VT_HW_CONSOLE_BINDING=y
995 +# CONFIG_SERIAL_NONSTANDARD is not set
1000 +# CONFIG_SERIAL_8250 is not set
1003 +# Non-8250 serial port support
1005 +CONFIG_SERIAL_SAMSUNG=y
1006 +CONFIG_SERIAL_SAMSUNG_UARTS=3
1007 +CONFIG_SERIAL_SAMSUNG_CONSOLE=y
1008 +CONFIG_SERIAL_S3C2440=y
1009 +CONFIG_SERIAL_CORE=y
1010 +CONFIG_SERIAL_CORE_CONSOLE=y
1011 +CONFIG_UNIX98_PTYS=y
1012 +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
1013 +CONFIG_LEGACY_PTYS=y
1014 +CONFIG_LEGACY_PTY_COUNT=128
1015 +CONFIG_IPMI_HANDLER=m
1016 +# CONFIG_IPMI_PANIC_EVENT is not set
1017 +CONFIG_IPMI_DEVICE_INTERFACE=m
1019 +CONFIG_IPMI_WATCHDOG=m
1020 +CONFIG_IPMI_POWEROFF=m
1022 +# CONFIG_R3964 is not set
1023 +# CONFIG_RAW_DRIVER is not set
1024 +# CONFIG_TCG_TPM is not set
1026 +CONFIG_I2C_BOARDINFO=y
1027 +CONFIG_I2C_CHARDEV=y
1028 +CONFIG_I2C_HELPER_AUTO=y
1029 +CONFIG_I2C_ALGOBIT=y
1032 +# I2C Hardware Bus support
1036 +# I2C system bus drivers (mostly embedded / system-on-chip)
1038 +# CONFIG_I2C_GPIO is not set
1039 +# CONFIG_I2C_OCORES is not set
1040 +CONFIG_I2C_S3C2410=y
1041 +CONFIG_I2C_SIMTEC=y
1044 +# External I2C/SMBus adapter drivers
1046 +# CONFIG_I2C_PARPORT_LIGHT is not set
1047 +# CONFIG_I2C_TAOS_EVM is not set
1048 +# CONFIG_I2C_TINY_USB is not set
1051 +# Other I2C/SMBus bus drivers
1053 +# CONFIG_I2C_PCA_PLATFORM is not set
1054 +# CONFIG_I2C_STUB is not set
1057 +# Miscellaneous I2C Chip support
1059 +# CONFIG_DS1682 is not set
1060 +# CONFIG_SENSORS_PCF8574 is not set
1061 +# CONFIG_PCF8575 is not set
1062 +# CONFIG_SENSORS_PCA9539 is not set
1063 +# CONFIG_SENSORS_PCF8591 is not set
1064 +# CONFIG_SENSORS_MAX6875 is not set
1065 +CONFIG_SENSORS_TSL2550=y
1066 +# CONFIG_I2C_DEBUG_CORE is not set
1067 +# CONFIG_I2C_DEBUG_ALGO is not set
1068 +# CONFIG_I2C_DEBUG_BUS is not set
1069 +# CONFIG_I2C_DEBUG_CHIP is not set
1071 +CONFIG_SPI_MASTER=y
1074 +# SPI Master Controller Drivers
1076 +CONFIG_SPI_BITBANG=y
1077 +# CONFIG_SPI_GPIO is not set
1078 +CONFIG_SPI_S3C24XX=y
1079 +# CONFIG_SPI_S3C24XX_GPIO is not set
1082 +# SPI Protocol Masters
1084 +CONFIG_SPI_SPIDEV=y
1085 +# CONFIG_SPI_TLE62X0 is not set
1086 +CONFIG_ARCH_REQUIRE_GPIOLIB=y
1088 +CONFIG_GPIO_SYSFS=y
1091 +# Memory mapped GPIO expanders:
1095 +# I2C GPIO expanders:
1097 +# CONFIG_GPIO_MAX732X is not set
1098 +# CONFIG_GPIO_PCA953X is not set
1099 +# CONFIG_GPIO_PCF857X is not set
1102 +# PCI GPIO expanders:
1106 +# SPI GPIO expanders:
1108 +# CONFIG_GPIO_MAX7301 is not set
1109 +# CONFIG_GPIO_MCP23S08 is not set
1110 +# CONFIG_W1 is not set
1111 +# CONFIG_POWER_SUPPLY is not set
1112 +# CONFIG_HWMON is not set
1115 +# CONFIG_WATCHDOG_NOWAYOUT is not set
1118 +# Watchdog Device Drivers
1120 +# CONFIG_SOFT_WATCHDOG is not set
1121 +CONFIG_S3C2410_WATCHDOG=y
1124 +# USB-based Watchdog Cards
1126 +# CONFIG_USBPCWATCHDOG is not set
1127 +CONFIG_SSB_POSSIBLE=y
1130 +# Sonics Silicon Backplane
1132 +# CONFIG_SSB is not set
1135 +# Multifunction device drivers
1137 +# CONFIG_MFD_CORE is not set
1138 +# CONFIG_MFD_SM501 is not set
1139 +# CONFIG_MFD_ASIC3 is not set
1140 +# CONFIG_HTC_EGPIO is not set
1141 +# CONFIG_HTC_PASIC3 is not set
1142 +# CONFIG_TPS65010 is not set
1143 +# CONFIG_TWL4030_CORE is not set
1144 +# CONFIG_MFD_TMIO is not set
1145 +# CONFIG_MFD_T7L66XB is not set
1146 +# CONFIG_MFD_TC6387XB is not set
1147 +# CONFIG_MFD_TC6393XB is not set
1148 +# CONFIG_PMIC_DA903X is not set
1149 +# CONFIG_MFD_WM8400 is not set
1150 +# CONFIG_MFD_WM8350_I2C is not set
1151 +# CONFIG_MFD_PCF50633 is not set
1154 +# Multimedia devices
1158 +# Multimedia core support
1160 +# CONFIG_VIDEO_DEV is not set
1161 +# CONFIG_DVB_CORE is not set
1162 +# CONFIG_VIDEO_MEDIA is not set
1165 +# Multimedia drivers
1167 +# CONFIG_DAB is not set
1172 +# CONFIG_VGASTATE is not set
1173 +CONFIG_VIDEO_OUTPUT_CONTROL=y
1175 +CONFIG_FIRMWARE_EDID=y
1176 +# CONFIG_FB_DDC is not set
1177 +# CONFIG_FB_BOOT_VESA_SUPPORT is not set
1178 +CONFIG_FB_CFB_FILLRECT=y
1179 +CONFIG_FB_CFB_COPYAREA=y
1180 +CONFIG_FB_CFB_IMAGEBLIT=y
1181 +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
1182 +# CONFIG_FB_SYS_FILLRECT is not set
1183 +# CONFIG_FB_SYS_COPYAREA is not set
1184 +# CONFIG_FB_SYS_IMAGEBLIT is not set
1185 +# CONFIG_FB_FOREIGN_ENDIAN is not set
1186 +# CONFIG_FB_SYS_FOPS is not set
1187 +# CONFIG_FB_SVGALIB is not set
1188 +# CONFIG_FB_MACMODES is not set
1189 +# CONFIG_FB_BACKLIGHT is not set
1190 +CONFIG_FB_MODE_HELPERS=y
1191 +CONFIG_FB_TILEBLITTING=y
1194 +# Frame buffer hardware drivers
1196 +# CONFIG_FB_UVESA is not set
1197 +# CONFIG_FB_S1D13XXX is not set
1198 +CONFIG_FB_S3C2410=y
1199 +CONFIG_FB_S3C2410_DEBUG=y
1200 +# CONFIG_FB_VIRTUAL is not set
1201 +# CONFIG_FB_METRONOME is not set
1202 +# CONFIG_FB_MB862XX is not set
1203 +CONFIG_BACKLIGHT_LCD_SUPPORT=y
1204 +CONFIG_LCD_CLASS_DEVICE=y
1205 +# CONFIG_LCD_LTV350QV is not set
1206 +# CONFIG_LCD_ILI9320 is not set
1207 +# CONFIG_LCD_TDO24M is not set
1208 +# CONFIG_LCD_VGG2432A4 is not set
1209 +CONFIG_LCD_PLATFORM=y
1210 +CONFIG_BACKLIGHT_CLASS_DEVICE=y
1211 +# CONFIG_BACKLIGHT_GENERIC is not set
1212 +CONFIG_BACKLIGHT_PWM=y
1215 +# Display device support
1217 +CONFIG_DISPLAY_SUPPORT=y
1220 +# Display hardware drivers
1224 +# Console display driver support
1226 +# CONFIG_VGA_CONSOLE is not set
1227 +CONFIG_DUMMY_CONSOLE=y
1228 +CONFIG_FRAMEBUFFER_CONSOLE=y
1229 +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
1230 +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
1232 +# CONFIG_FONT_8x8 is not set
1233 +# CONFIG_FONT_8x16 is not set
1234 +# CONFIG_FONT_6x11 is not set
1235 +# CONFIG_FONT_7x14 is not set
1236 +# CONFIG_FONT_PEARL_8x8 is not set
1237 +# CONFIG_FONT_ACORN_8x8 is not set
1238 +CONFIG_FONT_MINI_4x6=y
1239 +# CONFIG_FONT_SUN8x16 is not set
1240 +# CONFIG_FONT_SUN12x22 is not set
1241 +# CONFIG_FONT_10x18 is not set
1243 +# CONFIG_LOGO_LINUX_MONO is not set
1244 +# CONFIG_LOGO_LINUX_VGA16 is not set
1245 +# CONFIG_LOGO_LINUX_CLUT224 is not set
1246 +CONFIG_LOGO_ARMWORKS_CLUT224=y
1248 +CONFIG_SOUND_OSS_CORE=y
1253 +CONFIG_SND_RAWMIDI=m
1254 +CONFIG_SND_SEQUENCER=m
1255 +CONFIG_SND_SEQ_DUMMY=m
1256 +CONFIG_SND_OSSEMUL=y
1257 +CONFIG_SND_MIXER_OSS=m
1258 +CONFIG_SND_PCM_OSS=m
1259 +CONFIG_SND_PCM_OSS_PLUGINS=y
1260 +CONFIG_SND_SEQUENCER_OSS=y
1261 +CONFIG_SND_DYNAMIC_MINORS=y
1262 +CONFIG_SND_SUPPORT_OLD_API=y
1263 +CONFIG_SND_VERBOSE_PROCFS=y
1264 +# CONFIG_SND_VERBOSE_PRINTK is not set
1265 +# CONFIG_SND_DEBUG is not set
1266 +CONFIG_SND_MPU401_UART=m
1267 +CONFIG_SND_DRIVERS=y
1269 +CONFIG_SND_VIRMIDI=m
1271 +CONFIG_SND_SERIAL_U16550=m
1272 +CONFIG_SND_MPU401=m
1276 +CONFIG_SND_USB_AUDIO=m
1277 +CONFIG_SND_USB_CAIAQ=m
1278 +CONFIG_SND_USB_CAIAQ_INPUT=y
1280 +CONFIG_SND_S3C24XX_SOC=y
1281 +CONFIG_SND_S3C24XX_SOC_I2S=y
1282 +# CONFIG_SND_S3C24XX_SOC_LN2440SBC_ALC650 is not set
1283 +CONFIG_SND_S3C24XX_SOC_S3C24XX_UDA134X=y
1284 +CONFIG_SND_SOC_I2C_AND_SPI=y
1285 +# CONFIG_SND_SOC_ALL_CODECS is not set
1286 +CONFIG_SND_SOC_L3=y
1287 +CONFIG_SND_SOC_UDA134X=y
1288 +# CONFIG_SOUND_PRIME is not set
1289 +CONFIG_HID_SUPPORT=y
1291 +# CONFIG_HID_DEBUG is not set
1295 +# USB Input Devices
1299 +CONFIG_USB_HIDDEV=y
1302 +# Special HID drivers
1304 +CONFIG_HID_COMPAT=y
1305 +CONFIG_HID_A4TECH=y
1307 +CONFIG_HID_BELKIN=y
1308 +CONFIG_HID_CHERRY=y
1309 +CONFIG_HID_CHICONY=y
1310 +CONFIG_HID_CYPRESS=y
1312 +CONFIG_HID_GYRATION=y
1313 +CONFIG_HID_LOGITECH=y
1314 +# CONFIG_LOGITECH_FF is not set
1315 +# CONFIG_LOGIRUMBLEPAD2_FF is not set
1316 +CONFIG_HID_MICROSOFT=y
1317 +CONFIG_HID_MONTEREY=y
1319 +CONFIG_HID_PANTHERLORD=y
1320 +# CONFIG_PANTHERLORD_FF is not set
1321 +CONFIG_HID_PETALYNX=y
1322 +CONFIG_HID_SAMSUNG=y
1324 +CONFIG_HID_SUNPLUS=y
1325 +# CONFIG_GREENASIA_FF is not set
1326 +CONFIG_HID_TOPSEED=y
1327 +# CONFIG_THRUSTMASTER_FF is not set
1328 +# CONFIG_ZEROPLUS_FF is not set
1329 +CONFIG_USB_SUPPORT=y
1330 +CONFIG_USB_ARCH_HAS_HCD=y
1331 +CONFIG_USB_ARCH_HAS_OHCI=y
1332 +# CONFIG_USB_ARCH_HAS_EHCI is not set
1334 +# CONFIG_USB_DEBUG is not set
1335 +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
1338 +# Miscellaneous USB options
1340 +CONFIG_USB_DEVICEFS=y
1341 +# CONFIG_USB_DEVICE_CLASS is not set
1342 +# CONFIG_USB_DYNAMIC_MINORS is not set
1343 +# CONFIG_USB_SUSPEND is not set
1344 +# CONFIG_USB_OTG is not set
1345 +# CONFIG_USB_MON is not set
1346 +# CONFIG_USB_WUSB is not set
1347 +# CONFIG_USB_WUSB_CBAF is not set
1350 +# USB Host Controller Drivers
1352 +# CONFIG_USB_C67X00_HCD is not set
1353 +# CONFIG_USB_OXU210HP_HCD is not set
1354 +# CONFIG_USB_ISP116X_HCD is not set
1355 +CONFIG_USB_OHCI_HCD=y
1356 +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
1357 +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
1358 +CONFIG_USB_OHCI_LITTLE_ENDIAN=y
1359 +# CONFIG_USB_SL811_HCD is not set
1360 +# CONFIG_USB_R8A66597_HCD is not set
1361 +# CONFIG_USB_HWA_HCD is not set
1362 +# CONFIG_USB_MUSB_HDRC is not set
1363 +# CONFIG_USB_GADGET_MUSB_HDRC is not set
1366 +# USB Device Class drivers
1369 +# CONFIG_USB_PRINTER is not set
1371 +# CONFIG_USB_TMC is not set
1374 +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
1378 +# see USB_STORAGE Help for more information
1380 +CONFIG_USB_STORAGE=y
1381 +# CONFIG_USB_STORAGE_DEBUG is not set
1382 +CONFIG_USB_STORAGE_DATAFAB=y
1383 +# CONFIG_USB_STORAGE_FREECOM is not set
1384 +CONFIG_USB_STORAGE_ISD200=y
1385 +CONFIG_USB_STORAGE_USBAT=y
1386 +CONFIG_USB_STORAGE_SDDR09=y
1387 +CONFIG_USB_STORAGE_SDDR55=y
1388 +CONFIG_USB_STORAGE_JUMPSHOT=y
1389 +CONFIG_USB_STORAGE_ALAUDA=y
1390 +# CONFIG_USB_STORAGE_ONETOUCH is not set
1391 +# CONFIG_USB_STORAGE_KARMA is not set
1392 +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
1393 +CONFIG_USB_LIBUSUAL=y
1396 +# USB Imaging devices
1398 +# CONFIG_USB_MDC800 is not set
1399 +# CONFIG_USB_MICROTEK is not set
1404 +# CONFIG_USB_SERIAL is not set
1407 +# USB Miscellaneous drivers
1409 +# CONFIG_USB_EMI62 is not set
1410 +# CONFIG_USB_EMI26 is not set
1411 +# CONFIG_USB_ADUTUX is not set
1412 +# CONFIG_USB_SEVSEG is not set
1413 +# CONFIG_USB_RIO500 is not set
1414 +# CONFIG_USB_LEGOTOWER is not set
1415 +# CONFIG_USB_LCD is not set
1416 +# CONFIG_USB_BERRY_CHARGE is not set
1417 +# CONFIG_USB_LED is not set
1418 +# CONFIG_USB_CYPRESS_CY7C63 is not set
1419 +# CONFIG_USB_CYTHERM is not set
1420 +# CONFIG_USB_PHIDGET is not set
1421 +# CONFIG_USB_IDMOUSE is not set
1422 +# CONFIG_USB_FTDI_ELAN is not set
1423 +# CONFIG_USB_APPLEDISPLAY is not set
1424 +# CONFIG_USB_LD is not set
1425 +# CONFIG_USB_TRANCEVIBRATOR is not set
1426 +# CONFIG_USB_IOWARRIOR is not set
1427 +# CONFIG_USB_TEST is not set
1428 +# CONFIG_USB_ISIGHTFW is not set
1429 +# CONFIG_USB_VST is not set
1430 +CONFIG_USB_GADGET=y
1431 +# CONFIG_USB_GADGET_DEBUG_FILES is not set
1432 +# CONFIG_USB_GADGET_DEBUG_FS is not set
1433 +CONFIG_USB_GADGET_VBUS_DRAW=2
1434 +CONFIG_USB_GADGET_SELECTED=y
1435 +# CONFIG_USB_GADGET_AT91 is not set
1436 +# CONFIG_USB_GADGET_ATMEL_USBA is not set
1437 +# CONFIG_USB_GADGET_FSL_USB2 is not set
1438 +# CONFIG_USB_GADGET_LH7A40X is not set
1439 +# CONFIG_USB_GADGET_OMAP is not set
1440 +# CONFIG_USB_GADGET_PXA25X is not set
1441 +# CONFIG_USB_GADGET_PXA27X is not set
1442 +CONFIG_USB_GADGET_S3C2410=y
1443 +CONFIG_USB_S3C2410=y
1444 +# CONFIG_USB_S3C2410_DEBUG is not set
1445 +# CONFIG_USB_GADGET_IMX is not set
1446 +# CONFIG_USB_GADGET_M66592 is not set
1447 +# CONFIG_USB_GADGET_AMD5536UDC is not set
1448 +# CONFIG_USB_GADGET_FSL_QE is not set
1449 +# CONFIG_USB_GADGET_CI13XXX is not set
1450 +# CONFIG_USB_GADGET_NET2280 is not set
1451 +# CONFIG_USB_GADGET_GOKU is not set
1452 +# CONFIG_USB_GADGET_DUMMY_HCD is not set
1453 +# CONFIG_USB_GADGET_DUALSPEED is not set
1456 +CONFIG_USB_ETH_RNDIS=y
1457 +CONFIG_USB_GADGETFS=m
1458 +CONFIG_USB_FILE_STORAGE=m
1459 +# CONFIG_USB_FILE_STORAGE_TEST is not set
1460 +CONFIG_USB_G_SERIAL=m
1461 +# CONFIG_USB_MIDI_GADGET is not set
1462 +# CONFIG_USB_G_PRINTER is not set
1463 +CONFIG_USB_CDC_COMPOSITE=m
1466 +# OTG and related infrastructure
1468 +# CONFIG_USB_GPIO_VBUS is not set
1470 +# CONFIG_MMC_DEBUG is not set
1471 +# CONFIG_MMC_UNSAFE_RESUME is not set
1474 +# MMC/SD/SDIO Card Drivers
1477 +CONFIG_MMC_BLOCK_BOUNCE=y
1479 +# CONFIG_MMC_TEST is not set
1482 +# MMC/SD/SDIO Host Controller Drivers
1484 +# CONFIG_MMC_SDHCI is not set
1485 +# CONFIG_MMC_SPI is not set
1487 +# CONFIG_MEMSTICK is not set
1488 +# CONFIG_ACCESSIBILITY is not set
1490 +CONFIG_LEDS_CLASS=y
1495 +CONFIG_LEDS_S3C24XX=y
1496 +# CONFIG_LEDS_PCA9532 is not set
1498 +# CONFIG_LEDS_PCA955X is not set
1503 +CONFIG_LEDS_TRIGGERS=y
1504 +CONFIG_LEDS_TRIGGER_TIMER=y
1505 +CONFIG_LEDS_TRIGGER_HEARTBEAT=y
1506 +CONFIG_LEDS_TRIGGER_BACKLIGHT=y
1507 +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
1510 +CONFIG_RTC_HCTOSYS=y
1511 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
1512 +# CONFIG_RTC_DEBUG is not set
1517 +CONFIG_RTC_INTF_SYSFS=y
1518 +CONFIG_RTC_INTF_PROC=y
1519 +CONFIG_RTC_INTF_DEV=y
1520 +CONFIG_RTC_INTF_DEV_UIE_EMUL=y
1521 +# CONFIG_RTC_DRV_TEST is not set
1526 +# CONFIG_RTC_DRV_DS1307 is not set
1527 +# CONFIG_RTC_DRV_DS1374 is not set
1528 +# CONFIG_RTC_DRV_DS1672 is not set
1529 +# CONFIG_RTC_DRV_MAX6900 is not set
1530 +# CONFIG_RTC_DRV_RS5C372 is not set
1531 +# CONFIG_RTC_DRV_ISL1208 is not set
1532 +# CONFIG_RTC_DRV_X1205 is not set
1533 +# CONFIG_RTC_DRV_PCF8563 is not set
1534 +# CONFIG_RTC_DRV_PCF8583 is not set
1535 +# CONFIG_RTC_DRV_M41T80 is not set
1536 +# CONFIG_RTC_DRV_S35390A is not set
1537 +# CONFIG_RTC_DRV_FM3130 is not set
1538 +# CONFIG_RTC_DRV_RX8581 is not set
1543 +# CONFIG_RTC_DRV_M41T94 is not set
1544 +# CONFIG_RTC_DRV_DS1305 is not set
1545 +# CONFIG_RTC_DRV_DS1390 is not set
1546 +# CONFIG_RTC_DRV_MAX6902 is not set
1547 +# CONFIG_RTC_DRV_R9701 is not set
1548 +# CONFIG_RTC_DRV_RS5C348 is not set
1549 +# CONFIG_RTC_DRV_DS3234 is not set
1552 +# Platform RTC drivers
1554 +# CONFIG_RTC_DRV_CMOS is not set
1555 +# CONFIG_RTC_DRV_DS1286 is not set
1556 +# CONFIG_RTC_DRV_DS1511 is not set
1557 +# CONFIG_RTC_DRV_DS1553 is not set
1558 +# CONFIG_RTC_DRV_DS1742 is not set
1559 +# CONFIG_RTC_DRV_STK17TA8 is not set
1560 +# CONFIG_RTC_DRV_M48T86 is not set
1561 +# CONFIG_RTC_DRV_M48T35 is not set
1562 +# CONFIG_RTC_DRV_M48T59 is not set
1563 +# CONFIG_RTC_DRV_BQ4802 is not set
1564 +# CONFIG_RTC_DRV_V3020 is not set
1567 +# on-CPU RTC drivers
1569 +CONFIG_RTC_DRV_S3C=y
1570 +CONFIG_DMADEVICES=y
1575 +# CONFIG_REGULATOR is not set
1576 +# CONFIG_UIO is not set
1577 +# CONFIG_STAGING is not set
1583 +CONFIG_EXT2_FS_XATTR=y
1584 +CONFIG_EXT2_FS_POSIX_ACL=y
1585 +CONFIG_EXT2_FS_SECURITY=y
1586 +# CONFIG_EXT2_FS_XIP is not set
1588 +CONFIG_EXT3_FS_XATTR=y
1589 +CONFIG_EXT3_FS_POSIX_ACL=y
1590 +CONFIG_EXT3_FS_SECURITY=y
1591 +# CONFIG_EXT4_FS is not set
1593 +# CONFIG_JBD_DEBUG is not set
1594 +CONFIG_FS_MBCACHE=y
1595 +# CONFIG_REISERFS_FS is not set
1596 +# CONFIG_JFS_FS is not set
1597 +CONFIG_FS_POSIX_ACL=y
1598 +CONFIG_FILE_LOCKING=y
1599 +# CONFIG_XFS_FS is not set
1600 +# CONFIG_GFS2_FS is not set
1601 +# CONFIG_OCFS2_FS is not set
1602 +# CONFIG_BTRFS_FS is not set
1605 +CONFIG_INOTIFY_USER=y
1606 +# CONFIG_QUOTA is not set
1608 +CONFIG_AUTOFS4_FS=y
1609 +# CONFIG_FUSE_FS is not set
1610 +CONFIG_GENERIC_ACL=y
1613 +# CD-ROM/DVD Filesystems
1615 +# CONFIG_ISO9660_FS is not set
1616 +# CONFIG_UDF_FS is not set
1619 +# DOS/FAT/NT Filesystems
1624 +CONFIG_FAT_DEFAULT_CODEPAGE=437
1625 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
1626 +# CONFIG_NTFS_FS is not set
1629 +# Pseudo filesystems
1632 +CONFIG_PROC_SYSCTL=y
1633 +CONFIG_PROC_PAGE_MONITOR=y
1636 +CONFIG_TMPFS_POSIX_ACL=y
1637 +# CONFIG_HUGETLB_PAGE is not set
1638 +CONFIG_CONFIGFS_FS=m
1639 +CONFIG_MISC_FILESYSTEMS=y
1640 +# CONFIG_ADFS_FS is not set
1641 +# CONFIG_AFFS_FS is not set
1642 +# CONFIG_ECRYPT_FS is not set
1643 +# CONFIG_HFS_FS is not set
1644 +# CONFIG_HFSPLUS_FS is not set
1645 +# CONFIG_BEFS_FS is not set
1646 +# CONFIG_BFS_FS is not set
1647 +# CONFIG_EFS_FS is not set
1649 +CONFIG_JFFS2_FS_DEBUG=0
1650 +CONFIG_JFFS2_FS_WRITEBUFFER=y
1651 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
1652 +# CONFIG_JFFS2_SUMMARY is not set
1653 +# CONFIG_JFFS2_FS_XATTR is not set
1654 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
1655 +CONFIG_JFFS2_ZLIB=y
1656 +# CONFIG_JFFS2_LZO is not set
1657 +CONFIG_JFFS2_RTIME=y
1658 +# CONFIG_JFFS2_RUBIN is not set
1660 +# CONFIG_SQUASHFS is not set
1661 +# CONFIG_VXFS_FS is not set
1662 +# CONFIG_MINIX_FS is not set
1663 +# CONFIG_OMFS_FS is not set
1664 +# CONFIG_HPFS_FS is not set
1665 +# CONFIG_QNX4FS_FS is not set
1667 +# CONFIG_SYSV_FS is not set
1668 +# CONFIG_UFS_FS is not set
1669 +CONFIG_NETWORK_FILESYSTEMS=y
1672 +CONFIG_NFS_V3_ACL=y
1675 +# CONFIG_NFSD is not set
1678 +CONFIG_NFS_ACL_SUPPORT=y
1679 +CONFIG_NFS_COMMON=y
1681 +CONFIG_SUNRPC_GSS=y
1682 +# CONFIG_SUNRPC_REGISTER_V4 is not set
1683 +CONFIG_RPCSEC_GSS_KRB5=y
1684 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
1685 +# CONFIG_SMB_FS is not set
1686 +# CONFIG_CIFS is not set
1687 +# CONFIG_NCP_FS is not set
1688 +# CONFIG_CODA_FS is not set
1689 +# CONFIG_AFS_FS is not set
1694 +CONFIG_PARTITION_ADVANCED=y
1695 +# CONFIG_ACORN_PARTITION is not set
1696 +# CONFIG_OSF_PARTITION is not set
1697 +# CONFIG_AMIGA_PARTITION is not set
1698 +# CONFIG_ATARI_PARTITION is not set
1699 +# CONFIG_MAC_PARTITION is not set
1700 +CONFIG_MSDOS_PARTITION=y
1701 +CONFIG_BSD_DISKLABEL=y
1702 +CONFIG_MINIX_SUBPARTITION=y
1703 +CONFIG_SOLARIS_X86_PARTITION=y
1704 +CONFIG_UNIXWARE_DISKLABEL=y
1705 +CONFIG_LDM_PARTITION=y
1706 +# CONFIG_LDM_DEBUG is not set
1707 +# CONFIG_SGI_PARTITION is not set
1708 +# CONFIG_ULTRIX_PARTITION is not set
1709 +# CONFIG_SUN_PARTITION is not set
1710 +# CONFIG_KARMA_PARTITION is not set
1711 +CONFIG_EFI_PARTITION=y
1712 +# CONFIG_SYSV68_PARTITION is not set
1714 +CONFIG_NLS_DEFAULT="cp437"
1715 +CONFIG_NLS_CODEPAGE_437=m
1716 +CONFIG_NLS_CODEPAGE_737=m
1717 +CONFIG_NLS_CODEPAGE_775=m
1718 +CONFIG_NLS_CODEPAGE_850=m
1719 +CONFIG_NLS_CODEPAGE_852=m
1720 +CONFIG_NLS_CODEPAGE_855=m
1721 +CONFIG_NLS_CODEPAGE_857=m
1722 +CONFIG_NLS_CODEPAGE_860=m
1723 +CONFIG_NLS_CODEPAGE_861=m
1724 +CONFIG_NLS_CODEPAGE_862=m
1725 +CONFIG_NLS_CODEPAGE_863=m
1726 +CONFIG_NLS_CODEPAGE_864=m
1727 +CONFIG_NLS_CODEPAGE_865=m
1728 +CONFIG_NLS_CODEPAGE_866=m
1729 +CONFIG_NLS_CODEPAGE_869=m
1730 +CONFIG_NLS_CODEPAGE_936=m
1731 +CONFIG_NLS_CODEPAGE_950=m
1732 +CONFIG_NLS_CODEPAGE_932=m
1733 +CONFIG_NLS_CODEPAGE_949=m
1734 +CONFIG_NLS_CODEPAGE_874=m
1735 +CONFIG_NLS_ISO8859_8=m
1736 +CONFIG_NLS_CODEPAGE_1250=m
1737 +CONFIG_NLS_CODEPAGE_1251=m
1739 +CONFIG_NLS_ISO8859_1=m
1740 +CONFIG_NLS_ISO8859_2=m
1741 +CONFIG_NLS_ISO8859_3=m
1742 +CONFIG_NLS_ISO8859_4=m
1743 +CONFIG_NLS_ISO8859_5=m
1744 +CONFIG_NLS_ISO8859_6=m
1745 +CONFIG_NLS_ISO8859_7=m
1746 +CONFIG_NLS_ISO8859_9=m
1747 +CONFIG_NLS_ISO8859_13=m
1748 +CONFIG_NLS_ISO8859_14=m
1749 +CONFIG_NLS_ISO8859_15=m
1750 +CONFIG_NLS_KOI8_R=m
1751 +CONFIG_NLS_KOI8_U=m
1753 +# CONFIG_DLM is not set
1758 +# CONFIG_PRINTK_TIME is not set
1759 +# CONFIG_ENABLE_WARN_DEPRECATED is not set
1760 +# CONFIG_ENABLE_MUST_CHECK is not set
1761 +CONFIG_FRAME_WARN=1024
1762 +# CONFIG_MAGIC_SYSRQ is not set
1763 +# CONFIG_UNUSED_SYMBOLS is not set
1765 +# CONFIG_HEADERS_CHECK is not set
1766 +# CONFIG_DEBUG_KERNEL is not set
1767 +# CONFIG_SLUB_DEBUG_ON is not set
1768 +# CONFIG_SLUB_STATS is not set
1769 +CONFIG_STACKTRACE=y
1770 +CONFIG_DEBUG_BUGVERBOSE=y
1771 +CONFIG_DEBUG_MEMORY_INIT=y
1772 +CONFIG_FRAME_POINTER=y
1773 +# CONFIG_RCU_CPU_STALL_DETECTOR is not set
1774 +# CONFIG_LATENCYTOP is not set
1775 +CONFIG_SYSCTL_SYSCALL_CHECK=y
1776 +CONFIG_NOP_TRACER=y
1777 +CONFIG_HAVE_FUNCTION_TRACER=y
1778 +CONFIG_RING_BUFFER=y
1784 +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
1785 +# CONFIG_SAMPLES is not set
1786 +CONFIG_HAVE_ARCH_KGDB=y
1787 +CONFIG_DEBUG_USER=y
1788 +CONFIG_DEBUG_S3C_UART=0
1794 +# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
1795 +# CONFIG_SECURITY is not set
1796 +# CONFIG_SECURITYFS is not set
1797 +CONFIG_SECURITY_FILE_CAPABILITIES=y
1801 +# Crypto core or helper
1803 +CONFIG_CRYPTO_FIPS=y
1804 +CONFIG_CRYPTO_ALGAPI=y
1805 +CONFIG_CRYPTO_ALGAPI2=y
1806 +CONFIG_CRYPTO_AEAD=m
1807 +CONFIG_CRYPTO_AEAD2=y
1808 +CONFIG_CRYPTO_BLKCIPHER=y
1809 +CONFIG_CRYPTO_BLKCIPHER2=y
1810 +CONFIG_CRYPTO_HASH=y
1811 +CONFIG_CRYPTO_HASH2=y
1812 +CONFIG_CRYPTO_RNG=m
1813 +CONFIG_CRYPTO_RNG2=y
1814 +CONFIG_CRYPTO_MANAGER=y
1815 +CONFIG_CRYPTO_MANAGER2=y
1816 +CONFIG_CRYPTO_GF128MUL=m
1817 +CONFIG_CRYPTO_NULL=m
1818 +CONFIG_CRYPTO_CRYPTD=m
1819 +CONFIG_CRYPTO_AUTHENC=m
1820 +CONFIG_CRYPTO_TEST=m
1823 +# Authenticated Encryption with Associated Data
1825 +CONFIG_CRYPTO_CCM=m
1826 +CONFIG_CRYPTO_GCM=m
1827 +CONFIG_CRYPTO_SEQIV=m
1832 +CONFIG_CRYPTO_CBC=y
1833 +CONFIG_CRYPTO_CTR=m
1834 +CONFIG_CRYPTO_CTS=m
1835 +CONFIG_CRYPTO_ECB=m
1836 +CONFIG_CRYPTO_LRW=m
1837 +CONFIG_CRYPTO_PCBC=m
1838 +CONFIG_CRYPTO_XTS=m
1843 +CONFIG_CRYPTO_HMAC=y
1844 +CONFIG_CRYPTO_XCBC=m
1849 +CONFIG_CRYPTO_CRC32C=m
1850 +CONFIG_CRYPTO_MD4=m
1851 +CONFIG_CRYPTO_MD5=y
1852 +CONFIG_CRYPTO_MICHAEL_MIC=m
1853 +CONFIG_CRYPTO_RMD128=m
1854 +CONFIG_CRYPTO_RMD160=m
1855 +CONFIG_CRYPTO_RMD256=m
1856 +CONFIG_CRYPTO_RMD320=m
1857 +CONFIG_CRYPTO_SHA1=m
1858 +CONFIG_CRYPTO_SHA256=m
1859 +CONFIG_CRYPTO_SHA512=m
1860 +CONFIG_CRYPTO_TGR192=m
1861 +CONFIG_CRYPTO_WP512=m
1866 +CONFIG_CRYPTO_AES=m
1867 +CONFIG_CRYPTO_ANUBIS=m
1868 +CONFIG_CRYPTO_ARC4=m
1869 +CONFIG_CRYPTO_BLOWFISH=m
1870 +CONFIG_CRYPTO_CAMELLIA=m
1871 +CONFIG_CRYPTO_CAST5=m
1872 +CONFIG_CRYPTO_CAST6=m
1873 +CONFIG_CRYPTO_DES=y
1874 +CONFIG_CRYPTO_FCRYPT=m
1875 +CONFIG_CRYPTO_KHAZAD=m
1876 +CONFIG_CRYPTO_SALSA20=m
1877 +CONFIG_CRYPTO_SEED=m
1878 +CONFIG_CRYPTO_SERPENT=m
1879 +CONFIG_CRYPTO_TEA=m
1880 +CONFIG_CRYPTO_TWOFISH=m
1881 +CONFIG_CRYPTO_TWOFISH_COMMON=m
1886 +CONFIG_CRYPTO_DEFLATE=m
1887 +CONFIG_CRYPTO_LZO=m
1890 +# Random Number Generation
1892 +CONFIG_CRYPTO_ANSI_CPRNG=m
1898 +CONFIG_BITREVERSE=y
1899 +CONFIG_GENERIC_FIND_LAST_BIT=y
1902 +CONFIG_CRC_T10DIF=y
1907 +CONFIG_AUDIT_GENERIC=y
1908 +CONFIG_ZLIB_INFLATE=y
1909 +CONFIG_ZLIB_DEFLATE=y
1910 +CONFIG_LZO_COMPRESS=m
1911 +CONFIG_LZO_DECOMPRESS=m
1912 +CONFIG_TEXTSEARCH=y
1913 +CONFIG_TEXTSEARCH_KMP=m
1914 +CONFIG_TEXTSEARCH_BM=m
1915 +CONFIG_TEXTSEARCH_FSM=m
1919 diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h
1920 index a58378c..ce3b36e 100644
1921 --- a/arch/arm/include/asm/elf.h
1922 +++ b/arch/arm/include/asm/elf.h
1923 @@ -50,6 +50,7 @@ typedef struct user_fp elf_fpregset_t;
1924 #define R_ARM_ABS32 2
1925 #define R_ARM_CALL 28
1926 #define R_ARM_JUMP24 29
1927 +#define R_ARM_V4BX 40
1930 * These are used to set parameters in the core dumps.
1931 diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
1932 index dab48f2..fa03392 100644
1933 --- a/arch/arm/kernel/module.c
1934 +++ b/arch/arm/kernel/module.c
1935 @@ -132,6 +132,13 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
1936 *(u32 *)loc |= offset & 0x00ffffff;
1939 +#ifdef CONFIG_CPU_ARM920T
1940 + /* modern toolchain generate V4BX for the modules, and there is no
1941 + * way to skip them being generated in the .ko, so in our case, we just
1942 + * can ignore them */
1943 + case R_ARM_V4BX: /* Ignore these sections */
1947 printk(KERN_ERR "%s: unknown relocation: %u\n",
1948 module->name, ELF32_R_TYPE(rel->r_info));
1949 diff --git a/arch/arm/mach-s3c2410/include/mach/ts.h b/arch/arm/mach-s3c2410/include/mach/ts.h
1950 new file mode 100644
1951 index 0000000..1b451ea
1953 +++ b/arch/arm/mach-s3c2410/include/mach/ts.h
1955 +/* arch/arm/mach-s3c2410/include/mach/ts.h
1957 + * Copyright (c) 2005 Arnaud Patard <arnaud.patard@rtp-net.org>
1960 + * This program is free software; you can redistribute it and/or modify
1961 + * it under the terms of the GNU General Public License version 2 as
1962 + * published by the Free Software Foundation.
1966 + * 24-Mar-2005 RTP Created file
1967 + * 03-Aug-2005 RTP Renamed to ts.h
1970 +#ifndef __ASM_ARM_TS_H
1971 +#define __ASM_ARM_TS_H
1973 +#include <../drivers/input/touchscreen/ts_filter.h>
1975 +struct s3c2410_ts_mach_info {
1978 + /* array of pointers to filter APIs we want to use, in order
1979 + * ends on first NULL, all NULL is OK
1981 + struct ts_filter_api *filter_sequence[MAX_TS_FILTER_CHAIN];
1982 + /* array of configuration ints, one for each filter above */
1983 + void *filter_config[MAX_TS_FILTER_CHAIN];
1986 +void set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info);
1988 +#endif /* __ASM_ARM_TS_H */
1990 diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig
1991 index cde5ae9..7953c22 100644
1992 --- a/arch/arm/mach-s3c2440/Kconfig
1993 +++ b/arch/arm/mach-s3c2440/Kconfig
1994 @@ -79,5 +79,15 @@ config MACH_AT2440EVB
1996 Say Y here if you are using the AT2440EVB development board
1998 +config MACH_MINI2440
1999 + bool "MINI2440 development board"
2000 + select CPU_S3C2440
2001 + select EEPROM_AT24
2002 + select BACKLIGHT_PWM
2003 + select SND_S3C24XX_SOC_S3C24XX_UDA134X
2005 + Say Y here to select support for the MINI2440. Is a 10cm x 10cm board
2006 + available via various sources. It can come with a 3.5" or 7" touch LCD.
2010 diff --git a/arch/arm/mach-s3c2440/Makefile b/arch/arm/mach-s3c2440/Makefile
2011 index 0b4440e..bfadcf6 100644
2012 --- a/arch/arm/mach-s3c2440/Makefile
2013 +++ b/arch/arm/mach-s3c2440/Makefile
2014 @@ -22,3 +22,4 @@ obj-$(CONFIG_MACH_RX3715) += mach-rx3715.o
2015 obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o
2016 obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
2017 obj-$(CONFIG_MACH_AT2440EVB) += mach-at2440evb.o
2018 +obj-$(CONFIG_MACH_MINI2440) += mach-mini2440.o
2019 diff --git a/arch/arm/mach-s3c2440/mach-mini2440.c b/arch/arm/mach-s3c2440/mach-mini2440.c
2020 new file mode 100644
2021 index 0000000..5ff1457
2023 +++ b/arch/arm/mach-s3c2440/mach-mini2440.c
2025 +/* linux/arch/arm/mach-s3c2440/mach-mini2440.c
2027 + * Copyright (c) 2008 Ramax Lo <ramaxlo@gmail.com>
2028 + * Based on mach-anubis.c by Ben Dooks <ben@simtec.co.uk>
2029 + * and modifications by SBZ <sbz@spgui.org> and
2030 + * Weibing <http://weibing.blogbus.com>
2031 + * Michel Pollet <buserror@gmail.com>
2033 + * For product information, visit http://www.arm9e.com/
2035 + * This program is free software; you can redistribute it and/or modify
2036 + * it under the terms of the GNU General Public License version 2 as
2037 + * published by the Free Software Foundation.
2040 +#include <linux/kernel.h>
2041 +#include <linux/types.h>
2042 +#include <linux/interrupt.h>
2043 +#include <linux/list.h>
2044 +#include <linux/timer.h>
2045 +#include <linux/init.h>
2046 +#include <linux/io.h>
2047 +#include <linux/serial_core.h>
2048 +#include <linux/dm9000.h>
2049 +#include <linux/i2c/at24.h>
2050 +#include <linux/platform_device.h>
2051 +#include <linux/gpio_keys.h>
2052 +#include <linux/i2c.h>
2053 +#include <linux/mmc/host.h>
2054 +#include <linux/pwm_backlight.h>
2056 +#include <asm/mach/arch.h>
2057 +#include <asm/mach/map.h>
2059 +#include <mach/hardware.h>
2060 +#include <mach/fb.h>
2061 +#include <asm/mach-types.h>
2063 +#include <plat/regs-serial.h>
2064 +#include <mach/regs-gpio.h>
2065 +#include <mach/leds-gpio.h>
2066 +#include <mach/regs-mem.h>
2067 +#include <mach/regs-lcd.h>
2068 +#include <plat/nand.h>
2069 +#include <plat/iic.h>
2070 +#include <plat/mci.h>
2071 +#include <mach/ts.h>
2072 +#include <mach/irqs.h>
2074 +#include <plat/regs-serial.h>
2075 +#include <mach/regs-gpio.h>
2076 +#include <mach/regs-mem.h>
2077 +#include <mach/regs-lcd.h>
2079 +#include <linux/mtd/mtd.h>
2080 +#include <linux/mtd/nand.h>
2081 +#include <linux/mtd/nand_ecc.h>
2082 +#include <linux/mtd/partitions.h>
2084 +#include <plat/clock.h>
2085 +#include <plat/devs.h>
2086 +#include <plat/cpu.h>
2088 +#include <sound/s3c24xx_uda134x.h>
2090 +#ifdef CONFIG_TOUCHSCREEN_FILTER
2091 +#include <../drivers/input/touchscreen/ts_filter_linear.h>
2092 +#include <../drivers/input/touchscreen/ts_filter_mean.h>
2093 +#include <../drivers/input/touchscreen/ts_filter_median.h>
2094 +#include <../drivers/input/touchscreen/ts_filter_group.h>
2097 +#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
2099 +static struct map_desc mini2440_iodesc[] __initdata = {
2100 + /* nothing to declare, move along */
2103 +#define UCON S3C2410_UCON_DEFAULT
2104 +#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
2105 +#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
2108 +static struct s3c2410_uartcfg mini2440_uartcfgs[] __initdata = {
2132 +/* touchscreen configuration */
2133 +#ifdef CONFIG_TOUCHSCREEN_FILTER
2134 +static struct ts_filter_linear_configuration mini2440_ts_linear_config = {
2137 + 1, /* y proportion */
2144 + 1 /* common divisor */
2150 +static struct ts_filter_group_configuration mini2440_ts_group_config = {
2152 + .close_enough = 10,
2153 + .threshold = 6, /* at least half of the points in a group */
2157 +static struct ts_filter_median_configuration mini2440_ts_median_config = {
2159 + .decimation_below = 3,
2160 + .decimation_threshold = 8 * 3,
2161 + .decimation_above = 4,
2164 +static struct ts_filter_mean_configuration mini2440_ts_mean_config = {
2165 + .bits_filter_length = 2, /* 4 points */
2168 +static struct s3c2410_ts_mach_info mini2440_ts_cfg = {
2170 + .presc = 0xff, /* slow as we can go */
2171 + .filter_sequence = {
2172 + [0] = &ts_filter_group_api,
2173 + [1] = &ts_filter_median_api,
2174 + [2] = &ts_filter_mean_api,
2175 + [3] = &ts_filter_linear_api,
2177 + .filter_config = {
2178 + [0] = &mini2440_ts_group_config,
2179 + [1] = &mini2440_ts_median_config,
2180 + [2] = &mini2440_ts_mean_config,
2181 + [3] = &mini2440_ts_linear_config,
2184 +#else /* !CONFIG_TOUCHSCREEN_FILTER */
2185 +static struct s3c2410_ts_mach_info mini2440_ts_cfg = {
2187 + .presc = 0xff, /* slow as we can go */
2191 +/* LCD driver info */
2193 +/* LCD timing and setup */
2195 +#define _LCD_DECLARE(_xres,margin_left,margin_right,hsync, _yres,margin_top,margin_bottom,vsync, refresh) \
2198 + .height = _yres, \
2200 + .left_margin = margin_left, \
2201 + .right_margin = margin_right, \
2202 + .upper_margin = margin_top, \
2203 + .lower_margin = margin_bottom, \
2204 + .hsync_len = hsync, \
2205 + .vsync_len = vsync, \
2206 + .pixclock = (1000000000000LL / \
2208 + (hsync + margin_left + _xres + margin_right) * \
2209 + (vsync + margin_top + _yres + margin_bottom))), \
2211 + .type = (S3C2410_LCDCON1_TFT16BPP |\
2212 + S3C2410_LCDCON1_TFT),
2214 +struct s3c2410fb_display mini2440_lcd_cfg[] __initdata = {
2215 + [0] = { // mini2440 + 3.5" TFT + touchscreen
2217 + 240, 21, 38, 6, // x timing
2218 + 320, 2, 6, 2, // y timing
2219 + 60) // refresh rate
2220 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2221 + S3C2410_LCDCON5_INVVLINE |\
2222 + S3C2410_LCDCON5_INVVFRAME |\
2223 + S3C2410_LCDCON5_INVVDEN |\
2224 + S3C2410_LCDCON5_PWREN),
2226 + [1] = { // mini2440 + 7" TFT + touchscreen
2228 + 800, 41, 68, 32, // x timing
2229 + 480, 26, 6, 2, // y timing
2230 + 40) // refresh rate
2231 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2232 + S3C2410_LCDCON5_INVVLINE |\
2233 + S3C2410_LCDCON5_INVVFRAME |\
2234 + S3C2410_LCDCON5_INVVDEN |\
2235 + S3C2410_LCDCON5_PWREN),
2237 + /* VGA all share the timings
2238 + * NOTE: The VGA board seems to always output at 1024x768
2239 + * unless you add the dip-switch block. The smaller resolution
2240 + * WILL work, but be displayed in the top/left corner on the VGA screen
2244 + 1024, 1, 2, 2, // y timing
2245 + 768, 200, 16, 16, // x timing
2246 + 24) // refresh rate, maximum stable, tested with the FPGA shield
2247 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2248 + S3C2410_LCDCON5_HWSWP),
2252 + 800, 1, 2, 2, // y timing
2253 + 600, 200, 16, 16, // x timing
2254 + 24) // refresh rate, maximum stable, tested with the FPGA shield
2255 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2256 + S3C2410_LCDCON5_HWSWP),
2260 + 640, 1, 2, 2, // y timing
2261 + 480, 200, 16, 16, // x timing
2262 + 24) // refresh rate, maximum stable, tested with the FPGA shield
2263 + .lcdcon5 = (S3C2410_LCDCON5_FRM565 |\
2264 + S3C2410_LCDCON5_HWSWP),
2268 +/* todo - put into gpio header */
2270 +#define S3C2410_GPCCON_MASK(x) (3 << ((x) * 2))
2271 +#define S3C2410_GPDCON_MASK(x) (3 << ((x) * 2))
2273 +struct s3c2410fb_mach_info mini2440_fb_info __initdata = {
2274 + .displays = &mini2440_lcd_cfg[0],
2275 + .num_displays = 1,
2276 + .default_display = 0,
2278 + /* Enable VD[2..7], VD[10..15], VD[18..23] and VCLK, syncs, VDEN
2279 + * and disable the pull down resistors on pins we are using for LCD
2282 + .gpcup = (0xf << 1) | (0x3f << 10),
2284 + .gpccon = (S3C2410_GPC1_VCLK | S3C2410_GPC2_VLINE |
2285 + S3C2410_GPC3_VFRAME | S3C2410_GPC4_VM |
2286 + S3C2410_GPC10_VD2 | S3C2410_GPC11_VD3 |
2287 + S3C2410_GPC12_VD4 | S3C2410_GPC13_VD5 |
2288 + S3C2410_GPC14_VD6 | S3C2410_GPC15_VD7),
2290 + .gpccon_mask = (S3C2410_GPCCON_MASK(1) | S3C2410_GPCCON_MASK(2) |
2291 + S3C2410_GPCCON_MASK(3) | S3C2410_GPCCON_MASK(4) |
2292 + S3C2410_GPCCON_MASK(10) | S3C2410_GPCCON_MASK(11) |
2293 + S3C2410_GPCCON_MASK(12) | S3C2410_GPCCON_MASK(13) |
2294 + S3C2410_GPCCON_MASK(14) | S3C2410_GPCCON_MASK(15)),
2296 + .gpdup = (0x3f << 2) | (0x3f << 10),
2298 + .gpdcon = (S3C2410_GPD2_VD10 | S3C2410_GPD3_VD11 |
2299 + S3C2410_GPD4_VD12 | S3C2410_GPD5_VD13 |
2300 + S3C2410_GPD6_VD14 | S3C2410_GPD7_VD15 |
2301 + S3C2410_GPD10_VD18 | S3C2410_GPD11_VD19 |
2302 + S3C2410_GPD12_VD20 | S3C2410_GPD13_VD21 |
2303 + S3C2410_GPD14_VD22 | S3C2410_GPD15_VD23),
2305 + .gpdcon_mask = (S3C2410_GPDCON_MASK(2) | S3C2410_GPDCON_MASK(3) |
2306 + S3C2410_GPDCON_MASK(4) | S3C2410_GPDCON_MASK(5) |
2307 + S3C2410_GPDCON_MASK(6) | S3C2410_GPDCON_MASK(7) |
2308 + S3C2410_GPDCON_MASK(10) | S3C2410_GPDCON_MASK(11)|
2309 + S3C2410_GPDCON_MASK(12) | S3C2410_GPDCON_MASK(13)|
2310 + S3C2410_GPDCON_MASK(14) | S3C2410_GPDCON_MASK(15)),
2315 +static struct s3c24xx_mci_pdata mini2440_mmc_cfg = {
2316 + .gpio_detect = S3C2410_GPG8,
2317 + .set_power = NULL,
2318 + .ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,
2321 +/* NAND Flash on MINI2440 board */
2323 +static struct mtd_partition mini2440_default_nand_part[] = {
2330 + .name = "u-boot-env",
2332 + .offset = SZ_256K,
2336 + .size = 0x00500000, /* 5 megabytes, for a kernel with no modules */
2337 + .offset = SZ_256K + SZ_128K,
2341 + .offset = SZ_256K + SZ_128K + 0x00500000,
2342 + .size = MTDPART_SIZ_FULL,
2346 +static struct s3c2410_nand_set mini2440_nand_sets[] = {
2350 + .nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
2351 + .partitions = mini2440_default_nand_part,
2355 +static struct s3c2410_platform_nand mini2440_nand_info = {
2356 + .tacls = 0, // was 25,
2357 + .twrph0 = 25, // 55,
2358 + .twrph1 = 15, // 40,
2359 + .nr_sets = ARRAY_SIZE(mini2440_nand_sets),
2360 + .sets = mini2440_nand_sets,
2363 +/* DM9000AEP 10/100 ethernet controller */
2365 +static struct resource mini2440_dm9k_resource[] = {
2367 + .start = MACH_MINI2440_DM9K_BASE,
2368 + .end = MACH_MINI2440_DM9K_BASE + 3,
2369 + .flags = IORESOURCE_MEM
2372 + .start = MACH_MINI2440_DM9K_BASE + 4,
2373 + .end = MACH_MINI2440_DM9K_BASE + 7,
2374 + .flags = IORESOURCE_MEM
2377 + .start = IRQ_EINT7,
2379 + .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
2383 +static struct dm9000_plat_data mini2440_dm9k_pdata = {
2384 + .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
2387 +static struct platform_device mini2440_device_eth = {
2390 + .num_resources = ARRAY_SIZE(mini2440_dm9k_resource),
2391 + .resource = mini2440_dm9k_resource,
2393 + .platform_data = &mini2440_dm9k_pdata,
2399 +static int mini2440_backlight_init(struct device *dev)
2404 + * Cut the power to the LCD if brightness reaches 0
2406 +static int mini2440_backlight_notify(int brightness)
2409 + s3c2410_gpio_setpin(S3C2410_GPB1, 1);
2410 + s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_TOUT1); // pwm backlight
2411 +// s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_OUTP); // pwm backlight
2412 + s3c2410_gpio_setpin(S3C2410_GPG4, 1);
2413 + s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_LCDPWREN);
2415 + s3c2410_gpio_setpin(S3C2410_GPB1, 0);
2416 + s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_OUTP);
2417 + s3c2410_gpio_setpin(S3C2410_GPG4, 0);
2418 + s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);
2420 + return brightness;
2423 +static struct platform_pwm_backlight_data mini2440_backlight_data = {
2425 + .max_brightness = 1023,
2426 + .dft_brightness = 900,
2427 + .pwm_period_ns = 4000000, /* Fl = 250Hz PWM */
2428 + .init = mini2440_backlight_init,
2429 + .notify = mini2440_backlight_notify,
2432 +static struct platform_device mini2440_backlight_device = {
2433 + .name = "pwm-backlight",
2435 + .platform_data = &mini2440_backlight_data,
2441 +static struct s3c24xx_led_platdata mini2440_led1_pdata = {
2443 + .gpio = S3C2410_GPB5,
2444 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2445 + .def_trigger = "heartbeat",
2448 +static struct s3c24xx_led_platdata mini2440_led2_pdata = {
2450 + .gpio = S3C2410_GPB6,
2451 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2452 + .def_trigger = "nand-disk",
2455 +static struct s3c24xx_led_platdata mini2440_led3_pdata = {
2457 + .gpio = S3C2410_GPB7,
2458 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2459 + .def_trigger = "mmc0",
2462 +static struct s3c24xx_led_platdata mini2440_led4_pdata = {
2464 + .gpio = S3C2410_GPB8,
2465 + .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
2466 + .def_trigger = "",
2469 +static struct platform_device mini2440_led1 = {
2470 + .name = "s3c24xx_led",
2473 + .platform_data = &mini2440_led1_pdata,
2477 +static struct platform_device mini2440_led2 = {
2478 + .name = "s3c24xx_led",
2481 + .platform_data = &mini2440_led2_pdata,
2485 +static struct platform_device mini2440_led3 = {
2486 + .name = "s3c24xx_led",
2489 + .platform_data = &mini2440_led3_pdata,
2493 +static struct platform_device mini2440_led4 = {
2494 + .name = "s3c24xx_led",
2497 + .platform_data = &mini2440_led4_pdata,
2503 +static struct s3c24xx_uda134x_platform_data mini2440_audio_pins __initdata = {
2504 + .l3_clk = S3C2410_GPB4,
2505 + .l3_mode = S3C2410_GPB2,
2506 + .l3_data = S3C2410_GPB3,
2507 + .model = UDA134X_UDA1341
2510 +static struct platform_device mini2440_audio = {
2511 + .name = "s3c24xx_uda134x",
2514 + .platform_data = &mini2440_audio_pins,
2523 +static struct at24_platform_data at24c08 = {
2524 + .byte_len = (8*1024) / 8,
2526 + .flags = AT24_FLAG_ADDR16,
2529 +static struct i2c_board_info mini2440_i2c_devs[] __initdata = {
2531 + I2C_BOARD_INFO("at24c08", 0x50),
2532 + .platform_data = &at24c08,
2537 + * mini2440_features string
2539 + * t = Touchscreen present
2540 + * b = PWM backlight control
2542 + * 0-9 LCD configuration
2545 +static char mini2440_features_str[12] __initdata = "0tb";
2547 +static int __init mini2440_features_setup(char *str)
2550 + strlcpy(mini2440_features_str, str, sizeof(mini2440_features_str));
2554 +__setup("mini2440=", mini2440_features_setup);
2556 +static struct platform_device *mini2440_devices[] __initdata = {
2559 +// &s3c_device_adc, // ADC doesn't like living with touchscreen !
2562 + &mini2440_device_eth,
2571 +// &s3c_device_timer[0], // buzzer pwm, no API for it
2572 + /* remaining devices are optional */
2575 +static void __init mini2440_map_io(void)
2577 + s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));
2578 + s3c24xx_init_clocks(12000000);
2579 + s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs));
2581 + s3c_device_nand.dev.platform_data = &mini2440_nand_info;
2582 + s3c_device_sdi.dev.platform_data = &mini2440_mmc_cfg;
2585 +static void __init mini2440_init(void)
2587 + struct platform_device *optionals[8];
2589 + int lcd_index = -1;
2592 + s3c2410_gpio_cfgpin(S3C2410_GPC0, S3C2410_GPC0_LEND);
2594 + s3c2410_gpio_pullup(S3C2410_GPB1, 0); // remove pullup on PWM backlight
2595 + s3c2410_gpio_setpin(S3C2410_GPB1, 0);
2596 + s3c2410_gpio_cfgpin(S3C2410_GPB1, S3C2410_GPB1_TOUT1);
2598 + printk(KERN_INFO "MINI2440: Option string mini2440=%s\n", mini2440_features_str);
2602 + char * fp = mini2440_features_str;
2606 + case '0'...'9': /* tft screen */
2607 + if (done & (1 << 0))
2608 + printk(KERN_INFO "MINI2440: '%c' ignored, screen type already set\n", f);
2611 + if (li >= ARRAY_SIZE(mini2440_lcd_cfg))
2612 + printk(KERN_INFO "MINI2440: '%c' out of range for LCD mode\n", f);
2614 + optionals[count++] = &s3c_device_lcd;
2621 + if (done & (1 << 1))
2622 + printk(KERN_INFO "MINI2440: '%c' ignored, backlight already set\n", f);
2624 + optionals[count++] = &s3c_device_timer[1]; // need this timer for the backlight
2625 + optionals[count++] = &mini2440_backlight_device;
2630 + if (done & (1 << 2))
2631 + printk(KERN_INFO "MINI2440: '%c' ignored, touchscreen already set\n", f);
2633 + optionals[count++] = &s3c_device_ts;
2637 + if (done & (1 << 2))
2638 + printk(KERN_INFO "MINI2440: '%c' ignored, camera already registered\n", f);
2640 + optionals[count++] = &s3c_device_camif;
2646 + if (lcd_index != -1) {
2648 + mini2440_fb_info.displays = &mini2440_lcd_cfg[lcd_index];
2649 + printk(KERN_INFO "MINI2440: LCD");
2650 + for (li = 0; li < ARRAY_SIZE(mini2440_lcd_cfg); li++)
2651 + if (li == lcd_index)
2652 + printk(" [%d:%dx%d]", li, mini2440_lcd_cfg[li].width, mini2440_lcd_cfg[li].height);
2654 + printk(" %d:%dx%d", li, mini2440_lcd_cfg[li].width, mini2440_lcd_cfg[li].height);
2656 + s3c24xx_fb_set_platdata(&mini2440_fb_info);
2658 + s3c_i2c0_set_platdata(NULL);
2660 + set_s3c2410ts_info(&mini2440_ts_cfg);
2662 + platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
2663 + if (count) /* the optional features */
2664 + platform_add_devices(optionals, count);
2666 + i2c_register_board_info(0, mini2440_i2c_devs, ARRAY_SIZE(mini2440_i2c_devs));
2670 +MACHINE_START(MINI2440, "MINI2440")
2671 + .phys_io = S3C2410_PA_UART,
2672 + .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
2673 + .boot_params = S3C2410_SDRAM_PA + 0x100,
2674 + .map_io = mini2440_map_io,
2675 + .init_machine = mini2440_init,
2676 + .init_irq = s3c24xx_init_irq,
2677 + .timer = &s3c24xx_timer,
2679 diff --git a/arch/arm/plat-s3c/include/plat/devs.h b/arch/arm/plat-s3c/include/plat/devs.h
2680 index 6b1b523..cf160ab 100644
2681 --- a/arch/arm/plat-s3c/include/plat/devs.h
2682 +++ b/arch/arm/plat-s3c/include/plat/devs.h
2683 @@ -45,10 +45,11 @@ extern struct platform_device s3c_device_nand;
2685 extern struct platform_device s3c_device_usbgadget;
2687 +extern struct platform_device s3c_device_ts;
2689 /* s3c2440 specific devices */
2691 #ifdef CONFIG_CPU_S3C2440
2693 extern struct platform_device s3c_device_camif;
2696 diff --git a/arch/arm/plat-s3c24xx/devs.c b/arch/arm/plat-s3c24xx/devs.c
2697 index 16ac01d..a3f8102 100644
2698 --- a/arch/arm/plat-s3c24xx/devs.c
2699 +++ b/arch/arm/plat-s3c24xx/devs.c
2701 #include <asm/mach/irq.h>
2702 #include <mach/fb.h>
2703 #include <mach/hardware.h>
2704 +#include <mach/ts.h>
2705 +#include <asm/io.h>
2706 #include <asm/irq.h>
2708 #include <plat/regs-serial.h>
2709 @@ -229,6 +231,23 @@ struct platform_device s3c_device_nand = {
2711 EXPORT_SYMBOL(s3c_device_nand);
2714 +struct platform_device s3c_device_ts = {
2715 + .name = "s3c2410-ts",
2719 +EXPORT_SYMBOL(s3c_device_ts);
2721 +static struct s3c2410_ts_mach_info s3c2410ts_info;
2723 +void set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
2725 + memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(struct s3c2410_ts_mach_info));
2726 + s3c_device_ts.dev.platform_data = &s3c2410ts_info;
2728 +EXPORT_SYMBOL(set_s3c2410ts_info);
2730 /* USB Device (Gadget)*/
2732 static struct resource s3c_usbgadget_resource[] = {
2733 diff --git a/arch/arm/plat-s3c24xx/s3c244x.c b/arch/arm/plat-s3c24xx/s3c244x.c
2734 index c1de6bb..df78a15 100644
2735 --- a/arch/arm/plat-s3c24xx/s3c244x.c
2736 +++ b/arch/arm/plat-s3c24xx/s3c244x.c
2737 @@ -59,6 +59,8 @@ void __init s3c244x_init_uarts(struct s3c2410_uartcfg *cfg, int no)
2738 s3c24xx_init_uartdevs("s3c2440-uart", s3c2410_uart_resources, cfg, no);
2741 +extern struct platform_device s3c_device_ts;
2743 void __init s3c244x_map_io(void)
2745 /* register our io-tables */
2746 @@ -70,6 +72,7 @@ void __init s3c244x_map_io(void)
2747 s3c_device_sdi.name = "s3c2440-sdi";
2748 s3c_device_i2c0.name = "s3c2440-i2c";
2749 s3c_device_nand.name = "s3c2440-nand";
2750 + s3c_device_ts.name = "s3c2440-ts";
2751 s3c_device_usbgadget.name = "s3c2440-usbgadget";
2754 diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
2755 index bb6486a..75ff0a8 100644
2756 --- a/drivers/input/touchscreen/Kconfig
2757 +++ b/drivers/input/touchscreen/Kconfig
2758 @@ -11,6 +11,54 @@ menuconfig INPUT_TOUCHSCREEN
2760 if INPUT_TOUCHSCREEN
2762 +menuconfig TOUCHSCREEN_FILTER
2763 + boolean "Touchscreen Filtering"
2764 + depends on INPUT_TOUCHSCREEN
2765 + select TOUCHSCREEN_FILTER_GROUP
2766 + select TOUCHSCREEN_FILTER_MEDIAN
2767 + select TOUCHSCREEN_FILTER_MEAN
2768 + select TOUCHSCREEN_FILTER_LINEAR
2770 + Select this to include kernel touchscreen filter support. The filters
2771 + can be combined in any order in your machine init and the parameters
2772 + for them can also be set there.
2774 +if TOUCHSCREEN_FILTER
2776 +config TOUCHSCREEN_FILTER_GROUP
2777 + bool "Group Touchscreen Filter"
2778 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2781 + Say Y here if you want to use the Group touchscreen filter, it
2782 + avoids using atypical samples.
2784 +config TOUCHSCREEN_FILTER_MEDIAN
2785 + bool "Median Average Touchscreen Filter"
2786 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2789 + Say Y here if you want to use the Median touchscreen filter, it's
2790 + highly effective if you data is noisy with occasional excursions.
2792 +config TOUCHSCREEN_FILTER_MEAN
2793 + bool "Mean Average Touchscreen Filter"
2794 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2797 + Say Y here if you want to use the Mean touchscreen filter, it
2798 + can further improve decent quality data by removing jitter
2800 +config TOUCHSCREEN_FILTER_LINEAR
2801 + bool "Linear Touchscreen Filter"
2802 + depends on INPUT_TOUCHSCREEN && TOUCHSCREEN_FILTER
2805 + Say Y here if you want to use the Linear touchscreen filter, it
2806 + enables the use of calibration data for the touchscreen.
2810 config TOUCHSCREEN_ADS7846
2811 tristate "ADS7846/TSC2046 and ADS7843 based touchscreens"
2812 depends on SPI_MASTER
2813 @@ -79,6 +127,24 @@ config TOUCHSCREEN_FUJITSU
2814 To compile this driver as a module, choose M here: the
2815 module will be called fujitsu-ts.
2817 +config TOUCHSCREEN_S3C2410
2818 + tristate "Samsung S3C2410 touchscreen input driver"
2819 + depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN
2822 + Say Y here if you have the s3c2410 touchscreen.
2826 + To compile this driver as a module, choose M here: the
2827 + module will be called s3c2410_ts.
2829 +config TOUCHSCREEN_S3C2410_DEBUG
2830 + boolean "Samsung S3C2410 touchscreen debug messages"
2831 + depends on TOUCHSCREEN_S3C2410
2833 + Select this if you want debug messages
2835 config TOUCHSCREEN_GUNZE
2836 tristate "Gunze AHL-51S touchscreen"
2838 diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
2839 index d3375af..4b0a03e 100644
2840 --- a/drivers/input/touchscreen/Makefile
2841 +++ b/drivers/input/touchscreen/Makefile
2842 @@ -34,3 +34,9 @@ wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9705) += wm9705.o
2843 wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9712) += wm9712.o
2844 wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9713) += wm9713.o
2845 obj-$(CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE) += mainstone-wm97xx.o
2846 +obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
2847 +obj-$(CONFIG_TOUCHSCREEN_FILTER) += ts_filter.o
2848 +obj-$(CONFIG_TOUCHSCREEN_FILTER_GROUP) += ts_filter_group.o
2849 +obj-$(CONFIG_TOUCHSCREEN_FILTER_LINEAR) += ts_filter_linear.o
2850 +obj-$(CONFIG_TOUCHSCREEN_FILTER_MEDIAN) += ts_filter_median.o
2851 +obj-$(CONFIG_TOUCHSCREEN_FILTER_MEAN) += ts_filter_mean.o
2852 diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
2853 new file mode 100644
2854 index 0000000..ea0777c
2856 +++ b/drivers/input/touchscreen/s3c2410_ts.c
2859 + * This program is free software; you can redistribute it and/or modify
2860 + * it under the terms of the GNU General Public License as published by
2861 + * the Free Software Foundation; either version 2 of the License, or
2862 + * (at your option) any later version.
2864 + * This program is distributed in the hope that it will be useful,
2865 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2866 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2867 + * GNU General Public License for more details.
2869 + * You should have received a copy of the GNU General Public License
2870 + * along with this program; if not, write to the Free Software
2871 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2873 + * Copyright (c) 2004 Arnaud Patard <arnaud.patard@rtp-net.org>
2874 + * iPAQ H1940 touchscreen support
2878 + * 2004-09-05: Herbert Pötzl <herbert@13thfloor.at>
2879 + * - added clock (de-)allocation code
2881 + * 2005-03-06: Arnaud Patard <arnaud.patard@rtp-net.org>
2882 + * - h1940_ -> s3c2410 (this driver is now also used on the n30
2884 + * - Debug messages are now enabled with the config option
2885 + * TOUCHSCREEN_S3C2410_DEBUG
2886 + * - Changed the way the value are read
2887 + * - Input subsystem should now work
2888 + * - Use ioremap and readl/writel
2890 + * 2005-03-23: Arnaud Patard <arnaud.patard@rtp-net.org>
2891 + * - Make use of some undocumented features of the touchscreen
2894 + * 2007-05-23: Harald Welte <laforge@openmoko.org>
2895 + * - Add proper support for S32440
2897 + * 2008-06-23: Andy Green <andy@openmoko.com>
2898 + * - removed averaging system
2899 + * - added generic Touchscreen filter stuff
2901 + * 2008-11-27: Nelson Castillo <arhuaco@freaks-unidos.net>
2902 + * - improve interrupt handling
2905 +#include <linux/errno.h>
2906 +#include <linux/kernel.h>
2907 +#include <linux/module.h>
2908 +#include <linux/slab.h>
2909 +#include <linux/input.h>
2910 +#include <linux/init.h>
2911 +#include <linux/serio.h>
2912 +#include <linux/timer.h>
2913 +#include <linux/kfifo.h>
2914 +#include <linux/delay.h>
2915 +#include <linux/platform_device.h>
2916 +#include <linux/clk.h>
2917 +#include <asm/io.h>
2918 +#include <asm/irq.h>
2920 +#include <mach/regs-gpio.h>
2921 +#include <mach/ts.h>
2923 +#include <plat/regs-adc.h>
2925 +#include "ts_filter.h"
2927 +/* For ts.dev.id.version */
2928 +#define S3C2410TSVERSION 0x0101
2930 +#define TSC_SLEEP (S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_XY_PST(0))
2932 +#define WAIT4INT(x) (((x)<<8) | \
2933 + S3C2410_ADCTSC_YM_SEN | \
2934 + S3C2410_ADCTSC_YP_SEN | \
2935 + S3C2410_ADCTSC_XP_SEN | \
2936 + S3C2410_ADCTSC_XY_PST(3))
2938 +#define AUTOPST (S3C2410_ADCTSC_YM_SEN | \
2939 + S3C2410_ADCTSC_YP_SEN | \
2940 + S3C2410_ADCTSC_XP_SEN | \
2941 + S3C2410_ADCTSC_AUTO_PST | \
2942 + S3C2410_ADCTSC_XY_PST(0))
2944 +#define DEBUG_LVL KERN_DEBUG
2946 +MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
2947 +MODULE_DESCRIPTION("s3c2410 touchscreen driver");
2948 +MODULE_LICENSE("GPL");
2951 + * Definitions & global arrays.
2954 +static char *s3c2410ts_name = "s3c2410 TouchScreen";
2956 +#define TS_RELEASE_TIMEOUT (HZ >> 7 ? HZ >> 7 : 1) /* 8ms (5ms if HZ is 200) */
2957 +#define TS_EVENT_FIFO_SIZE (2 << 6) /* must be a power of 2 */
2959 +#define TS_STATE_STANDBY 0 /* initial state */
2960 +#define TS_STATE_PRESSED 1
2961 +#define TS_STATE_RELEASE_PENDING 2
2962 +#define TS_STATE_RELEASE 3
2965 + * Per-touchscreen data.
2969 + struct input_dev *dev;
2970 + struct ts_filter *tsf[MAX_TS_FILTER_CHAIN];
2971 + int coords[2]; /* just X and Y for us */
2974 + struct kfifo *event_fifo;
2977 +static struct s3c2410ts ts;
2979 +static void __iomem *base_addr;
2982 + * A few low level functions.
2985 +static inline void s3c2410_ts_connect(void)
2987 + s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);
2988 + s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);
2989 + s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);
2990 + s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
2993 +static void s3c2410_ts_start_adc_conversion(void)
2995 + writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST,
2996 + base_addr + S3C2410_ADCTSC);
2997 + writel(readl(base_addr + S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START,
2998 + base_addr + S3C2410_ADCCON);
3002 + * Just send the input events.
3005 +enum ts_input_event {IE_DOWN = 0, IE_UP};
3007 +static void ts_input_report(int event, int coords[])
3009 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3010 + static char *s[] = {"down", "up"};
3011 + struct timeval tv;
3013 + do_gettimeofday(&tv);
3016 + if (event == IE_DOWN) {
3017 + input_report_abs(ts.dev, ABS_X, coords[0]);
3018 + input_report_abs(ts.dev, ABS_Y, coords[1]);
3019 + input_report_key(ts.dev, BTN_TOUCH, 1);
3020 + input_report_abs(ts.dev, ABS_PRESSURE, 1);
3022 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3023 + printk(DEBUG_LVL "T:%06d %6s (X:%03d, Y:%03d)\n",
3024 + (int)tv.tv_usec, s[event], coords[0], coords[1]);
3027 + input_report_key(ts.dev, BTN_TOUCH, 0);
3028 + input_report_abs(ts.dev, ABS_PRESSURE, 0);
3030 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3031 + printk(DEBUG_LVL "T:%06d %6s\n",
3032 + (int)tv.tv_usec, s[event]);
3036 + input_sync(ts.dev);
3040 + * Manage the state of the touchscreen.
3043 +static void event_send_timer_f(unsigned long data);
3045 +static struct timer_list event_send_timer =
3046 + TIMER_INITIALIZER(event_send_timer_f, 0, 0);
3048 +static void event_send_timer_f(unsigned long data)
3050 + static int noop_counter;
3053 + while (__kfifo_get(ts.event_fifo, (unsigned char *)&event_type,
3057 + switch (event_type) {
3059 + if (ts.state == TS_STATE_RELEASE_PENDING)
3060 + /* Ignore short UP event */
3061 + ts.state = TS_STATE_PRESSED;
3065 + ts.state = TS_STATE_RELEASE_PENDING;
3069 + if (ts.is_down) /* stylus_action needs a conversion */
3070 + s3c2410_ts_start_adc_conversion();
3072 + if (unlikely(__kfifo_get(ts.event_fifo,
3073 + (unsigned char *)buf,
3075 + != sizeof(int) * 2))
3076 + goto ts_exit_error;
3078 + ts_input_report(IE_DOWN, buf);
3079 + ts.state = TS_STATE_PRESSED;
3083 + goto ts_exit_error;
3089 + if (noop_counter++ >= 1) {
3091 + if (ts.state == TS_STATE_RELEASE_PENDING) {
3092 + /* We delay the UP event for a
3093 + * while to avoid jitter. If we get a DOWN
3094 + * event we do not send it. */
3096 + ts_input_report(IE_UP, NULL);
3097 + ts.state = TS_STATE_STANDBY;
3100 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3103 + mod_timer(&event_send_timer, jiffies + TS_RELEASE_TIMEOUT);
3108 +ts_exit_error: /* should not happen unless we have a bug */
3109 + printk(KERN_ERR __FILE__ ": event_send_timer_f failed\n");
3113 + * Manage interrupts.
3116 +static irqreturn_t stylus_updown(int irq, void *dev_id)
3118 + unsigned long data0;
3119 + unsigned long data1;
3122 + data0 = readl(base_addr+S3C2410_ADCDAT0);
3123 + data1 = readl(base_addr+S3C2410_ADCDAT1);
3125 + ts.is_down = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) &&
3126 + (!(data1 & S3C2410_ADCDAT0_UPDOWN));
3128 + event_type = ts.is_down ? 'D' : 'U';
3130 + if (unlikely(__kfifo_put(ts.event_fifo, (unsigned char *)&event_type,
3131 + sizeof(int)) != sizeof(int))) /* should not happen */
3132 + printk(KERN_ERR __FILE__": stylus_updown lost event!\n");
3135 + s3c2410_ts_start_adc_conversion();
3137 + writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
3139 + mod_timer(&event_send_timer, jiffies + 1);
3141 + return IRQ_HANDLED;
3144 +static irqreturn_t stylus_action(int irq, void *dev_id)
3148 + /* grab the ADC results */
3149 + ts.coords[0] = readl(base_addr + S3C2410_ADCDAT0) &
3150 + S3C2410_ADCDAT0_XPDATA_MASK;
3151 + ts.coords[1] = readl(base_addr + S3C2410_ADCDAT1) &
3152 + S3C2410_ADCDAT1_YPDATA_MASK;
3154 + if (ts.tsf[0]) { /* filtering is enabled, don't use raw directly */
3155 + switch ((ts.tsf[0]->api->process)(ts.tsf[0], &ts.coords[0])) {
3157 + * no real sample came out of processing yet,
3158 + * get another raw result to feed it
3160 + s3c2410_ts_start_adc_conversion();
3161 + return IRQ_HANDLED;
3162 + case 1: /* filters are ready to deliver a sample */
3163 + (ts.tsf[0]->api->scale)(ts.tsf[0], &ts.coords[0]);
3166 + /* error in filters, ignore the event */
3167 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3168 + writel(WAIT4INT(1), base_addr + S3C2410_ADCTSC);
3169 + return IRQ_HANDLED;
3171 + printk(KERN_ERR":stylus_action error\n");
3175 + /* We use a buffer because want an atomic operation */
3177 + buf[1] = ts.coords[0];
3178 + buf[2] = ts.coords[1];
3180 + if (unlikely(__kfifo_put(ts.event_fifo, (unsigned char *)buf,
3181 + sizeof(int) * 3) != sizeof(int) * 3))
3182 + /* should not happen */
3183 + printk(KERN_ERR":stylus_action error\n");
3185 + writel(WAIT4INT(1), base_addr + S3C2410_ADCTSC);
3186 + mod_timer(&event_send_timer, jiffies + 1);
3188 + return IRQ_HANDLED;
3191 +static struct clk *adc_clock;
3194 + * The functions for inserting/removing us as a module.
3197 +static int __init s3c2410ts_probe(struct platform_device *pdev)
3200 + struct s3c2410_ts_mach_info *info;
3201 + struct input_dev *input_dev;
3204 + dev_info(&pdev->dev, "Starting\n");
3206 + info = (struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
3210 + dev_err(&pdev->dev, "Hm... too bad: no platform data for ts\n");
3214 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3215 + printk(DEBUG_LVL "Entering s3c2410ts_init\n");
3218 + adc_clock = clk_get(NULL, "adc");
3220 + dev_err(&pdev->dev, "failed to get adc clock source\n");
3223 + clk_enable(adc_clock);
3225 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
3226 + printk(DEBUG_LVL "got and enabled clock\n");
3229 + base_addr = ioremap(S3C2410_PA_ADC,0x20);
3230 + if (base_addr == NULL) {
3231 + dev_err(&pdev->dev, "Failed to remap register block\n");
3237 + /* If we acutally are a S3C2410: Configure GPIOs */
3238 + if (!strcmp(pdev->name, "s3c2410-ts"))
3239 + s3c2410_ts_connect();
3241 + if ((info->presc & 0xff) > 0)
3242 + writel(S3C2410_ADCCON_PRSCEN |
3243 + S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
3244 + base_addr + S3C2410_ADCCON);
3246 + writel(0, base_addr+S3C2410_ADCCON);
3248 + /* Initialise registers */
3249 + if ((info->delay & 0xffff) > 0)
3250 + writel(info->delay & 0xffff, base_addr + S3C2410_ADCDLY);
3252 + writel(WAIT4INT(0), base_addr + S3C2410_ADCTSC);
3254 + /* Initialise input stuff */
3255 + memset(&ts, 0, sizeof(struct s3c2410ts));
3256 + input_dev = input_allocate_device();
3259 + dev_err(&pdev->dev, "Unable to allocate the input device\n");
3264 + ts.dev = input_dev;
3265 + ts.dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) |
3267 + ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
3268 + input_set_abs_params(ts.dev, ABS_X, 0, 0x3FF, 0, 0);
3269 + input_set_abs_params(ts.dev, ABS_Y, 0, 0x3FF, 0, 0);
3270 + input_set_abs_params(ts.dev, ABS_PRESSURE, 0, 1, 0, 0);
3272 + ts.dev->name = s3c2410ts_name;
3273 + ts.dev->id.bustype = BUS_RS232;
3274 + ts.dev->id.vendor = 0xDEAD;
3275 + ts.dev->id.product = 0xBEEF;
3276 + ts.dev->id.version = S3C2410TSVERSION;
3277 + ts.state = TS_STATE_STANDBY;
3278 + ts.event_fifo = kfifo_alloc(TS_EVENT_FIFO_SIZE, GFP_KERNEL, NULL);
3279 + if (IS_ERR(ts.event_fifo)) {
3284 + /* create the filter chain set up for the 2 coordinates we produce */
3285 + ret = ts_filter_create_chain(
3286 + pdev, (struct ts_filter_api **)&info->filter_sequence,
3287 + (void *)&info->filter_config, ts.tsf, ARRAY_SIZE(ts.coords));
3289 + dev_info(&pdev->dev, "%d filter(s) initialized\n", ret);
3290 + else /* this is OK, just means there won't be any filtering */
3291 + dev_info(&pdev->dev, "Unfiltered output selected\n");
3294 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3296 + dev_info(&pdev->dev, "No filtering\n");
3299 + if (request_irq(IRQ_ADC, stylus_action, IRQF_SAMPLE_RANDOM,
3300 + "s3c2410_action", ts.dev)) {
3301 + dev_err(&pdev->dev, "Could not allocate ts IRQ_ADC !\n");
3302 + iounmap(base_addr);
3306 + if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
3307 + "s3c2410_action", ts.dev)) {
3308 + dev_err(&pdev->dev, "Could not allocate ts IRQ_TC !\n");
3309 + free_irq(IRQ_ADC, ts.dev);
3310 + iounmap(base_addr);
3315 + dev_info(&pdev->dev, "successfully loaded\n");
3317 + /* All went ok, so register to the input system */
3318 + rc = input_register_device(ts.dev);
3327 + free_irq(IRQ_TC, ts.dev);
3328 + free_irq(IRQ_ADC, ts.dev);
3329 + clk_disable(adc_clock);
3330 + iounmap(base_addr);
3331 + disable_irq(IRQ_TC);
3333 + disable_irq(IRQ_ADC);
3335 + ts_filter_destroy_chain(pdev, ts.tsf);
3336 + kfifo_free(ts.event_fifo);
3338 + input_unregister_device(ts.dev);
3340 + iounmap(base_addr);
3346 +static int s3c2410ts_remove(struct platform_device *pdev)
3348 + disable_irq(IRQ_ADC);
3349 + disable_irq(IRQ_TC);
3350 + free_irq(IRQ_TC,ts.dev);
3351 + free_irq(IRQ_ADC,ts.dev);
3354 + clk_disable(adc_clock);
3355 + clk_put(adc_clock);
3359 + input_unregister_device(ts.dev);
3360 + iounmap(base_addr);
3362 + ts_filter_destroy_chain(pdev, ts.tsf);
3364 + kfifo_free(ts.event_fifo);
3370 +static int s3c2410ts_suspend(struct platform_device *pdev, pm_message_t state)
3372 + writel(TSC_SLEEP, base_addr+S3C2410_ADCTSC);
3373 + writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_STDBM,
3374 + base_addr+S3C2410_ADCCON);
3376 + disable_irq(IRQ_ADC);
3377 + disable_irq(IRQ_TC);
3379 + clk_disable(adc_clock);
3384 +static int s3c2410ts_resume(struct platform_device *pdev)
3386 + struct s3c2410_ts_mach_info *info =
3387 + ( struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
3389 + clk_enable(adc_clock);
3393 + (ts.tsf[0]->api->clear)(ts.tsf[0]);
3395 + enable_irq(IRQ_ADC);
3396 + enable_irq(IRQ_TC);
3398 + if ((info->presc&0xff) > 0)
3399 + writel(S3C2410_ADCCON_PRSCEN |
3400 + S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
3401 + base_addr+S3C2410_ADCCON);
3403 + writel(0,base_addr+S3C2410_ADCCON);
3405 + /* Initialise registers */
3406 + if ((info->delay & 0xffff) > 0)
3407 + writel(info->delay & 0xffff, base_addr+S3C2410_ADCDLY);
3409 + writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
3415 +#define s3c2410ts_suspend NULL
3416 +#define s3c2410ts_resume NULL
3419 +static struct platform_driver s3c2410ts_driver = {
3421 + .name = "s3c2410-ts",
3422 + .owner = THIS_MODULE,
3424 + .probe = s3c2410ts_probe,
3425 + .remove = s3c2410ts_remove,
3426 + .suspend = s3c2410ts_suspend,
3427 + .resume = s3c2410ts_resume,
3431 +static struct platform_driver s3c2440ts_driver = {
3433 + .name = "s3c2440-ts",
3434 + .owner = THIS_MODULE,
3436 + .probe = s3c2410ts_probe,
3437 + .remove = s3c2410ts_remove,
3438 + .suspend = s3c2410ts_suspend,
3439 + .resume = s3c2410ts_resume,
3443 +static int __init s3c2410ts_init(void)
3447 + rc = platform_driver_register(&s3c2410ts_driver);
3451 + rc = platform_driver_register(&s3c2440ts_driver);
3453 + platform_driver_unregister(&s3c2410ts_driver);
3458 +static void __exit s3c2410ts_exit(void)
3460 + platform_driver_unregister(&s3c2440ts_driver);
3461 + platform_driver_unregister(&s3c2410ts_driver);
3464 +module_init(s3c2410ts_init);
3465 +module_exit(s3c2410ts_exit);
3467 diff --git a/drivers/input/touchscreen/ts_filter.c b/drivers/input/touchscreen/ts_filter.c
3468 new file mode 100644
3469 index 0000000..832844d
3471 +++ b/drivers/input/touchscreen/ts_filter.c
3474 + * This program is free software; you can redistribute it and/or modify
3475 + * it under the terms of the GNU General Public License as published by
3476 + * the Free Software Foundation; either version 2 of the License, or
3477 + * (at your option) any later version.
3479 + * This program is distributed in the hope that it will be useful,
3480 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
3481 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3482 + * GNU General Public License for more details.
3484 + * You should have received a copy of the GNU General Public License
3485 + * along with this program; if not, write to the Free Software
3486 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3488 + * Copyright (c) 2008 Andy Green <andy@openmoko.com>
3491 +#include <linux/kernel.h>
3492 +#include <linux/device.h>
3493 +#include "ts_filter.h"
3495 +static DEFINE_MUTEX(chain_mutex);
3497 +int ts_filter_create_chain(struct platform_device *pdev,
3498 + struct ts_filter_api **api, void **config,
3499 + struct ts_filter **arr, int count_coords)
3502 + struct ts_filter *last = NULL;
3507 + mutex_lock(&chain_mutex);
3510 + *arr = ((*api)->create)(pdev, *config++, count_coords);
3512 + printk(KERN_ERR "Filter %d failed init\n", count);
3515 + (*arr)->api = *api++;
3517 + last->next = *arr;
3523 + mutex_unlock(&chain_mutex);
3527 +EXPORT_SYMBOL_GPL(ts_filter_create_chain);
3529 +void ts_filter_destroy_chain(struct platform_device *pdev,
3530 + struct ts_filter **arr)
3532 + struct ts_filter **first = arr;
3534 + mutex_lock(&chain_mutex);
3537 + ((*arr)->api->destroy)(pdev, *arr);
3542 + mutex_unlock(&chain_mutex);
3544 +EXPORT_SYMBOL_GPL(ts_filter_destroy_chain);
3546 diff --git a/drivers/input/touchscreen/ts_filter.h b/drivers/input/touchscreen/ts_filter.h
3547 new file mode 100644
3548 index 0000000..3746e45
3550 +++ b/drivers/input/touchscreen/ts_filter.h
3552 +#ifndef __TS_FILTER_H__
3553 +#define __TS_FILTER_H__
3556 + * Touchscreen filter.
3558 + * (c) 2008 Andy Green <andy@openmoko.com>
3561 +#include <linux/platform_device.h>
3563 +#define MAX_TS_FILTER_CHAIN 8 /* Max. filters we can chain up. */
3564 +#define MAX_TS_FILTER_COORDS 3 /* X, Y and Z (pressure). */
3568 +/* Operations that a filter can perform. */
3570 +struct ts_filter_api {
3571 + struct ts_filter * (*create)(struct platform_device *pdev, void *config,
3572 + int count_coords);
3573 + void (*destroy)(struct platform_device *pdev, struct ts_filter *filter);
3574 + void (*clear)(struct ts_filter *filter);
3575 + int (*process)(struct ts_filter *filter, int *coords);
3576 + void (*scale)(struct ts_filter *filter, int *coords);
3580 + * This is the common part of all filters.
3581 + * We use this type as an otherwise opaque handle on to
3582 + * the actual filter. Therefore you need one of these
3583 + * at the start of your actual filter struct.
3587 + struct ts_filter *next; /* Next in chain. */
3588 + struct ts_filter_api *api; /* Operations to use for this object. */
3590 + int coords[MAX_TS_FILTER_COORDS];
3594 + * Helper to create a filter chain from an array of API pointers and
3595 + * array of config ints. Leaves pointers to created filters in arr
3596 + * array and fills in ->next pointers to create the chain.
3599 +#ifdef CONFIG_TOUCHSCREEN_FILTER
3600 +extern int ts_filter_create_chain(struct platform_device *pdev,
3601 + struct ts_filter_api **api, void **config,
3602 + struct ts_filter **arr, int count_coords);
3604 +/* Helper to destroy a whole chain from the list of filter pointers. */
3606 +extern void ts_filter_destroy_chain(struct platform_device *pdev,
3607 + struct ts_filter **arr);
3609 +#define ts_filter_create_chain(pdev, api, config, arr, count_coords) (0)
3610 +#define ts_filter_destroy_chain(pdev, arr) do { } while (0)
3614 diff --git a/drivers/input/touchscreen/ts_filter_group.c b/drivers/input/touchscreen/ts_filter_group.c
3615 new file mode 100644
3616 index 0000000..f2ecd92
3618 +++ b/drivers/input/touchscreen/ts_filter_group.c
3621 + * This program is free software; you can redistribute it and/or modify
3622 + * it under the terms of the GNU General Public License as published by
3623 + * the Free Software Foundation; either version 2 of the License, or
3624 + * (at your option) any later version.
3626 + * This program is distributed in the hope that it will be useful,
3627 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
3628 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3629 + * GNU General Public License for more details.
3631 + * You should have received a copy of the GNU General Public License
3632 + * along with this program; if not, write to the Free Software
3633 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3635 + * Copyright (C) 2008 by Openmoko, Inc.
3636 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
3637 + * All rights reserved.
3639 + * This filter is useful to reject samples that are not reliable. We consider
3640 + * that a sample is not reliable if it deviates form the Majority.
3642 + * 1) We collect S samples.
3644 + * 2) For each dimension:
3646 + * - We sort the points.
3647 + * - Points that are "close enough" are considered to be in the same set.
3648 + * - We choose the set with more elements. If more than "threshold"
3649 + * points are in this set we use the first and the last point of the set
3650 + * to define the valid range for this dimension [min, max], otherwise we
3651 + * discard all the points and go to step 1.
3653 + * 3) We consider the unsorted S samples and try to feed them to the next
3654 + * filter in the chain. If one of the points of each sample
3655 + * is not in the allowed range for its dimension, we discard the sample.
3659 +#include <linux/kernel.h>
3660 +#include <linux/slab.h>
3661 +#include <linux/sort.h>
3662 +#include "ts_filter_group.h"
3664 +static void ts_filter_group_clear_internal(struct ts_filter_group *tsfg,
3668 + tsfg->tries_left = attempts;
3671 +static void ts_filter_group_clear(struct ts_filter *tsf)
3673 + struct ts_filter_group *tsfg = (struct ts_filter_group *)tsf;
3675 + ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
3677 + if (tsf->next) /* chain */
3678 + (tsf->next->api->clear)(tsf->next);
3681 +static struct ts_filter *ts_filter_group_create(struct platform_device *pdev,
3682 + void *conf, int count_coords)
3684 + struct ts_filter_group *tsfg;
3687 + BUG_ON((count_coords < 1) || (count_coords > MAX_TS_FILTER_COORDS));
3689 + tsfg = kzalloc(sizeof(struct ts_filter_group), GFP_KERNEL);
3693 + tsfg->config = (struct ts_filter_group_configuration *)conf;
3694 + tsfg->tsf.count_coords = count_coords;
3696 + BUG_ON(tsfg->config->attempts <= 0);
3698 + tsfg->samples[0] = kmalloc((2 + count_coords) * sizeof(int) *
3699 + tsfg->config->extent, GFP_KERNEL);
3700 + if (!tsfg->samples[0]) {
3704 + for (i = 1; i < count_coords; ++i)
3705 + tsfg->samples[i] = tsfg->samples[0] + i * tsfg->config->extent;
3706 + tsfg->sorted_samples = tsfg->samples[0] + count_coords *
3707 + tsfg->config->extent;
3708 + tsfg->group_size = tsfg->samples[0] + (1 + count_coords) *
3709 + tsfg->config->extent;
3711 + ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
3713 + printk(KERN_INFO" Created group ts filter len %d depth %d close %d "
3714 + "thresh %d\n", tsfg->config->extent, count_coords,
3715 + tsfg->config->close_enough, tsfg->config->threshold);
3717 + return &tsfg->tsf;
3720 +static void ts_filter_group_destroy(struct platform_device *pdev,
3721 + struct ts_filter *tsf)
3723 + struct ts_filter_group *tsfg = (struct ts_filter_group *)tsf;
3725 + kfree(tsfg->samples[0]); /* first guy has pointer from kmalloc */
3729 +static void ts_filter_group_scale(struct ts_filter *tsf, int *coords)
3732 + (tsf->next->api->scale)(tsf->next, coords);
3735 +static int int_cmp(const void *_a, const void *_b)
3737 + const int *a = _a;
3738 + const int *b = _b;
3747 +static int ts_filter_group_process(struct ts_filter *tsf, int *coords)
3749 + struct ts_filter_group *tsfg = (struct ts_filter_group *)tsf;
3752 + int ret = 0; /* ask for more samples by default */
3754 + BUG_ON(tsfg->N >= tsfg->config->extent);
3756 + for (n = 0; n < tsf->count_coords; n++)
3757 + tsfg->samples[n][tsfg->N] = coords[n];
3759 + if (++tsfg->N < tsfg->config->extent)
3760 + return 0; /* we meed more samples */
3762 + for (n = 0; n < tsfg->tsf.count_coords; n++) {
3763 + int *v = tsfg->sorted_samples;
3769 + memcpy(v, tsfg->samples[n], tsfg->N * sizeof(int));
3770 + sort(v, tsfg->N, sizeof(int), int_cmp, NULL);
3772 + tsfg->group_size[0] = 1;
3773 + for (i = 1; i < tsfg->N; ++i) {
3774 + if (v[i] - v[i - 1] <= tsfg->config->close_enough)
3775 + tsfg->group_size[ngroups]++;
3777 + tsfg->group_size[++ngroups] = 1;
3781 + best_size = tsfg->group_size[0];
3782 + for (i = 1; i < ngroups; i++) {
3783 + idx += tsfg->group_size[i - 1];
3784 + if (best_size < tsfg->group_size[i]) {
3785 + best_size = tsfg->group_size[i];
3790 + if (best_size < tsfg->config->threshold) {
3791 + /* this set is not good enough for us */
3792 + if (--tsfg->tries_left) {
3793 + ts_filter_group_clear_internal
3794 + (tsfg, tsfg->tries_left);
3795 + return 0; /* ask for more samples */
3797 + return -1; /* we give up */
3800 + tsfg->range_min[n] = v[best_idx];
3801 + tsfg->range_max[n] = v[best_idx + best_size - 1];
3804 + for (i = 0; i < tsfg->N; ++i) {
3807 + for (n = 0; n < tsfg->tsf.count_coords; ++n) {
3808 + coords[n] = tsfg->samples[n][i];
3809 + if (coords[n] < tsfg->range_min[n] ||
3810 + coords[n] > tsfg->range_max[n])
3814 + if (n != tsfg->tsf.count_coords) /* sample not OK */
3818 + r = (tsf->next->api->process)(tsf->next, coords);
3823 + } else if (i == tsfg->N - 1) {
3828 + ts_filter_group_clear_internal(tsfg, tsfg->config->attempts);
3833 +struct ts_filter_api ts_filter_group_api = {
3834 + .create = ts_filter_group_create,
3835 + .destroy = ts_filter_group_destroy,
3836 + .clear = ts_filter_group_clear,
3837 + .process = ts_filter_group_process,
3838 + .scale = ts_filter_group_scale,
3841 diff --git a/drivers/input/touchscreen/ts_filter_group.h b/drivers/input/touchscreen/ts_filter_group.h
3842 new file mode 100644
3843 index 0000000..c411080
3845 +++ b/drivers/input/touchscreen/ts_filter_group.h
3847 +#ifndef __TS_FILTER_GROUP_H__
3848 +#define __TS_FILTER_GROUP_H__
3850 +#include "ts_filter.h"
3853 + * Touchscreen group filter.
3855 + * Copyright (C) 2008 by Openmoko, Inc.
3856 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
3860 +struct ts_filter_group_configuration {
3867 +struct ts_filter_group {
3868 + struct ts_filter tsf;
3869 + struct ts_filter_group_configuration *config;
3871 + int N; /* How many samples we have */
3872 + int *samples[MAX_TS_FILTER_COORDS]; /* the samples, our input */
3874 + int *group_size; /* used for temporal computations */
3875 + int *sorted_samples; /* used for temporal computations */
3877 + int range_max[MAX_TS_FILTER_COORDS]; /* max computed ranges */
3878 + int range_min[MAX_TS_FILTER_COORDS]; /* min computed ranges */
3880 + int tries_left; /* We finish if we don't get enough samples */
3883 +extern struct ts_filter_api ts_filter_group_api;
3886 diff --git a/drivers/input/touchscreen/ts_filter_linear.c b/drivers/input/touchscreen/ts_filter_linear.c
3887 new file mode 100644
3888 index 0000000..c336252
3890 +++ b/drivers/input/touchscreen/ts_filter_linear.c
3893 + * This program is free software; you can redistribute it and/or modify
3894 + * it under the terms of the GNU General Public License as published by
3895 + * the Free Software Foundation; version 2 of the License, or
3896 + * (at your option) any later version.
3898 + * This program is distributed in the hope that it will be useful,
3899 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
3900 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3901 + * GNU General Public License for more details.
3903 + * You should have received a copy of the GNU General Public License
3904 + * along with this program; if not, write to the Free Software
3905 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3907 + * Copyright (C) 2008 by Openmoko, Inc.
3908 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
3909 + * All rights reserved.
3911 + * Linearly scale touchscreen values.
3913 + * Expose the TS_FILTER_LINEAR_NCONSTANTS for the linear transformation
3918 +#include "ts_filter_linear.h"
3919 +#include <linux/kernel.h>
3920 +#include <linux/slab.h>
3921 +#include <linux/string.h>
3924 +/* sysfs functions */
3927 +static ssize_t const_attr_show(struct kobject *kobj,
3928 + struct attribute *attr,
3931 + struct const_attribute *a = to_const_attr(attr);
3933 + return a->show(to_const_obj(kobj), a, buf);
3936 +static ssize_t const_attr_store(struct kobject *kobj,
3937 + struct attribute *attr,
3938 + const char *buf, size_t len)
3940 + struct const_attribute *a = to_const_attr(attr);
3942 + return a->store(to_const_obj(kobj), a, buf, len);
3945 +static struct sysfs_ops const_sysfs_ops = {
3946 + .show = const_attr_show,
3947 + .store = const_attr_store,
3950 +static void const_release(struct kobject *kobj)
3952 + kfree(to_const_obj(kobj)->tsfl);
3955 +static ssize_t const_show(struct const_obj *obj, struct const_attribute *attr,
3960 + sscanf(attr->attr.name, "%d", &who);
3961 + return sprintf(buf, "%d\n", obj->tsfl->constants[who]);
3964 +static ssize_t const_store(struct const_obj *obj, struct const_attribute *attr,
3965 + const char *buf, size_t count)
3969 + sscanf(attr->attr.name, "%d", &who);
3970 + sscanf(buf, "%d", &obj->tsfl->constants[who]);
3974 +/* filter functions */
3976 +static struct ts_filter *ts_filter_linear_create(struct platform_device *pdev,
3977 + void *conf, int count_coords)
3979 + struct ts_filter_linear *tsfl;
3983 + tsfl = kzalloc(sizeof(struct ts_filter_linear), GFP_KERNEL);
3987 + tsfl->config = (struct ts_filter_linear_configuration *)conf;
3988 + tsfl->tsf.count_coords = count_coords;
3990 + for (i = 0; i < TS_FILTER_LINEAR_NCONSTANTS; ++i) {
3991 + tsfl->constants[i] = tsfl->config->constants[i];
3994 + sprintf(tsfl->attr_names[i], "%d", i);
3995 + tsfl->kattrs[i].attr.name = tsfl->attr_names[i];
3996 + tsfl->kattrs[i].attr.mode = 0666;
3997 + tsfl->kattrs[i].show = const_show;
3998 + tsfl->kattrs[i].store = const_store;
3999 + tsfl->attrs[i] = &tsfl->kattrs[i].attr;
4001 + tsfl->attrs[i] = NULL;
4003 + tsfl->const_ktype.sysfs_ops = &const_sysfs_ops;
4004 + tsfl->const_ktype.release = const_release;
4005 + tsfl->const_ktype.default_attrs = tsfl->attrs;
4006 + tsfl->c_obj.tsfl = tsfl; /* kernel frees tsfl in const_release */
4008 + ret = kobject_init_and_add(&tsfl->c_obj.kobj, &tsfl->const_ktype,
4009 + &pdev->dev.kobj, "calibration");
4011 + kobject_put(&tsfl->c_obj.kobj);
4015 + printk(KERN_INFO" Created Linear ts filter depth %d\n", count_coords);
4017 + return &tsfl->tsf;
4020 +static void ts_filter_linear_destroy(struct platform_device *pdev,
4021 + struct ts_filter *tsf)
4023 + struct ts_filter_linear *tsfl = (struct ts_filter_linear *)tsf;
4025 + /* kernel frees tsfl in const_release */
4026 + kobject_put(&tsfl->c_obj.kobj);
4029 +static void ts_filter_linear_clear(struct ts_filter *tsf)
4031 + if (tsf->next) /* chain */
4032 + (tsf->next->api->clear)(tsf->next);
4036 +static void ts_filter_linear_scale(struct ts_filter *tsf, int *coords)
4038 + struct ts_filter_linear *tsfl = (struct ts_filter_linear *)tsf;
4039 + int *k = tsfl->constants;
4040 + int c0 = coords[tsfl->config->coord0];
4041 + int c1 = coords[tsfl->config->coord1];
4043 + coords[tsfl->config->coord0] = (k[2] + k[0] * c0 + k[1] * c1) / k[6];
4044 + coords[tsfl->config->coord1] = (k[5] + k[3] * c0 + k[4] * c1) / k[6];
4047 + (tsf->next->api->scale)(tsf->next, coords);
4050 +static int ts_filter_linear_process(struct ts_filter *tsf, int *coords)
4053 + return (tsf->next->api->process)(tsf->next, coords);
4058 +struct ts_filter_api ts_filter_linear_api = {
4059 + .create = ts_filter_linear_create,
4060 + .destroy = ts_filter_linear_destroy,
4061 + .clear = ts_filter_linear_clear,
4062 + .process = ts_filter_linear_process,
4063 + .scale = ts_filter_linear_scale,
4065 diff --git a/drivers/input/touchscreen/ts_filter_linear.h b/drivers/input/touchscreen/ts_filter_linear.h
4066 new file mode 100644
4067 index 0000000..fc27cf7
4069 +++ b/drivers/input/touchscreen/ts_filter_linear.h
4071 +#ifndef __TS_FILTER_LINEAR_H__
4072 +#define __TS_FILTER_LINEAR_H__
4074 +#include "ts_filter.h"
4075 +#include <linux/kobject.h>
4078 + * Touchscreen linear filter.
4080 + * Copyright (C) 2008 by Openmoko, Inc.
4081 + * Author: Nelson Castillo <arhuaco@freaks-unidos.net>
4085 +#define TS_FILTER_LINEAR_NCONSTANTS 7
4089 +struct ts_filter_linear;
4092 + struct ts_filter_linear *tsfl;
4093 + struct kobject kobj;
4096 +#define to_const_obj(x) container_of(x, struct const_obj, kobj)
4098 +struct const_attribute {
4099 + struct attribute attr;
4100 + ssize_t (*show)(struct const_obj *const, struct const_attribute *attr,
4102 + ssize_t (*store)(struct const_obj *const, struct const_attribute *attr,
4103 + const char *buf, size_t count);
4106 +#define to_const_attr(x) container_of(x, struct const_attribute, attr)
4108 +/* filter configuration */
4110 +struct ts_filter_linear_configuration {
4111 + int constants[TS_FILTER_LINEAR_NCONSTANTS];
4118 +struct ts_filter_linear {
4119 + struct ts_filter tsf;
4120 + struct ts_filter_linear_configuration *config;
4122 + int constants[TS_FILTER_LINEAR_NCONSTANTS];
4125 + struct const_obj c_obj;
4126 + struct kobj_type const_ktype;
4127 + struct const_attribute kattrs[TS_FILTER_LINEAR_NCONSTANTS];
4128 + struct attribute *attrs[TS_FILTER_LINEAR_NCONSTANTS + 1];
4129 + char attr_names[TS_FILTER_LINEAR_NCONSTANTS][2];
4132 +extern struct ts_filter_api ts_filter_linear_api;
4135 diff --git a/drivers/input/touchscreen/ts_filter_mean.c b/drivers/input/touchscreen/ts_filter_mean.c
4136 new file mode 100644
4137 index 0000000..e4e0f2a
4139 +++ b/drivers/input/touchscreen/ts_filter_mean.c
4142 + * This program is free software; you can redistribute it and/or modify
4143 + * it under the terms of the GNU General Public License as published by
4144 + * the Free Software Foundation; either version 2 of the License, or
4145 + * (at your option) any later version.
4147 + * This program is distributed in the hope that it will be useful,
4148 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4149 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4150 + * GNU General Public License for more details.
4152 + * You should have received a copy of the GNU General Public License
4153 + * along with this program; if not, write to the Free Software
4154 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4156 + * Copyright (c) 2008 Andy Green <andy@openmoko.com>
4159 + * Mean has no effect if the samples are changing by more that the
4160 + * threshold set by averaging_threshold in the configuration.
4162 + * However while samples come in that don't go outside this threshold from
4163 + * the last reported sample, Mean replaces the samples with a simple mean
4164 + * of a configurable number of samples (set by bits_filter_length in config,
4165 + * which is 2^n, so 5 there makes 32 sample averaging).
4167 + * Mean works well if the input data is already good quality, reducing + / - 1
4168 + * sample jitter when the stylus is still, or moving very slowly, without
4169 + * introducing abrupt transitions or reducing ability to follow larger
4170 + * movements. If you set the threshold higher than the dynamic range of the
4171 + * coordinates, you can just use it as a simple mean average.
4174 +#include <linux/errno.h>
4175 +#include <linux/kernel.h>
4176 +#include <linux/slab.h>
4177 +#include "ts_filter_mean.h"
4179 +static void ts_filter_mean_clear_internal(struct ts_filter *tsf)
4181 + struct ts_filter_mean *tsfs = (struct ts_filter_mean *)tsf;
4184 + for (n = 0; n < tsfs->tsf.count_coords; n++) {
4185 + tsfs->fhead[n] = 0;
4186 + tsfs->ftail[n] = 0;
4187 + tsfs->lowpass[n] = 0;
4191 +static void ts_filter_mean_clear(struct ts_filter *tsf)
4193 + ts_filter_mean_clear_internal(tsf);
4195 + if (tsf->next) /* chain */
4196 + (tsf->next->api->clear)(tsf->next);
4199 +static struct ts_filter *ts_filter_mean_create(struct platform_device *pdev,
4200 + void *config, int count_coords)
4204 + struct ts_filter_mean *tsfs = kzalloc(
4205 + sizeof(struct ts_filter_mean), GFP_KERNEL);
4210 + BUG_ON((count_coords < 1) || (count_coords > MAX_TS_FILTER_COORDS));
4211 + tsfs->tsf.count_coords = count_coords;
4213 + tsfs->config = (struct ts_filter_mean_configuration *)config;
4215 + tsfs->config->extent = 1 << tsfs->config->bits_filter_length;
4216 + BUG_ON((tsfs->config->extent > 256) || (!tsfs->config->extent));
4218 + p = kmalloc(tsfs->config->extent * sizeof(int) * count_coords,
4223 + for (n = 0; n < count_coords; n++) {
4224 + tsfs->fifo[n] = p;
4225 + p += tsfs->config->extent;
4228 + if (!tsfs->config->averaging_threshold)
4229 + tsfs->config->averaging_threshold = 0xffff; /* always active */
4231 + ts_filter_mean_clear_internal(&tsfs->tsf);
4233 + printk(KERN_INFO" Created Mean ts filter len %d depth %d thresh %d\n",
4234 + tsfs->config->extent, count_coords,
4235 + tsfs->config->averaging_threshold);
4237 + return &tsfs->tsf;
4240 +static void ts_filter_mean_destroy(struct platform_device *pdev,
4241 + struct ts_filter *tsf)
4243 + struct ts_filter_mean *tsfs = (struct ts_filter_mean *)tsf;
4245 + kfree(tsfs->fifo[0]); /* first guy has pointer from kmalloc */
4249 +static void ts_filter_mean_scale(struct ts_filter *tsf, int *coords)
4251 + if (tsf->next) /* chain */
4252 + (tsf->next->api->scale)(tsf->next, coords);
4256 + * Give us the raw sample data in x and y, and if we return 1 then you can
4257 + * get a filtered coordinate from tsm->x and tsm->y. If we return 0 you didn't
4258 + * fill the filter with samples yet.
4261 +static int ts_filter_mean_process(struct ts_filter *tsf, int *coords)
4263 + struct ts_filter_mean *tsfs = (struct ts_filter_mean *)tsf;
4267 + for (n = 0; n < tsf->count_coords; n++) {
4270 + * Has he moved far enough away that we should abandon current
4271 + * low pass filtering state?
4273 + if ((coords[n] < (tsfs->reported[n] -
4274 + tsfs->config->averaging_threshold)) ||
4275 + (coords[n] > (tsfs->reported[n] +
4276 + tsfs->config->averaging_threshold))) {
4277 + tsfs->fhead[n] = 0;
4278 + tsfs->ftail[n] = 0;
4279 + tsfs->lowpass[n] = 0;
4282 + /* capture this sample into fifo and sum */
4283 + tsfs->fifo[n][tsfs->fhead[n]++] = coords[n];
4284 + if (tsfs->fhead[n] == tsfs->config->extent)
4285 + tsfs->fhead[n] = 0;
4286 + tsfs->lowpass[n] += coords[n];
4288 + /* adjust the sum into an average and use that*/
4289 + len = (tsfs->fhead[n] - tsfs->ftail[n]) &
4290 + (tsfs->config->extent - 1);
4291 + coords[n] = (tsfs->lowpass[n] + (len >> 1)) / len;
4292 + tsfs->reported[n] = coords[n];
4294 + /* remove oldest sample if we are full */
4295 + if (len == (tsfs->config->extent - 1)) {
4296 + tsfs->lowpass[n] -= tsfs->fifo[n][tsfs->ftail[n]++];
4297 + if (tsfs->ftail[n] == tsfs->config->extent)
4298 + tsfs->ftail[n] = 0;
4302 + if (tsf->next) /* chain */
4303 + return (tsf->next->api->process)(tsf->next, coords);
4308 +struct ts_filter_api ts_filter_mean_api = {
4309 + .create = ts_filter_mean_create,
4310 + .destroy = ts_filter_mean_destroy,
4311 + .clear = ts_filter_mean_clear,
4312 + .process = ts_filter_mean_process,
4313 + .scale = ts_filter_mean_scale,
4315 diff --git a/drivers/input/touchscreen/ts_filter_mean.h b/drivers/input/touchscreen/ts_filter_mean.h
4316 new file mode 100644
4317 index 0000000..44c506c
4319 +++ b/drivers/input/touchscreen/ts_filter_mean.h
4321 +#ifndef __TS_FILTER_MEAN_H__
4322 +#define __TS_FILTER_MEAN_H__
4324 +#include "ts_filter.h"
4327 + * Touchscreen filter.
4331 + * (c) 2008 Andy Green <andy@openmoko.com>
4334 +struct ts_filter_mean_configuration {
4335 + int bits_filter_length;
4336 + int averaging_threshold;
4341 +struct ts_filter_mean {
4342 + struct ts_filter tsf;
4343 + struct ts_filter_mean_configuration *config;
4345 + int reported[MAX_TS_FILTER_COORDS];
4346 + int lowpass[MAX_TS_FILTER_COORDS];
4347 + int *fifo[MAX_TS_FILTER_COORDS];
4348 + int fhead[MAX_TS_FILTER_COORDS];
4349 + int ftail[MAX_TS_FILTER_COORDS];
4352 +extern struct ts_filter_api ts_filter_mean_api;
4355 diff --git a/drivers/input/touchscreen/ts_filter_median.c b/drivers/input/touchscreen/ts_filter_median.c
4356 new file mode 100644
4357 index 0000000..b3b6a9c
4359 +++ b/drivers/input/touchscreen/ts_filter_median.c
4362 + * This program is free software; you can redistribute it and/or modify
4363 + * it under the terms of the GNU General Public License as published by
4364 + * the Free Software Foundation; either version 2 of the License, or
4365 + * (at your option) any later version.
4367 + * This program is distributed in the hope that it will be useful,
4368 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
4369 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4370 + * GNU General Public License for more details.
4372 + * You should have received a copy of the GNU General Public License
4373 + * along with this program; if not, write to the Free Software
4374 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4376 + * Copyright (c) 2008 Andy Green <andy@openmoko.com>
4379 + * Median averaging stuff. We sort incoming raw samples into an array of
4380 + * MEDIAN_SIZE length, discarding the oldest sample each time once we are full.
4381 + * We then return the sum of the middle three samples for X and Y. It means
4382 + * the final result must be divided by (3 * scaling factor) to correct for
4383 + * avoiding the repeated /3.
4385 + * This strongly rejects brief excursions away from a central point that is
4386 + * sticky in time compared to the excursion duration.
4388 + * Thanks to Dale Schumacher (who wrote some example code) and Carl-Daniel
4389 + * Halifinger who pointed out this would be a good method.
4392 +#include <linux/errno.h>
4393 +#include <linux/kernel.h>
4394 +#include <linux/slab.h>
4395 +#include "ts_filter_median.h"
4397 +static void ts_filter_median_insert(int *p, int sample, int count)
4401 + /* search through what we got so far to find where to put sample */
4402 + for (n = 0; n < count; n++)
4403 + /* we met somebody bigger than us? */
4404 + if (sample < p[n]) {
4405 + /* starting from the end, push bigger guys down one */
4406 + for (count--; count >= n; count--)
4407 + p[count + 1] = p[count];
4408 + p[n] = sample; /* and put us in place of first bigger */
4412 + p[count] = sample; /* nobody was bigger than us, add us on the end */
4415 +static void ts_filter_median_del(int *p, int value, int count)
4419 + for (index = 0; index < count; index++)
4420 + if (p[index] == value) {
4421 + for (; index < count; index++)
4422 + p[index] = p[index + 1];
4428 +static void ts_filter_median_clear_internal(struct ts_filter *tsf)
4430 + struct ts_filter_median *tsfm = (struct ts_filter_median *)tsf;
4436 +static void ts_filter_median_clear(struct ts_filter *tsf)
4438 + ts_filter_median_clear_internal(tsf);
4440 + if (tsf->next) /* chain */
4441 + (tsf->next->api->clear)(tsf->next);
4444 +static struct ts_filter *ts_filter_median_create(struct platform_device *pdev,
4445 + void *conf, int count_coords)
4449 + struct ts_filter_median *tsfm = kzalloc(sizeof(struct ts_filter_median),
4455 + tsfm->config = (struct ts_filter_median_configuration *)conf;
4456 + BUG_ON((count_coords < 1) || (count_coords > MAX_TS_FILTER_COORDS));
4457 + tsfm->tsf.count_coords = count_coords;
4459 + tsfm->config->midpoint = (tsfm->config->extent >> 1) + 1;
4461 + p = kmalloc(2 * count_coords * sizeof(int) * (tsfm->config->extent + 1),
4468 + for (n = 0; n < count_coords; n++) {
4469 + tsfm->sort[n] = p;
4470 + p += tsfm->config->extent + 1;
4471 + tsfm->fifo[n] = p;
4472 + p += tsfm->config->extent + 1;
4475 + ts_filter_median_clear_internal(&tsfm->tsf);
4477 + printk(KERN_INFO" Created Median ts filter len %d depth %d dec %d\n",
4478 + tsfm->config->extent, count_coords,
4479 + tsfm->config->decimation_threshold);
4481 + return &tsfm->tsf;
4484 +static void ts_filter_median_destroy(struct platform_device *pdev,
4485 + struct ts_filter *tsf)
4487 + struct ts_filter_median *tsfm = (struct ts_filter_median *)tsf;
4489 + kfree(tsfm->sort[0]); /* first guy has pointer from kmalloc */
4493 +static void ts_filter_median_scale(struct ts_filter *tsf, int *coords)
4497 + for (n = 0; n < tsf->count_coords; n++)
4498 + coords[n] = (coords[n] + 2) / 3;
4500 + if (tsf->next) /* chain */
4501 + (tsf->next->api->scale)(tsf->next, coords);
4505 + * Give us the raw sample data coords, and if we return 1 then you can
4506 + * get a filtered coordinate from coords. If we return 0 you didn't
4507 + * fill all the filters with samples yet.
4510 +static int ts_filter_median_process(struct ts_filter *tsf, int *coords)
4512 + struct ts_filter_median *tsfm = (struct ts_filter_median *)tsf;
4516 + for (n = 0; n < tsf->count_coords; n++) {
4517 + /* grab copy in insertion order to remove when oldest */
4518 + tsfm->fifo[n][tsfm->pos] = coords[n];
4519 + /* insert these samples in sorted order in the median arrays */
4520 + ts_filter_median_insert(tsfm->sort[n], coords[n], tsfm->valid);
4522 + /* move us on in the fifo */
4523 + if (++tsfm->pos == (tsfm->config->extent + 1))
4526 + /* we have finished a median sampling? */
4527 + if (++tsfm->valid != tsfm->config->extent)
4528 + return 0; /* no valid sample to use */
4530 + /* discard the oldest sample in median sorted array */
4534 + * Sum the middle 3 in the median sorted arrays. We don't divide back
4535 + * down which increases the sum resolution by a factor of 3 until the
4536 + * scale API is called.
4538 + for (n = 0; n < tsfm->tsf.count_coords; n++)
4539 + /* perform the deletion of the oldest sample */
4540 + ts_filter_median_del(tsfm->sort[n], tsfm->fifo[n][tsfm->pos],
4543 + tsfm->decimation_count--;
4544 + if (tsfm->decimation_count >= 0)
4547 + for (n = 0; n < tsfm->tsf.count_coords; n++) {
4548 + /* give the coordinate result from summing median 3 */
4549 + coords[n] = tsfm->sort[n][tsfm->config->midpoint - 1] +
4550 + tsfm->sort[n][tsfm->config->midpoint] +
4551 + tsfm->sort[n][tsfm->config->midpoint + 1]
4554 + movement += abs(tsfm->last_issued[n] - coords[n]);
4557 + if (movement > tsfm->config->decimation_threshold) /* fast */
4558 + tsfm->decimation_count = tsfm->config->decimation_above;
4560 + tsfm->decimation_count = tsfm->config->decimation_below;
4562 + memcpy(&tsfm->last_issued[0], coords,
4563 + tsfm->tsf.count_coords * sizeof(int));
4565 + if (tsf->next) /* chain */
4566 + return (tsf->next->api->process)(tsf->next, coords);
4571 +struct ts_filter_api ts_filter_median_api = {
4572 + .create = ts_filter_median_create,
4573 + .destroy = ts_filter_median_destroy,
4574 + .clear = ts_filter_median_clear,
4575 + .process = ts_filter_median_process,
4576 + .scale = ts_filter_median_scale,
4578 diff --git a/drivers/input/touchscreen/ts_filter_median.h b/drivers/input/touchscreen/ts_filter_median.h
4579 new file mode 100644
4580 index 0000000..8f25e27
4582 +++ b/drivers/input/touchscreen/ts_filter_median.h
4584 +#ifndef __TS_FILTER_MEDIAN_H__
4585 +#define __TS_FILTER_MEDIAN_H__
4587 +#include "ts_filter.h"
4590 + * Touchscreen filter.
4594 + * (c) 2008 Andy Green <andy@openmoko.com>
4597 +struct ts_filter_median_configuration {
4600 + int decimation_threshold;
4601 + int decimation_above;
4602 + int decimation_below;
4605 +struct ts_filter_median {
4606 + struct ts_filter tsf;
4607 + struct ts_filter_median_configuration *config;
4609 + int decimation_count;
4610 + int last_issued[MAX_TS_FILTER_COORDS];
4611 + int valid; /* how many samples in the sort buffer are valid */
4612 + int *sort[MAX_TS_FILTER_COORDS]; /* samples taken for median */
4613 + int *fifo[MAX_TS_FILTER_COORDS]; /* samples taken for median */
4614 + int pos; /* where we are in the fifo sample memory */
4617 +extern struct ts_filter_api ts_filter_median_api;
4620 diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
4621 index 26fc098..2449230 100644
4622 --- a/drivers/mmc/core/sd.c
4623 +++ b/drivers/mmc/core/sd.c
4624 @@ -449,6 +449,11 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
4628 +#ifdef CONFIG_MACH_MINI2440
4629 + /* Prevents the -110 error at startup/insertion */
4634 * Fetch switch information from card.
4636 diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig
4637 index 39ac49e..34834ed 100644
4638 --- a/drivers/video/logo/Kconfig
4639 +++ b/drivers/video/logo/Kconfig
4640 @@ -82,4 +82,9 @@ config LOGO_M32R_CLUT224
4644 +config LOGO_ARMWORKS_CLUT224
4645 + bool "Armworks 224-color logo"
4646 + depends on MACH_MINI2440
4650 diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile
4651 index b91251d..4d0423f 100644
4652 --- a/drivers/video/logo/Makefile
4653 +++ b/drivers/video/logo/Makefile
4654 @@ -15,6 +15,7 @@ obj-$(CONFIG_LOGO_SUPERH_MONO) += logo_superh_mono.o
4655 obj-$(CONFIG_LOGO_SUPERH_VGA16) += logo_superh_vga16.o
4656 obj-$(CONFIG_LOGO_SUPERH_CLUT224) += logo_superh_clut224.o
4657 obj-$(CONFIG_LOGO_M32R_CLUT224) += logo_m32r_clut224.o
4658 +obj-$(CONFIG_LOGO_ARMWORKS_CLUT224) += logo_armworks_clut224.o
4660 obj-$(CONFIG_SPU_BASE) += logo_spe_clut224.o
4662 diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c
4663 index 2e85a2b..40b5e31 100644
4664 --- a/drivers/video/logo/logo.c
4665 +++ b/drivers/video/logo/logo.c
4666 @@ -35,6 +35,7 @@ extern const struct linux_logo logo_superh_mono;
4667 extern const struct linux_logo logo_superh_vga16;
4668 extern const struct linux_logo logo_superh_clut224;
4669 extern const struct linux_logo logo_m32r_clut224;
4670 +extern const struct linux_logo logo_armworks_clut224;
4673 module_param(nologo, bool, 0);
4674 @@ -115,6 +116,10 @@ const struct linux_logo * __init_refok fb_find_logo(int depth)
4675 /* M32R Linux logo */
4676 logo = &logo_m32r_clut224;
4678 +#ifdef CONFIG_LOGO_ARMWORKS_CLUT224
4679 + /* ARMWorks Linux logo */
4680 + logo = &logo_armworks_clut224;
4685 diff --git a/drivers/video/logo/logo_armworks_clut224.ppm b/drivers/video/logo/logo_armworks_clut224.ppm
4686 new file mode 100644
4687 index 0000000..a632167
4689 +++ b/drivers/video/logo/logo_armworks_clut224.ppm
4692 +# CREATOR: GIMP PNM Filter Version 1.1
16695 diff --git a/init/main.c b/init/main.c
16696 index 8442094..f991cbf 100644
16699 @@ -795,8 +795,20 @@ static noinline int init_post(void)
16700 system_state = SYSTEM_RUNNING;
16701 numa_default_policy();
16703 - if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
16704 - printk(KERN_WARNING "Warning: unable to open an initial console.\n");
16705 + if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) {
16706 + /* jal: try to create /dev/console as char device 5,1 */
16708 + if ((rc=sys_mknod((const char __user *) "/dev/console", S_IFCHR|S_IRUSR|S_IWUSR, MKDEV(5,1))) < 0) {
16709 + printk(KERN_WARNING "Failed to create /dev/console (%d)\n",rc);
16712 + if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) {
16713 + printk(KERN_WARNING "Created missing /dev/console, proceeding ...\n");
16715 + printk(KERN_WARNING "opened intial console on char dev 5,1\n");