[ar71xx] make use the USB controller on the WP543 board
[openwrt.git] / target / linux / orion / patches / 000-orion_git_sync.patch
1 --- a/MAINTAINERS
2 +++ b/MAINTAINERS
3 @@ -2686,12 +2686,10 @@
4 S: Maintained
5
6 MARVELL MV643XX ETHERNET DRIVER
7 -P: Dale Farnsworth
8 -M: dale@farnsworth.org
9 -P: Manish Lachwani
10 -M: mlachwani@mvista.com
11 +P: Lennert Buytenhek
12 +M: buytenh@marvell.com
13 L: netdev@vger.kernel.org
14 -S: Odd Fixes for 2.4; Maintained for 2.6.
15 +S: Supported
16
17 MATROX FRAMEBUFFER DRIVER
18 P: Petr Vandrovec
19 --- a/arch/arm/Kconfig
20 +++ b/arch/arm/Kconfig
21 @@ -84,6 +84,11 @@
22 bool
23 default y
24
25 +config HAVE_LATENCYTOP_SUPPORT
26 + bool
27 + depends on !SMP
28 + default y
29 +
30 config LOCKDEP_SUPPORT
31 bool
32 default y
33 @@ -347,6 +352,16 @@
34 If you have any questions or comments about the Linux kernel port
35 to this board, send e-mail to <sjhill@cotw.com>.
36
37 +config ARCH_KIRKWOOD
38 + bool "Marvell Kirkwood"
39 + select PCI
40 + select GENERIC_TIME
41 + select GENERIC_CLOCKEVENTS
42 + select PLAT_ORION
43 + help
44 + Support for the following Marvell Kirkwood series SoCs:
45 + 88F6180, 88F6192 and 88F6281.
46 +
47 config ARCH_KS8695
48 bool "Micrel/Kendin KS8695"
49 select GENERIC_GPIO
50 @@ -365,6 +380,24 @@
51
52 <http://www.digi.com/products/microprocessors/index.jsp>
53
54 +config ARCH_LOKI
55 + bool "Marvell Loki (88RC8480)"
56 + select GENERIC_TIME
57 + select GENERIC_CLOCKEVENTS
58 + select PLAT_ORION
59 + help
60 + Support for the Marvell Loki (88RC8480) SoC.
61 +
62 +config ARCH_MV78XX0
63 + bool "Marvell MV78xx0"
64 + select PCI
65 + select GENERIC_TIME
66 + select GENERIC_CLOCKEVENTS
67 + select PLAT_ORION
68 + help
69 + Support for the following Marvell MV78xx0 series SoCs:
70 + MV781x0, MV782x0.
71 +
72 config ARCH_MXC
73 bool "Freescale MXC/iMX-based"
74 select ARCH_MTD_XIP
75 @@ -381,7 +414,8 @@
76 select PLAT_ORION
77 help
78 Support for the following Marvell Orion 5x series SoCs:
79 - Orion-1 (5181), Orion-NAS (5182), Orion-2 (5281.)
80 + Orion-1 (5181), Orion-VoIP (5181L), Orion-NAS (5182),
81 + Orion-2 (5281).
82
83 config ARCH_PNX4008
84 bool "Philips Nexperia PNX4008 Mobile"
85 @@ -502,6 +536,10 @@
86
87 source "arch/arm/mach-ixp23xx/Kconfig"
88
89 +source "arch/arm/mach-loki/Kconfig"
90 +
91 +source "arch/arm/mach-mv78xx0/Kconfig"
92 +
93 source "arch/arm/mach-pxa/Kconfig"
94
95 source "arch/arm/mach-sa1100/Kconfig"
96 @@ -514,6 +552,8 @@
97
98 source "arch/arm/mach-orion5x/Kconfig"
99
100 +source "arch/arm/mach-kirkwood/Kconfig"
101 +
102 source "arch/arm/plat-s3c24xx/Kconfig"
103 source "arch/arm/plat-s3c/Kconfig"
104
105 --- a/arch/arm/Makefile
106 +++ b/arch/arm/Makefile
107 @@ -135,11 +135,14 @@
108 machine-$(CONFIG_ARCH_NETX) := netx
109 machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx
110 machine-$(CONFIG_ARCH_DAVINCI) := davinci
111 + machine-$(CONFIG_ARCH_KIRKWOOD) := kirkwood
112 machine-$(CONFIG_ARCH_KS8695) := ks8695
113 incdir-$(CONFIG_ARCH_MXC) := mxc
114 machine-$(CONFIG_ARCH_MX3) := mx3
115 machine-$(CONFIG_ARCH_ORION5X) := orion5x
116 machine-$(CONFIG_ARCH_MSM7X00A) := msm
117 + machine-$(CONFIG_ARCH_LOKI) := loki
118 + machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0
119
120 ifeq ($(CONFIG_ARCH_EBSA110),y)
121 # This is what happens if you forget the IOCS16 line.
122 --- a/arch/arm/boot/compressed/head.S
123 +++ b/arch/arm/boot/compressed/head.S
124 @@ -623,8 +623,8 @@
125 b __armv4_mmu_cache_off
126 b __armv4_mmu_cache_flush
127
128 - .word 0x56055310 @ Feroceon
129 - .word 0xfffffff0
130 + .word 0x56050000 @ Feroceon
131 + .word 0xff0f0000
132 b __armv4_mmu_cache_on
133 b __armv4_mmu_cache_off
134 b __armv5tej_mmu_cache_flush
135 --- /dev/null
136 +++ b/arch/arm/configs/kirkwood_defconfig
137 @@ -0,0 +1,1426 @@
138 +#
139 +# Automatically generated make config: don't edit
140 +# Linux kernel version: 2.6.26-rc5
141 +# Sun Jun 22 15:51:25 2008
142 +#
143 +CONFIG_ARM=y
144 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
145 +CONFIG_GENERIC_GPIO=y
146 +CONFIG_GENERIC_TIME=y
147 +CONFIG_GENERIC_CLOCKEVENTS=y
148 +CONFIG_MMU=y
149 +# CONFIG_NO_IOPORT is not set
150 +CONFIG_GENERIC_HARDIRQS=y
151 +CONFIG_STACKTRACE_SUPPORT=y
152 +CONFIG_HAVE_LATENCYTOP_SUPPORT=y
153 +CONFIG_LOCKDEP_SUPPORT=y
154 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
155 +CONFIG_HARDIRQS_SW_RESEND=y
156 +CONFIG_GENERIC_IRQ_PROBE=y
157 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
158 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
159 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
160 +CONFIG_GENERIC_HWEIGHT=y
161 +CONFIG_GENERIC_CALIBRATE_DELAY=y
162 +CONFIG_ARCH_SUPPORTS_AOUT=y
163 +CONFIG_ZONE_DMA=y
164 +CONFIG_VECTORS_BASE=0xffff0000
165 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
166 +
167 +#
168 +# General setup
169 +#
170 +CONFIG_EXPERIMENTAL=y
171 +CONFIG_BROKEN_ON_SMP=y
172 +CONFIG_LOCK_KERNEL=y
173 +CONFIG_INIT_ENV_ARG_LIMIT=32
174 +CONFIG_LOCALVERSION=""
175 +CONFIG_LOCALVERSION_AUTO=y
176 +CONFIG_SWAP=y
177 +CONFIG_SYSVIPC=y
178 +CONFIG_SYSVIPC_SYSCTL=y
179 +# CONFIG_POSIX_MQUEUE is not set
180 +# CONFIG_BSD_PROCESS_ACCT is not set
181 +# CONFIG_TASKSTATS is not set
182 +# CONFIG_AUDIT is not set
183 +# CONFIG_IKCONFIG is not set
184 +CONFIG_LOG_BUF_SHIFT=14
185 +# CONFIG_CGROUPS is not set
186 +# CONFIG_GROUP_SCHED is not set
187 +# CONFIG_SYSFS_DEPRECATED_V2 is not set
188 +# CONFIG_RELAY is not set
189 +# CONFIG_NAMESPACES is not set
190 +# CONFIG_BLK_DEV_INITRD is not set
191 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
192 +CONFIG_SYSCTL=y
193 +CONFIG_EMBEDDED=y
194 +CONFIG_UID16=y
195 +CONFIG_SYSCTL_SYSCALL=y
196 +CONFIG_SYSCTL_SYSCALL_CHECK=y
197 +CONFIG_KALLSYMS=y
198 +# CONFIG_KALLSYMS_ALL is not set
199 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
200 +CONFIG_HOTPLUG=y
201 +CONFIG_PRINTK=y
202 +CONFIG_BUG=y
203 +CONFIG_ELF_CORE=y
204 +CONFIG_COMPAT_BRK=y
205 +CONFIG_BASE_FULL=y
206 +CONFIG_FUTEX=y
207 +CONFIG_ANON_INODES=y
208 +CONFIG_EPOLL=y
209 +CONFIG_SIGNALFD=y
210 +CONFIG_TIMERFD=y
211 +CONFIG_EVENTFD=y
212 +CONFIG_SHMEM=y
213 +CONFIG_VM_EVENT_COUNTERS=y
214 +CONFIG_SLAB=y
215 +# CONFIG_SLUB is not set
216 +# CONFIG_SLOB is not set
217 +CONFIG_PROFILING=y
218 +# CONFIG_MARKERS is not set
219 +CONFIG_OPROFILE=y
220 +CONFIG_HAVE_OPROFILE=y
221 +CONFIG_KPROBES=y
222 +CONFIG_KRETPROBES=y
223 +CONFIG_HAVE_KPROBES=y
224 +CONFIG_HAVE_KRETPROBES=y
225 +# CONFIG_HAVE_DMA_ATTRS is not set
226 +CONFIG_PROC_PAGE_MONITOR=y
227 +CONFIG_SLABINFO=y
228 +CONFIG_RT_MUTEXES=y
229 +# CONFIG_TINY_SHMEM is not set
230 +CONFIG_BASE_SMALL=0
231 +CONFIG_MODULES=y
232 +# CONFIG_MODULE_FORCE_LOAD is not set
233 +CONFIG_MODULE_UNLOAD=y
234 +# CONFIG_MODULE_FORCE_UNLOAD is not set
235 +# CONFIG_MODVERSIONS is not set
236 +# CONFIG_MODULE_SRCVERSION_ALL is not set
237 +# CONFIG_KMOD is not set
238 +CONFIG_BLOCK=y
239 +# CONFIG_LBD is not set
240 +# CONFIG_BLK_DEV_IO_TRACE is not set
241 +# CONFIG_LSF is not set
242 +# CONFIG_BLK_DEV_BSG is not set
243 +
244 +#
245 +# IO Schedulers
246 +#
247 +CONFIG_IOSCHED_NOOP=y
248 +CONFIG_IOSCHED_AS=y
249 +CONFIG_IOSCHED_DEADLINE=y
250 +CONFIG_IOSCHED_CFQ=y
251 +# CONFIG_DEFAULT_AS is not set
252 +# CONFIG_DEFAULT_DEADLINE is not set
253 +CONFIG_DEFAULT_CFQ=y
254 +# CONFIG_DEFAULT_NOOP is not set
255 +CONFIG_DEFAULT_IOSCHED="cfq"
256 +CONFIG_CLASSIC_RCU=y
257 +
258 +#
259 +# System Type
260 +#
261 +# CONFIG_ARCH_AAEC2000 is not set
262 +# CONFIG_ARCH_INTEGRATOR is not set
263 +# CONFIG_ARCH_REALVIEW is not set
264 +# CONFIG_ARCH_VERSATILE is not set
265 +# CONFIG_ARCH_AT91 is not set
266 +# CONFIG_ARCH_CLPS7500 is not set
267 +# CONFIG_ARCH_CLPS711X is not set
268 +# CONFIG_ARCH_CO285 is not set
269 +# CONFIG_ARCH_EBSA110 is not set
270 +# CONFIG_ARCH_EP93XX is not set
271 +# CONFIG_ARCH_FOOTBRIDGE is not set
272 +# CONFIG_ARCH_NETX is not set
273 +# CONFIG_ARCH_H720X is not set
274 +# CONFIG_ARCH_IMX is not set
275 +# CONFIG_ARCH_IOP13XX is not set
276 +# CONFIG_ARCH_IOP32X is not set
277 +# CONFIG_ARCH_IOP33X is not set
278 +# CONFIG_ARCH_IXP23XX is not set
279 +# CONFIG_ARCH_IXP2000 is not set
280 +# CONFIG_ARCH_IXP4XX is not set
281 +# CONFIG_ARCH_L7200 is not set
282 +CONFIG_ARCH_KIRKWOOD=y
283 +# CONFIG_ARCH_KS8695 is not set
284 +# CONFIG_ARCH_NS9XXX is not set
285 +# CONFIG_ARCH_LOKI is not set
286 +# CONFIG_ARCH_MV78XX0 is not set
287 +# CONFIG_ARCH_MXC is not set
288 +# CONFIG_ARCH_ORION5X is not set
289 +# CONFIG_ARCH_PNX4008 is not set
290 +# CONFIG_ARCH_PXA is not set
291 +# CONFIG_ARCH_RPC is not set
292 +# CONFIG_ARCH_SA1100 is not set
293 +# CONFIG_ARCH_S3C2410 is not set
294 +# CONFIG_ARCH_SHARK is not set
295 +# CONFIG_ARCH_LH7A40X is not set
296 +# CONFIG_ARCH_DAVINCI is not set
297 +# CONFIG_ARCH_OMAP is not set
298 +# CONFIG_ARCH_MSM7X00A is not set
299 +
300 +#
301 +# Marvell Kirkwood Implementations
302 +#
303 +CONFIG_MACH_DB88F6281_BP=y
304 +CONFIG_MACH_RD88F6192_NAS=y
305 +CONFIG_MACH_RD88F6281=y
306 +
307 +#
308 +# Boot options
309 +#
310 +
311 +#
312 +# Power management
313 +#
314 +CONFIG_PLAT_ORION=y
315 +
316 +#
317 +# Processor Type
318 +#
319 +CONFIG_CPU_32=y
320 +CONFIG_CPU_FEROCEON=y
321 +# CONFIG_CPU_FEROCEON_OLD_ID is not set
322 +CONFIG_CPU_32v5=y
323 +CONFIG_CPU_ABRT_EV5T=y
324 +CONFIG_CPU_PABRT_NOIFAR=y
325 +CONFIG_CPU_CACHE_VIVT=y
326 +CONFIG_CPU_COPY_FEROCEON=y
327 +CONFIG_CPU_TLB_FEROCEON=y
328 +CONFIG_CPU_CP15=y
329 +CONFIG_CPU_CP15_MMU=y
330 +
331 +#
332 +# Processor Features
333 +#
334 +CONFIG_ARM_THUMB=y
335 +# CONFIG_CPU_ICACHE_DISABLE is not set
336 +# CONFIG_CPU_DCACHE_DISABLE is not set
337 +CONFIG_OUTER_CACHE=y
338 +CONFIG_CACHE_FEROCEON_L2=y
339 +
340 +#
341 +# Bus support
342 +#
343 +CONFIG_PCI=y
344 +CONFIG_PCI_SYSCALL=y
345 +# CONFIG_ARCH_SUPPORTS_MSI is not set
346 +CONFIG_PCI_LEGACY=y
347 +# CONFIG_PCI_DEBUG is not set
348 +# CONFIG_PCCARD is not set
349 +
350 +#
351 +# Kernel Features
352 +#
353 +CONFIG_TICK_ONESHOT=y
354 +CONFIG_NO_HZ=y
355 +CONFIG_HIGH_RES_TIMERS=y
356 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
357 +CONFIG_PREEMPT=y
358 +CONFIG_HZ=100
359 +CONFIG_AEABI=y
360 +# CONFIG_OABI_COMPAT is not set
361 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
362 +CONFIG_SELECT_MEMORY_MODEL=y
363 +CONFIG_FLATMEM_MANUAL=y
364 +# CONFIG_DISCONTIGMEM_MANUAL is not set
365 +# CONFIG_SPARSEMEM_MANUAL is not set
366 +CONFIG_FLATMEM=y
367 +CONFIG_FLAT_NODE_MEM_MAP=y
368 +# CONFIG_SPARSEMEM_STATIC is not set
369 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
370 +CONFIG_PAGEFLAGS_EXTENDED=y
371 +CONFIG_SPLIT_PTLOCK_CPUS=4096
372 +# CONFIG_RESOURCES_64BIT is not set
373 +CONFIG_ZONE_DMA_FLAG=1
374 +CONFIG_BOUNCE=y
375 +CONFIG_VIRT_TO_BUS=y
376 +CONFIG_ALIGNMENT_TRAP=y
377 +
378 +#
379 +# Boot options
380 +#
381 +CONFIG_ZBOOT_ROM_TEXT=0x0
382 +CONFIG_ZBOOT_ROM_BSS=0x0
383 +CONFIG_CMDLINE=""
384 +# CONFIG_XIP_KERNEL is not set
385 +# CONFIG_KEXEC is not set
386 +
387 +#
388 +# Floating point emulation
389 +#
390 +
391 +#
392 +# At least one emulation must be selected
393 +#
394 +# CONFIG_VFP is not set
395 +
396 +#
397 +# Userspace binary formats
398 +#
399 +CONFIG_BINFMT_ELF=y
400 +# CONFIG_BINFMT_AOUT is not set
401 +# CONFIG_BINFMT_MISC is not set
402 +
403 +#
404 +# Power management options
405 +#
406 +# CONFIG_PM is not set
407 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
408 +
409 +#
410 +# Networking
411 +#
412 +CONFIG_NET=y
413 +
414 +#
415 +# Networking options
416 +#
417 +CONFIG_PACKET=y
418 +CONFIG_PACKET_MMAP=y
419 +CONFIG_UNIX=y
420 +CONFIG_XFRM=y
421 +# CONFIG_XFRM_USER is not set
422 +# CONFIG_XFRM_SUB_POLICY is not set
423 +# CONFIG_XFRM_MIGRATE is not set
424 +# CONFIG_XFRM_STATISTICS is not set
425 +# CONFIG_NET_KEY is not set
426 +CONFIG_INET=y
427 +CONFIG_IP_MULTICAST=y
428 +# CONFIG_IP_ADVANCED_ROUTER is not set
429 +CONFIG_IP_FIB_HASH=y
430 +CONFIG_IP_PNP=y
431 +CONFIG_IP_PNP_DHCP=y
432 +CONFIG_IP_PNP_BOOTP=y
433 +# CONFIG_IP_PNP_RARP is not set
434 +# CONFIG_NET_IPIP is not set
435 +# CONFIG_NET_IPGRE is not set
436 +# CONFIG_IP_MROUTE is not set
437 +# CONFIG_ARPD is not set
438 +# CONFIG_SYN_COOKIES is not set
439 +# CONFIG_INET_AH is not set
440 +# CONFIG_INET_ESP is not set
441 +# CONFIG_INET_IPCOMP is not set
442 +# CONFIG_INET_XFRM_TUNNEL is not set
443 +# CONFIG_INET_TUNNEL is not set
444 +CONFIG_INET_XFRM_MODE_TRANSPORT=y
445 +CONFIG_INET_XFRM_MODE_TUNNEL=y
446 +CONFIG_INET_XFRM_MODE_BEET=y
447 +# CONFIG_INET_LRO is not set
448 +CONFIG_INET_DIAG=y
449 +CONFIG_INET_TCP_DIAG=y
450 +# CONFIG_TCP_CONG_ADVANCED is not set
451 +CONFIG_TCP_CONG_CUBIC=y
452 +CONFIG_DEFAULT_TCP_CONG="cubic"
453 +# CONFIG_TCP_MD5SIG is not set
454 +# CONFIG_IPV6 is not set
455 +# CONFIG_NETWORK_SECMARK is not set
456 +# CONFIG_NETFILTER is not set
457 +# CONFIG_IP_DCCP is not set
458 +# CONFIG_IP_SCTP is not set
459 +# CONFIG_TIPC is not set
460 +# CONFIG_ATM is not set
461 +# CONFIG_BRIDGE is not set
462 +# CONFIG_VLAN_8021Q is not set
463 +# CONFIG_DECNET is not set
464 +# CONFIG_LLC2 is not set
465 +# CONFIG_IPX is not set
466 +# CONFIG_ATALK is not set
467 +# CONFIG_X25 is not set
468 +# CONFIG_LAPB is not set
469 +# CONFIG_ECONET is not set
470 +# CONFIG_WAN_ROUTER is not set
471 +# CONFIG_NET_SCHED is not set
472 +
473 +#
474 +# Network testing
475 +#
476 +CONFIG_NET_PKTGEN=m
477 +# CONFIG_NET_TCPPROBE is not set
478 +# CONFIG_HAMRADIO is not set
479 +# CONFIG_CAN is not set
480 +# CONFIG_IRDA is not set
481 +# CONFIG_BT is not set
482 +# CONFIG_AF_RXRPC is not set
483 +
484 +#
485 +# Wireless
486 +#
487 +# CONFIG_CFG80211 is not set
488 +CONFIG_WIRELESS_EXT=y
489 +# CONFIG_MAC80211 is not set
490 +# CONFIG_IEEE80211 is not set
491 +# CONFIG_RFKILL is not set
492 +# CONFIG_NET_9P is not set
493 +
494 +#
495 +# Device Drivers
496 +#
497 +
498 +#
499 +# Generic Driver Options
500 +#
501 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
502 +CONFIG_STANDALONE=y
503 +CONFIG_PREVENT_FIRMWARE_BUILD=y
504 +CONFIG_FW_LOADER=y
505 +# CONFIG_DEBUG_DRIVER is not set
506 +# CONFIG_DEBUG_DEVRES is not set
507 +# CONFIG_SYS_HYPERVISOR is not set
508 +# CONFIG_CONNECTOR is not set
509 +CONFIG_MTD=y
510 +# CONFIG_MTD_DEBUG is not set
511 +# CONFIG_MTD_CONCAT is not set
512 +CONFIG_MTD_PARTITIONS=y
513 +# CONFIG_MTD_REDBOOT_PARTS is not set
514 +CONFIG_MTD_CMDLINE_PARTS=y
515 +# CONFIG_MTD_AFS_PARTS is not set
516 +# CONFIG_MTD_AR7_PARTS is not set
517 +
518 +#
519 +# User Modules And Translation Layers
520 +#
521 +CONFIG_MTD_CHAR=y
522 +CONFIG_MTD_BLKDEVS=y
523 +CONFIG_MTD_BLOCK=y
524 +# CONFIG_FTL is not set
525 +# CONFIG_NFTL is not set
526 +# CONFIG_INFTL is not set
527 +# CONFIG_RFD_FTL is not set
528 +# CONFIG_SSFDC is not set
529 +# CONFIG_MTD_OOPS is not set
530 +
531 +#
532 +# RAM/ROM/Flash chip drivers
533 +#
534 +CONFIG_MTD_CFI=y
535 +CONFIG_MTD_JEDECPROBE=y
536 +CONFIG_MTD_GEN_PROBE=y
537 +CONFIG_MTD_CFI_ADV_OPTIONS=y
538 +CONFIG_MTD_CFI_NOSWAP=y
539 +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
540 +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
541 +CONFIG_MTD_CFI_GEOMETRY=y
542 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
543 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
544 +# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
545 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
546 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
547 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
548 +CONFIG_MTD_CFI_I1=y
549 +CONFIG_MTD_CFI_I2=y
550 +# CONFIG_MTD_CFI_I4 is not set
551 +# CONFIG_MTD_CFI_I8 is not set
552 +# CONFIG_MTD_OTP is not set
553 +CONFIG_MTD_CFI_INTELEXT=y
554 +# CONFIG_MTD_CFI_AMDSTD is not set
555 +CONFIG_MTD_CFI_STAA=y
556 +CONFIG_MTD_CFI_UTIL=y
557 +# CONFIG_MTD_RAM is not set
558 +# CONFIG_MTD_ROM is not set
559 +# CONFIG_MTD_ABSENT is not set
560 +
561 +#
562 +# Mapping drivers for chip access
563 +#
564 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
565 +CONFIG_MTD_PHYSMAP=y
566 +CONFIG_MTD_PHYSMAP_START=0x0
567 +CONFIG_MTD_PHYSMAP_LEN=0x0
568 +CONFIG_MTD_PHYSMAP_BANKWIDTH=0
569 +# CONFIG_MTD_ARM_INTEGRATOR is not set
570 +# CONFIG_MTD_IMPA7 is not set
571 +# CONFIG_MTD_INTEL_VR_NOR is not set
572 +# CONFIG_MTD_PLATRAM is not set
573 +
574 +#
575 +# Self-contained MTD device drivers
576 +#
577 +# CONFIG_MTD_PMC551 is not set
578 +# CONFIG_MTD_DATAFLASH is not set
579 +CONFIG_MTD_M25P80=y
580 +CONFIG_M25PXX_USE_FAST_READ=y
581 +# CONFIG_MTD_SLRAM is not set
582 +# CONFIG_MTD_PHRAM is not set
583 +# CONFIG_MTD_MTDRAM is not set
584 +# CONFIG_MTD_BLOCK2MTD is not set
585 +
586 +#
587 +# Disk-On-Chip Device Drivers
588 +#
589 +# CONFIG_MTD_DOC2000 is not set
590 +# CONFIG_MTD_DOC2001 is not set
591 +# CONFIG_MTD_DOC2001PLUS is not set
592 +CONFIG_MTD_NAND=y
593 +CONFIG_MTD_NAND_VERIFY_WRITE=y
594 +# CONFIG_MTD_NAND_ECC_SMC is not set
595 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
596 +CONFIG_MTD_NAND_IDS=y
597 +# CONFIG_MTD_NAND_DISKONCHIP is not set
598 +# CONFIG_MTD_NAND_CAFE is not set
599 +# CONFIG_MTD_NAND_NANDSIM is not set
600 +# CONFIG_MTD_NAND_PLATFORM is not set
601 +# CONFIG_MTD_ALAUDA is not set
602 +CONFIG_MTD_NAND_ORION=y
603 +# CONFIG_MTD_ONENAND is not set
604 +
605 +#
606 +# UBI - Unsorted block images
607 +#
608 +# CONFIG_MTD_UBI is not set
609 +# CONFIG_PARPORT is not set
610 +CONFIG_BLK_DEV=y
611 +# CONFIG_BLK_CPQ_DA is not set
612 +# CONFIG_BLK_CPQ_CISS_DA is not set
613 +# CONFIG_BLK_DEV_DAC960 is not set
614 +# CONFIG_BLK_DEV_UMEM is not set
615 +# CONFIG_BLK_DEV_COW_COMMON is not set
616 +CONFIG_BLK_DEV_LOOP=y
617 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
618 +# CONFIG_BLK_DEV_NBD is not set
619 +# CONFIG_BLK_DEV_SX8 is not set
620 +# CONFIG_BLK_DEV_UB is not set
621 +# CONFIG_BLK_DEV_RAM is not set
622 +# CONFIG_CDROM_PKTCDVD is not set
623 +# CONFIG_ATA_OVER_ETH is not set
624 +# CONFIG_MISC_DEVICES is not set
625 +CONFIG_HAVE_IDE=y
626 +# CONFIG_IDE is not set
627 +
628 +#
629 +# SCSI device support
630 +#
631 +# CONFIG_RAID_ATTRS is not set
632 +CONFIG_SCSI=y
633 +CONFIG_SCSI_DMA=y
634 +# CONFIG_SCSI_TGT is not set
635 +# CONFIG_SCSI_NETLINK is not set
636 +# CONFIG_SCSI_PROC_FS is not set
637 +
638 +#
639 +# SCSI support type (disk, tape, CD-ROM)
640 +#
641 +CONFIG_BLK_DEV_SD=y
642 +# CONFIG_CHR_DEV_ST is not set
643 +# CONFIG_CHR_DEV_OSST is not set
644 +CONFIG_BLK_DEV_SR=m
645 +# CONFIG_BLK_DEV_SR_VENDOR is not set
646 +CONFIG_CHR_DEV_SG=m
647 +# CONFIG_CHR_DEV_SCH is not set
648 +
649 +#
650 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
651 +#
652 +# CONFIG_SCSI_MULTI_LUN is not set
653 +# CONFIG_SCSI_CONSTANTS is not set
654 +# CONFIG_SCSI_LOGGING is not set
655 +# CONFIG_SCSI_SCAN_ASYNC is not set
656 +CONFIG_SCSI_WAIT_SCAN=m
657 +
658 +#
659 +# SCSI Transports
660 +#
661 +# CONFIG_SCSI_SPI_ATTRS is not set
662 +# CONFIG_SCSI_FC_ATTRS is not set
663 +# CONFIG_SCSI_ISCSI_ATTRS is not set
664 +# CONFIG_SCSI_SAS_LIBSAS is not set
665 +# CONFIG_SCSI_SRP_ATTRS is not set
666 +CONFIG_SCSI_LOWLEVEL=y
667 +# CONFIG_ISCSI_TCP is not set
668 +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
669 +# CONFIG_SCSI_3W_9XXX is not set
670 +# CONFIG_SCSI_ACARD is not set
671 +# CONFIG_SCSI_AACRAID is not set
672 +# CONFIG_SCSI_AIC7XXX is not set
673 +# CONFIG_SCSI_AIC7XXX_OLD is not set
674 +# CONFIG_SCSI_AIC79XX is not set
675 +# CONFIG_SCSI_AIC94XX is not set
676 +# CONFIG_SCSI_DPT_I2O is not set
677 +# CONFIG_SCSI_ADVANSYS is not set
678 +# CONFIG_SCSI_ARCMSR is not set
679 +# CONFIG_MEGARAID_NEWGEN is not set
680 +# CONFIG_MEGARAID_LEGACY is not set
681 +# CONFIG_MEGARAID_SAS is not set
682 +# CONFIG_SCSI_HPTIOP is not set
683 +# CONFIG_SCSI_DMX3191D is not set
684 +# CONFIG_SCSI_FUTURE_DOMAIN is not set
685 +# CONFIG_SCSI_IPS is not set
686 +# CONFIG_SCSI_INITIO is not set
687 +# CONFIG_SCSI_INIA100 is not set
688 +# CONFIG_SCSI_MVSAS is not set
689 +# CONFIG_SCSI_STEX is not set
690 +# CONFIG_SCSI_SYM53C8XX_2 is not set
691 +# CONFIG_SCSI_IPR is not set
692 +# CONFIG_SCSI_QLOGIC_1280 is not set
693 +# CONFIG_SCSI_QLA_FC is not set
694 +# CONFIG_SCSI_QLA_ISCSI is not set
695 +# CONFIG_SCSI_LPFC is not set
696 +# CONFIG_SCSI_DC395x is not set
697 +# CONFIG_SCSI_DC390T is not set
698 +# CONFIG_SCSI_NSP32 is not set
699 +# CONFIG_SCSI_DEBUG is not set
700 +# CONFIG_SCSI_SRP is not set
701 +CONFIG_ATA=y
702 +# CONFIG_ATA_NONSTANDARD is not set
703 +CONFIG_SATA_PMP=y
704 +# CONFIG_SATA_AHCI is not set
705 +# CONFIG_SATA_SIL24 is not set
706 +CONFIG_ATA_SFF=y
707 +# CONFIG_SATA_SVW is not set
708 +# CONFIG_ATA_PIIX is not set
709 +CONFIG_SATA_MV=y
710 +# CONFIG_SATA_NV is not set
711 +# CONFIG_PDC_ADMA is not set
712 +# CONFIG_SATA_QSTOR is not set
713 +# CONFIG_SATA_PROMISE is not set
714 +# CONFIG_SATA_SX4 is not set
715 +# CONFIG_SATA_SIL is not set
716 +# CONFIG_SATA_SIS is not set
717 +# CONFIG_SATA_ULI is not set
718 +# CONFIG_SATA_VIA is not set
719 +# CONFIG_SATA_VITESSE is not set
720 +# CONFIG_SATA_INIC162X is not set
721 +# CONFIG_PATA_ALI is not set
722 +# CONFIG_PATA_AMD is not set
723 +# CONFIG_PATA_ARTOP is not set
724 +# CONFIG_PATA_ATIIXP is not set
725 +# CONFIG_PATA_CMD640_PCI is not set
726 +# CONFIG_PATA_CMD64X is not set
727 +# CONFIG_PATA_CS5520 is not set
728 +# CONFIG_PATA_CS5530 is not set
729 +# CONFIG_PATA_CYPRESS is not set
730 +# CONFIG_PATA_EFAR is not set
731 +# CONFIG_ATA_GENERIC is not set
732 +# CONFIG_PATA_HPT366 is not set
733 +# CONFIG_PATA_HPT37X is not set
734 +# CONFIG_PATA_HPT3X2N is not set
735 +# CONFIG_PATA_HPT3X3 is not set
736 +# CONFIG_PATA_IT821X is not set
737 +# CONFIG_PATA_IT8213 is not set
738 +# CONFIG_PATA_JMICRON is not set
739 +# CONFIG_PATA_TRIFLEX is not set
740 +# CONFIG_PATA_MARVELL is not set
741 +# CONFIG_PATA_MPIIX is not set
742 +# CONFIG_PATA_OLDPIIX is not set
743 +# CONFIG_PATA_NETCELL is not set
744 +# CONFIG_PATA_NINJA32 is not set
745 +# CONFIG_PATA_NS87410 is not set
746 +# CONFIG_PATA_NS87415 is not set
747 +# CONFIG_PATA_OPTI is not set
748 +# CONFIG_PATA_OPTIDMA is not set
749 +# CONFIG_PATA_PDC_OLD is not set
750 +# CONFIG_PATA_RADISYS is not set
751 +# CONFIG_PATA_RZ1000 is not set
752 +# CONFIG_PATA_SC1200 is not set
753 +# CONFIG_PATA_SERVERWORKS is not set
754 +# CONFIG_PATA_PDC2027X is not set
755 +# CONFIG_PATA_SIL680 is not set
756 +# CONFIG_PATA_SIS is not set
757 +# CONFIG_PATA_VIA is not set
758 +# CONFIG_PATA_WINBOND is not set
759 +# CONFIG_PATA_PLATFORM is not set
760 +# CONFIG_PATA_SCH is not set
761 +# CONFIG_MD is not set
762 +# CONFIG_FUSION is not set
763 +
764 +#
765 +# IEEE 1394 (FireWire) support
766 +#
767 +# CONFIG_FIREWIRE is not set
768 +# CONFIG_IEEE1394 is not set
769 +# CONFIG_I2O is not set
770 +CONFIG_NETDEVICES=y
771 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
772 +# CONFIG_DUMMY is not set
773 +# CONFIG_BONDING is not set
774 +# CONFIG_MACVLAN is not set
775 +# CONFIG_EQUALIZER is not set
776 +# CONFIG_TUN is not set
777 +# CONFIG_VETH is not set
778 +# CONFIG_ARCNET is not set
779 +# CONFIG_PHYLIB is not set
780 +CONFIG_NET_ETHERNET=y
781 +CONFIG_MII=y
782 +# CONFIG_AX88796 is not set
783 +# CONFIG_HAPPYMEAL is not set
784 +# CONFIG_SUNGEM is not set
785 +# CONFIG_CASSINI is not set
786 +# CONFIG_NET_VENDOR_3COM is not set
787 +# CONFIG_SMC91X is not set
788 +# CONFIG_DM9000 is not set
789 +# CONFIG_ENC28J60 is not set
790 +# CONFIG_NET_TULIP is not set
791 +# CONFIG_HP100 is not set
792 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
793 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
794 +# CONFIG_IBM_NEW_EMAC_TAH is not set
795 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
796 +CONFIG_NET_PCI=y
797 +# CONFIG_PCNET32 is not set
798 +# CONFIG_AMD8111_ETH is not set
799 +# CONFIG_ADAPTEC_STARFIRE is not set
800 +# CONFIG_B44 is not set
801 +# CONFIG_FORCEDETH is not set
802 +# CONFIG_EEPRO100 is not set
803 +# CONFIG_E100 is not set
804 +# CONFIG_FEALNX is not set
805 +# CONFIG_NATSEMI is not set
806 +# CONFIG_NE2K_PCI is not set
807 +# CONFIG_8139CP is not set
808 +# CONFIG_8139TOO is not set
809 +# CONFIG_R6040 is not set
810 +# CONFIG_SIS900 is not set
811 +# CONFIG_EPIC100 is not set
812 +# CONFIG_SUNDANCE is not set
813 +# CONFIG_TLAN is not set
814 +# CONFIG_VIA_RHINE is not set
815 +# CONFIG_SC92031 is not set
816 +CONFIG_NETDEV_1000=y
817 +# CONFIG_ACENIC is not set
818 +# CONFIG_DL2K is not set
819 +CONFIG_E1000=y
820 +CONFIG_E1000_NAPI=y
821 +# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
822 +# CONFIG_E1000E is not set
823 +# CONFIG_E1000E_ENABLED is not set
824 +# CONFIG_IP1000 is not set
825 +# CONFIG_IGB is not set
826 +# CONFIG_NS83820 is not set
827 +# CONFIG_HAMACHI is not set
828 +# CONFIG_YELLOWFIN is not set
829 +# CONFIG_R8169 is not set
830 +# CONFIG_SIS190 is not set
831 +# CONFIG_SKGE is not set
832 +# CONFIG_SKY2 is not set
833 +# CONFIG_VIA_VELOCITY is not set
834 +# CONFIG_TIGON3 is not set
835 +# CONFIG_BNX2 is not set
836 +CONFIG_MV643XX_ETH=y
837 +# CONFIG_QLA3XXX is not set
838 +# CONFIG_ATL1 is not set
839 +# CONFIG_NETDEV_10000 is not set
840 +# CONFIG_TR is not set
841 +
842 +#
843 +# Wireless LAN
844 +#
845 +# CONFIG_WLAN_PRE80211 is not set
846 +# CONFIG_WLAN_80211 is not set
847 +# CONFIG_IWLWIFI_LEDS is not set
848 +
849 +#
850 +# USB Network Adapters
851 +#
852 +# CONFIG_USB_CATC is not set
853 +# CONFIG_USB_KAWETH is not set
854 +# CONFIG_USB_PEGASUS is not set
855 +# CONFIG_USB_RTL8150 is not set
856 +# CONFIG_USB_USBNET is not set
857 +# CONFIG_WAN is not set
858 +# CONFIG_FDDI is not set
859 +# CONFIG_HIPPI is not set
860 +# CONFIG_PPP is not set
861 +# CONFIG_SLIP is not set
862 +# CONFIG_NET_FC is not set
863 +# CONFIG_NETCONSOLE is not set
864 +# CONFIG_NETPOLL is not set
865 +# CONFIG_NET_POLL_CONTROLLER is not set
866 +# CONFIG_ISDN is not set
867 +
868 +#
869 +# Input device support
870 +#
871 +CONFIG_INPUT=y
872 +# CONFIG_INPUT_FF_MEMLESS is not set
873 +# CONFIG_INPUT_POLLDEV is not set
874 +
875 +#
876 +# Userland interfaces
877 +#
878 +CONFIG_INPUT_MOUSEDEV=y
879 +CONFIG_INPUT_MOUSEDEV_PSAUX=y
880 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
881 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
882 +# CONFIG_INPUT_JOYDEV is not set
883 +# CONFIG_INPUT_EVDEV is not set
884 +# CONFIG_INPUT_EVBUG is not set
885 +
886 +#
887 +# Input Device Drivers
888 +#
889 +# CONFIG_INPUT_KEYBOARD is not set
890 +# CONFIG_INPUT_MOUSE is not set
891 +# CONFIG_INPUT_JOYSTICK is not set
892 +# CONFIG_INPUT_TABLET is not set
893 +# CONFIG_INPUT_TOUCHSCREEN is not set
894 +# CONFIG_INPUT_MISC is not set
895 +
896 +#
897 +# Hardware I/O ports
898 +#
899 +# CONFIG_SERIO is not set
900 +# CONFIG_GAMEPORT is not set
901 +
902 +#
903 +# Character devices
904 +#
905 +# CONFIG_VT is not set
906 +# CONFIG_DEVKMEM is not set
907 +# CONFIG_SERIAL_NONSTANDARD is not set
908 +# CONFIG_NOZOMI is not set
909 +
910 +#
911 +# Serial drivers
912 +#
913 +CONFIG_SERIAL_8250=y
914 +CONFIG_SERIAL_8250_CONSOLE=y
915 +# CONFIG_SERIAL_8250_PCI is not set
916 +CONFIG_SERIAL_8250_NR_UARTS=4
917 +CONFIG_SERIAL_8250_RUNTIME_UARTS=2
918 +# CONFIG_SERIAL_8250_EXTENDED is not set
919 +
920 +#
921 +# Non-8250 serial port support
922 +#
923 +CONFIG_SERIAL_CORE=y
924 +CONFIG_SERIAL_CORE_CONSOLE=y
925 +# CONFIG_SERIAL_JSM is not set
926 +CONFIG_UNIX98_PTYS=y
927 +CONFIG_LEGACY_PTYS=y
928 +CONFIG_LEGACY_PTY_COUNT=16
929 +# CONFIG_IPMI_HANDLER is not set
930 +# CONFIG_HW_RANDOM is not set
931 +# CONFIG_NVRAM is not set
932 +# CONFIG_R3964 is not set
933 +# CONFIG_APPLICOM is not set
934 +# CONFIG_RAW_DRIVER is not set
935 +# CONFIG_TCG_TPM is not set
936 +CONFIG_DEVPORT=y
937 +CONFIG_I2C=y
938 +CONFIG_I2C_BOARDINFO=y
939 +CONFIG_I2C_CHARDEV=y
940 +
941 +#
942 +# I2C Hardware Bus support
943 +#
944 +# CONFIG_I2C_ALI1535 is not set
945 +# CONFIG_I2C_ALI1563 is not set
946 +# CONFIG_I2C_ALI15X3 is not set
947 +# CONFIG_I2C_AMD756 is not set
948 +# CONFIG_I2C_AMD8111 is not set
949 +# CONFIG_I2C_GPIO is not set
950 +# CONFIG_I2C_I801 is not set
951 +# CONFIG_I2C_I810 is not set
952 +# CONFIG_I2C_PIIX4 is not set
953 +# CONFIG_I2C_NFORCE2 is not set
954 +# CONFIG_I2C_OCORES is not set
955 +# CONFIG_I2C_PARPORT_LIGHT is not set
956 +# CONFIG_I2C_PROSAVAGE is not set
957 +# CONFIG_I2C_SAVAGE4 is not set
958 +# CONFIG_I2C_SIMTEC is not set
959 +# CONFIG_I2C_SIS5595 is not set
960 +# CONFIG_I2C_SIS630 is not set
961 +# CONFIG_I2C_SIS96X is not set
962 +# CONFIG_I2C_TAOS_EVM is not set
963 +# CONFIG_I2C_STUB is not set
964 +# CONFIG_I2C_TINY_USB is not set
965 +# CONFIG_I2C_VIA is not set
966 +# CONFIG_I2C_VIAPRO is not set
967 +# CONFIG_I2C_VOODOO3 is not set
968 +# CONFIG_I2C_PCA_PLATFORM is not set
969 +CONFIG_I2C_MV64XXX=y
970 +
971 +#
972 +# Miscellaneous I2C Chip support
973 +#
974 +# CONFIG_DS1682 is not set
975 +# CONFIG_SENSORS_EEPROM is not set
976 +# CONFIG_SENSORS_PCF8574 is not set
977 +# CONFIG_PCF8575 is not set
978 +# CONFIG_SENSORS_PCF8591 is not set
979 +# CONFIG_SENSORS_MAX6875 is not set
980 +# CONFIG_SENSORS_TSL2550 is not set
981 +# CONFIG_I2C_DEBUG_CORE is not set
982 +# CONFIG_I2C_DEBUG_ALGO is not set
983 +# CONFIG_I2C_DEBUG_BUS is not set
984 +# CONFIG_I2C_DEBUG_CHIP is not set
985 +CONFIG_SPI=y
986 +# CONFIG_SPI_DEBUG is not set
987 +CONFIG_SPI_MASTER=y
988 +
989 +#
990 +# SPI Master Controller Drivers
991 +#
992 +# CONFIG_SPI_BITBANG is not set
993 +CONFIG_SPI_ORION=y
994 +
995 +#
996 +# SPI Protocol Masters
997 +#
998 +# CONFIG_SPI_AT25 is not set
999 +# CONFIG_SPI_SPIDEV is not set
1000 +# CONFIG_SPI_TLE62X0 is not set
1001 +# CONFIG_W1 is not set
1002 +# CONFIG_POWER_SUPPLY is not set
1003 +# CONFIG_HWMON is not set
1004 +# CONFIG_WATCHDOG is not set
1005 +
1006 +#
1007 +# Sonics Silicon Backplane
1008 +#
1009 +CONFIG_SSB_POSSIBLE=y
1010 +# CONFIG_SSB is not set
1011 +
1012 +#
1013 +# Multifunction device drivers
1014 +#
1015 +# CONFIG_MFD_SM501 is not set
1016 +# CONFIG_MFD_ASIC3 is not set
1017 +# CONFIG_HTC_PASIC3 is not set
1018 +
1019 +#
1020 +# Multimedia devices
1021 +#
1022 +
1023 +#
1024 +# Multimedia core support
1025 +#
1026 +# CONFIG_VIDEO_DEV is not set
1027 +# CONFIG_DVB_CORE is not set
1028 +# CONFIG_VIDEO_MEDIA is not set
1029 +
1030 +#
1031 +# Multimedia drivers
1032 +#
1033 +# CONFIG_DAB is not set
1034 +
1035 +#
1036 +# Graphics support
1037 +#
1038 +# CONFIG_DRM is not set
1039 +# CONFIG_VGASTATE is not set
1040 +# CONFIG_VIDEO_OUTPUT_CONTROL is not set
1041 +# CONFIG_FB is not set
1042 +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
1043 +
1044 +#
1045 +# Display device support
1046 +#
1047 +# CONFIG_DISPLAY_SUPPORT is not set
1048 +
1049 +#
1050 +# Sound
1051 +#
1052 +# CONFIG_SOUND is not set
1053 +CONFIG_HID_SUPPORT=y
1054 +CONFIG_HID=y
1055 +# CONFIG_HID_DEBUG is not set
1056 +# CONFIG_HIDRAW is not set
1057 +
1058 +#
1059 +# USB Input Devices
1060 +#
1061 +CONFIG_USB_HID=y
1062 +# CONFIG_USB_HIDINPUT_POWERBOOK is not set
1063 +# CONFIG_HID_FF is not set
1064 +# CONFIG_USB_HIDDEV is not set
1065 +CONFIG_USB_SUPPORT=y
1066 +CONFIG_USB_ARCH_HAS_HCD=y
1067 +CONFIG_USB_ARCH_HAS_OHCI=y
1068 +CONFIG_USB_ARCH_HAS_EHCI=y
1069 +CONFIG_USB=y
1070 +# CONFIG_USB_DEBUG is not set
1071 +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
1072 +
1073 +#
1074 +# Miscellaneous USB options
1075 +#
1076 +CONFIG_USB_DEVICEFS=y
1077 +CONFIG_USB_DEVICE_CLASS=y
1078 +# CONFIG_USB_DYNAMIC_MINORS is not set
1079 +# CONFIG_USB_OTG is not set
1080 +# CONFIG_USB_OTG_WHITELIST is not set
1081 +# CONFIG_USB_OTG_BLACKLIST_HUB is not set
1082 +
1083 +#
1084 +# USB Host Controller Drivers
1085 +#
1086 +# CONFIG_USB_C67X00_HCD is not set
1087 +CONFIG_USB_EHCI_HCD=y
1088 +CONFIG_USB_EHCI_ROOT_HUB_TT=y
1089 +CONFIG_USB_EHCI_TT_NEWSCHED=y
1090 +# CONFIG_USB_ISP116X_HCD is not set
1091 +# CONFIG_USB_ISP1760_HCD is not set
1092 +# CONFIG_USB_OHCI_HCD is not set
1093 +# CONFIG_USB_UHCI_HCD is not set
1094 +# CONFIG_USB_SL811_HCD is not set
1095 +# CONFIG_USB_R8A66597_HCD is not set
1096 +
1097 +#
1098 +# USB Device Class drivers
1099 +#
1100 +# CONFIG_USB_ACM is not set
1101 +CONFIG_USB_PRINTER=y
1102 +# CONFIG_USB_WDM is not set
1103 +
1104 +#
1105 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
1106 +#
1107 +
1108 +#
1109 +# may also be needed; see USB_STORAGE Help for more information
1110 +#
1111 +CONFIG_USB_STORAGE=y
1112 +# CONFIG_USB_STORAGE_DEBUG is not set
1113 +CONFIG_USB_STORAGE_DATAFAB=y
1114 +CONFIG_USB_STORAGE_FREECOM=y
1115 +# CONFIG_USB_STORAGE_ISD200 is not set
1116 +CONFIG_USB_STORAGE_DPCM=y
1117 +# CONFIG_USB_STORAGE_USBAT is not set
1118 +CONFIG_USB_STORAGE_SDDR09=y
1119 +CONFIG_USB_STORAGE_SDDR55=y
1120 +CONFIG_USB_STORAGE_JUMPSHOT=y
1121 +# CONFIG_USB_STORAGE_ALAUDA is not set
1122 +# CONFIG_USB_STORAGE_ONETOUCH is not set
1123 +# CONFIG_USB_STORAGE_KARMA is not set
1124 +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
1125 +# CONFIG_USB_LIBUSUAL is not set
1126 +
1127 +#
1128 +# USB Imaging devices
1129 +#
1130 +# CONFIG_USB_MDC800 is not set
1131 +# CONFIG_USB_MICROTEK is not set
1132 +# CONFIG_USB_MON is not set
1133 +
1134 +#
1135 +# USB port drivers
1136 +#
1137 +# CONFIG_USB_SERIAL is not set
1138 +
1139 +#
1140 +# USB Miscellaneous drivers
1141 +#
1142 +# CONFIG_USB_EMI62 is not set
1143 +# CONFIG_USB_EMI26 is not set
1144 +# CONFIG_USB_ADUTUX is not set
1145 +# CONFIG_USB_AUERSWALD is not set
1146 +# CONFIG_USB_RIO500 is not set
1147 +# CONFIG_USB_LEGOTOWER is not set
1148 +# CONFIG_USB_LCD is not set
1149 +# CONFIG_USB_BERRY_CHARGE is not set
1150 +# CONFIG_USB_LED is not set
1151 +# CONFIG_USB_CYPRESS_CY7C63 is not set
1152 +# CONFIG_USB_CYTHERM is not set
1153 +# CONFIG_USB_PHIDGET is not set
1154 +# CONFIG_USB_IDMOUSE is not set
1155 +# CONFIG_USB_FTDI_ELAN is not set
1156 +# CONFIG_USB_APPLEDISPLAY is not set
1157 +# CONFIG_USB_SISUSBVGA is not set
1158 +# CONFIG_USB_LD is not set
1159 +# CONFIG_USB_TRANCEVIBRATOR is not set
1160 +# CONFIG_USB_IOWARRIOR is not set
1161 +# CONFIG_USB_TEST is not set
1162 +# CONFIG_USB_ISIGHTFW is not set
1163 +# CONFIG_USB_GADGET is not set
1164 +# CONFIG_MMC is not set
1165 +CONFIG_NEW_LEDS=y
1166 +# CONFIG_LEDS_CLASS is not set
1167 +
1168 +#
1169 +# LED drivers
1170 +#
1171 +
1172 +#
1173 +# LED Triggers
1174 +#
1175 +# CONFIG_LEDS_TRIGGERS is not set
1176 +CONFIG_RTC_LIB=y
1177 +CONFIG_RTC_CLASS=y
1178 +# CONFIG_RTC_DEBUG is not set
1179 +
1180 +#
1181 +# RTC interfaces
1182 +#
1183 +CONFIG_RTC_INTF_SYSFS=y
1184 +CONFIG_RTC_INTF_PROC=y
1185 +CONFIG_RTC_INTF_DEV=y
1186 +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
1187 +# CONFIG_RTC_DRV_TEST is not set
1188 +
1189 +#
1190 +# I2C RTC drivers
1191 +#
1192 +# CONFIG_RTC_DRV_DS1307 is not set
1193 +# CONFIG_RTC_DRV_DS1374 is not set
1194 +# CONFIG_RTC_DRV_DS1672 is not set
1195 +# CONFIG_RTC_DRV_MAX6900 is not set
1196 +CONFIG_RTC_DRV_MV=y
1197 +# CONFIG_RTC_DRV_RS5C372 is not set
1198 +# CONFIG_RTC_DRV_ISL1208 is not set
1199 +# CONFIG_RTC_DRV_X1205 is not set
1200 +# CONFIG_RTC_DRV_PCF8563 is not set
1201 +# CONFIG_RTC_DRV_PCF8583 is not set
1202 +# CONFIG_RTC_DRV_M41T80 is not set
1203 +# CONFIG_RTC_DRV_S35390A is not set
1204 +
1205 +#
1206 +# SPI RTC drivers
1207 +#
1208 +# CONFIG_RTC_DRV_MAX6902 is not set
1209 +# CONFIG_RTC_DRV_R9701 is not set
1210 +# CONFIG_RTC_DRV_RS5C348 is not set
1211 +
1212 +#
1213 +# Platform RTC drivers
1214 +#
1215 +# CONFIG_RTC_DRV_CMOS is not set
1216 +# CONFIG_RTC_DRV_DS1511 is not set
1217 +# CONFIG_RTC_DRV_DS1553 is not set
1218 +# CONFIG_RTC_DRV_DS1742 is not set
1219 +# CONFIG_RTC_DRV_STK17TA8 is not set
1220 +# CONFIG_RTC_DRV_M48T86 is not set
1221 +# CONFIG_RTC_DRV_M48T59 is not set
1222 +# CONFIG_RTC_DRV_V3020 is not set
1223 +
1224 +#
1225 +# on-CPU RTC drivers
1226 +#
1227 +CONFIG_DMADEVICES=y
1228 +
1229 +#
1230 +# DMA Devices
1231 +#
1232 +CONFIG_MV_XOR=y
1233 +CONFIG_DMA_ENGINE=y
1234 +
1235 +#
1236 +# DMA Clients
1237 +#
1238 +# CONFIG_NET_DMA is not set
1239 +# CONFIG_UIO is not set
1240 +
1241 +#
1242 +# File systems
1243 +#
1244 +CONFIG_EXT2_FS=y
1245 +# CONFIG_EXT2_FS_XATTR is not set
1246 +# CONFIG_EXT2_FS_XIP is not set
1247 +CONFIG_EXT3_FS=y
1248 +# CONFIG_EXT3_FS_XATTR is not set
1249 +# CONFIG_EXT4DEV_FS is not set
1250 +CONFIG_JBD=y
1251 +# CONFIG_REISERFS_FS is not set
1252 +# CONFIG_JFS_FS is not set
1253 +# CONFIG_FS_POSIX_ACL is not set
1254 +CONFIG_XFS_FS=y
1255 +# CONFIG_XFS_QUOTA is not set
1256 +# CONFIG_XFS_POSIX_ACL is not set
1257 +# CONFIG_XFS_RT is not set
1258 +# CONFIG_XFS_DEBUG is not set
1259 +# CONFIG_OCFS2_FS is not set
1260 +CONFIG_DNOTIFY=y
1261 +CONFIG_INOTIFY=y
1262 +CONFIG_INOTIFY_USER=y
1263 +# CONFIG_QUOTA is not set
1264 +# CONFIG_AUTOFS_FS is not set
1265 +# CONFIG_AUTOFS4_FS is not set
1266 +# CONFIG_FUSE_FS is not set
1267 +
1268 +#
1269 +# CD-ROM/DVD Filesystems
1270 +#
1271 +CONFIG_ISO9660_FS=y
1272 +CONFIG_JOLIET=y
1273 +# CONFIG_ZISOFS is not set
1274 +CONFIG_UDF_FS=m
1275 +CONFIG_UDF_NLS=y
1276 +
1277 +#
1278 +# DOS/FAT/NT Filesystems
1279 +#
1280 +CONFIG_FAT_FS=y
1281 +CONFIG_MSDOS_FS=y
1282 +CONFIG_VFAT_FS=y
1283 +CONFIG_FAT_DEFAULT_CODEPAGE=437
1284 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
1285 +# CONFIG_NTFS_FS is not set
1286 +
1287 +#
1288 +# Pseudo filesystems
1289 +#
1290 +CONFIG_PROC_FS=y
1291 +CONFIG_PROC_SYSCTL=y
1292 +CONFIG_SYSFS=y
1293 +CONFIG_TMPFS=y
1294 +# CONFIG_TMPFS_POSIX_ACL is not set
1295 +# CONFIG_HUGETLB_PAGE is not set
1296 +# CONFIG_CONFIGFS_FS is not set
1297 +
1298 +#
1299 +# Miscellaneous filesystems
1300 +#
1301 +# CONFIG_ADFS_FS is not set
1302 +# CONFIG_AFFS_FS is not set
1303 +# CONFIG_HFS_FS is not set
1304 +# CONFIG_HFSPLUS_FS is not set
1305 +# CONFIG_BEFS_FS is not set
1306 +# CONFIG_BFS_FS is not set
1307 +# CONFIG_EFS_FS is not set
1308 +CONFIG_JFFS2_FS=y
1309 +CONFIG_JFFS2_FS_DEBUG=0
1310 +CONFIG_JFFS2_FS_WRITEBUFFER=y
1311 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
1312 +# CONFIG_JFFS2_SUMMARY is not set
1313 +# CONFIG_JFFS2_FS_XATTR is not set
1314 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
1315 +CONFIG_JFFS2_ZLIB=y
1316 +# CONFIG_JFFS2_LZO is not set
1317 +CONFIG_JFFS2_RTIME=y
1318 +# CONFIG_JFFS2_RUBIN is not set
1319 +CONFIG_CRAMFS=y
1320 +# CONFIG_VXFS_FS is not set
1321 +# CONFIG_MINIX_FS is not set
1322 +# CONFIG_HPFS_FS is not set
1323 +# CONFIG_QNX4FS_FS is not set
1324 +# CONFIG_ROMFS_FS is not set
1325 +# CONFIG_SYSV_FS is not set
1326 +# CONFIG_UFS_FS is not set
1327 +CONFIG_NETWORK_FILESYSTEMS=y
1328 +CONFIG_NFS_FS=y
1329 +CONFIG_NFS_V3=y
1330 +# CONFIG_NFS_V3_ACL is not set
1331 +# CONFIG_NFS_V4 is not set
1332 +# CONFIG_NFSD is not set
1333 +CONFIG_ROOT_NFS=y
1334 +CONFIG_LOCKD=y
1335 +CONFIG_LOCKD_V4=y
1336 +CONFIG_NFS_COMMON=y
1337 +CONFIG_SUNRPC=y
1338 +# CONFIG_SUNRPC_BIND34 is not set
1339 +# CONFIG_RPCSEC_GSS_KRB5 is not set
1340 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
1341 +# CONFIG_SMB_FS is not set
1342 +# CONFIG_CIFS is not set
1343 +# CONFIG_NCP_FS is not set
1344 +# CONFIG_CODA_FS is not set
1345 +# CONFIG_AFS_FS is not set
1346 +
1347 +#
1348 +# Partition Types
1349 +#
1350 +CONFIG_PARTITION_ADVANCED=y
1351 +# CONFIG_ACORN_PARTITION is not set
1352 +# CONFIG_OSF_PARTITION is not set
1353 +# CONFIG_AMIGA_PARTITION is not set
1354 +# CONFIG_ATARI_PARTITION is not set
1355 +# CONFIG_MAC_PARTITION is not set
1356 +CONFIG_MSDOS_PARTITION=y
1357 +# CONFIG_BSD_DISKLABEL is not set
1358 +# CONFIG_MINIX_SUBPARTITION is not set
1359 +# CONFIG_SOLARIS_X86_PARTITION is not set
1360 +# CONFIG_UNIXWARE_DISKLABEL is not set
1361 +# CONFIG_LDM_PARTITION is not set
1362 +# CONFIG_SGI_PARTITION is not set
1363 +# CONFIG_ULTRIX_PARTITION is not set
1364 +# CONFIG_SUN_PARTITION is not set
1365 +# CONFIG_KARMA_PARTITION is not set
1366 +# CONFIG_EFI_PARTITION is not set
1367 +# CONFIG_SYSV68_PARTITION is not set
1368 +CONFIG_NLS=y
1369 +CONFIG_NLS_DEFAULT="iso8859-1"
1370 +CONFIG_NLS_CODEPAGE_437=y
1371 +# CONFIG_NLS_CODEPAGE_737 is not set
1372 +# CONFIG_NLS_CODEPAGE_775 is not set
1373 +CONFIG_NLS_CODEPAGE_850=y
1374 +# CONFIG_NLS_CODEPAGE_852 is not set
1375 +# CONFIG_NLS_CODEPAGE_855 is not set
1376 +# CONFIG_NLS_CODEPAGE_857 is not set
1377 +# CONFIG_NLS_CODEPAGE_860 is not set
1378 +# CONFIG_NLS_CODEPAGE_861 is not set
1379 +# CONFIG_NLS_CODEPAGE_862 is not set
1380 +# CONFIG_NLS_CODEPAGE_863 is not set
1381 +# CONFIG_NLS_CODEPAGE_864 is not set
1382 +# CONFIG_NLS_CODEPAGE_865 is not set
1383 +# CONFIG_NLS_CODEPAGE_866 is not set
1384 +# CONFIG_NLS_CODEPAGE_869 is not set
1385 +# CONFIG_NLS_CODEPAGE_936 is not set
1386 +# CONFIG_NLS_CODEPAGE_950 is not set
1387 +# CONFIG_NLS_CODEPAGE_932 is not set
1388 +# CONFIG_NLS_CODEPAGE_949 is not set
1389 +# CONFIG_NLS_CODEPAGE_874 is not set
1390 +# CONFIG_NLS_ISO8859_8 is not set
1391 +# CONFIG_NLS_CODEPAGE_1250 is not set
1392 +# CONFIG_NLS_CODEPAGE_1251 is not set
1393 +# CONFIG_NLS_ASCII is not set
1394 +CONFIG_NLS_ISO8859_1=y
1395 +CONFIG_NLS_ISO8859_2=y
1396 +# CONFIG_NLS_ISO8859_3 is not set
1397 +# CONFIG_NLS_ISO8859_4 is not set
1398 +# CONFIG_NLS_ISO8859_5 is not set
1399 +# CONFIG_NLS_ISO8859_6 is not set
1400 +# CONFIG_NLS_ISO8859_7 is not set
1401 +# CONFIG_NLS_ISO8859_9 is not set
1402 +# CONFIG_NLS_ISO8859_13 is not set
1403 +# CONFIG_NLS_ISO8859_14 is not set
1404 +# CONFIG_NLS_ISO8859_15 is not set
1405 +# CONFIG_NLS_KOI8_R is not set
1406 +# CONFIG_NLS_KOI8_U is not set
1407 +CONFIG_NLS_UTF8=y
1408 +# CONFIG_DLM is not set
1409 +
1410 +#
1411 +# Kernel hacking
1412 +#
1413 +# CONFIG_PRINTK_TIME is not set
1414 +CONFIG_ENABLE_WARN_DEPRECATED=y
1415 +CONFIG_ENABLE_MUST_CHECK=y
1416 +CONFIG_FRAME_WARN=1024
1417 +CONFIG_MAGIC_SYSRQ=y
1418 +# CONFIG_UNUSED_SYMBOLS is not set
1419 +# CONFIG_DEBUG_FS is not set
1420 +# CONFIG_HEADERS_CHECK is not set
1421 +CONFIG_DEBUG_KERNEL=y
1422 +# CONFIG_DEBUG_SHIRQ is not set
1423 +CONFIG_DETECT_SOFTLOCKUP=y
1424 +# CONFIG_SCHED_DEBUG is not set
1425 +# CONFIG_SCHEDSTATS is not set
1426 +# CONFIG_TIMER_STATS is not set
1427 +# CONFIG_DEBUG_OBJECTS is not set
1428 +# CONFIG_DEBUG_SLAB is not set
1429 +# CONFIG_DEBUG_PREEMPT is not set
1430 +# CONFIG_DEBUG_RT_MUTEXES is not set
1431 +# CONFIG_RT_MUTEX_TESTER is not set
1432 +# CONFIG_DEBUG_SPINLOCK is not set
1433 +# CONFIG_DEBUG_MUTEXES is not set
1434 +# CONFIG_DEBUG_LOCK_ALLOC is not set
1435 +# CONFIG_PROVE_LOCKING is not set
1436 +# CONFIG_LOCK_STAT is not set
1437 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
1438 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
1439 +# CONFIG_DEBUG_KOBJECT is not set
1440 +# CONFIG_DEBUG_BUGVERBOSE is not set
1441 +CONFIG_DEBUG_INFO=y
1442 +# CONFIG_DEBUG_VM is not set
1443 +# CONFIG_DEBUG_WRITECOUNT is not set
1444 +# CONFIG_DEBUG_LIST is not set
1445 +# CONFIG_DEBUG_SG is not set
1446 +CONFIG_FRAME_POINTER=y
1447 +# CONFIG_BOOT_PRINTK_DELAY is not set
1448 +# CONFIG_RCU_TORTURE_TEST is not set
1449 +# CONFIG_KPROBES_SANITY_TEST is not set
1450 +# CONFIG_BACKTRACE_SELF_TEST is not set
1451 +# CONFIG_LKDTM is not set
1452 +# CONFIG_FAULT_INJECTION is not set
1453 +# CONFIG_LATENCYTOP is not set
1454 +# CONFIG_SAMPLES is not set
1455 +CONFIG_DEBUG_USER=y
1456 +CONFIG_DEBUG_ERRORS=y
1457 +# CONFIG_DEBUG_STACK_USAGE is not set
1458 +CONFIG_DEBUG_LL=y
1459 +# CONFIG_DEBUG_ICEDCC is not set
1460 +
1461 +#
1462 +# Security options
1463 +#
1464 +# CONFIG_KEYS is not set
1465 +# CONFIG_SECURITY is not set
1466 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
1467 +CONFIG_ASYNC_CORE=y
1468 +CONFIG_CRYPTO=y
1469 +
1470 +#
1471 +# Crypto core or helper
1472 +#
1473 +CONFIG_CRYPTO_ALGAPI=m
1474 +CONFIG_CRYPTO_BLKCIPHER=m
1475 +CONFIG_CRYPTO_MANAGER=m
1476 +# CONFIG_CRYPTO_GF128MUL is not set
1477 +# CONFIG_CRYPTO_NULL is not set
1478 +# CONFIG_CRYPTO_CRYPTD is not set
1479 +# CONFIG_CRYPTO_AUTHENC is not set
1480 +# CONFIG_CRYPTO_TEST is not set
1481 +
1482 +#
1483 +# Authenticated Encryption with Associated Data
1484 +#
1485 +# CONFIG_CRYPTO_CCM is not set
1486 +# CONFIG_CRYPTO_GCM is not set
1487 +# CONFIG_CRYPTO_SEQIV is not set
1488 +
1489 +#
1490 +# Block modes
1491 +#
1492 +CONFIG_CRYPTO_CBC=m
1493 +# CONFIG_CRYPTO_CTR is not set
1494 +# CONFIG_CRYPTO_CTS is not set
1495 +CONFIG_CRYPTO_ECB=m
1496 +# CONFIG_CRYPTO_LRW is not set
1497 +CONFIG_CRYPTO_PCBC=m
1498 +# CONFIG_CRYPTO_XTS is not set
1499 +
1500 +#
1501 +# Hash modes
1502 +#
1503 +# CONFIG_CRYPTO_HMAC is not set
1504 +# CONFIG_CRYPTO_XCBC is not set
1505 +
1506 +#
1507 +# Digest
1508 +#
1509 +# CONFIG_CRYPTO_CRC32C is not set
1510 +# CONFIG_CRYPTO_MD4 is not set
1511 +# CONFIG_CRYPTO_MD5 is not set
1512 +# CONFIG_CRYPTO_MICHAEL_MIC is not set
1513 +# CONFIG_CRYPTO_SHA1 is not set
1514 +# CONFIG_CRYPTO_SHA256 is not set
1515 +# CONFIG_CRYPTO_SHA512 is not set
1516 +# CONFIG_CRYPTO_TGR192 is not set
1517 +# CONFIG_CRYPTO_WP512 is not set
1518 +
1519 +#
1520 +# Ciphers
1521 +#
1522 +# CONFIG_CRYPTO_AES is not set
1523 +# CONFIG_CRYPTO_ANUBIS is not set
1524 +# CONFIG_CRYPTO_ARC4 is not set
1525 +# CONFIG_CRYPTO_BLOWFISH is not set
1526 +# CONFIG_CRYPTO_CAMELLIA is not set
1527 +# CONFIG_CRYPTO_CAST5 is not set
1528 +# CONFIG_CRYPTO_CAST6 is not set
1529 +# CONFIG_CRYPTO_DES is not set
1530 +# CONFIG_CRYPTO_FCRYPT is not set
1531 +# CONFIG_CRYPTO_KHAZAD is not set
1532 +# CONFIG_CRYPTO_SALSA20 is not set
1533 +# CONFIG_CRYPTO_SEED is not set
1534 +# CONFIG_CRYPTO_SERPENT is not set
1535 +# CONFIG_CRYPTO_TEA is not set
1536 +# CONFIG_CRYPTO_TWOFISH is not set
1537 +
1538 +#
1539 +# Compression
1540 +#
1541 +# CONFIG_CRYPTO_DEFLATE is not set
1542 +# CONFIG_CRYPTO_LZO is not set
1543 +CONFIG_CRYPTO_HW=y
1544 +# CONFIG_CRYPTO_DEV_HIFN_795X is not set
1545 +
1546 +#
1547 +# Library routines
1548 +#
1549 +CONFIG_BITREVERSE=y
1550 +# CONFIG_GENERIC_FIND_FIRST_BIT is not set
1551 +# CONFIG_GENERIC_FIND_NEXT_BIT is not set
1552 +CONFIG_CRC_CCITT=y
1553 +CONFIG_CRC16=y
1554 +CONFIG_CRC_ITU_T=m
1555 +CONFIG_CRC32=y
1556 +# CONFIG_CRC7 is not set
1557 +CONFIG_LIBCRC32C=y
1558 +CONFIG_ZLIB_INFLATE=y
1559 +CONFIG_ZLIB_DEFLATE=y
1560 +CONFIG_PLIST=y
1561 +CONFIG_HAS_IOMEM=y
1562 +CONFIG_HAS_IOPORT=y
1563 +CONFIG_HAS_DMA=y
1564 --- /dev/null
1565 +++ b/arch/arm/configs/loki_defconfig
1566 @@ -0,0 +1,1147 @@
1567 +#
1568 +# Automatically generated make config: don't edit
1569 +# Linux kernel version: 2.6.26-rc5
1570 +# Fri Jun 13 03:07:49 2008
1571 +#
1572 +CONFIG_ARM=y
1573 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
1574 +# CONFIG_GENERIC_GPIO is not set
1575 +CONFIG_GENERIC_TIME=y
1576 +CONFIG_GENERIC_CLOCKEVENTS=y
1577 +CONFIG_MMU=y
1578 +# CONFIG_NO_IOPORT is not set
1579 +CONFIG_GENERIC_HARDIRQS=y
1580 +CONFIG_STACKTRACE_SUPPORT=y
1581 +CONFIG_HAVE_LATENCYTOP_SUPPORT=y
1582 +CONFIG_LOCKDEP_SUPPORT=y
1583 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
1584 +CONFIG_HARDIRQS_SW_RESEND=y
1585 +CONFIG_GENERIC_IRQ_PROBE=y
1586 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
1587 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
1588 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
1589 +CONFIG_GENERIC_HWEIGHT=y
1590 +CONFIG_GENERIC_CALIBRATE_DELAY=y
1591 +CONFIG_ARCH_SUPPORTS_AOUT=y
1592 +CONFIG_ZONE_DMA=y
1593 +CONFIG_VECTORS_BASE=0xffff0000
1594 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
1595 +
1596 +#
1597 +# General setup
1598 +#
1599 +CONFIG_EXPERIMENTAL=y
1600 +CONFIG_BROKEN_ON_SMP=y
1601 +CONFIG_LOCK_KERNEL=y
1602 +CONFIG_INIT_ENV_ARG_LIMIT=32
1603 +CONFIG_LOCALVERSION=""
1604 +CONFIG_LOCALVERSION_AUTO=y
1605 +CONFIG_SWAP=y
1606 +CONFIG_SYSVIPC=y
1607 +CONFIG_SYSVIPC_SYSCTL=y
1608 +# CONFIG_POSIX_MQUEUE is not set
1609 +# CONFIG_BSD_PROCESS_ACCT is not set
1610 +# CONFIG_TASKSTATS is not set
1611 +# CONFIG_AUDIT is not set
1612 +# CONFIG_IKCONFIG is not set
1613 +CONFIG_LOG_BUF_SHIFT=14
1614 +# CONFIG_CGROUPS is not set
1615 +# CONFIG_GROUP_SCHED is not set
1616 +# CONFIG_SYSFS_DEPRECATED_V2 is not set
1617 +# CONFIG_RELAY is not set
1618 +# CONFIG_NAMESPACES is not set
1619 +# CONFIG_BLK_DEV_INITRD is not set
1620 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
1621 +CONFIG_SYSCTL=y
1622 +CONFIG_EMBEDDED=y
1623 +CONFIG_UID16=y
1624 +CONFIG_SYSCTL_SYSCALL=y
1625 +CONFIG_SYSCTL_SYSCALL_CHECK=y
1626 +CONFIG_KALLSYMS=y
1627 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
1628 +CONFIG_HOTPLUG=y
1629 +CONFIG_PRINTK=y
1630 +CONFIG_BUG=y
1631 +CONFIG_ELF_CORE=y
1632 +CONFIG_COMPAT_BRK=y
1633 +CONFIG_BASE_FULL=y
1634 +CONFIG_FUTEX=y
1635 +CONFIG_ANON_INODES=y
1636 +CONFIG_EPOLL=y
1637 +CONFIG_SIGNALFD=y
1638 +CONFIG_TIMERFD=y
1639 +CONFIG_EVENTFD=y
1640 +CONFIG_SHMEM=y
1641 +CONFIG_VM_EVENT_COUNTERS=y
1642 +CONFIG_SLAB=y
1643 +# CONFIG_SLUB is not set
1644 +# CONFIG_SLOB is not set
1645 +# CONFIG_PROFILING is not set
1646 +# CONFIG_MARKERS is not set
1647 +CONFIG_HAVE_OPROFILE=y
1648 +# CONFIG_KPROBES is not set
1649 +CONFIG_HAVE_KPROBES=y
1650 +CONFIG_HAVE_KRETPROBES=y
1651 +# CONFIG_HAVE_DMA_ATTRS is not set
1652 +CONFIG_PROC_PAGE_MONITOR=y
1653 +CONFIG_SLABINFO=y
1654 +CONFIG_RT_MUTEXES=y
1655 +# CONFIG_TINY_SHMEM is not set
1656 +CONFIG_BASE_SMALL=0
1657 +CONFIG_MODULES=y
1658 +# CONFIG_MODULE_FORCE_LOAD is not set
1659 +CONFIG_MODULE_UNLOAD=y
1660 +# CONFIG_MODULE_FORCE_UNLOAD is not set
1661 +# CONFIG_MODVERSIONS is not set
1662 +# CONFIG_MODULE_SRCVERSION_ALL is not set
1663 +# CONFIG_KMOD is not set
1664 +CONFIG_BLOCK=y
1665 +# CONFIG_LBD is not set
1666 +# CONFIG_BLK_DEV_IO_TRACE is not set
1667 +# CONFIG_LSF is not set
1668 +# CONFIG_BLK_DEV_BSG is not set
1669 +
1670 +#
1671 +# IO Schedulers
1672 +#
1673 +CONFIG_IOSCHED_NOOP=y
1674 +CONFIG_IOSCHED_AS=y
1675 +CONFIG_IOSCHED_DEADLINE=y
1676 +CONFIG_IOSCHED_CFQ=y
1677 +# CONFIG_DEFAULT_AS is not set
1678 +# CONFIG_DEFAULT_DEADLINE is not set
1679 +CONFIG_DEFAULT_CFQ=y
1680 +# CONFIG_DEFAULT_NOOP is not set
1681 +CONFIG_DEFAULT_IOSCHED="cfq"
1682 +CONFIG_CLASSIC_RCU=y
1683 +
1684 +#
1685 +# System Type
1686 +#
1687 +# CONFIG_ARCH_AAEC2000 is not set
1688 +# CONFIG_ARCH_INTEGRATOR is not set
1689 +# CONFIG_ARCH_REALVIEW is not set
1690 +# CONFIG_ARCH_VERSATILE is not set
1691 +# CONFIG_ARCH_AT91 is not set
1692 +# CONFIG_ARCH_CLPS7500 is not set
1693 +# CONFIG_ARCH_CLPS711X is not set
1694 +# CONFIG_ARCH_CO285 is not set
1695 +# CONFIG_ARCH_EBSA110 is not set
1696 +# CONFIG_ARCH_EP93XX is not set
1697 +# CONFIG_ARCH_FOOTBRIDGE is not set
1698 +# CONFIG_ARCH_NETX is not set
1699 +# CONFIG_ARCH_H720X is not set
1700 +# CONFIG_ARCH_IMX is not set
1701 +# CONFIG_ARCH_IOP13XX is not set
1702 +# CONFIG_ARCH_IOP32X is not set
1703 +# CONFIG_ARCH_IOP33X is not set
1704 +# CONFIG_ARCH_IXP23XX is not set
1705 +# CONFIG_ARCH_IXP2000 is not set
1706 +# CONFIG_ARCH_IXP4XX is not set
1707 +# CONFIG_ARCH_L7200 is not set
1708 +# CONFIG_ARCH_KIRKWOOD is not set
1709 +# CONFIG_ARCH_KS8695 is not set
1710 +# CONFIG_ARCH_NS9XXX is not set
1711 +CONFIG_ARCH_LOKI=y
1712 +# CONFIG_ARCH_MV78XX0 is not set
1713 +# CONFIG_ARCH_MXC is not set
1714 +# CONFIG_ARCH_ORION5X is not set
1715 +# CONFIG_ARCH_PNX4008 is not set
1716 +# CONFIG_ARCH_PXA is not set
1717 +# CONFIG_ARCH_RPC is not set
1718 +# CONFIG_ARCH_SA1100 is not set
1719 +# CONFIG_ARCH_S3C2410 is not set
1720 +# CONFIG_ARCH_SHARK is not set
1721 +# CONFIG_ARCH_LH7A40X is not set
1722 +# CONFIG_ARCH_DAVINCI is not set
1723 +# CONFIG_ARCH_OMAP is not set
1724 +# CONFIG_ARCH_MSM7X00A is not set
1725 +
1726 +#
1727 +# Marvell Loki (88RC8480) Implementations
1728 +#
1729 +CONFIG_MACH_LB88RC8480=y
1730 +
1731 +#
1732 +# Boot options
1733 +#
1734 +
1735 +#
1736 +# Power management
1737 +#
1738 +CONFIG_PLAT_ORION=y
1739 +
1740 +#
1741 +# Processor Type
1742 +#
1743 +CONFIG_CPU_32=y
1744 +CONFIG_CPU_FEROCEON=y
1745 +# CONFIG_CPU_FEROCEON_OLD_ID is not set
1746 +CONFIG_CPU_32v5=y
1747 +CONFIG_CPU_ABRT_EV5T=y
1748 +CONFIG_CPU_PABRT_NOIFAR=y
1749 +CONFIG_CPU_CACHE_VIVT=y
1750 +CONFIG_CPU_COPY_FEROCEON=y
1751 +CONFIG_CPU_TLB_FEROCEON=y
1752 +CONFIG_CPU_CP15=y
1753 +CONFIG_CPU_CP15_MMU=y
1754 +
1755 +#
1756 +# Processor Features
1757 +#
1758 +CONFIG_ARM_THUMB=y
1759 +# CONFIG_CPU_ICACHE_DISABLE is not set
1760 +# CONFIG_CPU_DCACHE_DISABLE is not set
1761 +# CONFIG_OUTER_CACHE is not set
1762 +
1763 +#
1764 +# Bus support
1765 +#
1766 +# CONFIG_PCI_SYSCALL is not set
1767 +# CONFIG_ARCH_SUPPORTS_MSI is not set
1768 +# CONFIG_PCCARD is not set
1769 +
1770 +#
1771 +# Kernel Features
1772 +#
1773 +CONFIG_TICK_ONESHOT=y
1774 +CONFIG_NO_HZ=y
1775 +CONFIG_HIGH_RES_TIMERS=y
1776 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
1777 +CONFIG_PREEMPT=y
1778 +CONFIG_HZ=100
1779 +CONFIG_AEABI=y
1780 +CONFIG_OABI_COMPAT=y
1781 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
1782 +CONFIG_SELECT_MEMORY_MODEL=y
1783 +CONFIG_FLATMEM_MANUAL=y
1784 +# CONFIG_DISCONTIGMEM_MANUAL is not set
1785 +# CONFIG_SPARSEMEM_MANUAL is not set
1786 +CONFIG_FLATMEM=y
1787 +CONFIG_FLAT_NODE_MEM_MAP=y
1788 +# CONFIG_SPARSEMEM_STATIC is not set
1789 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
1790 +CONFIG_PAGEFLAGS_EXTENDED=y
1791 +CONFIG_SPLIT_PTLOCK_CPUS=4096
1792 +# CONFIG_RESOURCES_64BIT is not set
1793 +CONFIG_ZONE_DMA_FLAG=1
1794 +CONFIG_BOUNCE=y
1795 +CONFIG_VIRT_TO_BUS=y
1796 +CONFIG_ALIGNMENT_TRAP=y
1797 +
1798 +#
1799 +# Boot options
1800 +#
1801 +CONFIG_ZBOOT_ROM_TEXT=0x0
1802 +CONFIG_ZBOOT_ROM_BSS=0x0
1803 +CONFIG_CMDLINE=""
1804 +# CONFIG_XIP_KERNEL is not set
1805 +# CONFIG_KEXEC is not set
1806 +
1807 +#
1808 +# Floating point emulation
1809 +#
1810 +
1811 +#
1812 +# At least one emulation must be selected
1813 +#
1814 +# CONFIG_FPE_NWFPE is not set
1815 +# CONFIG_FPE_FASTFPE is not set
1816 +# CONFIG_VFP is not set
1817 +
1818 +#
1819 +# Userspace binary formats
1820 +#
1821 +CONFIG_BINFMT_ELF=y
1822 +# CONFIG_BINFMT_AOUT is not set
1823 +# CONFIG_BINFMT_MISC is not set
1824 +
1825 +#
1826 +# Power management options
1827 +#
1828 +# CONFIG_PM is not set
1829 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
1830 +
1831 +#
1832 +# Networking
1833 +#
1834 +CONFIG_NET=y
1835 +
1836 +#
1837 +# Networking options
1838 +#
1839 +CONFIG_PACKET=y
1840 +CONFIG_PACKET_MMAP=y
1841 +CONFIG_UNIX=y
1842 +CONFIG_XFRM=y
1843 +# CONFIG_XFRM_USER is not set
1844 +# CONFIG_XFRM_SUB_POLICY is not set
1845 +# CONFIG_XFRM_MIGRATE is not set
1846 +# CONFIG_XFRM_STATISTICS is not set
1847 +# CONFIG_NET_KEY is not set
1848 +CONFIG_INET=y
1849 +CONFIG_IP_MULTICAST=y
1850 +# CONFIG_IP_ADVANCED_ROUTER is not set
1851 +CONFIG_IP_FIB_HASH=y
1852 +CONFIG_IP_PNP=y
1853 +CONFIG_IP_PNP_DHCP=y
1854 +CONFIG_IP_PNP_BOOTP=y
1855 +# CONFIG_IP_PNP_RARP is not set
1856 +# CONFIG_NET_IPIP is not set
1857 +# CONFIG_NET_IPGRE is not set
1858 +# CONFIG_IP_MROUTE is not set
1859 +# CONFIG_ARPD is not set
1860 +# CONFIG_SYN_COOKIES is not set
1861 +# CONFIG_INET_AH is not set
1862 +# CONFIG_INET_ESP is not set
1863 +# CONFIG_INET_IPCOMP is not set
1864 +# CONFIG_INET_XFRM_TUNNEL is not set
1865 +# CONFIG_INET_TUNNEL is not set
1866 +CONFIG_INET_XFRM_MODE_TRANSPORT=y
1867 +CONFIG_INET_XFRM_MODE_TUNNEL=y
1868 +CONFIG_INET_XFRM_MODE_BEET=y
1869 +# CONFIG_INET_LRO is not set
1870 +CONFIG_INET_DIAG=y
1871 +CONFIG_INET_TCP_DIAG=y
1872 +# CONFIG_TCP_CONG_ADVANCED is not set
1873 +CONFIG_TCP_CONG_CUBIC=y
1874 +CONFIG_DEFAULT_TCP_CONG="cubic"
1875 +# CONFIG_TCP_MD5SIG is not set
1876 +# CONFIG_IPV6 is not set
1877 +# CONFIG_NETWORK_SECMARK is not set
1878 +# CONFIG_NETFILTER is not set
1879 +# CONFIG_IP_DCCP is not set
1880 +# CONFIG_IP_SCTP is not set
1881 +# CONFIG_TIPC is not set
1882 +# CONFIG_ATM is not set
1883 +# CONFIG_BRIDGE is not set
1884 +# CONFIG_VLAN_8021Q is not set
1885 +# CONFIG_DECNET is not set
1886 +# CONFIG_LLC2 is not set
1887 +# CONFIG_IPX is not set
1888 +# CONFIG_ATALK is not set
1889 +# CONFIG_X25 is not set
1890 +# CONFIG_LAPB is not set
1891 +# CONFIG_ECONET is not set
1892 +# CONFIG_WAN_ROUTER is not set
1893 +# CONFIG_NET_SCHED is not set
1894 +
1895 +#
1896 +# Network testing
1897 +#
1898 +CONFIG_NET_PKTGEN=m
1899 +# CONFIG_HAMRADIO is not set
1900 +# CONFIG_CAN is not set
1901 +# CONFIG_IRDA is not set
1902 +# CONFIG_BT is not set
1903 +# CONFIG_AF_RXRPC is not set
1904 +
1905 +#
1906 +# Wireless
1907 +#
1908 +# CONFIG_CFG80211 is not set
1909 +CONFIG_WIRELESS_EXT=y
1910 +# CONFIG_MAC80211 is not set
1911 +# CONFIG_IEEE80211 is not set
1912 +# CONFIG_RFKILL is not set
1913 +# CONFIG_NET_9P is not set
1914 +
1915 +#
1916 +# Device Drivers
1917 +#
1918 +
1919 +#
1920 +# Generic Driver Options
1921 +#
1922 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
1923 +CONFIG_STANDALONE=y
1924 +CONFIG_PREVENT_FIRMWARE_BUILD=y
1925 +CONFIG_FW_LOADER=y
1926 +# CONFIG_SYS_HYPERVISOR is not set
1927 +# CONFIG_CONNECTOR is not set
1928 +CONFIG_MTD=y
1929 +# CONFIG_MTD_DEBUG is not set
1930 +# CONFIG_MTD_CONCAT is not set
1931 +CONFIG_MTD_PARTITIONS=y
1932 +# CONFIG_MTD_REDBOOT_PARTS is not set
1933 +CONFIG_MTD_CMDLINE_PARTS=y
1934 +# CONFIG_MTD_AFS_PARTS is not set
1935 +# CONFIG_MTD_AR7_PARTS is not set
1936 +
1937 +#
1938 +# User Modules And Translation Layers
1939 +#
1940 +CONFIG_MTD_CHAR=y
1941 +CONFIG_MTD_BLKDEVS=y
1942 +CONFIG_MTD_BLOCK=y
1943 +CONFIG_FTL=y
1944 +CONFIG_NFTL=y
1945 +# CONFIG_NFTL_RW is not set
1946 +# CONFIG_INFTL is not set
1947 +# CONFIG_RFD_FTL is not set
1948 +# CONFIG_SSFDC is not set
1949 +# CONFIG_MTD_OOPS is not set
1950 +
1951 +#
1952 +# RAM/ROM/Flash chip drivers
1953 +#
1954 +CONFIG_MTD_CFI=y
1955 +CONFIG_MTD_JEDECPROBE=y
1956 +CONFIG_MTD_GEN_PROBE=y
1957 +CONFIG_MTD_CFI_ADV_OPTIONS=y
1958 +CONFIG_MTD_CFI_NOSWAP=y
1959 +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
1960 +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
1961 +CONFIG_MTD_CFI_GEOMETRY=y
1962 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
1963 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
1964 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
1965 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
1966 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
1967 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
1968 +CONFIG_MTD_CFI_I1=y
1969 +CONFIG_MTD_CFI_I2=y
1970 +CONFIG_MTD_CFI_I4=y
1971 +# CONFIG_MTD_CFI_I8 is not set
1972 +# CONFIG_MTD_OTP is not set
1973 +CONFIG_MTD_CFI_INTELEXT=y
1974 +CONFIG_MTD_CFI_AMDSTD=y
1975 +CONFIG_MTD_CFI_STAA=y
1976 +CONFIG_MTD_CFI_UTIL=y
1977 +# CONFIG_MTD_RAM is not set
1978 +# CONFIG_MTD_ROM is not set
1979 +# CONFIG_MTD_ABSENT is not set
1980 +
1981 +#
1982 +# Mapping drivers for chip access
1983 +#
1984 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
1985 +CONFIG_MTD_PHYSMAP=y
1986 +CONFIG_MTD_PHYSMAP_START=0x0
1987 +CONFIG_MTD_PHYSMAP_LEN=0x0
1988 +CONFIG_MTD_PHYSMAP_BANKWIDTH=0
1989 +# CONFIG_MTD_ARM_INTEGRATOR is not set
1990 +# CONFIG_MTD_IMPA7 is not set
1991 +# CONFIG_MTD_PLATRAM is not set
1992 +
1993 +#
1994 +# Self-contained MTD device drivers
1995 +#
1996 +# CONFIG_MTD_DATAFLASH is not set
1997 +CONFIG_MTD_M25P80=y
1998 +CONFIG_M25PXX_USE_FAST_READ=y
1999 +# CONFIG_MTD_SLRAM is not set
2000 +# CONFIG_MTD_PHRAM is not set
2001 +# CONFIG_MTD_MTDRAM is not set
2002 +# CONFIG_MTD_BLOCK2MTD is not set
2003 +
2004 +#
2005 +# Disk-On-Chip Device Drivers
2006 +#
2007 +# CONFIG_MTD_DOC2000 is not set
2008 +# CONFIG_MTD_DOC2001 is not set
2009 +# CONFIG_MTD_DOC2001PLUS is not set
2010 +CONFIG_MTD_NAND=y
2011 +CONFIG_MTD_NAND_VERIFY_WRITE=y
2012 +# CONFIG_MTD_NAND_ECC_SMC is not set
2013 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
2014 +CONFIG_MTD_NAND_IDS=y
2015 +# CONFIG_MTD_NAND_DISKONCHIP is not set
2016 +# CONFIG_MTD_NAND_NANDSIM is not set
2017 +# CONFIG_MTD_NAND_PLATFORM is not set
2018 +# CONFIG_MTD_ALAUDA is not set
2019 +CONFIG_MTD_NAND_ORION=y
2020 +# CONFIG_MTD_ONENAND is not set
2021 +
2022 +#
2023 +# UBI - Unsorted block images
2024 +#
2025 +# CONFIG_MTD_UBI is not set
2026 +# CONFIG_PARPORT is not set
2027 +CONFIG_BLK_DEV=y
2028 +# CONFIG_BLK_DEV_COW_COMMON is not set
2029 +CONFIG_BLK_DEV_LOOP=y
2030 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
2031 +# CONFIG_BLK_DEV_NBD is not set
2032 +# CONFIG_BLK_DEV_UB is not set
2033 +# CONFIG_BLK_DEV_RAM is not set
2034 +# CONFIG_CDROM_PKTCDVD is not set
2035 +# CONFIG_ATA_OVER_ETH is not set
2036 +# CONFIG_MISC_DEVICES is not set
2037 +CONFIG_HAVE_IDE=y
2038 +# CONFIG_IDE is not set
2039 +
2040 +#
2041 +# SCSI device support
2042 +#
2043 +# CONFIG_RAID_ATTRS is not set
2044 +CONFIG_SCSI=y
2045 +CONFIG_SCSI_DMA=y
2046 +# CONFIG_SCSI_TGT is not set
2047 +# CONFIG_SCSI_NETLINK is not set
2048 +# CONFIG_SCSI_PROC_FS is not set
2049 +
2050 +#
2051 +# SCSI support type (disk, tape, CD-ROM)
2052 +#
2053 +CONFIG_BLK_DEV_SD=y
2054 +# CONFIG_CHR_DEV_ST is not set
2055 +# CONFIG_CHR_DEV_OSST is not set
2056 +CONFIG_BLK_DEV_SR=m
2057 +# CONFIG_BLK_DEV_SR_VENDOR is not set
2058 +CONFIG_CHR_DEV_SG=m
2059 +# CONFIG_CHR_DEV_SCH is not set
2060 +
2061 +#
2062 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
2063 +#
2064 +# CONFIG_SCSI_MULTI_LUN is not set
2065 +# CONFIG_SCSI_CONSTANTS is not set
2066 +# CONFIG_SCSI_LOGGING is not set
2067 +# CONFIG_SCSI_SCAN_ASYNC is not set
2068 +CONFIG_SCSI_WAIT_SCAN=m
2069 +
2070 +#
2071 +# SCSI Transports
2072 +#
2073 +# CONFIG_SCSI_SPI_ATTRS is not set
2074 +# CONFIG_SCSI_FC_ATTRS is not set
2075 +# CONFIG_SCSI_ISCSI_ATTRS is not set
2076 +# CONFIG_SCSI_SAS_LIBSAS is not set
2077 +# CONFIG_SCSI_SRP_ATTRS is not set
2078 +CONFIG_SCSI_LOWLEVEL=y
2079 +# CONFIG_ISCSI_TCP is not set
2080 +# CONFIG_SCSI_DEBUG is not set
2081 +CONFIG_ATA=y
2082 +# CONFIG_ATA_NONSTANDARD is not set
2083 +CONFIG_SATA_PMP=y
2084 +CONFIG_ATA_SFF=y
2085 +CONFIG_SATA_MV=y
2086 +# CONFIG_PATA_PLATFORM is not set
2087 +# CONFIG_MD is not set
2088 +CONFIG_NETDEVICES=y
2089 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
2090 +# CONFIG_DUMMY is not set
2091 +# CONFIG_BONDING is not set
2092 +# CONFIG_MACVLAN is not set
2093 +# CONFIG_EQUALIZER is not set
2094 +# CONFIG_TUN is not set
2095 +# CONFIG_VETH is not set
2096 +# CONFIG_PHYLIB is not set
2097 +CONFIG_NET_ETHERNET=y
2098 +CONFIG_MII=y
2099 +# CONFIG_AX88796 is not set
2100 +# CONFIG_SMC91X is not set
2101 +# CONFIG_DM9000 is not set
2102 +# CONFIG_ENC28J60 is not set
2103 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
2104 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
2105 +# CONFIG_IBM_NEW_EMAC_TAH is not set
2106 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
2107 +# CONFIG_B44 is not set
2108 +CONFIG_NETDEV_1000=y
2109 +# CONFIG_E1000E_ENABLED is not set
2110 +CONFIG_MV643XX_ETH=y
2111 +# CONFIG_NETDEV_10000 is not set
2112 +
2113 +#
2114 +# Wireless LAN
2115 +#
2116 +# CONFIG_WLAN_PRE80211 is not set
2117 +# CONFIG_WLAN_80211 is not set
2118 +# CONFIG_IWLWIFI_LEDS is not set
2119 +
2120 +#
2121 +# USB Network Adapters
2122 +#
2123 +# CONFIG_USB_CATC is not set
2124 +# CONFIG_USB_KAWETH is not set
2125 +# CONFIG_USB_PEGASUS is not set
2126 +# CONFIG_USB_RTL8150 is not set
2127 +# CONFIG_USB_USBNET is not set
2128 +# CONFIG_WAN is not set
2129 +# CONFIG_PPP is not set
2130 +# CONFIG_SLIP is not set
2131 +# CONFIG_NETCONSOLE is not set
2132 +# CONFIG_NETPOLL is not set
2133 +# CONFIG_NET_POLL_CONTROLLER is not set
2134 +# CONFIG_ISDN is not set
2135 +
2136 +#
2137 +# Input device support
2138 +#
2139 +CONFIG_INPUT=y
2140 +# CONFIG_INPUT_FF_MEMLESS is not set
2141 +# CONFIG_INPUT_POLLDEV is not set
2142 +
2143 +#
2144 +# Userland interfaces
2145 +#
2146 +CONFIG_INPUT_MOUSEDEV=y
2147 +CONFIG_INPUT_MOUSEDEV_PSAUX=y
2148 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
2149 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
2150 +# CONFIG_INPUT_JOYDEV is not set
2151 +# CONFIG_INPUT_EVDEV is not set
2152 +# CONFIG_INPUT_EVBUG is not set
2153 +
2154 +#
2155 +# Input Device Drivers
2156 +#
2157 +# CONFIG_INPUT_KEYBOARD is not set
2158 +# CONFIG_INPUT_MOUSE is not set
2159 +# CONFIG_INPUT_JOYSTICK is not set
2160 +# CONFIG_INPUT_TABLET is not set
2161 +# CONFIG_INPUT_TOUCHSCREEN is not set
2162 +# CONFIG_INPUT_MISC is not set
2163 +
2164 +#
2165 +# Hardware I/O ports
2166 +#
2167 +# CONFIG_SERIO is not set
2168 +# CONFIG_GAMEPORT is not set
2169 +
2170 +#
2171 +# Character devices
2172 +#
2173 +CONFIG_VT=y
2174 +CONFIG_VT_CONSOLE=y
2175 +CONFIG_HW_CONSOLE=y
2176 +# CONFIG_VT_HW_CONSOLE_BINDING is not set
2177 +CONFIG_DEVKMEM=y
2178 +# CONFIG_SERIAL_NONSTANDARD is not set
2179 +
2180 +#
2181 +# Serial drivers
2182 +#
2183 +CONFIG_SERIAL_8250=y
2184 +CONFIG_SERIAL_8250_CONSOLE=y
2185 +CONFIG_SERIAL_8250_NR_UARTS=4
2186 +CONFIG_SERIAL_8250_RUNTIME_UARTS=2
2187 +# CONFIG_SERIAL_8250_EXTENDED is not set
2188 +
2189 +#
2190 +# Non-8250 serial port support
2191 +#
2192 +CONFIG_SERIAL_CORE=y
2193 +CONFIG_SERIAL_CORE_CONSOLE=y
2194 +CONFIG_UNIX98_PTYS=y
2195 +CONFIG_LEGACY_PTYS=y
2196 +CONFIG_LEGACY_PTY_COUNT=16
2197 +# CONFIG_IPMI_HANDLER is not set
2198 +CONFIG_HW_RANDOM=m
2199 +# CONFIG_NVRAM is not set
2200 +# CONFIG_R3964 is not set
2201 +# CONFIG_RAW_DRIVER is not set
2202 +# CONFIG_TCG_TPM is not set
2203 +CONFIG_I2C=y
2204 +CONFIG_I2C_BOARDINFO=y
2205 +CONFIG_I2C_CHARDEV=y
2206 +
2207 +#
2208 +# I2C Hardware Bus support
2209 +#
2210 +# CONFIG_I2C_OCORES is not set
2211 +# CONFIG_I2C_PARPORT_LIGHT is not set
2212 +# CONFIG_I2C_SIMTEC is not set
2213 +# CONFIG_I2C_TAOS_EVM is not set
2214 +# CONFIG_I2C_STUB is not set
2215 +# CONFIG_I2C_TINY_USB is not set
2216 +# CONFIG_I2C_PCA_PLATFORM is not set
2217 +CONFIG_I2C_MV64XXX=y
2218 +
2219 +#
2220 +# Miscellaneous I2C Chip support
2221 +#
2222 +# CONFIG_DS1682 is not set
2223 +# CONFIG_SENSORS_EEPROM is not set
2224 +# CONFIG_SENSORS_PCF8574 is not set
2225 +# CONFIG_PCF8575 is not set
2226 +# CONFIG_SENSORS_PCF8591 is not set
2227 +# CONFIG_SENSORS_MAX6875 is not set
2228 +# CONFIG_SENSORS_TSL2550 is not set
2229 +# CONFIG_I2C_DEBUG_CORE is not set
2230 +# CONFIG_I2C_DEBUG_ALGO is not set
2231 +# CONFIG_I2C_DEBUG_BUS is not set
2232 +# CONFIG_I2C_DEBUG_CHIP is not set
2233 +CONFIG_SPI=y
2234 +CONFIG_SPI_MASTER=y
2235 +
2236 +#
2237 +# SPI Master Controller Drivers
2238 +#
2239 +# CONFIG_SPI_BITBANG is not set
2240 +
2241 +#
2242 +# SPI Protocol Masters
2243 +#
2244 +# CONFIG_SPI_AT25 is not set
2245 +# CONFIG_SPI_SPIDEV is not set
2246 +# CONFIG_SPI_TLE62X0 is not set
2247 +# CONFIG_W1 is not set
2248 +# CONFIG_POWER_SUPPLY is not set
2249 +# CONFIG_HWMON is not set
2250 +# CONFIG_WATCHDOG is not set
2251 +
2252 +#
2253 +# Sonics Silicon Backplane
2254 +#
2255 +CONFIG_SSB_POSSIBLE=y
2256 +# CONFIG_SSB is not set
2257 +
2258 +#
2259 +# Multifunction device drivers
2260 +#
2261 +# CONFIG_MFD_SM501 is not set
2262 +# CONFIG_MFD_ASIC3 is not set
2263 +# CONFIG_HTC_PASIC3 is not set
2264 +
2265 +#
2266 +# Multimedia devices
2267 +#
2268 +
2269 +#
2270 +# Multimedia core support
2271 +#
2272 +# CONFIG_VIDEO_DEV is not set
2273 +# CONFIG_DVB_CORE is not set
2274 +# CONFIG_VIDEO_MEDIA is not set
2275 +
2276 +#
2277 +# Multimedia drivers
2278 +#
2279 +# CONFIG_DAB is not set
2280 +
2281 +#
2282 +# Graphics support
2283 +#
2284 +# CONFIG_VGASTATE is not set
2285 +# CONFIG_VIDEO_OUTPUT_CONTROL is not set
2286 +# CONFIG_FB is not set
2287 +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
2288 +
2289 +#
2290 +# Display device support
2291 +#
2292 +# CONFIG_DISPLAY_SUPPORT is not set
2293 +
2294 +#
2295 +# Console display driver support
2296 +#
2297 +# CONFIG_VGA_CONSOLE is not set
2298 +CONFIG_DUMMY_CONSOLE=y
2299 +
2300 +#
2301 +# Sound
2302 +#
2303 +# CONFIG_SOUND is not set
2304 +CONFIG_HID_SUPPORT=y
2305 +CONFIG_HID=y
2306 +# CONFIG_HID_DEBUG is not set
2307 +# CONFIG_HIDRAW is not set
2308 +
2309 +#
2310 +# USB Input Devices
2311 +#
2312 +CONFIG_USB_HID=y
2313 +# CONFIG_USB_HIDINPUT_POWERBOOK is not set
2314 +# CONFIG_HID_FF is not set
2315 +# CONFIG_USB_HIDDEV is not set
2316 +CONFIG_USB_SUPPORT=y
2317 +CONFIG_USB_ARCH_HAS_HCD=y
2318 +# CONFIG_USB_ARCH_HAS_OHCI is not set
2319 +# CONFIG_USB_ARCH_HAS_EHCI is not set
2320 +CONFIG_USB=y
2321 +# CONFIG_USB_DEBUG is not set
2322 +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
2323 +
2324 +#
2325 +# Miscellaneous USB options
2326 +#
2327 +CONFIG_USB_DEVICEFS=y
2328 +CONFIG_USB_DEVICE_CLASS=y
2329 +# CONFIG_USB_DYNAMIC_MINORS is not set
2330 +# CONFIG_USB_OTG is not set
2331 +# CONFIG_USB_OTG_WHITELIST is not set
2332 +# CONFIG_USB_OTG_BLACKLIST_HUB is not set
2333 +
2334 +#
2335 +# USB Host Controller Drivers
2336 +#
2337 +# CONFIG_USB_C67X00_HCD is not set
2338 +# CONFIG_USB_ISP116X_HCD is not set
2339 +# CONFIG_USB_ISP1760_HCD is not set
2340 +# CONFIG_USB_SL811_HCD is not set
2341 +# CONFIG_USB_R8A66597_HCD is not set
2342 +
2343 +#
2344 +# USB Device Class drivers
2345 +#
2346 +# CONFIG_USB_ACM is not set
2347 +CONFIG_USB_PRINTER=y
2348 +# CONFIG_USB_WDM is not set
2349 +
2350 +#
2351 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
2352 +#
2353 +
2354 +#
2355 +# may also be needed; see USB_STORAGE Help for more information
2356 +#
2357 +CONFIG_USB_STORAGE=y
2358 +# CONFIG_USB_STORAGE_DEBUG is not set
2359 +CONFIG_USB_STORAGE_DATAFAB=y
2360 +CONFIG_USB_STORAGE_FREECOM=y
2361 +# CONFIG_USB_STORAGE_ISD200 is not set
2362 +CONFIG_USB_STORAGE_DPCM=y
2363 +# CONFIG_USB_STORAGE_USBAT is not set
2364 +CONFIG_USB_STORAGE_SDDR09=y
2365 +CONFIG_USB_STORAGE_SDDR55=y
2366 +CONFIG_USB_STORAGE_JUMPSHOT=y
2367 +# CONFIG_USB_STORAGE_ALAUDA is not set
2368 +# CONFIG_USB_STORAGE_ONETOUCH is not set
2369 +# CONFIG_USB_STORAGE_KARMA is not set
2370 +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
2371 +# CONFIG_USB_LIBUSUAL is not set
2372 +
2373 +#
2374 +# USB Imaging devices
2375 +#
2376 +# CONFIG_USB_MDC800 is not set
2377 +# CONFIG_USB_MICROTEK is not set
2378 +# CONFIG_USB_MON is not set
2379 +
2380 +#
2381 +# USB port drivers
2382 +#
2383 +# CONFIG_USB_SERIAL is not set
2384 +
2385 +#
2386 +# USB Miscellaneous drivers
2387 +#
2388 +# CONFIG_USB_EMI62 is not set
2389 +# CONFIG_USB_EMI26 is not set
2390 +# CONFIG_USB_ADUTUX is not set
2391 +# CONFIG_USB_AUERSWALD is not set
2392 +# CONFIG_USB_RIO500 is not set
2393 +# CONFIG_USB_LEGOTOWER is not set
2394 +# CONFIG_USB_LCD is not set
2395 +# CONFIG_USB_BERRY_CHARGE is not set
2396 +# CONFIG_USB_LED is not set
2397 +# CONFIG_USB_CYPRESS_CY7C63 is not set
2398 +# CONFIG_USB_CYTHERM is not set
2399 +# CONFIG_USB_PHIDGET is not set
2400 +# CONFIG_USB_IDMOUSE is not set
2401 +# CONFIG_USB_FTDI_ELAN is not set
2402 +# CONFIG_USB_APPLEDISPLAY is not set
2403 +# CONFIG_USB_LD is not set
2404 +# CONFIG_USB_TRANCEVIBRATOR is not set
2405 +# CONFIG_USB_IOWARRIOR is not set
2406 +# CONFIG_USB_TEST is not set
2407 +# CONFIG_USB_ISIGHTFW is not set
2408 +# CONFIG_USB_GADGET is not set
2409 +# CONFIG_MMC is not set
2410 +CONFIG_NEW_LEDS=y
2411 +# CONFIG_LEDS_CLASS is not set
2412 +
2413 +#
2414 +# LED drivers
2415 +#
2416 +
2417 +#
2418 +# LED Triggers
2419 +#
2420 +# CONFIG_LEDS_TRIGGERS is not set
2421 +CONFIG_RTC_LIB=y
2422 +# CONFIG_RTC_CLASS is not set
2423 +# CONFIG_UIO is not set
2424 +
2425 +#
2426 +# File systems
2427 +#
2428 +CONFIG_EXT2_FS=y
2429 +# CONFIG_EXT2_FS_XATTR is not set
2430 +# CONFIG_EXT2_FS_XIP is not set
2431 +CONFIG_EXT3_FS=y
2432 +# CONFIG_EXT3_FS_XATTR is not set
2433 +# CONFIG_EXT4DEV_FS is not set
2434 +CONFIG_JBD=y
2435 +# CONFIG_REISERFS_FS is not set
2436 +# CONFIG_JFS_FS is not set
2437 +# CONFIG_FS_POSIX_ACL is not set
2438 +CONFIG_XFS_FS=y
2439 +# CONFIG_XFS_QUOTA is not set
2440 +# CONFIG_XFS_POSIX_ACL is not set
2441 +# CONFIG_XFS_RT is not set
2442 +# CONFIG_XFS_DEBUG is not set
2443 +# CONFIG_OCFS2_FS is not set
2444 +CONFIG_DNOTIFY=y
2445 +CONFIG_INOTIFY=y
2446 +CONFIG_INOTIFY_USER=y
2447 +# CONFIG_QUOTA is not set
2448 +# CONFIG_AUTOFS_FS is not set
2449 +# CONFIG_AUTOFS4_FS is not set
2450 +# CONFIG_FUSE_FS is not set
2451 +
2452 +#
2453 +# CD-ROM/DVD Filesystems
2454 +#
2455 +CONFIG_ISO9660_FS=y
2456 +# CONFIG_JOLIET is not set
2457 +# CONFIG_ZISOFS is not set
2458 +CONFIG_UDF_FS=m
2459 +CONFIG_UDF_NLS=y
2460 +
2461 +#
2462 +# DOS/FAT/NT Filesystems
2463 +#
2464 +CONFIG_FAT_FS=y
2465 +CONFIG_MSDOS_FS=y
2466 +CONFIG_VFAT_FS=y
2467 +CONFIG_FAT_DEFAULT_CODEPAGE=437
2468 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
2469 +# CONFIG_NTFS_FS is not set
2470 +
2471 +#
2472 +# Pseudo filesystems
2473 +#
2474 +CONFIG_PROC_FS=y
2475 +CONFIG_PROC_SYSCTL=y
2476 +CONFIG_SYSFS=y
2477 +CONFIG_TMPFS=y
2478 +# CONFIG_TMPFS_POSIX_ACL is not set
2479 +# CONFIG_HUGETLB_PAGE is not set
2480 +# CONFIG_CONFIGFS_FS is not set
2481 +
2482 +#
2483 +# Miscellaneous filesystems
2484 +#
2485 +# CONFIG_ADFS_FS is not set
2486 +# CONFIG_AFFS_FS is not set
2487 +# CONFIG_HFS_FS is not set
2488 +# CONFIG_HFSPLUS_FS is not set
2489 +# CONFIG_BEFS_FS is not set
2490 +# CONFIG_BFS_FS is not set
2491 +# CONFIG_EFS_FS is not set
2492 +CONFIG_JFFS2_FS=y
2493 +CONFIG_JFFS2_FS_DEBUG=0
2494 +CONFIG_JFFS2_FS_WRITEBUFFER=y
2495 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
2496 +# CONFIG_JFFS2_SUMMARY is not set
2497 +# CONFIG_JFFS2_FS_XATTR is not set
2498 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
2499 +CONFIG_JFFS2_ZLIB=y
2500 +# CONFIG_JFFS2_LZO is not set
2501 +CONFIG_JFFS2_RTIME=y
2502 +# CONFIG_JFFS2_RUBIN is not set
2503 +CONFIG_CRAMFS=y
2504 +# CONFIG_VXFS_FS is not set
2505 +# CONFIG_MINIX_FS is not set
2506 +# CONFIG_HPFS_FS is not set
2507 +# CONFIG_QNX4FS_FS is not set
2508 +# CONFIG_ROMFS_FS is not set
2509 +# CONFIG_SYSV_FS is not set
2510 +# CONFIG_UFS_FS is not set
2511 +CONFIG_NETWORK_FILESYSTEMS=y
2512 +CONFIG_NFS_FS=y
2513 +CONFIG_NFS_V3=y
2514 +# CONFIG_NFS_V3_ACL is not set
2515 +# CONFIG_NFS_V4 is not set
2516 +# CONFIG_NFSD is not set
2517 +CONFIG_ROOT_NFS=y
2518 +CONFIG_LOCKD=y
2519 +CONFIG_LOCKD_V4=y
2520 +CONFIG_NFS_COMMON=y
2521 +CONFIG_SUNRPC=y
2522 +# CONFIG_SUNRPC_BIND34 is not set
2523 +# CONFIG_RPCSEC_GSS_KRB5 is not set
2524 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
2525 +# CONFIG_SMB_FS is not set
2526 +# CONFIG_CIFS is not set
2527 +# CONFIG_NCP_FS is not set
2528 +# CONFIG_CODA_FS is not set
2529 +# CONFIG_AFS_FS is not set
2530 +
2531 +#
2532 +# Partition Types
2533 +#
2534 +CONFIG_PARTITION_ADVANCED=y
2535 +# CONFIG_ACORN_PARTITION is not set
2536 +# CONFIG_OSF_PARTITION is not set
2537 +# CONFIG_AMIGA_PARTITION is not set
2538 +# CONFIG_ATARI_PARTITION is not set
2539 +# CONFIG_MAC_PARTITION is not set
2540 +CONFIG_MSDOS_PARTITION=y
2541 +CONFIG_BSD_DISKLABEL=y
2542 +CONFIG_MINIX_SUBPARTITION=y
2543 +CONFIG_SOLARIS_X86_PARTITION=y
2544 +CONFIG_UNIXWARE_DISKLABEL=y
2545 +CONFIG_LDM_PARTITION=y
2546 +CONFIG_LDM_DEBUG=y
2547 +# CONFIG_SGI_PARTITION is not set
2548 +# CONFIG_ULTRIX_PARTITION is not set
2549 +CONFIG_SUN_PARTITION=y
2550 +# CONFIG_KARMA_PARTITION is not set
2551 +# CONFIG_EFI_PARTITION is not set
2552 +# CONFIG_SYSV68_PARTITION is not set
2553 +CONFIG_NLS=y
2554 +CONFIG_NLS_DEFAULT="iso8859-1"
2555 +CONFIG_NLS_CODEPAGE_437=y
2556 +# CONFIG_NLS_CODEPAGE_737 is not set
2557 +# CONFIG_NLS_CODEPAGE_775 is not set
2558 +CONFIG_NLS_CODEPAGE_850=y
2559 +# CONFIG_NLS_CODEPAGE_852 is not set
2560 +# CONFIG_NLS_CODEPAGE_855 is not set
2561 +# CONFIG_NLS_CODEPAGE_857 is not set
2562 +# CONFIG_NLS_CODEPAGE_860 is not set
2563 +# CONFIG_NLS_CODEPAGE_861 is not set
2564 +# CONFIG_NLS_CODEPAGE_862 is not set
2565 +# CONFIG_NLS_CODEPAGE_863 is not set
2566 +# CONFIG_NLS_CODEPAGE_864 is not set
2567 +# CONFIG_NLS_CODEPAGE_865 is not set
2568 +# CONFIG_NLS_CODEPAGE_866 is not set
2569 +# CONFIG_NLS_CODEPAGE_869 is not set
2570 +# CONFIG_NLS_CODEPAGE_936 is not set
2571 +# CONFIG_NLS_CODEPAGE_950 is not set
2572 +# CONFIG_NLS_CODEPAGE_932 is not set
2573 +# CONFIG_NLS_CODEPAGE_949 is not set
2574 +# CONFIG_NLS_CODEPAGE_874 is not set
2575 +# CONFIG_NLS_ISO8859_8 is not set
2576 +# CONFIG_NLS_CODEPAGE_1250 is not set
2577 +# CONFIG_NLS_CODEPAGE_1251 is not set
2578 +# CONFIG_NLS_ASCII is not set
2579 +CONFIG_NLS_ISO8859_1=y
2580 +CONFIG_NLS_ISO8859_2=y
2581 +# CONFIG_NLS_ISO8859_3 is not set
2582 +# CONFIG_NLS_ISO8859_4 is not set
2583 +# CONFIG_NLS_ISO8859_5 is not set
2584 +# CONFIG_NLS_ISO8859_6 is not set
2585 +# CONFIG_NLS_ISO8859_7 is not set
2586 +# CONFIG_NLS_ISO8859_9 is not set
2587 +# CONFIG_NLS_ISO8859_13 is not set
2588 +# CONFIG_NLS_ISO8859_14 is not set
2589 +# CONFIG_NLS_ISO8859_15 is not set
2590 +# CONFIG_NLS_KOI8_R is not set
2591 +# CONFIG_NLS_KOI8_U is not set
2592 +# CONFIG_NLS_UTF8 is not set
2593 +# CONFIG_DLM is not set
2594 +
2595 +#
2596 +# Kernel hacking
2597 +#
2598 +# CONFIG_PRINTK_TIME is not set
2599 +CONFIG_ENABLE_WARN_DEPRECATED=y
2600 +CONFIG_ENABLE_MUST_CHECK=y
2601 +CONFIG_FRAME_WARN=1024
2602 +CONFIG_MAGIC_SYSRQ=y
2603 +# CONFIG_UNUSED_SYMBOLS is not set
2604 +# CONFIG_DEBUG_FS is not set
2605 +# CONFIG_HEADERS_CHECK is not set
2606 +# CONFIG_DEBUG_KERNEL is not set
2607 +# CONFIG_DEBUG_BUGVERBOSE is not set
2608 +CONFIG_FRAME_POINTER=y
2609 +# CONFIG_LATENCYTOP is not set
2610 +# CONFIG_SAMPLES is not set
2611 +CONFIG_DEBUG_USER=y
2612 +
2613 +#
2614 +# Security options
2615 +#
2616 +# CONFIG_KEYS is not set
2617 +# CONFIG_SECURITY is not set
2618 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
2619 +CONFIG_CRYPTO=y
2620 +
2621 +#
2622 +# Crypto core or helper
2623 +#
2624 +CONFIG_CRYPTO_ALGAPI=m
2625 +CONFIG_CRYPTO_BLKCIPHER=m
2626 +CONFIG_CRYPTO_MANAGER=m
2627 +# CONFIG_CRYPTO_GF128MUL is not set
2628 +# CONFIG_CRYPTO_NULL is not set
2629 +# CONFIG_CRYPTO_CRYPTD is not set
2630 +# CONFIG_CRYPTO_AUTHENC is not set
2631 +# CONFIG_CRYPTO_TEST is not set
2632 +
2633 +#
2634 +# Authenticated Encryption with Associated Data
2635 +#
2636 +# CONFIG_CRYPTO_CCM is not set
2637 +# CONFIG_CRYPTO_GCM is not set
2638 +# CONFIG_CRYPTO_SEQIV is not set
2639 +
2640 +#
2641 +# Block modes
2642 +#
2643 +CONFIG_CRYPTO_CBC=m
2644 +# CONFIG_CRYPTO_CTR is not set
2645 +# CONFIG_CRYPTO_CTS is not set
2646 +CONFIG_CRYPTO_ECB=m
2647 +# CONFIG_CRYPTO_LRW is not set
2648 +CONFIG_CRYPTO_PCBC=m
2649 +# CONFIG_CRYPTO_XTS is not set
2650 +
2651 +#
2652 +# Hash modes
2653 +#
2654 +# CONFIG_CRYPTO_HMAC is not set
2655 +# CONFIG_CRYPTO_XCBC is not set
2656 +
2657 +#
2658 +# Digest
2659 +#
2660 +# CONFIG_CRYPTO_CRC32C is not set
2661 +# CONFIG_CRYPTO_MD4 is not set
2662 +# CONFIG_CRYPTO_MD5 is not set
2663 +# CONFIG_CRYPTO_MICHAEL_MIC is not set
2664 +# CONFIG_CRYPTO_SHA1 is not set
2665 +# CONFIG_CRYPTO_SHA256 is not set
2666 +# CONFIG_CRYPTO_SHA512 is not set
2667 +# CONFIG_CRYPTO_TGR192 is not set
2668 +# CONFIG_CRYPTO_WP512 is not set
2669 +
2670 +#
2671 +# Ciphers
2672 +#
2673 +# CONFIG_CRYPTO_AES is not set
2674 +# CONFIG_CRYPTO_ANUBIS is not set
2675 +# CONFIG_CRYPTO_ARC4 is not set
2676 +# CONFIG_CRYPTO_BLOWFISH is not set
2677 +# CONFIG_CRYPTO_CAMELLIA is not set
2678 +# CONFIG_CRYPTO_CAST5 is not set
2679 +# CONFIG_CRYPTO_CAST6 is not set
2680 +# CONFIG_CRYPTO_DES is not set
2681 +# CONFIG_CRYPTO_FCRYPT is not set
2682 +# CONFIG_CRYPTO_KHAZAD is not set
2683 +# CONFIG_CRYPTO_SALSA20 is not set
2684 +# CONFIG_CRYPTO_SEED is not set
2685 +# CONFIG_CRYPTO_SERPENT is not set
2686 +# CONFIG_CRYPTO_TEA is not set
2687 +# CONFIG_CRYPTO_TWOFISH is not set
2688 +
2689 +#
2690 +# Compression
2691 +#
2692 +# CONFIG_CRYPTO_DEFLATE is not set
2693 +# CONFIG_CRYPTO_LZO is not set
2694 +CONFIG_CRYPTO_HW=y
2695 +
2696 +#
2697 +# Library routines
2698 +#
2699 +CONFIG_BITREVERSE=y
2700 +# CONFIG_GENERIC_FIND_FIRST_BIT is not set
2701 +# CONFIG_GENERIC_FIND_NEXT_BIT is not set
2702 +CONFIG_CRC_CCITT=y
2703 +CONFIG_CRC16=y
2704 +CONFIG_CRC_ITU_T=m
2705 +CONFIG_CRC32=y
2706 +# CONFIG_CRC7 is not set
2707 +CONFIG_LIBCRC32C=y
2708 +CONFIG_ZLIB_INFLATE=y
2709 +CONFIG_ZLIB_DEFLATE=y
2710 +CONFIG_PLIST=y
2711 +CONFIG_HAS_IOMEM=y
2712 +CONFIG_HAS_IOPORT=y
2713 +CONFIG_HAS_DMA=y
2714 --- /dev/null
2715 +++ b/arch/arm/configs/mv78xx0_defconfig
2716 @@ -0,0 +1,1445 @@
2717 +#
2718 +# Automatically generated make config: don't edit
2719 +# Linux kernel version: 2.6.26-rc5
2720 +# Fri Jun 13 02:57:32 2008
2721 +#
2722 +CONFIG_ARM=y
2723 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
2724 +# CONFIG_GENERIC_GPIO is not set
2725 +CONFIG_GENERIC_TIME=y
2726 +CONFIG_GENERIC_CLOCKEVENTS=y
2727 +CONFIG_MMU=y
2728 +# CONFIG_NO_IOPORT is not set
2729 +CONFIG_GENERIC_HARDIRQS=y
2730 +CONFIG_STACKTRACE_SUPPORT=y
2731 +CONFIG_HAVE_LATENCYTOP_SUPPORT=y
2732 +CONFIG_LOCKDEP_SUPPORT=y
2733 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
2734 +CONFIG_HARDIRQS_SW_RESEND=y
2735 +CONFIG_GENERIC_IRQ_PROBE=y
2736 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
2737 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
2738 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
2739 +CONFIG_GENERIC_HWEIGHT=y
2740 +CONFIG_GENERIC_CALIBRATE_DELAY=y
2741 +CONFIG_ARCH_SUPPORTS_AOUT=y
2742 +CONFIG_ZONE_DMA=y
2743 +CONFIG_VECTORS_BASE=0xffff0000
2744 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
2745 +
2746 +#
2747 +# General setup
2748 +#
2749 +CONFIG_EXPERIMENTAL=y
2750 +CONFIG_BROKEN_ON_SMP=y
2751 +CONFIG_LOCK_KERNEL=y
2752 +CONFIG_INIT_ENV_ARG_LIMIT=32
2753 +CONFIG_LOCALVERSION=""
2754 +CONFIG_LOCALVERSION_AUTO=y
2755 +CONFIG_SWAP=y
2756 +CONFIG_SYSVIPC=y
2757 +CONFIG_SYSVIPC_SYSCTL=y
2758 +# CONFIG_POSIX_MQUEUE is not set
2759 +# CONFIG_BSD_PROCESS_ACCT is not set
2760 +# CONFIG_TASKSTATS is not set
2761 +# CONFIG_AUDIT is not set
2762 +# CONFIG_IKCONFIG is not set
2763 +CONFIG_LOG_BUF_SHIFT=14
2764 +# CONFIG_CGROUPS is not set
2765 +# CONFIG_GROUP_SCHED is not set
2766 +CONFIG_SYSFS_DEPRECATED=y
2767 +CONFIG_SYSFS_DEPRECATED_V2=y
2768 +# CONFIG_RELAY is not set
2769 +# CONFIG_NAMESPACES is not set
2770 +# CONFIG_BLK_DEV_INITRD is not set
2771 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
2772 +CONFIG_SYSCTL=y
2773 +CONFIG_EMBEDDED=y
2774 +CONFIG_UID16=y
2775 +CONFIG_SYSCTL_SYSCALL=y
2776 +CONFIG_SYSCTL_SYSCALL_CHECK=y
2777 +CONFIG_KALLSYMS=y
2778 +CONFIG_KALLSYMS_ALL=y
2779 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
2780 +CONFIG_HOTPLUG=y
2781 +CONFIG_PRINTK=y
2782 +CONFIG_BUG=y
2783 +CONFIG_ELF_CORE=y
2784 +CONFIG_COMPAT_BRK=y
2785 +CONFIG_BASE_FULL=y
2786 +CONFIG_FUTEX=y
2787 +CONFIG_ANON_INODES=y
2788 +CONFIG_EPOLL=y
2789 +CONFIG_SIGNALFD=y
2790 +CONFIG_TIMERFD=y
2791 +CONFIG_EVENTFD=y
2792 +CONFIG_SHMEM=y
2793 +CONFIG_VM_EVENT_COUNTERS=y
2794 +# CONFIG_SLUB_DEBUG is not set
2795 +# CONFIG_SLAB is not set
2796 +CONFIG_SLUB=y
2797 +# CONFIG_SLOB is not set
2798 +CONFIG_PROFILING=y
2799 +# CONFIG_MARKERS is not set
2800 +CONFIG_OPROFILE=y
2801 +CONFIG_HAVE_OPROFILE=y
2802 +CONFIG_KPROBES=y
2803 +CONFIG_KRETPROBES=y
2804 +CONFIG_HAVE_KPROBES=y
2805 +CONFIG_HAVE_KRETPROBES=y
2806 +# CONFIG_HAVE_DMA_ATTRS is not set
2807 +CONFIG_PROC_PAGE_MONITOR=y
2808 +CONFIG_RT_MUTEXES=y
2809 +# CONFIG_TINY_SHMEM is not set
2810 +CONFIG_BASE_SMALL=0
2811 +CONFIG_MODULES=y
2812 +# CONFIG_MODULE_FORCE_LOAD is not set
2813 +CONFIG_MODULE_UNLOAD=y
2814 +# CONFIG_MODULE_FORCE_UNLOAD is not set
2815 +# CONFIG_MODVERSIONS is not set
2816 +# CONFIG_MODULE_SRCVERSION_ALL is not set
2817 +# CONFIG_KMOD is not set
2818 +CONFIG_BLOCK=y
2819 +# CONFIG_LBD is not set
2820 +# CONFIG_BLK_DEV_IO_TRACE is not set
2821 +# CONFIG_LSF is not set
2822 +# CONFIG_BLK_DEV_BSG is not set
2823 +
2824 +#
2825 +# IO Schedulers
2826 +#
2827 +CONFIG_IOSCHED_NOOP=y
2828 +CONFIG_IOSCHED_AS=y
2829 +CONFIG_IOSCHED_DEADLINE=y
2830 +CONFIG_IOSCHED_CFQ=y
2831 +# CONFIG_DEFAULT_AS is not set
2832 +# CONFIG_DEFAULT_DEADLINE is not set
2833 +CONFIG_DEFAULT_CFQ=y
2834 +# CONFIG_DEFAULT_NOOP is not set
2835 +CONFIG_DEFAULT_IOSCHED="cfq"
2836 +CONFIG_CLASSIC_RCU=y
2837 +
2838 +#
2839 +# System Type
2840 +#
2841 +# CONFIG_ARCH_AAEC2000 is not set
2842 +# CONFIG_ARCH_INTEGRATOR is not set
2843 +# CONFIG_ARCH_REALVIEW is not set
2844 +# CONFIG_ARCH_VERSATILE is not set
2845 +# CONFIG_ARCH_AT91 is not set
2846 +# CONFIG_ARCH_CLPS7500 is not set
2847 +# CONFIG_ARCH_CLPS711X is not set
2848 +# CONFIG_ARCH_CO285 is not set
2849 +# CONFIG_ARCH_EBSA110 is not set
2850 +# CONFIG_ARCH_EP93XX is not set
2851 +# CONFIG_ARCH_FOOTBRIDGE is not set
2852 +# CONFIG_ARCH_NETX is not set
2853 +# CONFIG_ARCH_H720X is not set
2854 +# CONFIG_ARCH_IMX is not set
2855 +# CONFIG_ARCH_IOP13XX is not set
2856 +# CONFIG_ARCH_IOP32X is not set
2857 +# CONFIG_ARCH_IOP33X is not set
2858 +# CONFIG_ARCH_IXP23XX is not set
2859 +# CONFIG_ARCH_IXP2000 is not set
2860 +# CONFIG_ARCH_IXP4XX is not set
2861 +# CONFIG_ARCH_L7200 is not set
2862 +# CONFIG_ARCH_KIRKWOOD is not set
2863 +# CONFIG_ARCH_KS8695 is not set
2864 +# CONFIG_ARCH_NS9XXX is not set
2865 +# CONFIG_ARCH_LOKI is not set
2866 +CONFIG_ARCH_MV78XX0=y
2867 +# CONFIG_ARCH_MXC is not set
2868 +# CONFIG_ARCH_ORION5X is not set
2869 +# CONFIG_ARCH_PNX4008 is not set
2870 +# CONFIG_ARCH_PXA is not set
2871 +# CONFIG_ARCH_RPC is not set
2872 +# CONFIG_ARCH_SA1100 is not set
2873 +# CONFIG_ARCH_S3C2410 is not set
2874 +# CONFIG_ARCH_SHARK is not set
2875 +# CONFIG_ARCH_LH7A40X is not set
2876 +# CONFIG_ARCH_DAVINCI is not set
2877 +# CONFIG_ARCH_OMAP is not set
2878 +# CONFIG_ARCH_MSM7X00A is not set
2879 +
2880 +#
2881 +# Marvell MV78xx0 Implementations
2882 +#
2883 +CONFIG_MACH_DB78X00_BP=y
2884 +
2885 +#
2886 +# Boot options
2887 +#
2888 +
2889 +#
2890 +# Power management
2891 +#
2892 +CONFIG_PLAT_ORION=y
2893 +
2894 +#
2895 +# Processor Type
2896 +#
2897 +CONFIG_CPU_32=y
2898 +CONFIG_CPU_FEROCEON=y
2899 +CONFIG_CPU_FEROCEON_OLD_ID=y
2900 +CONFIG_CPU_32v5=y
2901 +CONFIG_CPU_ABRT_EV5T=y
2902 +CONFIG_CPU_PABRT_NOIFAR=y
2903 +CONFIG_CPU_CACHE_VIVT=y
2904 +CONFIG_CPU_COPY_FEROCEON=y
2905 +CONFIG_CPU_TLB_FEROCEON=y
2906 +CONFIG_CPU_CP15=y
2907 +CONFIG_CPU_CP15_MMU=y
2908 +
2909 +#
2910 +# Processor Features
2911 +#
2912 +CONFIG_ARM_THUMB=y
2913 +# CONFIG_CPU_ICACHE_DISABLE is not set
2914 +# CONFIG_CPU_DCACHE_DISABLE is not set
2915 +CONFIG_OUTER_CACHE=y
2916 +CONFIG_CACHE_FEROCEON_L2=y
2917 +
2918 +#
2919 +# Bus support
2920 +#
2921 +CONFIG_PCI=y
2922 +CONFIG_PCI_SYSCALL=y
2923 +# CONFIG_ARCH_SUPPORTS_MSI is not set
2924 +CONFIG_PCI_LEGACY=y
2925 +# CONFIG_PCI_DEBUG is not set
2926 +# CONFIG_PCCARD is not set
2927 +
2928 +#
2929 +# Kernel Features
2930 +#
2931 +CONFIG_TICK_ONESHOT=y
2932 +CONFIG_NO_HZ=y
2933 +CONFIG_HIGH_RES_TIMERS=y
2934 +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
2935 +CONFIG_PREEMPT=y
2936 +CONFIG_HZ=100
2937 +CONFIG_AEABI=y
2938 +CONFIG_OABI_COMPAT=y
2939 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
2940 +CONFIG_SELECT_MEMORY_MODEL=y
2941 +CONFIG_FLATMEM_MANUAL=y
2942 +# CONFIG_DISCONTIGMEM_MANUAL is not set
2943 +# CONFIG_SPARSEMEM_MANUAL is not set
2944 +CONFIG_FLATMEM=y
2945 +CONFIG_FLAT_NODE_MEM_MAP=y
2946 +# CONFIG_SPARSEMEM_STATIC is not set
2947 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
2948 +CONFIG_PAGEFLAGS_EXTENDED=y
2949 +CONFIG_SPLIT_PTLOCK_CPUS=4096
2950 +# CONFIG_RESOURCES_64BIT is not set
2951 +CONFIG_ZONE_DMA_FLAG=1
2952 +CONFIG_BOUNCE=y
2953 +CONFIG_VIRT_TO_BUS=y
2954 +CONFIG_ALIGNMENT_TRAP=y
2955 +
2956 +#
2957 +# Boot options
2958 +#
2959 +CONFIG_ZBOOT_ROM_TEXT=0x0
2960 +CONFIG_ZBOOT_ROM_BSS=0x0
2961 +CONFIG_CMDLINE=""
2962 +# CONFIG_XIP_KERNEL is not set
2963 +# CONFIG_KEXEC is not set
2964 +
2965 +#
2966 +# Floating point emulation
2967 +#
2968 +
2969 +#
2970 +# At least one emulation must be selected
2971 +#
2972 +CONFIG_FPE_NWFPE=y
2973 +# CONFIG_FPE_NWFPE_XP is not set
2974 +# CONFIG_FPE_FASTFPE is not set
2975 +CONFIG_VFP=y
2976 +
2977 +#
2978 +# Userspace binary formats
2979 +#
2980 +CONFIG_BINFMT_ELF=y
2981 +# CONFIG_BINFMT_AOUT is not set
2982 +# CONFIG_BINFMT_MISC is not set
2983 +
2984 +#
2985 +# Power management options
2986 +#
2987 +# CONFIG_PM is not set
2988 +CONFIG_ARCH_SUSPEND_POSSIBLE=y
2989 +
2990 +#
2991 +# Networking
2992 +#
2993 +CONFIG_NET=y
2994 +
2995 +#
2996 +# Networking options
2997 +#
2998 +CONFIG_PACKET=y
2999 +CONFIG_PACKET_MMAP=y
3000 +CONFIG_UNIX=y
3001 +CONFIG_XFRM=y
3002 +# CONFIG_XFRM_USER is not set
3003 +# CONFIG_XFRM_SUB_POLICY is not set
3004 +# CONFIG_XFRM_MIGRATE is not set
3005 +# CONFIG_XFRM_STATISTICS is not set
3006 +# CONFIG_NET_KEY is not set
3007 +CONFIG_INET=y
3008 +CONFIG_IP_MULTICAST=y
3009 +# CONFIG_IP_ADVANCED_ROUTER is not set
3010 +CONFIG_IP_FIB_HASH=y
3011 +CONFIG_IP_PNP=y
3012 +CONFIG_IP_PNP_DHCP=y
3013 +CONFIG_IP_PNP_BOOTP=y
3014 +# CONFIG_IP_PNP_RARP is not set
3015 +# CONFIG_NET_IPIP is not set
3016 +# CONFIG_NET_IPGRE is not set
3017 +# CONFIG_IP_MROUTE is not set
3018 +# CONFIG_ARPD is not set
3019 +# CONFIG_SYN_COOKIES is not set
3020 +# CONFIG_INET_AH is not set
3021 +# CONFIG_INET_ESP is not set
3022 +# CONFIG_INET_IPCOMP is not set
3023 +# CONFIG_INET_XFRM_TUNNEL is not set
3024 +# CONFIG_INET_TUNNEL is not set
3025 +CONFIG_INET_XFRM_MODE_TRANSPORT=y
3026 +CONFIG_INET_XFRM_MODE_TUNNEL=y
3027 +CONFIG_INET_XFRM_MODE_BEET=y
3028 +# CONFIG_INET_LRO is not set
3029 +CONFIG_INET_DIAG=y
3030 +CONFIG_INET_TCP_DIAG=y
3031 +# CONFIG_TCP_CONG_ADVANCED is not set
3032 +CONFIG_TCP_CONG_CUBIC=y
3033 +CONFIG_DEFAULT_TCP_CONG="cubic"
3034 +# CONFIG_TCP_MD5SIG is not set
3035 +# CONFIG_IPV6 is not set
3036 +# CONFIG_NETWORK_SECMARK is not set
3037 +# CONFIG_NETFILTER is not set
3038 +# CONFIG_IP_DCCP is not set
3039 +# CONFIG_IP_SCTP is not set
3040 +# CONFIG_TIPC is not set
3041 +# CONFIG_ATM is not set
3042 +# CONFIG_BRIDGE is not set
3043 +# CONFIG_VLAN_8021Q is not set
3044 +# CONFIG_DECNET is not set
3045 +# CONFIG_LLC2 is not set
3046 +# CONFIG_IPX is not set
3047 +# CONFIG_ATALK is not set
3048 +# CONFIG_X25 is not set
3049 +# CONFIG_LAPB is not set
3050 +# CONFIG_ECONET is not set
3051 +# CONFIG_WAN_ROUTER is not set
3052 +# CONFIG_NET_SCHED is not set
3053 +
3054 +#
3055 +# Network testing
3056 +#
3057 +CONFIG_NET_PKTGEN=m
3058 +# CONFIG_NET_TCPPROBE is not set
3059 +# CONFIG_HAMRADIO is not set
3060 +# CONFIG_CAN is not set
3061 +# CONFIG_IRDA is not set
3062 +# CONFIG_BT is not set
3063 +# CONFIG_AF_RXRPC is not set
3064 +
3065 +#
3066 +# Wireless
3067 +#
3068 +# CONFIG_CFG80211 is not set
3069 +CONFIG_WIRELESS_EXT=y
3070 +# CONFIG_MAC80211 is not set
3071 +# CONFIG_IEEE80211 is not set
3072 +# CONFIG_RFKILL is not set
3073 +# CONFIG_NET_9P is not set
3074 +
3075 +#
3076 +# Device Drivers
3077 +#
3078 +
3079 +#
3080 +# Generic Driver Options
3081 +#
3082 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
3083 +CONFIG_STANDALONE=y
3084 +CONFIG_PREVENT_FIRMWARE_BUILD=y
3085 +CONFIG_FW_LOADER=y
3086 +# CONFIG_DEBUG_DRIVER is not set
3087 +# CONFIG_DEBUG_DEVRES is not set
3088 +# CONFIG_SYS_HYPERVISOR is not set
3089 +# CONFIG_CONNECTOR is not set
3090 +CONFIG_MTD=y
3091 +# CONFIG_MTD_DEBUG is not set
3092 +# CONFIG_MTD_CONCAT is not set
3093 +CONFIG_MTD_PARTITIONS=y
3094 +# CONFIG_MTD_REDBOOT_PARTS is not set
3095 +CONFIG_MTD_CMDLINE_PARTS=y
3096 +# CONFIG_MTD_AFS_PARTS is not set
3097 +# CONFIG_MTD_AR7_PARTS is not set
3098 +
3099 +#
3100 +# User Modules And Translation Layers
3101 +#
3102 +CONFIG_MTD_CHAR=y
3103 +CONFIG_MTD_BLKDEVS=y
3104 +CONFIG_MTD_BLOCK=y
3105 +# CONFIG_FTL is not set
3106 +# CONFIG_NFTL is not set
3107 +# CONFIG_INFTL is not set
3108 +# CONFIG_RFD_FTL is not set
3109 +# CONFIG_SSFDC is not set
3110 +# CONFIG_MTD_OOPS is not set
3111 +
3112 +#
3113 +# RAM/ROM/Flash chip drivers
3114 +#
3115 +CONFIG_MTD_CFI=y
3116 +CONFIG_MTD_JEDECPROBE=y
3117 +CONFIG_MTD_GEN_PROBE=y
3118 +CONFIG_MTD_CFI_ADV_OPTIONS=y
3119 +CONFIG_MTD_CFI_NOSWAP=y
3120 +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
3121 +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
3122 +CONFIG_MTD_CFI_GEOMETRY=y
3123 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
3124 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
3125 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
3126 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
3127 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
3128 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
3129 +CONFIG_MTD_CFI_I1=y
3130 +CONFIG_MTD_CFI_I2=y
3131 +# CONFIG_MTD_CFI_I4 is not set
3132 +# CONFIG_MTD_CFI_I8 is not set
3133 +# CONFIG_MTD_OTP is not set
3134 +CONFIG_MTD_CFI_INTELEXT=y
3135 +CONFIG_MTD_CFI_AMDSTD=y
3136 +# CONFIG_MTD_CFI_STAA is not set
3137 +CONFIG_MTD_CFI_UTIL=y
3138 +# CONFIG_MTD_RAM is not set
3139 +# CONFIG_MTD_ROM is not set
3140 +# CONFIG_MTD_ABSENT is not set
3141 +
3142 +#
3143 +# Mapping drivers for chip access
3144 +#
3145 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
3146 +CONFIG_MTD_PHYSMAP=y
3147 +CONFIG_MTD_PHYSMAP_START=0x0
3148 +CONFIG_MTD_PHYSMAP_LEN=0x0
3149 +CONFIG_MTD_PHYSMAP_BANKWIDTH=0
3150 +# CONFIG_MTD_ARM_INTEGRATOR is not set
3151 +# CONFIG_MTD_IMPA7 is not set
3152 +# CONFIG_MTD_INTEL_VR_NOR is not set
3153 +# CONFIG_MTD_PLATRAM is not set
3154 +
3155 +#
3156 +# Self-contained MTD device drivers
3157 +#
3158 +# CONFIG_MTD_PMC551 is not set
3159 +# CONFIG_MTD_SLRAM is not set
3160 +# CONFIG_MTD_PHRAM is not set
3161 +# CONFIG_MTD_MTDRAM is not set
3162 +# CONFIG_MTD_BLOCK2MTD is not set
3163 +
3164 +#
3165 +# Disk-On-Chip Device Drivers
3166 +#
3167 +# CONFIG_MTD_DOC2000 is not set
3168 +# CONFIG_MTD_DOC2001 is not set
3169 +# CONFIG_MTD_DOC2001PLUS is not set
3170 +CONFIG_MTD_NAND=y
3171 +CONFIG_MTD_NAND_VERIFY_WRITE=y
3172 +# CONFIG_MTD_NAND_ECC_SMC is not set
3173 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
3174 +CONFIG_MTD_NAND_IDS=y
3175 +# CONFIG_MTD_NAND_DISKONCHIP is not set
3176 +# CONFIG_MTD_NAND_CAFE is not set
3177 +# CONFIG_MTD_NAND_NANDSIM is not set
3178 +# CONFIG_MTD_NAND_PLATFORM is not set
3179 +# CONFIG_MTD_ALAUDA is not set
3180 +CONFIG_MTD_NAND_ORION=y
3181 +# CONFIG_MTD_ONENAND is not set
3182 +
3183 +#
3184 +# UBI - Unsorted block images
3185 +#
3186 +# CONFIG_MTD_UBI is not set
3187 +# CONFIG_PARPORT is not set
3188 +CONFIG_BLK_DEV=y
3189 +# CONFIG_BLK_CPQ_DA is not set
3190 +# CONFIG_BLK_CPQ_CISS_DA is not set
3191 +# CONFIG_BLK_DEV_DAC960 is not set
3192 +# CONFIG_BLK_DEV_UMEM is not set
3193 +# CONFIG_BLK_DEV_COW_COMMON is not set
3194 +CONFIG_BLK_DEV_LOOP=y
3195 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
3196 +# CONFIG_BLK_DEV_NBD is not set
3197 +# CONFIG_BLK_DEV_SX8 is not set
3198 +# CONFIG_BLK_DEV_UB is not set
3199 +# CONFIG_BLK_DEV_RAM is not set
3200 +# CONFIG_CDROM_PKTCDVD is not set
3201 +# CONFIG_ATA_OVER_ETH is not set
3202 +CONFIG_MISC_DEVICES=y
3203 +# CONFIG_PHANTOM is not set
3204 +# CONFIG_EEPROM_93CX6 is not set
3205 +# CONFIG_SGI_IOC4 is not set
3206 +# CONFIG_TIFM_CORE is not set
3207 +# CONFIG_ENCLOSURE_SERVICES is not set
3208 +CONFIG_HAVE_IDE=y
3209 +# CONFIG_IDE is not set
3210 +
3211 +#
3212 +# SCSI device support
3213 +#
3214 +# CONFIG_RAID_ATTRS is not set
3215 +CONFIG_SCSI=y
3216 +CONFIG_SCSI_DMA=y
3217 +# CONFIG_SCSI_TGT is not set
3218 +# CONFIG_SCSI_NETLINK is not set
3219 +# CONFIG_SCSI_PROC_FS is not set
3220 +
3221 +#
3222 +# SCSI support type (disk, tape, CD-ROM)
3223 +#
3224 +CONFIG_BLK_DEV_SD=y
3225 +# CONFIG_CHR_DEV_ST is not set
3226 +# CONFIG_CHR_DEV_OSST is not set
3227 +CONFIG_BLK_DEV_SR=m
3228 +# CONFIG_BLK_DEV_SR_VENDOR is not set
3229 +CONFIG_CHR_DEV_SG=m
3230 +# CONFIG_CHR_DEV_SCH is not set
3231 +
3232 +#
3233 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
3234 +#
3235 +# CONFIG_SCSI_MULTI_LUN is not set
3236 +# CONFIG_SCSI_CONSTANTS is not set
3237 +# CONFIG_SCSI_LOGGING is not set
3238 +# CONFIG_SCSI_SCAN_ASYNC is not set
3239 +CONFIG_SCSI_WAIT_SCAN=m
3240 +
3241 +#
3242 +# SCSI Transports
3243 +#
3244 +# CONFIG_SCSI_SPI_ATTRS is not set
3245 +# CONFIG_SCSI_FC_ATTRS is not set
3246 +# CONFIG_SCSI_ISCSI_ATTRS is not set
3247 +# CONFIG_SCSI_SAS_LIBSAS is not set
3248 +# CONFIG_SCSI_SRP_ATTRS is not set
3249 +CONFIG_SCSI_LOWLEVEL=y
3250 +# CONFIG_ISCSI_TCP is not set
3251 +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
3252 +# CONFIG_SCSI_3W_9XXX is not set
3253 +# CONFIG_SCSI_ACARD is not set
3254 +# CONFIG_SCSI_AACRAID is not set
3255 +# CONFIG_SCSI_AIC7XXX is not set
3256 +# CONFIG_SCSI_AIC7XXX_OLD is not set
3257 +# CONFIG_SCSI_AIC79XX is not set
3258 +# CONFIG_SCSI_AIC94XX is not set
3259 +# CONFIG_SCSI_DPT_I2O is not set
3260 +# CONFIG_SCSI_ADVANSYS is not set
3261 +# CONFIG_SCSI_ARCMSR is not set
3262 +# CONFIG_MEGARAID_NEWGEN is not set
3263 +# CONFIG_MEGARAID_LEGACY is not set
3264 +# CONFIG_MEGARAID_SAS is not set
3265 +# CONFIG_SCSI_HPTIOP is not set
3266 +# CONFIG_SCSI_DMX3191D is not set
3267 +# CONFIG_SCSI_FUTURE_DOMAIN is not set
3268 +# CONFIG_SCSI_IPS is not set
3269 +# CONFIG_SCSI_INITIO is not set
3270 +# CONFIG_SCSI_INIA100 is not set
3271 +# CONFIG_SCSI_MVSAS is not set
3272 +# CONFIG_SCSI_STEX is not set
3273 +# CONFIG_SCSI_SYM53C8XX_2 is not set
3274 +# CONFIG_SCSI_IPR is not set
3275 +# CONFIG_SCSI_QLOGIC_1280 is not set
3276 +# CONFIG_SCSI_QLA_FC is not set
3277 +# CONFIG_SCSI_QLA_ISCSI is not set
3278 +# CONFIG_SCSI_LPFC is not set
3279 +# CONFIG_SCSI_DC395x is not set
3280 +# CONFIG_SCSI_DC390T is not set
3281 +# CONFIG_SCSI_NSP32 is not set
3282 +# CONFIG_SCSI_DEBUG is not set
3283 +# CONFIG_SCSI_SRP is not set
3284 +CONFIG_ATA=y
3285 +# CONFIG_ATA_NONSTANDARD is not set
3286 +CONFIG_SATA_PMP=y
3287 +# CONFIG_SATA_AHCI is not set
3288 +# CONFIG_SATA_SIL24 is not set
3289 +CONFIG_ATA_SFF=y
3290 +# CONFIG_SATA_SVW is not set
3291 +# CONFIG_ATA_PIIX is not set
3292 +CONFIG_SATA_MV=y
3293 +# CONFIG_SATA_NV is not set
3294 +# CONFIG_PDC_ADMA is not set
3295 +# CONFIG_SATA_QSTOR is not set
3296 +# CONFIG_SATA_PROMISE is not set
3297 +# CONFIG_SATA_SX4 is not set
3298 +# CONFIG_SATA_SIL is not set
3299 +# CONFIG_SATA_SIS is not set
3300 +# CONFIG_SATA_ULI is not set
3301 +# CONFIG_SATA_VIA is not set
3302 +# CONFIG_SATA_VITESSE is not set
3303 +# CONFIG_SATA_INIC162X is not set
3304 +# CONFIG_PATA_ALI is not set
3305 +# CONFIG_PATA_AMD is not set
3306 +# CONFIG_PATA_ARTOP is not set
3307 +# CONFIG_PATA_ATIIXP is not set
3308 +# CONFIG_PATA_CMD640_PCI is not set
3309 +# CONFIG_PATA_CMD64X is not set
3310 +# CONFIG_PATA_CS5520 is not set
3311 +# CONFIG_PATA_CS5530 is not set
3312 +# CONFIG_PATA_CYPRESS is not set
3313 +# CONFIG_PATA_EFAR is not set
3314 +# CONFIG_ATA_GENERIC is not set
3315 +# CONFIG_PATA_HPT366 is not set
3316 +# CONFIG_PATA_HPT37X is not set
3317 +# CONFIG_PATA_HPT3X2N is not set
3318 +# CONFIG_PATA_HPT3X3 is not set
3319 +# CONFIG_PATA_IT821X is not set
3320 +# CONFIG_PATA_IT8213 is not set
3321 +# CONFIG_PATA_JMICRON is not set
3322 +# CONFIG_PATA_TRIFLEX is not set
3323 +# CONFIG_PATA_MARVELL is not set
3324 +# CONFIG_PATA_MPIIX is not set
3325 +# CONFIG_PATA_OLDPIIX is not set
3326 +# CONFIG_PATA_NETCELL is not set
3327 +# CONFIG_PATA_NINJA32 is not set
3328 +# CONFIG_PATA_NS87410 is not set
3329 +# CONFIG_PATA_NS87415 is not set
3330 +# CONFIG_PATA_OPTI is not set
3331 +# CONFIG_PATA_OPTIDMA is not set
3332 +# CONFIG_PATA_PDC_OLD is not set
3333 +# CONFIG_PATA_RADISYS is not set
3334 +# CONFIG_PATA_RZ1000 is not set
3335 +# CONFIG_PATA_SC1200 is not set
3336 +# CONFIG_PATA_SERVERWORKS is not set
3337 +# CONFIG_PATA_PDC2027X is not set
3338 +# CONFIG_PATA_SIL680 is not set
3339 +# CONFIG_PATA_SIS is not set
3340 +# CONFIG_PATA_VIA is not set
3341 +# CONFIG_PATA_WINBOND is not set
3342 +# CONFIG_PATA_PLATFORM is not set
3343 +# CONFIG_PATA_SCH is not set
3344 +# CONFIG_MD is not set
3345 +# CONFIG_FUSION is not set
3346 +
3347 +#
3348 +# IEEE 1394 (FireWire) support
3349 +#
3350 +# CONFIG_FIREWIRE is not set
3351 +# CONFIG_IEEE1394 is not set
3352 +# CONFIG_I2O is not set
3353 +CONFIG_NETDEVICES=y
3354 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
3355 +# CONFIG_DUMMY is not set
3356 +# CONFIG_BONDING is not set
3357 +# CONFIG_MACVLAN is not set
3358 +# CONFIG_EQUALIZER is not set
3359 +# CONFIG_TUN is not set
3360 +# CONFIG_VETH is not set
3361 +# CONFIG_ARCNET is not set
3362 +# CONFIG_PHYLIB is not set
3363 +CONFIG_NET_ETHERNET=y
3364 +CONFIG_MII=y
3365 +# CONFIG_AX88796 is not set
3366 +# CONFIG_HAPPYMEAL is not set
3367 +# CONFIG_SUNGEM is not set
3368 +# CONFIG_CASSINI is not set
3369 +# CONFIG_NET_VENDOR_3COM is not set
3370 +# CONFIG_SMC91X is not set
3371 +# CONFIG_DM9000 is not set
3372 +# CONFIG_NET_TULIP is not set
3373 +# CONFIG_HP100 is not set
3374 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
3375 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
3376 +# CONFIG_IBM_NEW_EMAC_TAH is not set
3377 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
3378 +CONFIG_NET_PCI=y
3379 +# CONFIG_PCNET32 is not set
3380 +# CONFIG_AMD8111_ETH is not set
3381 +# CONFIG_ADAPTEC_STARFIRE is not set
3382 +# CONFIG_B44 is not set
3383 +# CONFIG_FORCEDETH is not set
3384 +# CONFIG_EEPRO100 is not set
3385 +# CONFIG_E100 is not set
3386 +# CONFIG_FEALNX is not set
3387 +# CONFIG_NATSEMI is not set
3388 +# CONFIG_NE2K_PCI is not set
3389 +# CONFIG_8139CP is not set
3390 +# CONFIG_8139TOO is not set
3391 +# CONFIG_R6040 is not set
3392 +# CONFIG_SIS900 is not set
3393 +# CONFIG_EPIC100 is not set
3394 +# CONFIG_SUNDANCE is not set
3395 +# CONFIG_TLAN is not set
3396 +# CONFIG_VIA_RHINE is not set
3397 +# CONFIG_SC92031 is not set
3398 +CONFIG_NETDEV_1000=y
3399 +# CONFIG_ACENIC is not set
3400 +# CONFIG_DL2K is not set
3401 +# CONFIG_E1000 is not set
3402 +# CONFIG_E1000E is not set
3403 +# CONFIG_E1000E_ENABLED is not set
3404 +# CONFIG_IP1000 is not set
3405 +# CONFIG_IGB is not set
3406 +# CONFIG_NS83820 is not set
3407 +# CONFIG_HAMACHI is not set
3408 +# CONFIG_YELLOWFIN is not set
3409 +# CONFIG_R8169 is not set
3410 +# CONFIG_SIS190 is not set
3411 +# CONFIG_SKGE is not set
3412 +# CONFIG_SKY2 is not set
3413 +# CONFIG_VIA_VELOCITY is not set
3414 +# CONFIG_TIGON3 is not set
3415 +# CONFIG_BNX2 is not set
3416 +CONFIG_MV643XX_ETH=y
3417 +# CONFIG_QLA3XXX is not set
3418 +# CONFIG_ATL1 is not set
3419 +# CONFIG_NETDEV_10000 is not set
3420 +# CONFIG_TR is not set
3421 +
3422 +#
3423 +# Wireless LAN
3424 +#
3425 +# CONFIG_WLAN_PRE80211 is not set
3426 +# CONFIG_WLAN_80211 is not set
3427 +# CONFIG_IWLWIFI_LEDS is not set
3428 +
3429 +#
3430 +# USB Network Adapters
3431 +#
3432 +# CONFIG_USB_CATC is not set
3433 +# CONFIG_USB_KAWETH is not set
3434 +# CONFIG_USB_PEGASUS is not set
3435 +# CONFIG_USB_RTL8150 is not set
3436 +# CONFIG_USB_USBNET is not set
3437 +# CONFIG_WAN is not set
3438 +# CONFIG_FDDI is not set
3439 +# CONFIG_HIPPI is not set
3440 +# CONFIG_PPP is not set
3441 +# CONFIG_SLIP is not set
3442 +# CONFIG_NET_FC is not set
3443 +# CONFIG_NETCONSOLE is not set
3444 +# CONFIG_NETPOLL is not set
3445 +# CONFIG_NET_POLL_CONTROLLER is not set
3446 +# CONFIG_ISDN is not set
3447 +
3448 +#
3449 +# Input device support
3450 +#
3451 +CONFIG_INPUT=y
3452 +# CONFIG_INPUT_FF_MEMLESS is not set
3453 +# CONFIG_INPUT_POLLDEV is not set
3454 +
3455 +#
3456 +# Userland interfaces
3457 +#
3458 +# CONFIG_INPUT_MOUSEDEV is not set
3459 +# CONFIG_INPUT_JOYDEV is not set
3460 +CONFIG_INPUT_EVDEV=y
3461 +# CONFIG_INPUT_EVBUG is not set
3462 +
3463 +#
3464 +# Input Device Drivers
3465 +#
3466 +# CONFIG_INPUT_KEYBOARD is not set
3467 +# CONFIG_INPUT_MOUSE is not set
3468 +# CONFIG_INPUT_JOYSTICK is not set
3469 +# CONFIG_INPUT_TABLET is not set
3470 +# CONFIG_INPUT_TOUCHSCREEN is not set
3471 +# CONFIG_INPUT_MISC is not set
3472 +
3473 +#
3474 +# Hardware I/O ports
3475 +#
3476 +# CONFIG_SERIO is not set
3477 +# CONFIG_GAMEPORT is not set
3478 +
3479 +#
3480 +# Character devices
3481 +#
3482 +# CONFIG_VT is not set
3483 +CONFIG_DEVKMEM=y
3484 +# CONFIG_SERIAL_NONSTANDARD is not set
3485 +# CONFIG_NOZOMI is not set
3486 +
3487 +#
3488 +# Serial drivers
3489 +#
3490 +CONFIG_SERIAL_8250=y
3491 +CONFIG_SERIAL_8250_CONSOLE=y
3492 +# CONFIG_SERIAL_8250_PCI is not set
3493 +CONFIG_SERIAL_8250_NR_UARTS=4
3494 +CONFIG_SERIAL_8250_RUNTIME_UARTS=2
3495 +# CONFIG_SERIAL_8250_EXTENDED is not set
3496 +
3497 +#
3498 +# Non-8250 serial port support
3499 +#
3500 +CONFIG_SERIAL_CORE=y
3501 +CONFIG_SERIAL_CORE_CONSOLE=y
3502 +# CONFIG_SERIAL_JSM is not set
3503 +CONFIG_UNIX98_PTYS=y
3504 +CONFIG_LEGACY_PTYS=y
3505 +CONFIG_LEGACY_PTY_COUNT=16
3506 +# CONFIG_IPMI_HANDLER is not set
3507 +# CONFIG_HW_RANDOM is not set
3508 +# CONFIG_NVRAM is not set
3509 +# CONFIG_R3964 is not set
3510 +# CONFIG_APPLICOM is not set
3511 +# CONFIG_RAW_DRIVER is not set
3512 +# CONFIG_TCG_TPM is not set
3513 +CONFIG_DEVPORT=y
3514 +CONFIG_I2C=y
3515 +CONFIG_I2C_BOARDINFO=y
3516 +CONFIG_I2C_CHARDEV=y
3517 +
3518 +#
3519 +# I2C Hardware Bus support
3520 +#
3521 +# CONFIG_I2C_ALI1535 is not set
3522 +# CONFIG_I2C_ALI1563 is not set
3523 +# CONFIG_I2C_ALI15X3 is not set
3524 +# CONFIG_I2C_AMD756 is not set
3525 +# CONFIG_I2C_AMD8111 is not set
3526 +# CONFIG_I2C_I801 is not set
3527 +# CONFIG_I2C_I810 is not set
3528 +# CONFIG_I2C_PIIX4 is not set
3529 +# CONFIG_I2C_NFORCE2 is not set
3530 +# CONFIG_I2C_OCORES is not set
3531 +# CONFIG_I2C_PARPORT_LIGHT is not set
3532 +# CONFIG_I2C_PROSAVAGE is not set
3533 +# CONFIG_I2C_SAVAGE4 is not set
3534 +# CONFIG_I2C_SIMTEC is not set
3535 +# CONFIG_I2C_SIS5595 is not set
3536 +# CONFIG_I2C_SIS630 is not set
3537 +# CONFIG_I2C_SIS96X is not set
3538 +# CONFIG_I2C_TAOS_EVM is not set
3539 +# CONFIG_I2C_STUB is not set
3540 +# CONFIG_I2C_TINY_USB is not set
3541 +# CONFIG_I2C_VIA is not set
3542 +# CONFIG_I2C_VIAPRO is not set
3543 +# CONFIG_I2C_VOODOO3 is not set
3544 +# CONFIG_I2C_PCA_PLATFORM is not set
3545 +CONFIG_I2C_MV64XXX=y
3546 +
3547 +#
3548 +# Miscellaneous I2C Chip support
3549 +#
3550 +# CONFIG_DS1682 is not set
3551 +# CONFIG_SENSORS_EEPROM is not set
3552 +# CONFIG_SENSORS_PCF8574 is not set
3553 +# CONFIG_PCF8575 is not set
3554 +# CONFIG_SENSORS_PCF8591 is not set
3555 +# CONFIG_SENSORS_MAX6875 is not set
3556 +# CONFIG_SENSORS_TSL2550 is not set
3557 +# CONFIG_I2C_DEBUG_CORE is not set
3558 +# CONFIG_I2C_DEBUG_ALGO is not set
3559 +# CONFIG_I2C_DEBUG_BUS is not set
3560 +# CONFIG_I2C_DEBUG_CHIP is not set
3561 +# CONFIG_SPI is not set
3562 +# CONFIG_W1 is not set
3563 +# CONFIG_POWER_SUPPLY is not set
3564 +CONFIG_HWMON=y
3565 +# CONFIG_HWMON_VID is not set
3566 +# CONFIG_SENSORS_AD7418 is not set
3567 +# CONFIG_SENSORS_ADM1021 is not set
3568 +# CONFIG_SENSORS_ADM1025 is not set
3569 +# CONFIG_SENSORS_ADM1026 is not set
3570 +# CONFIG_SENSORS_ADM1029 is not set
3571 +# CONFIG_SENSORS_ADM1031 is not set
3572 +# CONFIG_SENSORS_ADM9240 is not set
3573 +# CONFIG_SENSORS_ADT7470 is not set
3574 +# CONFIG_SENSORS_ADT7473 is not set
3575 +# CONFIG_SENSORS_ATXP1 is not set
3576 +# CONFIG_SENSORS_DS1621 is not set
3577 +# CONFIG_SENSORS_I5K_AMB is not set
3578 +# CONFIG_SENSORS_F71805F is not set
3579 +# CONFIG_SENSORS_F71882FG is not set
3580 +# CONFIG_SENSORS_F75375S is not set
3581 +# CONFIG_SENSORS_GL518SM is not set
3582 +# CONFIG_SENSORS_GL520SM is not set
3583 +# CONFIG_SENSORS_IT87 is not set
3584 +# CONFIG_SENSORS_LM63 is not set
3585 +# CONFIG_SENSORS_LM75 is not set
3586 +# CONFIG_SENSORS_LM77 is not set
3587 +# CONFIG_SENSORS_LM78 is not set
3588 +# CONFIG_SENSORS_LM80 is not set
3589 +# CONFIG_SENSORS_LM83 is not set
3590 +# CONFIG_SENSORS_LM85 is not set
3591 +# CONFIG_SENSORS_LM87 is not set
3592 +# CONFIG_SENSORS_LM90 is not set
3593 +# CONFIG_SENSORS_LM92 is not set
3594 +# CONFIG_SENSORS_LM93 is not set
3595 +# CONFIG_SENSORS_MAX1619 is not set
3596 +# CONFIG_SENSORS_MAX6650 is not set
3597 +# CONFIG_SENSORS_PC87360 is not set
3598 +# CONFIG_SENSORS_PC87427 is not set
3599 +# CONFIG_SENSORS_SIS5595 is not set
3600 +# CONFIG_SENSORS_DME1737 is not set
3601 +# CONFIG_SENSORS_SMSC47M1 is not set
3602 +# CONFIG_SENSORS_SMSC47M192 is not set
3603 +# CONFIG_SENSORS_SMSC47B397 is not set
3604 +# CONFIG_SENSORS_ADS7828 is not set
3605 +# CONFIG_SENSORS_THMC50 is not set
3606 +# CONFIG_SENSORS_VIA686A is not set
3607 +# CONFIG_SENSORS_VT1211 is not set
3608 +# CONFIG_SENSORS_VT8231 is not set
3609 +# CONFIG_SENSORS_W83781D is not set
3610 +# CONFIG_SENSORS_W83791D is not set
3611 +# CONFIG_SENSORS_W83792D is not set
3612 +# CONFIG_SENSORS_W83793 is not set
3613 +# CONFIG_SENSORS_W83L785TS is not set
3614 +# CONFIG_SENSORS_W83L786NG is not set
3615 +# CONFIG_SENSORS_W83627HF is not set
3616 +# CONFIG_SENSORS_W83627EHF is not set
3617 +# CONFIG_HWMON_DEBUG_CHIP is not set
3618 +# CONFIG_WATCHDOG is not set
3619 +
3620 +#
3621 +# Sonics Silicon Backplane
3622 +#
3623 +CONFIG_SSB_POSSIBLE=y
3624 +# CONFIG_SSB is not set
3625 +
3626 +#
3627 +# Multifunction device drivers
3628 +#
3629 +# CONFIG_MFD_SM501 is not set
3630 +# CONFIG_MFD_ASIC3 is not set
3631 +# CONFIG_HTC_PASIC3 is not set
3632 +
3633 +#
3634 +# Multimedia devices
3635 +#
3636 +
3637 +#
3638 +# Multimedia core support
3639 +#
3640 +# CONFIG_VIDEO_DEV is not set
3641 +# CONFIG_DVB_CORE is not set
3642 +# CONFIG_VIDEO_MEDIA is not set
3643 +
3644 +#
3645 +# Multimedia drivers
3646 +#
3647 +# CONFIG_DAB is not set
3648 +
3649 +#
3650 +# Graphics support
3651 +#
3652 +# CONFIG_DRM is not set
3653 +# CONFIG_VGASTATE is not set
3654 +# CONFIG_VIDEO_OUTPUT_CONTROL is not set
3655 +# CONFIG_FB is not set
3656 +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
3657 +
3658 +#
3659 +# Display device support
3660 +#
3661 +# CONFIG_DISPLAY_SUPPORT is not set
3662 +
3663 +#
3664 +# Sound
3665 +#
3666 +# CONFIG_SOUND is not set
3667 +CONFIG_HID_SUPPORT=y
3668 +CONFIG_HID=y
3669 +# CONFIG_HID_DEBUG is not set
3670 +# CONFIG_HIDRAW is not set
3671 +
3672 +#
3673 +# USB Input Devices
3674 +#
3675 +CONFIG_USB_HID=y
3676 +# CONFIG_USB_HIDINPUT_POWERBOOK is not set
3677 +# CONFIG_HID_FF is not set
3678 +# CONFIG_USB_HIDDEV is not set
3679 +CONFIG_USB_SUPPORT=y
3680 +CONFIG_USB_ARCH_HAS_HCD=y
3681 +CONFIG_USB_ARCH_HAS_OHCI=y
3682 +CONFIG_USB_ARCH_HAS_EHCI=y
3683 +CONFIG_USB=y
3684 +# CONFIG_USB_DEBUG is not set
3685 +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
3686 +
3687 +#
3688 +# Miscellaneous USB options
3689 +#
3690 +CONFIG_USB_DEVICEFS=y
3691 +CONFIG_USB_DEVICE_CLASS=y
3692 +# CONFIG_USB_DYNAMIC_MINORS is not set
3693 +# CONFIG_USB_OTG is not set
3694 +# CONFIG_USB_OTG_WHITELIST is not set
3695 +# CONFIG_USB_OTG_BLACKLIST_HUB is not set
3696 +
3697 +#
3698 +# USB Host Controller Drivers
3699 +#
3700 +# CONFIG_USB_C67X00_HCD is not set
3701 +CONFIG_USB_EHCI_HCD=y
3702 +CONFIG_USB_EHCI_ROOT_HUB_TT=y
3703 +CONFIG_USB_EHCI_TT_NEWSCHED=y
3704 +# CONFIG_USB_ISP116X_HCD is not set
3705 +# CONFIG_USB_ISP1760_HCD is not set
3706 +# CONFIG_USB_OHCI_HCD is not set
3707 +# CONFIG_USB_UHCI_HCD is not set
3708 +# CONFIG_USB_SL811_HCD is not set
3709 +# CONFIG_USB_R8A66597_HCD is not set
3710 +
3711 +#
3712 +# USB Device Class drivers
3713 +#
3714 +# CONFIG_USB_ACM is not set
3715 +CONFIG_USB_PRINTER=y
3716 +# CONFIG_USB_WDM is not set
3717 +
3718 +#
3719 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
3720 +#
3721 +
3722 +#
3723 +# may also be needed; see USB_STORAGE Help for more information
3724 +#
3725 +CONFIG_USB_STORAGE=y
3726 +# CONFIG_USB_STORAGE_DEBUG is not set
3727 +CONFIG_USB_STORAGE_DATAFAB=y
3728 +CONFIG_USB_STORAGE_FREECOM=y
3729 +# CONFIG_USB_STORAGE_ISD200 is not set
3730 +CONFIG_USB_STORAGE_DPCM=y
3731 +# CONFIG_USB_STORAGE_USBAT is not set
3732 +CONFIG_USB_STORAGE_SDDR09=y
3733 +CONFIG_USB_STORAGE_SDDR55=y
3734 +CONFIG_USB_STORAGE_JUMPSHOT=y
3735 +# CONFIG_USB_STORAGE_ALAUDA is not set
3736 +# CONFIG_USB_STORAGE_ONETOUCH is not set
3737 +# CONFIG_USB_STORAGE_KARMA is not set
3738 +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
3739 +# CONFIG_USB_LIBUSUAL is not set
3740 +
3741 +#
3742 +# USB Imaging devices
3743 +#
3744 +# CONFIG_USB_MDC800 is not set
3745 +# CONFIG_USB_MICROTEK is not set
3746 +# CONFIG_USB_MON is not set
3747 +
3748 +#
3749 +# USB port drivers
3750 +#
3751 +# CONFIG_USB_SERIAL is not set
3752 +
3753 +#
3754 +# USB Miscellaneous drivers
3755 +#
3756 +# CONFIG_USB_EMI62 is not set
3757 +# CONFIG_USB_EMI26 is not set
3758 +# CONFIG_USB_ADUTUX is not set
3759 +# CONFIG_USB_AUERSWALD is not set
3760 +# CONFIG_USB_RIO500 is not set
3761 +# CONFIG_USB_LEGOTOWER is not set
3762 +# CONFIG_USB_LCD is not set
3763 +# CONFIG_USB_BERRY_CHARGE is not set
3764 +# CONFIG_USB_LED is not set
3765 +# CONFIG_USB_CYPRESS_CY7C63 is not set
3766 +# CONFIG_USB_CYTHERM is not set
3767 +# CONFIG_USB_PHIDGET is not set
3768 +# CONFIG_USB_IDMOUSE is not set
3769 +# CONFIG_USB_FTDI_ELAN is not set
3770 +# CONFIG_USB_APPLEDISPLAY is not set
3771 +# CONFIG_USB_SISUSBVGA is not set
3772 +# CONFIG_USB_LD is not set
3773 +# CONFIG_USB_TRANCEVIBRATOR is not set
3774 +# CONFIG_USB_IOWARRIOR is not set
3775 +# CONFIG_USB_TEST is not set
3776 +# CONFIG_USB_ISIGHTFW is not set
3777 +# CONFIG_USB_GADGET is not set
3778 +# CONFIG_MMC is not set
3779 +CONFIG_NEW_LEDS=y
3780 +CONFIG_LEDS_CLASS=y
3781 +
3782 +#
3783 +# LED drivers
3784 +#
3785 +
3786 +#
3787 +# LED Triggers
3788 +#
3789 +CONFIG_LEDS_TRIGGERS=y
3790 +CONFIG_LEDS_TRIGGER_TIMER=y
3791 +CONFIG_LEDS_TRIGGER_HEARTBEAT=y
3792 +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
3793 +CONFIG_RTC_LIB=y
3794 +CONFIG_RTC_CLASS=y
3795 +CONFIG_RTC_HCTOSYS=y
3796 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
3797 +# CONFIG_RTC_DEBUG is not set
3798 +
3799 +#
3800 +# RTC interfaces
3801 +#
3802 +CONFIG_RTC_INTF_SYSFS=y
3803 +CONFIG_RTC_INTF_PROC=y
3804 +CONFIG_RTC_INTF_DEV=y
3805 +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
3806 +# CONFIG_RTC_DRV_TEST is not set
3807 +
3808 +#
3809 +# I2C RTC drivers
3810 +#
3811 +CONFIG_RTC_DRV_DS1307=y
3812 +# CONFIG_RTC_DRV_DS1374 is not set
3813 +# CONFIG_RTC_DRV_DS1672 is not set
3814 +# CONFIG_RTC_DRV_MAX6900 is not set
3815 +CONFIG_RTC_DRV_RS5C372=y
3816 +# CONFIG_RTC_DRV_ISL1208 is not set
3817 +# CONFIG_RTC_DRV_X1205 is not set
3818 +# CONFIG_RTC_DRV_PCF8563 is not set
3819 +# CONFIG_RTC_DRV_PCF8583 is not set
3820 +CONFIG_RTC_DRV_M41T80=y
3821 +# CONFIG_RTC_DRV_M41T80_WDT is not set
3822 +# CONFIG_RTC_DRV_S35390A is not set
3823 +
3824 +#
3825 +# SPI RTC drivers
3826 +#
3827 +
3828 +#
3829 +# Platform RTC drivers
3830 +#
3831 +# CONFIG_RTC_DRV_CMOS is not set
3832 +# CONFIG_RTC_DRV_DS1511 is not set
3833 +# CONFIG_RTC_DRV_DS1553 is not set
3834 +# CONFIG_RTC_DRV_DS1742 is not set
3835 +# CONFIG_RTC_DRV_STK17TA8 is not set
3836 +# CONFIG_RTC_DRV_M48T86 is not set
3837 +# CONFIG_RTC_DRV_M48T59 is not set
3838 +# CONFIG_RTC_DRV_V3020 is not set
3839 +
3840 +#
3841 +# on-CPU RTC drivers
3842 +#
3843 +# CONFIG_UIO is not set
3844 +
3845 +#
3846 +# File systems
3847 +#
3848 +CONFIG_EXT2_FS=y
3849 +# CONFIG_EXT2_FS_XATTR is not set
3850 +# CONFIG_EXT2_FS_XIP is not set
3851 +CONFIG_EXT3_FS=y
3852 +# CONFIG_EXT3_FS_XATTR is not set
3853 +# CONFIG_EXT4DEV_FS is not set
3854 +CONFIG_JBD=y
3855 +# CONFIG_REISERFS_FS is not set
3856 +# CONFIG_JFS_FS is not set
3857 +# CONFIG_FS_POSIX_ACL is not set
3858 +# CONFIG_XFS_FS is not set
3859 +# CONFIG_OCFS2_FS is not set
3860 +CONFIG_DNOTIFY=y
3861 +CONFIG_INOTIFY=y
3862 +CONFIG_INOTIFY_USER=y
3863 +# CONFIG_QUOTA is not set
3864 +# CONFIG_AUTOFS_FS is not set
3865 +# CONFIG_AUTOFS4_FS is not set
3866 +# CONFIG_FUSE_FS is not set
3867 +
3868 +#
3869 +# CD-ROM/DVD Filesystems
3870 +#
3871 +CONFIG_ISO9660_FS=m
3872 +CONFIG_JOLIET=y
3873 +# CONFIG_ZISOFS is not set
3874 +CONFIG_UDF_FS=m
3875 +CONFIG_UDF_NLS=y
3876 +
3877 +#
3878 +# DOS/FAT/NT Filesystems
3879 +#
3880 +CONFIG_FAT_FS=y
3881 +CONFIG_MSDOS_FS=y
3882 +CONFIG_VFAT_FS=y
3883 +CONFIG_FAT_DEFAULT_CODEPAGE=437
3884 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
3885 +# CONFIG_NTFS_FS is not set
3886 +
3887 +#
3888 +# Pseudo filesystems
3889 +#
3890 +CONFIG_PROC_FS=y
3891 +CONFIG_PROC_SYSCTL=y
3892 +CONFIG_SYSFS=y
3893 +CONFIG_TMPFS=y
3894 +# CONFIG_TMPFS_POSIX_ACL is not set
3895 +# CONFIG_HUGETLB_PAGE is not set
3896 +# CONFIG_CONFIGFS_FS is not set
3897 +
3898 +#
3899 +# Miscellaneous filesystems
3900 +#
3901 +# CONFIG_ADFS_FS is not set
3902 +# CONFIG_AFFS_FS is not set
3903 +# CONFIG_HFS_FS is not set
3904 +# CONFIG_HFSPLUS_FS is not set
3905 +# CONFIG_BEFS_FS is not set
3906 +# CONFIG_BFS_FS is not set
3907 +# CONFIG_EFS_FS is not set
3908 +CONFIG_JFFS2_FS=y
3909 +CONFIG_JFFS2_FS_DEBUG=0
3910 +CONFIG_JFFS2_FS_WRITEBUFFER=y
3911 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
3912 +# CONFIG_JFFS2_SUMMARY is not set
3913 +# CONFIG_JFFS2_FS_XATTR is not set
3914 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
3915 +CONFIG_JFFS2_ZLIB=y
3916 +# CONFIG_JFFS2_LZO is not set
3917 +CONFIG_JFFS2_RTIME=y
3918 +# CONFIG_JFFS2_RUBIN is not set
3919 +CONFIG_CRAMFS=y
3920 +# CONFIG_VXFS_FS is not set
3921 +# CONFIG_MINIX_FS is not set
3922 +# CONFIG_HPFS_FS is not set
3923 +# CONFIG_QNX4FS_FS is not set
3924 +# CONFIG_ROMFS_FS is not set
3925 +# CONFIG_SYSV_FS is not set
3926 +# CONFIG_UFS_FS is not set
3927 +CONFIG_NETWORK_FILESYSTEMS=y
3928 +CONFIG_NFS_FS=y
3929 +CONFIG_NFS_V3=y
3930 +# CONFIG_NFS_V3_ACL is not set
3931 +# CONFIG_NFS_V4 is not set
3932 +# CONFIG_NFSD is not set
3933 +CONFIG_ROOT_NFS=y
3934 +CONFIG_LOCKD=y
3935 +CONFIG_LOCKD_V4=y
3936 +CONFIG_NFS_COMMON=y
3937 +CONFIG_SUNRPC=y
3938 +# CONFIG_SUNRPC_BIND34 is not set
3939 +# CONFIG_RPCSEC_GSS_KRB5 is not set
3940 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
3941 +# CONFIG_SMB_FS is not set
3942 +# CONFIG_CIFS is not set
3943 +# CONFIG_NCP_FS is not set
3944 +# CONFIG_CODA_FS is not set
3945 +# CONFIG_AFS_FS is not set
3946 +
3947 +#
3948 +# Partition Types
3949 +#
3950 +CONFIG_PARTITION_ADVANCED=y
3951 +# CONFIG_ACORN_PARTITION is not set
3952 +# CONFIG_OSF_PARTITION is not set
3953 +# CONFIG_AMIGA_PARTITION is not set
3954 +# CONFIG_ATARI_PARTITION is not set
3955 +# CONFIG_MAC_PARTITION is not set
3956 +CONFIG_MSDOS_PARTITION=y
3957 +CONFIG_BSD_DISKLABEL=y
3958 +# CONFIG_MINIX_SUBPARTITION is not set
3959 +# CONFIG_SOLARIS_X86_PARTITION is not set
3960 +# CONFIG_UNIXWARE_DISKLABEL is not set
3961 +# CONFIG_LDM_PARTITION is not set
3962 +# CONFIG_SGI_PARTITION is not set
3963 +# CONFIG_ULTRIX_PARTITION is not set
3964 +# CONFIG_SUN_PARTITION is not set
3965 +# CONFIG_KARMA_PARTITION is not set
3966 +# CONFIG_EFI_PARTITION is not set
3967 +# CONFIG_SYSV68_PARTITION is not set
3968 +CONFIG_NLS=y
3969 +CONFIG_NLS_DEFAULT="iso8859-1"
3970 +CONFIG_NLS_CODEPAGE_437=y
3971 +# CONFIG_NLS_CODEPAGE_737 is not set
3972 +# CONFIG_NLS_CODEPAGE_775 is not set
3973 +CONFIG_NLS_CODEPAGE_850=y
3974 +# CONFIG_NLS_CODEPAGE_852 is not set
3975 +# CONFIG_NLS_CODEPAGE_855 is not set
3976 +# CONFIG_NLS_CODEPAGE_857 is not set
3977 +# CONFIG_NLS_CODEPAGE_860 is not set
3978 +# CONFIG_NLS_CODEPAGE_861 is not set
3979 +# CONFIG_NLS_CODEPAGE_862 is not set
3980 +# CONFIG_NLS_CODEPAGE_863 is not set
3981 +# CONFIG_NLS_CODEPAGE_864 is not set
3982 +# CONFIG_NLS_CODEPAGE_865 is not set
3983 +# CONFIG_NLS_CODEPAGE_866 is not set
3984 +# CONFIG_NLS_CODEPAGE_869 is not set
3985 +# CONFIG_NLS_CODEPAGE_936 is not set
3986 +# CONFIG_NLS_CODEPAGE_950 is not set
3987 +# CONFIG_NLS_CODEPAGE_932 is not set
3988 +# CONFIG_NLS_CODEPAGE_949 is not set
3989 +# CONFIG_NLS_CODEPAGE_874 is not set
3990 +# CONFIG_NLS_ISO8859_8 is not set
3991 +# CONFIG_NLS_CODEPAGE_1250 is not set
3992 +# CONFIG_NLS_CODEPAGE_1251 is not set
3993 +# CONFIG_NLS_ASCII is not set
3994 +CONFIG_NLS_ISO8859_1=y
3995 +CONFIG_NLS_ISO8859_2=y
3996 +# CONFIG_NLS_ISO8859_3 is not set
3997 +# CONFIG_NLS_ISO8859_4 is not set
3998 +# CONFIG_NLS_ISO8859_5 is not set
3999 +# CONFIG_NLS_ISO8859_6 is not set
4000 +# CONFIG_NLS_ISO8859_7 is not set
4001 +# CONFIG_NLS_ISO8859_9 is not set
4002 +# CONFIG_NLS_ISO8859_13 is not set
4003 +# CONFIG_NLS_ISO8859_14 is not set
4004 +# CONFIG_NLS_ISO8859_15 is not set
4005 +# CONFIG_NLS_KOI8_R is not set
4006 +# CONFIG_NLS_KOI8_U is not set
4007 +# CONFIG_NLS_UTF8 is not set
4008 +# CONFIG_DLM is not set
4009 +
4010 +#
4011 +# Kernel hacking
4012 +#
4013 +# CONFIG_PRINTK_TIME is not set
4014 +CONFIG_ENABLE_WARN_DEPRECATED=y
4015 +CONFIG_ENABLE_MUST_CHECK=y
4016 +CONFIG_FRAME_WARN=1024
4017 +CONFIG_MAGIC_SYSRQ=y
4018 +# CONFIG_UNUSED_SYMBOLS is not set
4019 +# CONFIG_DEBUG_FS is not set
4020 +# CONFIG_HEADERS_CHECK is not set
4021 +CONFIG_DEBUG_KERNEL=y
4022 +# CONFIG_DEBUG_SHIRQ is not set
4023 +CONFIG_DETECT_SOFTLOCKUP=y
4024 +CONFIG_SCHED_DEBUG=y
4025 +CONFIG_SCHEDSTATS=y
4026 +# CONFIG_TIMER_STATS is not set
4027 +# CONFIG_DEBUG_OBJECTS is not set
4028 +CONFIG_DEBUG_PREEMPT=y
4029 +# CONFIG_DEBUG_RT_MUTEXES is not set
4030 +# CONFIG_RT_MUTEX_TESTER is not set
4031 +# CONFIG_DEBUG_SPINLOCK is not set
4032 +# CONFIG_DEBUG_MUTEXES is not set
4033 +# CONFIG_DEBUG_LOCK_ALLOC is not set
4034 +# CONFIG_PROVE_LOCKING is not set
4035 +# CONFIG_LOCK_STAT is not set
4036 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
4037 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
4038 +# CONFIG_DEBUG_KOBJECT is not set
4039 +# CONFIG_DEBUG_BUGVERBOSE is not set
4040 +CONFIG_DEBUG_INFO=y
4041 +# CONFIG_DEBUG_VM is not set
4042 +# CONFIG_DEBUG_WRITECOUNT is not set
4043 +# CONFIG_DEBUG_LIST is not set
4044 +# CONFIG_DEBUG_SG is not set
4045 +CONFIG_FRAME_POINTER=y
4046 +# CONFIG_BOOT_PRINTK_DELAY is not set
4047 +# CONFIG_RCU_TORTURE_TEST is not set
4048 +# CONFIG_KPROBES_SANITY_TEST is not set
4049 +# CONFIG_BACKTRACE_SELF_TEST is not set
4050 +# CONFIG_LKDTM is not set
4051 +# CONFIG_FAULT_INJECTION is not set
4052 +# CONFIG_LATENCYTOP is not set
4053 +# CONFIG_SAMPLES is not set
4054 +CONFIG_DEBUG_USER=y
4055 +CONFIG_DEBUG_ERRORS=y
4056 +# CONFIG_DEBUG_STACK_USAGE is not set
4057 +CONFIG_DEBUG_LL=y
4058 +# CONFIG_DEBUG_ICEDCC is not set
4059 +
4060 +#
4061 +# Security options
4062 +#
4063 +# CONFIG_KEYS is not set
4064 +# CONFIG_SECURITY is not set
4065 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
4066 +CONFIG_CRYPTO=y
4067 +
4068 +#
4069 +# Crypto core or helper
4070 +#
4071 +CONFIG_CRYPTO_ALGAPI=m
4072 +CONFIG_CRYPTO_BLKCIPHER=m
4073 +CONFIG_CRYPTO_MANAGER=m
4074 +# CONFIG_CRYPTO_GF128MUL is not set
4075 +# CONFIG_CRYPTO_NULL is not set
4076 +# CONFIG_CRYPTO_CRYPTD is not set
4077 +# CONFIG_CRYPTO_AUTHENC is not set
4078 +# CONFIG_CRYPTO_TEST is not set
4079 +
4080 +#
4081 +# Authenticated Encryption with Associated Data
4082 +#
4083 +# CONFIG_CRYPTO_CCM is not set
4084 +# CONFIG_CRYPTO_GCM is not set
4085 +# CONFIG_CRYPTO_SEQIV is not set
4086 +
4087 +#
4088 +# Block modes
4089 +#
4090 +CONFIG_CRYPTO_CBC=m
4091 +# CONFIG_CRYPTO_CTR is not set
4092 +# CONFIG_CRYPTO_CTS is not set
4093 +CONFIG_CRYPTO_ECB=m
4094 +# CONFIG_CRYPTO_LRW is not set
4095 +CONFIG_CRYPTO_PCBC=m
4096 +# CONFIG_CRYPTO_XTS is not set
4097 +
4098 +#
4099 +# Hash modes
4100 +#
4101 +# CONFIG_CRYPTO_HMAC is not set
4102 +# CONFIG_CRYPTO_XCBC is not set
4103 +
4104 +#
4105 +# Digest
4106 +#
4107 +# CONFIG_CRYPTO_CRC32C is not set
4108 +# CONFIG_CRYPTO_MD4 is not set
4109 +# CONFIG_CRYPTO_MD5 is not set
4110 +# CONFIG_CRYPTO_MICHAEL_MIC is not set
4111 +# CONFIG_CRYPTO_SHA1 is not set
4112 +# CONFIG_CRYPTO_SHA256 is not set
4113 +# CONFIG_CRYPTO_SHA512 is not set
4114 +# CONFIG_CRYPTO_TGR192 is not set
4115 +# CONFIG_CRYPTO_WP512 is not set
4116 +
4117 +#
4118 +# Ciphers
4119 +#
4120 +# CONFIG_CRYPTO_AES is not set
4121 +# CONFIG_CRYPTO_ANUBIS is not set
4122 +# CONFIG_CRYPTO_ARC4 is not set
4123 +# CONFIG_CRYPTO_BLOWFISH is not set
4124 +# CONFIG_CRYPTO_CAMELLIA is not set
4125 +# CONFIG_CRYPTO_CAST5 is not set
4126 +# CONFIG_CRYPTO_CAST6 is not set
4127 +# CONFIG_CRYPTO_DES is not set
4128 +# CONFIG_CRYPTO_FCRYPT is not set
4129 +# CONFIG_CRYPTO_KHAZAD is not set
4130 +# CONFIG_CRYPTO_SALSA20 is not set
4131 +# CONFIG_CRYPTO_SEED is not set
4132 +# CONFIG_CRYPTO_SERPENT is not set
4133 +# CONFIG_CRYPTO_TEA is not set
4134 +# CONFIG_CRYPTO_TWOFISH is not set
4135 +
4136 +#
4137 +# Compression
4138 +#
4139 +# CONFIG_CRYPTO_DEFLATE is not set
4140 +# CONFIG_CRYPTO_LZO is not set
4141 +CONFIG_CRYPTO_HW=y
4142 +# CONFIG_CRYPTO_DEV_HIFN_795X is not set
4143 +
4144 +#
4145 +# Library routines
4146 +#
4147 +CONFIG_BITREVERSE=y
4148 +# CONFIG_GENERIC_FIND_FIRST_BIT is not set
4149 +# CONFIG_GENERIC_FIND_NEXT_BIT is not set
4150 +# CONFIG_CRC_CCITT is not set
4151 +# CONFIG_CRC16 is not set
4152 +CONFIG_CRC_ITU_T=m
4153 +CONFIG_CRC32=y
4154 +# CONFIG_CRC7 is not set
4155 +# CONFIG_LIBCRC32C is not set
4156 +CONFIG_ZLIB_INFLATE=y
4157 +CONFIG_ZLIB_DEFLATE=y
4158 +CONFIG_PLIST=y
4159 +CONFIG_HAS_IOMEM=y
4160 +CONFIG_HAS_IOPORT=y
4161 +CONFIG_HAS_DMA=y
4162 --- a/arch/arm/configs/orion5x_defconfig
4163 +++ b/arch/arm/configs/orion5x_defconfig
4164 @@ -1,7 +1,7 @@
4165 #
4166 # Automatically generated make config: don't edit
4167 -# Linux kernel version: 2.6.24
4168 -# Thu Feb 7 14:10:30 2008
4169 +# Linux kernel version: 2.6.26-rc4
4170 +# Mon Jun 2 23:54:48 2008
4171 #
4172 CONFIG_ARM=y
4173 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
4174 @@ -21,6 +21,7 @@
4175 # CONFIG_ARCH_HAS_ILOG2_U64 is not set
4176 CONFIG_GENERIC_HWEIGHT=y
4177 CONFIG_GENERIC_CALIBRATE_DELAY=y
4178 +CONFIG_ARCH_SUPPORTS_AOUT=y
4179 CONFIG_ZONE_DMA=y
4180 CONFIG_VECTORS_BASE=0xffff0000
4181 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
4182 @@ -40,24 +41,24 @@
4183 # CONFIG_POSIX_MQUEUE is not set
4184 # CONFIG_BSD_PROCESS_ACCT is not set
4185 # CONFIG_TASKSTATS is not set
4186 -# CONFIG_USER_NS is not set
4187 -# CONFIG_PID_NS is not set
4188 # CONFIG_AUDIT is not set
4189 # CONFIG_IKCONFIG is not set
4190 CONFIG_LOG_BUF_SHIFT=14
4191 # CONFIG_CGROUPS is not set
4192 -CONFIG_FAIR_GROUP_SCHED=y
4193 -CONFIG_FAIR_USER_SCHED=y
4194 -# CONFIG_FAIR_CGROUP_SCHED is not set
4195 +# CONFIG_GROUP_SCHED is not set
4196 CONFIG_SYSFS_DEPRECATED=y
4197 +CONFIG_SYSFS_DEPRECATED_V2=y
4198 # CONFIG_RELAY is not set
4199 +# CONFIG_NAMESPACES is not set
4200 # CONFIG_BLK_DEV_INITRD is not set
4201 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
4202 CONFIG_SYSCTL=y
4203 CONFIG_EMBEDDED=y
4204 CONFIG_UID16=y
4205 CONFIG_SYSCTL_SYSCALL=y
4206 +CONFIG_SYSCTL_SYSCALL_CHECK=y
4207 CONFIG_KALLSYMS=y
4208 +CONFIG_KALLSYMS_ALL=y
4209 # CONFIG_KALLSYMS_EXTRA_PASS is not set
4210 CONFIG_HOTPLUG=y
4211 CONFIG_PRINTK=y
4212 @@ -73,20 +74,25 @@
4213 CONFIG_EVENTFD=y
4214 CONFIG_SHMEM=y
4215 CONFIG_VM_EVENT_COUNTERS=y
4216 -CONFIG_SLAB=y
4217 -# CONFIG_SLUB is not set
4218 +# CONFIG_SLUB_DEBUG is not set
4219 +# CONFIG_SLAB is not set
4220 +CONFIG_SLUB=y
4221 # CONFIG_SLOB is not set
4222 -# CONFIG_PROFILING is not set
4223 +CONFIG_PROFILING=y
4224 # CONFIG_MARKERS is not set
4225 +CONFIG_OPROFILE=y
4226 CONFIG_HAVE_OPROFILE=y
4227 -# CONFIG_KPROBES is not set
4228 +CONFIG_KPROBES=y
4229 +CONFIG_KRETPROBES=y
4230 CONFIG_HAVE_KPROBES=y
4231 +CONFIG_HAVE_KRETPROBES=y
4232 +# CONFIG_HAVE_DMA_ATTRS is not set
4233 CONFIG_PROC_PAGE_MONITOR=y
4234 -CONFIG_SLABINFO=y
4235 CONFIG_RT_MUTEXES=y
4236 # CONFIG_TINY_SHMEM is not set
4237 CONFIG_BASE_SMALL=0
4238 CONFIG_MODULES=y
4239 +# CONFIG_MODULE_FORCE_LOAD is not set
4240 CONFIG_MODULE_UNLOAD=y
4241 # CONFIG_MODULE_FORCE_UNLOAD is not set
4242 # CONFIG_MODVERSIONS is not set
4243 @@ -111,7 +117,6 @@
4244 # CONFIG_DEFAULT_NOOP is not set
4245 CONFIG_DEFAULT_IOSCHED="cfq"
4246 CONFIG_CLASSIC_RCU=y
4247 -# CONFIG_PREEMPT_RCU is not set
4248
4249 #
4250 # System Type
4251 @@ -160,6 +165,7 @@
4252 CONFIG_MACH_KUROBOX_PRO=y
4253 CONFIG_MACH_DNS323=y
4254 CONFIG_MACH_TS209=y
4255 +CONFIG_MACH_LINKSTATION_PRO=y
4256
4257 #
4258 # Boot options
4259 @@ -168,6 +174,7 @@
4260 #
4261 # Power management
4262 #
4263 +CONFIG_PLAT_ORION=y
4264
4265 #
4266 # Processor Type
4267 @@ -177,8 +184,9 @@
4268 CONFIG_CPU_FEROCEON_OLD_ID=y
4269 CONFIG_CPU_32v5=y
4270 CONFIG_CPU_ABRT_EV5T=y
4271 +CONFIG_CPU_PABRT_NOIFAR=y
4272 CONFIG_CPU_CACHE_VIVT=y
4273 -CONFIG_CPU_COPY_V4WB=y
4274 +CONFIG_CPU_COPY_FEROCEON=y
4275 CONFIG_CPU_TLB_V4WBI=y
4276 CONFIG_CPU_CP15=y
4277 CONFIG_CPU_CP15_MMU=y
4278 @@ -189,7 +197,6 @@
4279 CONFIG_ARM_THUMB=y
4280 # CONFIG_CPU_ICACHE_DISABLE is not set
4281 # CONFIG_CPU_DCACHE_DISABLE is not set
4282 -# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
4283 # CONFIG_OUTER_CACHE is not set
4284
4285 #
4286 @@ -199,6 +206,7 @@
4287 CONFIG_PCI_SYSCALL=y
4288 # CONFIG_ARCH_SUPPORTS_MSI is not set
4289 CONFIG_PCI_LEGACY=y
4290 +# CONFIG_PCI_DEBUG is not set
4291 # CONFIG_PCCARD is not set
4292
4293 #
4294 @@ -221,6 +229,7 @@
4295 CONFIG_FLAT_NODE_MEM_MAP=y
4296 # CONFIG_SPARSEMEM_STATIC is not set
4297 # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
4298 +CONFIG_PAGEFLAGS_EXTENDED=y
4299 CONFIG_SPLIT_PTLOCK_CPUS=4096
4300 # CONFIG_RESOURCES_64BIT is not set
4301 CONFIG_ZONE_DMA_FLAG=1
4302 @@ -238,7 +247,6 @@
4303 CONFIG_CMDLINE=""
4304 # CONFIG_XIP_KERNEL is not set
4305 # CONFIG_KEXEC is not set
4306 -# CONFIG_ATAGS_PROC is not set
4307
4308 #
4309 # Floating point emulation
4310 @@ -311,8 +319,6 @@
4311 CONFIG_DEFAULT_TCP_CONG="cubic"
4312 # CONFIG_TCP_MD5SIG is not set
4313 # CONFIG_IPV6 is not set
4314 -# CONFIG_INET6_XFRM_TUNNEL is not set
4315 -# CONFIG_INET6_TUNNEL is not set
4316 # CONFIG_NETWORK_SECMARK is not set
4317 # CONFIG_NETFILTER is not set
4318 # CONFIG_IP_DCCP is not set
4319 @@ -335,6 +341,7 @@
4320 # Network testing
4321 #
4322 CONFIG_NET_PKTGEN=m
4323 +# CONFIG_NET_TCPPROBE is not set
4324 # CONFIG_HAMRADIO is not set
4325 # CONFIG_CAN is not set
4326 # CONFIG_IRDA is not set
4327 @@ -362,6 +369,8 @@
4328 CONFIG_STANDALONE=y
4329 CONFIG_PREVENT_FIRMWARE_BUILD=y
4330 CONFIG_FW_LOADER=y
4331 +# CONFIG_DEBUG_DRIVER is not set
4332 +# CONFIG_DEBUG_DEVRES is not set
4333 # CONFIG_SYS_HYPERVISOR is not set
4334 # CONFIG_CONNECTOR is not set
4335 CONFIG_MTD=y
4336 @@ -371,6 +380,7 @@
4337 # CONFIG_MTD_REDBOOT_PARTS is not set
4338 CONFIG_MTD_CMDLINE_PARTS=y
4339 # CONFIG_MTD_AFS_PARTS is not set
4340 +# CONFIG_MTD_AR7_PARTS is not set
4341
4342 #
4343 # User Modules And Translation Layers
4344 @@ -378,9 +388,8 @@
4345 CONFIG_MTD_CHAR=y
4346 CONFIG_MTD_BLKDEVS=y
4347 CONFIG_MTD_BLOCK=y
4348 -CONFIG_FTL=y
4349 -CONFIG_NFTL=y
4350 -# CONFIG_NFTL_RW is not set
4351 +# CONFIG_FTL is not set
4352 +# CONFIG_NFTL is not set
4353 # CONFIG_INFTL is not set
4354 # CONFIG_RFD_FTL is not set
4355 # CONFIG_SSFDC is not set
4356 @@ -405,12 +414,12 @@
4357 # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
4358 CONFIG_MTD_CFI_I1=y
4359 CONFIG_MTD_CFI_I2=y
4360 -CONFIG_MTD_CFI_I4=y
4361 +# CONFIG_MTD_CFI_I4 is not set
4362 # CONFIG_MTD_CFI_I8 is not set
4363 # CONFIG_MTD_OTP is not set
4364 CONFIG_MTD_CFI_INTELEXT=y
4365 CONFIG_MTD_CFI_AMDSTD=y
4366 -CONFIG_MTD_CFI_STAA=y
4367 +# CONFIG_MTD_CFI_STAA is not set
4368 CONFIG_MTD_CFI_UTIL=y
4369 # CONFIG_MTD_RAM is not set
4370 # CONFIG_MTD_ROM is not set
4371 @@ -481,6 +490,9 @@
4372 # CONFIG_EEPROM_93CX6 is not set
4373 # CONFIG_SGI_IOC4 is not set
4374 # CONFIG_TIFM_CORE is not set
4375 +# CONFIG_ENCLOSURE_SERVICES is not set
4376 +CONFIG_HAVE_IDE=y
4377 +# CONFIG_IDE is not set
4378
4379 #
4380 # SCSI device support
4381 @@ -542,6 +554,7 @@
4382 # CONFIG_SCSI_IPS is not set
4383 # CONFIG_SCSI_INITIO is not set
4384 # CONFIG_SCSI_INIA100 is not set
4385 +# CONFIG_SCSI_MVSAS is not set
4386 # CONFIG_SCSI_STEX is not set
4387 # CONFIG_SCSI_SYM53C8XX_2 is not set
4388 # CONFIG_SCSI_IPR is not set
4389 @@ -556,7 +569,10 @@
4390 # CONFIG_SCSI_SRP is not set
4391 CONFIG_ATA=y
4392 # CONFIG_ATA_NONSTANDARD is not set
4393 +CONFIG_SATA_PMP=y
4394 # CONFIG_SATA_AHCI is not set
4395 +# CONFIG_SATA_SIL24 is not set
4396 +CONFIG_ATA_SFF=y
4397 # CONFIG_SATA_SVW is not set
4398 # CONFIG_ATA_PIIX is not set
4399 CONFIG_SATA_MV=y
4400 @@ -566,7 +582,6 @@
4401 # CONFIG_SATA_PROMISE is not set
4402 # CONFIG_SATA_SX4 is not set
4403 # CONFIG_SATA_SIL is not set
4404 -# CONFIG_SATA_SIL24 is not set
4405 # CONFIG_SATA_SIS is not set
4406 # CONFIG_SATA_ULI is not set
4407 # CONFIG_SATA_VIA is not set
4408 @@ -611,6 +626,7 @@
4409 # CONFIG_PATA_VIA is not set
4410 # CONFIG_PATA_WINBOND is not set
4411 # CONFIG_PATA_PLATFORM is not set
4412 +# CONFIG_PATA_SCH is not set
4413 # CONFIG_MD is not set
4414 # CONFIG_FUSION is not set
4415
4416 @@ -652,7 +668,7 @@
4417 # CONFIG_B44 is not set
4418 # CONFIG_FORCEDETH is not set
4419 # CONFIG_EEPRO100 is not set
4420 -CONFIG_E100=y
4421 +# CONFIG_E100 is not set
4422 # CONFIG_FEALNX is not set
4423 # CONFIG_NATSEMI is not set
4424 # CONFIG_NE2K_PCI is not set
4425 @@ -668,9 +684,7 @@
4426 CONFIG_NETDEV_1000=y
4427 # CONFIG_ACENIC is not set
4428 # CONFIG_DL2K is not set
4429 -CONFIG_E1000=y
4430 -CONFIG_E1000_NAPI=y
4431 -# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
4432 +# CONFIG_E1000 is not set
4433 # CONFIG_E1000E is not set
4434 # CONFIG_E1000E_ENABLED is not set
4435 # CONFIG_IP1000 is not set
4436 @@ -680,27 +694,15 @@
4437 # CONFIG_YELLOWFIN is not set
4438 # CONFIG_R8169 is not set
4439 # CONFIG_SIS190 is not set
4440 -CONFIG_SKGE=y
4441 -CONFIG_SKY2=y
4442 -# CONFIG_SK98LIN is not set
4443 +# CONFIG_SKGE is not set
4444 +# CONFIG_SKY2 is not set
4445 # CONFIG_VIA_VELOCITY is not set
4446 -CONFIG_TIGON3=y
4447 +# CONFIG_TIGON3 is not set
4448 # CONFIG_BNX2 is not set
4449 CONFIG_MV643XX_ETH=y
4450 # CONFIG_QLA3XXX is not set
4451 # CONFIG_ATL1 is not set
4452 -CONFIG_NETDEV_10000=y
4453 -# CONFIG_CHELSIO_T1 is not set
4454 -# CONFIG_CHELSIO_T3 is not set
4455 -# CONFIG_IXGBE is not set
4456 -# CONFIG_IXGB is not set
4457 -# CONFIG_S2IO is not set
4458 -# CONFIG_MYRI10GE is not set
4459 -# CONFIG_NETXEN_NIC is not set
4460 -# CONFIG_NIU is not set
4461 -# CONFIG_MLX4_CORE is not set
4462 -# CONFIG_TEHUTI is not set
4463 -# CONFIG_BNX2X is not set
4464 +# CONFIG_NETDEV_10000 is not set
4465 # CONFIG_TR is not set
4466
4467 #
4468 @@ -708,6 +710,7 @@
4469 #
4470 # CONFIG_WLAN_PRE80211 is not set
4471 # CONFIG_WLAN_80211 is not set
4472 +# CONFIG_IWLWIFI_LEDS is not set
4473
4474 #
4475 # USB Network Adapters
4476 @@ -738,12 +741,9 @@
4477 #
4478 # Userland interfaces
4479 #
4480 -CONFIG_INPUT_MOUSEDEV=y
4481 -CONFIG_INPUT_MOUSEDEV_PSAUX=y
4482 -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
4483 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
4484 +# CONFIG_INPUT_MOUSEDEV is not set
4485 # CONFIG_INPUT_JOYDEV is not set
4486 -# CONFIG_INPUT_EVDEV is not set
4487 +CONFIG_INPUT_EVDEV=y
4488 # CONFIG_INPUT_EVBUG is not set
4489
4490 #
4491 @@ -765,10 +765,8 @@
4492 #
4493 # Character devices
4494 #
4495 -CONFIG_VT=y
4496 -CONFIG_VT_CONSOLE=y
4497 -CONFIG_HW_CONSOLE=y
4498 -# CONFIG_VT_HW_CONSOLE_BINDING is not set
4499 +# CONFIG_VT is not set
4500 +CONFIG_DEVKMEM=y
4501 # CONFIG_SERIAL_NONSTANDARD is not set
4502 # CONFIG_NOZOMI is not set
4503
4504 @@ -777,7 +775,7 @@
4505 #
4506 CONFIG_SERIAL_8250=y
4507 CONFIG_SERIAL_8250_CONSOLE=y
4508 -CONFIG_SERIAL_8250_PCI=y
4509 +# CONFIG_SERIAL_8250_PCI is not set
4510 CONFIG_SERIAL_8250_NR_UARTS=4
4511 CONFIG_SERIAL_8250_RUNTIME_UARTS=2
4512 # CONFIG_SERIAL_8250_EXTENDED is not set
4513 @@ -792,7 +790,7 @@
4514 CONFIG_LEGACY_PTYS=y
4515 CONFIG_LEGACY_PTY_COUNT=16
4516 # CONFIG_IPMI_HANDLER is not set
4517 -CONFIG_HW_RANDOM=m
4518 +# CONFIG_HW_RANDOM is not set
4519 # CONFIG_NVRAM is not set
4520 # CONFIG_R3964 is not set
4521 # CONFIG_APPLICOM is not set
4522 @@ -804,13 +802,6 @@
4523 CONFIG_I2C_CHARDEV=y
4524
4525 #
4526 -# I2C Algorithms
4527 -#
4528 -# CONFIG_I2C_ALGOBIT is not set
4529 -# CONFIG_I2C_ALGOPCF is not set
4530 -# CONFIG_I2C_ALGOPCA is not set
4531 -
4532 -#
4533 # I2C Hardware Bus support
4534 #
4535 # CONFIG_I2C_ALI1535 is not set
4536 @@ -837,6 +828,7 @@
4537 # CONFIG_I2C_VIA is not set
4538 # CONFIG_I2C_VIAPRO is not set
4539 # CONFIG_I2C_VOODOO3 is not set
4540 +# CONFIG_I2C_PCA_PLATFORM is not set
4541 CONFIG_I2C_MV64XXX=y
4542
4543 #
4544 @@ -847,19 +839,13 @@
4545 # CONFIG_SENSORS_PCF8574 is not set
4546 # CONFIG_PCF8575 is not set
4547 # CONFIG_SENSORS_PCF8591 is not set
4548 -# CONFIG_TPS65010 is not set
4549 # CONFIG_SENSORS_MAX6875 is not set
4550 # CONFIG_SENSORS_TSL2550 is not set
4551 # CONFIG_I2C_DEBUG_CORE is not set
4552 # CONFIG_I2C_DEBUG_ALGO is not set
4553 # CONFIG_I2C_DEBUG_BUS is not set
4554 # CONFIG_I2C_DEBUG_CHIP is not set
4555 -
4556 -#
4557 -# SPI support
4558 -#
4559 # CONFIG_SPI is not set
4560 -# CONFIG_SPI_MASTER is not set
4561 # CONFIG_W1 is not set
4562 # CONFIG_POWER_SUPPLY is not set
4563 CONFIG_HWMON=y
4564 @@ -872,6 +858,7 @@
4565 # CONFIG_SENSORS_ADM1031 is not set
4566 # CONFIG_SENSORS_ADM9240 is not set
4567 # CONFIG_SENSORS_ADT7470 is not set
4568 +# CONFIG_SENSORS_ADT7473 is not set
4569 # CONFIG_SENSORS_ATXP1 is not set
4570 # CONFIG_SENSORS_DS1621 is not set
4571 # CONFIG_SENSORS_I5K_AMB is not set
4572 @@ -901,6 +888,7 @@
4573 # CONFIG_SENSORS_SMSC47M1 is not set
4574 # CONFIG_SENSORS_SMSC47M192 is not set
4575 # CONFIG_SENSORS_SMSC47B397 is not set
4576 +# CONFIG_SENSORS_ADS7828 is not set
4577 # CONFIG_SENSORS_THMC50 is not set
4578 # CONFIG_SENSORS_VIA686A is not set
4579 # CONFIG_SENSORS_VT1211 is not set
4580 @@ -910,6 +898,7 @@
4581 # CONFIG_SENSORS_W83792D is not set
4582 # CONFIG_SENSORS_W83793 is not set
4583 # CONFIG_SENSORS_W83L785TS is not set
4584 +# CONFIG_SENSORS_W83L786NG is not set
4585 # CONFIG_SENSORS_W83627HF is not set
4586 # CONFIG_SENSORS_W83627EHF is not set
4587 # CONFIG_HWMON_DEBUG_CHIP is not set
4588 @@ -925,14 +914,24 @@
4589 # Multifunction device drivers
4590 #
4591 # CONFIG_MFD_SM501 is not set
4592 +# CONFIG_MFD_ASIC3 is not set
4593 +# CONFIG_HTC_PASIC3 is not set
4594
4595 #
4596 # Multimedia devices
4597 #
4598 +
4599 +#
4600 +# Multimedia core support
4601 +#
4602 # CONFIG_VIDEO_DEV is not set
4603 # CONFIG_DVB_CORE is not set
4604 -CONFIG_DAB=y
4605 -# CONFIG_USB_DABUSB is not set
4606 +# CONFIG_VIDEO_MEDIA is not set
4607 +
4608 +#
4609 +# Multimedia drivers
4610 +#
4611 +# CONFIG_DAB is not set
4612
4613 #
4614 # Graphics support
4615 @@ -949,12 +948,6 @@
4616 # CONFIG_DISPLAY_SUPPORT is not set
4617
4618 #
4619 -# Console display driver support
4620 -#
4621 -# CONFIG_VGA_CONSOLE is not set
4622 -CONFIG_DUMMY_CONSOLE=y
4623 -
4624 -#
4625 # Sound
4626 #
4627 # CONFIG_SOUND is not set
4628 @@ -985,14 +978,18 @@
4629 CONFIG_USB_DEVICE_CLASS=y
4630 # CONFIG_USB_DYNAMIC_MINORS is not set
4631 # CONFIG_USB_OTG is not set
4632 +# CONFIG_USB_OTG_WHITELIST is not set
4633 +# CONFIG_USB_OTG_BLACKLIST_HUB is not set
4634
4635 #
4636 # USB Host Controller Drivers
4637 #
4638 +# CONFIG_USB_C67X00_HCD is not set
4639 CONFIG_USB_EHCI_HCD=y
4640 CONFIG_USB_EHCI_ROOT_HUB_TT=y
4641 CONFIG_USB_EHCI_TT_NEWSCHED=y
4642 # CONFIG_USB_ISP116X_HCD is not set
4643 +# CONFIG_USB_ISP1760_HCD is not set
4644 # CONFIG_USB_OHCI_HCD is not set
4645 # CONFIG_USB_UHCI_HCD is not set
4646 # CONFIG_USB_SL811_HCD is not set
4647 @@ -1003,6 +1000,7 @@
4648 #
4649 # CONFIG_USB_ACM is not set
4650 CONFIG_USB_PRINTER=y
4651 +# CONFIG_USB_WDM is not set
4652
4653 #
4654 # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
4655 @@ -1022,7 +1020,9 @@
4656 CONFIG_USB_STORAGE_SDDR55=y
4657 CONFIG_USB_STORAGE_JUMPSHOT=y
4658 # CONFIG_USB_STORAGE_ALAUDA is not set
4659 +# CONFIG_USB_STORAGE_ONETOUCH is not set
4660 # CONFIG_USB_STORAGE_KARMA is not set
4661 +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
4662 # CONFIG_USB_LIBUSUAL is not set
4663
4664 #
4665 @@ -1060,6 +1060,7 @@
4666 # CONFIG_USB_TRANCEVIBRATOR is not set
4667 # CONFIG_USB_IOWARRIOR is not set
4668 # CONFIG_USB_TEST is not set
4669 +# CONFIG_USB_ISIGHTFW is not set
4670 # CONFIG_USB_GADGET is not set
4671 # CONFIG_MMC is not set
4672 CONFIG_NEW_LEDS=y
4673 @@ -1076,6 +1077,7 @@
4674 CONFIG_LEDS_TRIGGERS=y
4675 CONFIG_LEDS_TRIGGER_TIMER=y
4676 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
4677 +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
4678 CONFIG_RTC_LIB=y
4679 CONFIG_RTC_CLASS=y
4680 CONFIG_RTC_HCTOSYS=y
4681 @@ -1105,6 +1107,7 @@
4682 # CONFIG_RTC_DRV_PCF8583 is not set
4683 CONFIG_RTC_DRV_M41T80=y
4684 # CONFIG_RTC_DRV_M41T80_WDT is not set
4685 +# CONFIG_RTC_DRV_S35390A is not set
4686
4687 #
4688 # SPI RTC drivers
4689 @@ -1125,6 +1128,7 @@
4690 #
4691 # on-CPU RTC drivers
4692 #
4693 +# CONFIG_UIO is not set
4694
4695 #
4696 # File systems
4697 @@ -1140,14 +1144,11 @@
4698 # CONFIG_JFS_FS is not set
4699 # CONFIG_FS_POSIX_ACL is not set
4700 # CONFIG_XFS_FS is not set
4701 -# CONFIG_GFS2_FS is not set
4702 # CONFIG_OCFS2_FS is not set
4703 -# CONFIG_MINIX_FS is not set
4704 -# CONFIG_ROMFS_FS is not set
4705 +CONFIG_DNOTIFY=y
4706 CONFIG_INOTIFY=y
4707 CONFIG_INOTIFY_USER=y
4708 # CONFIG_QUOTA is not set
4709 -CONFIG_DNOTIFY=y
4710 # CONFIG_AUTOFS_FS is not set
4711 # CONFIG_AUTOFS4_FS is not set
4712 # CONFIG_FUSE_FS is not set
4713 @@ -1155,8 +1156,8 @@
4714 #
4715 # CD-ROM/DVD Filesystems
4716 #
4717 -CONFIG_ISO9660_FS=y
4718 -# CONFIG_JOLIET is not set
4719 +CONFIG_ISO9660_FS=m
4720 +CONFIG_JOLIET=y
4721 # CONFIG_ZISOFS is not set
4722 CONFIG_UDF_FS=m
4723 CONFIG_UDF_NLS=y
4724 @@ -1205,8 +1206,10 @@
4725 # CONFIG_JFFS2_RUBIN is not set
4726 CONFIG_CRAMFS=y
4727 # CONFIG_VXFS_FS is not set
4728 +# CONFIG_MINIX_FS is not set
4729 # CONFIG_HPFS_FS is not set
4730 # CONFIG_QNX4FS_FS is not set
4731 +# CONFIG_ROMFS_FS is not set
4732 # CONFIG_SYSV_FS is not set
4733 # CONFIG_UFS_FS is not set
4734 CONFIG_NETWORK_FILESYSTEMS=y
4735 @@ -1214,7 +1217,6 @@
4736 CONFIG_NFS_V3=y
4737 # CONFIG_NFS_V3_ACL is not set
4738 # CONFIG_NFS_V4 is not set
4739 -# CONFIG_NFS_DIRECTIO is not set
4740 # CONFIG_NFSD is not set
4741 CONFIG_ROOT_NFS=y
4742 CONFIG_LOCKD=y
4743 @@ -1241,14 +1243,13 @@
4744 # CONFIG_MAC_PARTITION is not set
4745 CONFIG_MSDOS_PARTITION=y
4746 CONFIG_BSD_DISKLABEL=y
4747 -CONFIG_MINIX_SUBPARTITION=y
4748 -CONFIG_SOLARIS_X86_PARTITION=y
4749 -CONFIG_UNIXWARE_DISKLABEL=y
4750 -CONFIG_LDM_PARTITION=y
4751 -CONFIG_LDM_DEBUG=y
4752 +# CONFIG_MINIX_SUBPARTITION is not set
4753 +# CONFIG_SOLARIS_X86_PARTITION is not set
4754 +# CONFIG_UNIXWARE_DISKLABEL is not set
4755 +# CONFIG_LDM_PARTITION is not set
4756 # CONFIG_SGI_PARTITION is not set
4757 # CONFIG_ULTRIX_PARTITION is not set
4758 -CONFIG_SUN_PARTITION=y
4759 +# CONFIG_SUN_PARTITION is not set
4760 # CONFIG_KARMA_PARTITION is not set
4761 # CONFIG_EFI_PARTITION is not set
4762 # CONFIG_SYSV68_PARTITION is not set
4763 @@ -1300,15 +1301,48 @@
4764 # CONFIG_PRINTK_TIME is not set
4765 CONFIG_ENABLE_WARN_DEPRECATED=y
4766 CONFIG_ENABLE_MUST_CHECK=y
4767 -# CONFIG_MAGIC_SYSRQ is not set
4768 +CONFIG_FRAME_WARN=1024
4769 +CONFIG_MAGIC_SYSRQ=y
4770 # CONFIG_UNUSED_SYMBOLS is not set
4771 # CONFIG_DEBUG_FS is not set
4772 # CONFIG_HEADERS_CHECK is not set
4773 -# CONFIG_DEBUG_KERNEL is not set
4774 +CONFIG_DEBUG_KERNEL=y
4775 +# CONFIG_DEBUG_SHIRQ is not set
4776 +CONFIG_DETECT_SOFTLOCKUP=y
4777 +CONFIG_SCHED_DEBUG=y
4778 +CONFIG_SCHEDSTATS=y
4779 +# CONFIG_TIMER_STATS is not set
4780 +# CONFIG_DEBUG_OBJECTS is not set
4781 +CONFIG_DEBUG_PREEMPT=y
4782 +# CONFIG_DEBUG_RT_MUTEXES is not set
4783 +# CONFIG_RT_MUTEX_TESTER is not set
4784 +# CONFIG_DEBUG_SPINLOCK is not set
4785 +# CONFIG_DEBUG_MUTEXES is not set
4786 +# CONFIG_DEBUG_LOCK_ALLOC is not set
4787 +# CONFIG_PROVE_LOCKING is not set
4788 +# CONFIG_LOCK_STAT is not set
4789 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
4790 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
4791 +# CONFIG_DEBUG_KOBJECT is not set
4792 # CONFIG_DEBUG_BUGVERBOSE is not set
4793 +CONFIG_DEBUG_INFO=y
4794 +# CONFIG_DEBUG_VM is not set
4795 +# CONFIG_DEBUG_WRITECOUNT is not set
4796 +# CONFIG_DEBUG_LIST is not set
4797 +# CONFIG_DEBUG_SG is not set
4798 CONFIG_FRAME_POINTER=y
4799 +# CONFIG_BOOT_PRINTK_DELAY is not set
4800 +# CONFIG_RCU_TORTURE_TEST is not set
4801 +# CONFIG_KPROBES_SANITY_TEST is not set
4802 +# CONFIG_BACKTRACE_SELF_TEST is not set
4803 +# CONFIG_LKDTM is not set
4804 +# CONFIG_FAULT_INJECTION is not set
4805 # CONFIG_SAMPLES is not set
4806 CONFIG_DEBUG_USER=y
4807 +CONFIG_DEBUG_ERRORS=y
4808 +# CONFIG_DEBUG_STACK_USAGE is not set
4809 +CONFIG_DEBUG_LL=y
4810 +# CONFIG_DEBUG_ICEDCC is not set
4811
4812 #
4813 # Security options
4814 @@ -1317,50 +1351,79 @@
4815 # CONFIG_SECURITY is not set
4816 # CONFIG_SECURITY_FILE_CAPABILITIES is not set
4817 CONFIG_CRYPTO=y
4818 +
4819 +#
4820 +# Crypto core or helper
4821 +#
4822 CONFIG_CRYPTO_ALGAPI=m
4823 CONFIG_CRYPTO_BLKCIPHER=m
4824 -# CONFIG_CRYPTO_SEQIV is not set
4825 CONFIG_CRYPTO_MANAGER=m
4826 +# CONFIG_CRYPTO_GF128MUL is not set
4827 +# CONFIG_CRYPTO_NULL is not set
4828 +# CONFIG_CRYPTO_CRYPTD is not set
4829 +# CONFIG_CRYPTO_AUTHENC is not set
4830 +# CONFIG_CRYPTO_TEST is not set
4831 +
4832 +#
4833 +# Authenticated Encryption with Associated Data
4834 +#
4835 +# CONFIG_CRYPTO_CCM is not set
4836 +# CONFIG_CRYPTO_GCM is not set
4837 +# CONFIG_CRYPTO_SEQIV is not set
4838 +
4839 +#
4840 +# Block modes
4841 +#
4842 +CONFIG_CRYPTO_CBC=m
4843 +# CONFIG_CRYPTO_CTR is not set
4844 +# CONFIG_CRYPTO_CTS is not set
4845 +CONFIG_CRYPTO_ECB=m
4846 +# CONFIG_CRYPTO_LRW is not set
4847 +CONFIG_CRYPTO_PCBC=m
4848 +# CONFIG_CRYPTO_XTS is not set
4849 +
4850 +#
4851 +# Hash modes
4852 +#
4853 # CONFIG_CRYPTO_HMAC is not set
4854 # CONFIG_CRYPTO_XCBC is not set
4855 -# CONFIG_CRYPTO_NULL is not set
4856 +
4857 +#
4858 +# Digest
4859 +#
4860 +# CONFIG_CRYPTO_CRC32C is not set
4861 # CONFIG_CRYPTO_MD4 is not set
4862 # CONFIG_CRYPTO_MD5 is not set
4863 +# CONFIG_CRYPTO_MICHAEL_MIC is not set
4864 # CONFIG_CRYPTO_SHA1 is not set
4865 # CONFIG_CRYPTO_SHA256 is not set
4866 # CONFIG_CRYPTO_SHA512 is not set
4867 -# CONFIG_CRYPTO_WP512 is not set
4868 # CONFIG_CRYPTO_TGR192 is not set
4869 -# CONFIG_CRYPTO_GF128MUL is not set
4870 -CONFIG_CRYPTO_ECB=m
4871 -CONFIG_CRYPTO_CBC=m
4872 -CONFIG_CRYPTO_PCBC=m
4873 -# CONFIG_CRYPTO_LRW is not set
4874 -# CONFIG_CRYPTO_XTS is not set
4875 -# CONFIG_CRYPTO_CTR is not set
4876 -# CONFIG_CRYPTO_GCM is not set
4877 -# CONFIG_CRYPTO_CCM is not set
4878 -# CONFIG_CRYPTO_CRYPTD is not set
4879 -# CONFIG_CRYPTO_DES is not set
4880 -# CONFIG_CRYPTO_FCRYPT is not set
4881 -# CONFIG_CRYPTO_BLOWFISH is not set
4882 -# CONFIG_CRYPTO_TWOFISH is not set
4883 -# CONFIG_CRYPTO_SERPENT is not set
4884 +# CONFIG_CRYPTO_WP512 is not set
4885 +
4886 +#
4887 +# Ciphers
4888 +#
4889 # CONFIG_CRYPTO_AES is not set
4890 +# CONFIG_CRYPTO_ANUBIS is not set
4891 +# CONFIG_CRYPTO_ARC4 is not set
4892 +# CONFIG_CRYPTO_BLOWFISH is not set
4893 +# CONFIG_CRYPTO_CAMELLIA is not set
4894 # CONFIG_CRYPTO_CAST5 is not set
4895 # CONFIG_CRYPTO_CAST6 is not set
4896 -# CONFIG_CRYPTO_TEA is not set
4897 -# CONFIG_CRYPTO_ARC4 is not set
4898 +# CONFIG_CRYPTO_DES is not set
4899 +# CONFIG_CRYPTO_FCRYPT is not set
4900 # CONFIG_CRYPTO_KHAZAD is not set
4901 -# CONFIG_CRYPTO_ANUBIS is not set
4902 -# CONFIG_CRYPTO_SEED is not set
4903 # CONFIG_CRYPTO_SALSA20 is not set
4904 +# CONFIG_CRYPTO_SEED is not set
4905 +# CONFIG_CRYPTO_SERPENT is not set
4906 +# CONFIG_CRYPTO_TEA is not set
4907 +# CONFIG_CRYPTO_TWOFISH is not set
4908 +
4909 +#
4910 +# Compression
4911 +#
4912 # CONFIG_CRYPTO_DEFLATE is not set
4913 -# CONFIG_CRYPTO_MICHAEL_MIC is not set
4914 -# CONFIG_CRYPTO_CRC32C is not set
4915 -# CONFIG_CRYPTO_CAMELLIA is not set
4916 -# CONFIG_CRYPTO_TEST is not set
4917 -# CONFIG_CRYPTO_AUTHENC is not set
4918 # CONFIG_CRYPTO_LZO is not set
4919 CONFIG_CRYPTO_HW=y
4920 # CONFIG_CRYPTO_DEV_HIFN_795X is not set
4921 @@ -1369,12 +1432,14 @@
4922 # Library routines
4923 #
4924 CONFIG_BITREVERSE=y
4925 -CONFIG_CRC_CCITT=y
4926 -CONFIG_CRC16=y
4927 -# CONFIG_CRC_ITU_T is not set
4928 +# CONFIG_GENERIC_FIND_FIRST_BIT is not set
4929 +# CONFIG_GENERIC_FIND_NEXT_BIT is not set
4930 +# CONFIG_CRC_CCITT is not set
4931 +# CONFIG_CRC16 is not set
4932 +CONFIG_CRC_ITU_T=m
4933 CONFIG_CRC32=y
4934 # CONFIG_CRC7 is not set
4935 -CONFIG_LIBCRC32C=y
4936 +# CONFIG_LIBCRC32C is not set
4937 CONFIG_ZLIB_INFLATE=y
4938 CONFIG_ZLIB_DEFLATE=y
4939 CONFIG_PLIST=y
4940 --- a/arch/arm/kernel/stacktrace.c
4941 +++ b/arch/arm/kernel/stacktrace.c
4942 @@ -36,6 +36,7 @@
4943 #ifdef CONFIG_STACKTRACE
4944 struct stack_trace_data {
4945 struct stack_trace *trace;
4946 + unsigned int no_sched_functions;
4947 unsigned int skip;
4948 };
4949
4950 @@ -43,27 +44,52 @@
4951 {
4952 struct stack_trace_data *data = d;
4953 struct stack_trace *trace = data->trace;
4954 + unsigned long addr = frame->lr;
4955
4956 + if (data->no_sched_functions && in_sched_functions(addr))
4957 + return 0;
4958 if (data->skip) {
4959 data->skip--;
4960 return 0;
4961 }
4962
4963 - trace->entries[trace->nr_entries++] = frame->lr;
4964 + trace->entries[trace->nr_entries++] = addr;
4965
4966 return trace->nr_entries >= trace->max_entries;
4967 }
4968
4969 -void save_stack_trace(struct stack_trace *trace)
4970 +void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
4971 {
4972 struct stack_trace_data data;
4973 unsigned long fp, base;
4974
4975 data.trace = trace;
4976 data.skip = trace->skip;
4977 - base = (unsigned long)task_stack_page(current);
4978 - asm("mov %0, fp" : "=r" (fp));
4979 + base = (unsigned long)task_stack_page(tsk);
4980 +
4981 + if (tsk != current) {
4982 +#ifdef CONFIG_SMP
4983 + /*
4984 + * What guarantees do we have here that 'tsk'
4985 + * is not running on another CPU?
4986 + */
4987 + BUG();
4988 +#else
4989 + data.no_sched_functions = 1;
4990 + fp = thread_saved_fp(tsk);
4991 +#endif
4992 + } else {
4993 + data.no_sched_functions = 0;
4994 + asm("mov %0, fp" : "=r" (fp));
4995 + }
4996
4997 walk_stackframe(fp, base, base + THREAD_SIZE, save_trace, &data);
4998 + if (trace->nr_entries < trace->max_entries)
4999 + trace->entries[trace->nr_entries++] = ULONG_MAX;
5000 +}
5001 +
5002 +void save_stack_trace(struct stack_trace *trace)
5003 +{
5004 + save_stack_trace_tsk(current, trace);
5005 }
5006 #endif
5007 --- a/arch/arm/lib/copy_template.S
5008 +++ b/arch/arm/lib/copy_template.S
5009 @@ -13,14 +13,6 @@
5010 */
5011
5012 /*
5013 - * This can be used to enable code to cacheline align the source pointer.
5014 - * Experiments on tested architectures (StrongARM and XScale) didn't show
5015 - * this a worthwhile thing to do. That might be different in the future.
5016 - */
5017 -//#define CALGN(code...) code
5018 -#define CALGN(code...)
5019 -
5020 -/*
5021 * Theory of operation
5022 * -------------------
5023 *
5024 @@ -82,7 +74,7 @@
5025 stmfd sp!, {r5 - r8}
5026 blt 5f
5027
5028 - CALGN( ands ip, r1, #31 )
5029 + CALGN( ands ip, r0, #31 )
5030 CALGN( rsb r3, ip, #32 )
5031 CALGN( sbcnes r4, r3, r2 ) @ C is always set here
5032 CALGN( bcs 2f )
5033 @@ -168,7 +160,7 @@
5034 subs r2, r2, #28
5035 blt 14f
5036
5037 - CALGN( ands ip, r1, #31 )
5038 + CALGN( ands ip, r0, #31 )
5039 CALGN( rsb ip, ip, #32 )
5040 CALGN( sbcnes r4, ip, r2 ) @ C is always set here
5041 CALGN( subcc r2, r2, ip )
5042 --- a/arch/arm/lib/memmove.S
5043 +++ b/arch/arm/lib/memmove.S
5044 @@ -13,14 +13,6 @@
5045 #include <linux/linkage.h>
5046 #include <asm/assembler.h>
5047
5048 -/*
5049 - * This can be used to enable code to cacheline align the source pointer.
5050 - * Experiments on tested architectures (StrongARM and XScale) didn't show
5051 - * this a worthwhile thing to do. That might be different in the future.
5052 - */
5053 -//#define CALGN(code...) code
5054 -#define CALGN(code...)
5055 -
5056 .text
5057
5058 /*
5059 @@ -55,11 +47,12 @@
5060 stmfd sp!, {r5 - r8}
5061 blt 5f
5062
5063 - CALGN( ands ip, r1, #31 )
5064 + CALGN( ands ip, r0, #31 )
5065 CALGN( sbcnes r4, ip, r2 ) @ C is always set here
5066 CALGN( bcs 2f )
5067 CALGN( adr r4, 6f )
5068 CALGN( subs r2, r2, ip ) @ C is set here
5069 + CALGN( rsb ip, ip, #32 )
5070 CALGN( add pc, r4, ip )
5071
5072 PLD( pld [r1, #-4] )
5073 @@ -138,8 +131,7 @@
5074 subs r2, r2, #28
5075 blt 14f
5076
5077 - CALGN( ands ip, r1, #31 )
5078 - CALGN( rsb ip, ip, #32 )
5079 + CALGN( ands ip, r0, #31 )
5080 CALGN( sbcnes r4, ip, r2 ) @ C is always set here
5081 CALGN( subcc r2, r2, ip )
5082 CALGN( bcc 15f )
5083 --- a/arch/arm/lib/memset.S
5084 +++ b/arch/arm/lib/memset.S
5085 @@ -39,6 +39,9 @@
5086 mov r3, r1
5087 cmp r2, #16
5088 blt 4f
5089 +
5090 +#if ! CALGN(1)+0
5091 +
5092 /*
5093 * We need an extra register for this loop - save the return address and
5094 * use the LR
5095 @@ -64,6 +67,49 @@
5096 stmneia r0!, {r1, r3, ip, lr}
5097 ldr lr, [sp], #4
5098
5099 +#else
5100 +
5101 +/*
5102 + * This version aligns the destination pointer in order to write
5103 + * whole cache lines at once.
5104 + */
5105 +
5106 + stmfd sp!, {r4-r7, lr}
5107 + mov r4, r1
5108 + mov r5, r1
5109 + mov r6, r1
5110 + mov r7, r1
5111 + mov ip, r1
5112 + mov lr, r1
5113 +
5114 + cmp r2, #96
5115 + tstgt r0, #31
5116 + ble 3f
5117 +
5118 + and ip, r0, #31
5119 + rsb ip, ip, #32
5120 + sub r2, r2, ip
5121 + movs ip, ip, lsl #(32 - 4)
5122 + stmcsia r0!, {r4, r5, r6, r7}
5123 + stmmiia r0!, {r4, r5}
5124 + tst ip, #(1 << 30)
5125 + mov ip, r1
5126 + strne r1, [r0], #4
5127 +
5128 +3: subs r2, r2, #64
5129 + stmgeia r0!, {r1, r3-r7, ip, lr}
5130 + stmgeia r0!, {r1, r3-r7, ip, lr}
5131 + bgt 3b
5132 + ldmeqfd sp!, {r4-r7, pc}
5133 +
5134 + tst r2, #32
5135 + stmneia r0!, {r1, r3-r7, ip, lr}
5136 + tst r2, #16
5137 + stmneia r0!, {r4-r7}
5138 + ldmfd sp!, {r4-r7, lr}
5139 +
5140 +#endif
5141 +
5142 4: tst r2, #8
5143 stmneia r0!, {r1, r3}
5144 tst r2, #4
5145 --- a/arch/arm/lib/memzero.S
5146 +++ b/arch/arm/lib/memzero.S
5147 @@ -39,6 +39,9 @@
5148 */
5149 cmp r1, #16 @ 1 we can skip this chunk if we
5150 blt 4f @ 1 have < 16 bytes
5151 +
5152 +#if ! CALGN(1)+0
5153 +
5154 /*
5155 * We need an extra register for this loop - save the return address and
5156 * use the LR
5157 @@ -64,6 +67,47 @@
5158 stmneia r0!, {r2, r3, ip, lr} @ 4
5159 ldr lr, [sp], #4 @ 1
5160
5161 +#else
5162 +
5163 +/*
5164 + * This version aligns the destination pointer in order to write
5165 + * whole cache lines at once.
5166 + */
5167 +
5168 + stmfd sp!, {r4-r7, lr}
5169 + mov r4, r2
5170 + mov r5, r2
5171 + mov r6, r2
5172 + mov r7, r2
5173 + mov ip, r2
5174 + mov lr, r2
5175 +
5176 + cmp r1, #96
5177 + andgts ip, r0, #31
5178 + ble 3f
5179 +
5180 + rsb ip, ip, #32
5181 + sub r1, r1, ip
5182 + movs ip, ip, lsl #(32 - 4)
5183 + stmcsia r0!, {r4, r5, r6, r7}
5184 + stmmiia r0!, {r4, r5}
5185 + movs ip, ip, lsl #2
5186 + strcs r2, [r0], #4
5187 +
5188 +3: subs r1, r1, #64
5189 + stmgeia r0!, {r2-r7, ip, lr}
5190 + stmgeia r0!, {r2-r7, ip, lr}
5191 + bgt 3b
5192 + ldmeqfd sp!, {r4-r7, pc}
5193 +
5194 + tst r1, #32
5195 + stmneia r0!, {r2-r7, ip, lr}
5196 + tst r1, #16
5197 + stmneia r0!, {r4-r7}
5198 + ldmfd sp!, {r4-r7, lr}
5199 +
5200 +#endif
5201 +
5202 4: tst r1, #8 @ 1 8 bytes or more?
5203 stmneia r0!, {r2, r3} @ 2
5204 tst r1, #4 @ 1 4 bytes or more?
5205 --- /dev/null
5206 +++ b/arch/arm/mach-kirkwood/Kconfig
5207 @@ -0,0 +1,25 @@
5208 +if ARCH_KIRKWOOD
5209 +
5210 +menu "Marvell Kirkwood Implementations"
5211 +
5212 +config MACH_DB88F6281_BP
5213 + bool "Marvell DB-88F6281-BP Development Board"
5214 + help
5215 + Say 'Y' here if you want your kernel to support the
5216 + Marvell DB-88F6281-BP Development Board.
5217 +
5218 +config MACH_RD88F6192_NAS
5219 + bool "Marvell RD-88F6192-NAS Reference Board"
5220 + help
5221 + Say 'Y' here if you want your kernel to support the
5222 + Marvell RD-88F6192-NAS Reference Board.
5223 +
5224 +config MACH_RD88F6281
5225 + bool "Marvell RD-88F6281 Reference Board"
5226 + help
5227 + Say 'Y' here if you want your kernel to support the
5228 + Marvell RD-88F6281 Reference Board.
5229 +
5230 +endmenu
5231 +
5232 +endif
5233 --- /dev/null
5234 +++ b/arch/arm/mach-kirkwood/Makefile
5235 @@ -0,0 +1,5 @@
5236 +obj-y += common.o addr-map.o irq.o pcie.o
5237 +
5238 +obj-$(CONFIG_MACH_DB88F6281_BP) += db88f6281-bp-setup.o
5239 +obj-$(CONFIG_MACH_RD88F6192_NAS) += rd88f6192-nas-setup.o
5240 +obj-$(CONFIG_MACH_RD88F6192_NAS) += rd88f6281-setup.o
5241 --- /dev/null
5242 +++ b/arch/arm/mach-kirkwood/Makefile.boot
5243 @@ -0,0 +1,3 @@
5244 + zreladdr-y := 0x00008000
5245 +params_phys-y := 0x00000100
5246 +initrd_phys-y := 0x00800000
5247 --- /dev/null
5248 +++ b/arch/arm/mach-kirkwood/addr-map.c
5249 @@ -0,0 +1,139 @@
5250 +/*
5251 + * arch/arm/mach-kirkwood/addr-map.c
5252 + *
5253 + * Address map functions for Marvell Kirkwood SoCs
5254 + *
5255 + * This file is licensed under the terms of the GNU General Public
5256 + * License version 2. This program is licensed "as is" without any
5257 + * warranty of any kind, whether express or implied.
5258 + */
5259 +
5260 +#include <linux/kernel.h>
5261 +#include <linux/init.h>
5262 +#include <linux/mbus.h>
5263 +#include <linux/io.h>
5264 +#include <asm/hardware.h>
5265 +#include "common.h"
5266 +
5267 +/*
5268 + * Generic Address Decode Windows bit settings
5269 + */
5270 +#define TARGET_DDR 0
5271 +#define TARGET_DEV_BUS 1
5272 +#define TARGET_PCIE 4
5273 +#define ATTR_DEV_SPI_ROM 0x1e
5274 +#define ATTR_DEV_BOOT 0x1d
5275 +#define ATTR_DEV_NAND 0x2f
5276 +#define ATTR_DEV_CS3 0x37
5277 +#define ATTR_DEV_CS2 0x3b
5278 +#define ATTR_DEV_CS1 0x3d
5279 +#define ATTR_DEV_CS0 0x3e
5280 +#define ATTR_PCIE_IO 0xe0
5281 +#define ATTR_PCIE_MEM 0xe8
5282 +
5283 +/*
5284 + * Helpers to get DDR bank info
5285 + */
5286 +#define DDR_BASE_CS_OFF(n) (0x0000 + ((n) << 3))
5287 +#define DDR_SIZE_CS_OFF(n) (0x0004 + ((n) << 3))
5288 +
5289 +/*
5290 + * CPU Address Decode Windows registers
5291 + */
5292 +#define WIN_OFF(n) (BRIDGE_VIRT_BASE + 0x0000 + ((n) << 4))
5293 +#define WIN_CTRL_OFF 0x0000
5294 +#define WIN_BASE_OFF 0x0004
5295 +#define WIN_REMAP_LO_OFF 0x0008
5296 +#define WIN_REMAP_HI_OFF 0x000c
5297 +
5298 +
5299 +struct mbus_dram_target_info kirkwood_mbus_dram_info;
5300 +
5301 +static int __init cpu_win_can_remap(int win)
5302 +{
5303 + if (win < 4)
5304 + return 1;
5305 +
5306 + return 0;
5307 +}
5308 +
5309 +static void __init setup_cpu_win(int win, u32 base, u32 size,
5310 + u8 target, u8 attr, int remap)
5311 +{
5312 + void __iomem *addr = (void __iomem *)WIN_OFF(win);
5313 + u32 ctrl;
5314 +
5315 + base &= 0xffff0000;
5316 + ctrl = ((size - 1) & 0xffff0000) | (attr << 8) | (target << 4) | 1;
5317 +
5318 + writel(base, addr + WIN_BASE_OFF);
5319 + writel(ctrl, addr + WIN_CTRL_OFF);
5320 + if (cpu_win_can_remap(win)) {
5321 + if (remap < 0)
5322 + remap = base;
5323 +
5324 + writel(remap & 0xffff0000, addr + WIN_REMAP_LO_OFF);
5325 + writel(0, addr + WIN_REMAP_HI_OFF);
5326 + }
5327 +}
5328 +
5329 +void __init kirkwood_setup_cpu_mbus(void)
5330 +{
5331 + void __iomem *addr;
5332 + int i;
5333 + int cs;
5334 +
5335 + /*
5336 + * First, disable and clear windows.
5337 + */
5338 + for (i = 0; i < 8; i++) {
5339 + addr = (void __iomem *)WIN_OFF(i);
5340 +
5341 + writel(0, addr + WIN_BASE_OFF);
5342 + writel(0, addr + WIN_CTRL_OFF);
5343 + if (cpu_win_can_remap(i)) {
5344 + writel(0, addr + WIN_REMAP_LO_OFF);
5345 + writel(0, addr + WIN_REMAP_HI_OFF);
5346 + }
5347 + }
5348 +
5349 + /*
5350 + * Setup windows for PCIe IO+MEM space.
5351 + */
5352 + setup_cpu_win(0, KIRKWOOD_PCIE_IO_PHYS_BASE, KIRKWOOD_PCIE_IO_SIZE,
5353 + TARGET_PCIE, ATTR_PCIE_IO, KIRKWOOD_PCIE_IO_BUS_BASE);
5354 + setup_cpu_win(1, KIRKWOOD_PCIE_MEM_PHYS_BASE, KIRKWOOD_PCIE_MEM_SIZE,
5355 + TARGET_PCIE, ATTR_PCIE_MEM, -1);
5356 +
5357 + /*
5358 + * Setup window for NAND controller.
5359 + */
5360 + setup_cpu_win(2, KIRKWOOD_NAND_MEM_PHYS_BASE, KIRKWOOD_NAND_MEM_SIZE,
5361 + TARGET_DEV_BUS, ATTR_DEV_NAND, -1);
5362 +
5363 + /*
5364 + * Setup MBUS dram target info.
5365 + */
5366 + kirkwood_mbus_dram_info.mbus_dram_target_id = TARGET_DDR;
5367 +
5368 + addr = (void __iomem *)DDR_WINDOW_CPU_BASE;
5369 +
5370 + for (i = 0, cs = 0; i < 4; i++) {
5371 + u32 base = readl(addr + DDR_BASE_CS_OFF(i));
5372 + u32 size = readl(addr + DDR_SIZE_CS_OFF(i));
5373 +
5374 + /*
5375 + * Chip select enabled?
5376 + */
5377 + if (size & 1) {
5378 + struct mbus_dram_window *w;
5379 +
5380 + w = &kirkwood_mbus_dram_info.cs[cs++];
5381 + w->cs_index = i;
5382 + w->mbus_attr = 0xf & ~(1 << i);
5383 + w->base = base & 0xffff0000;
5384 + w->size = (size | 0x0000ffff) + 1;
5385 + }
5386 + }
5387 + kirkwood_mbus_dram_info.num_cs = cs;
5388 +}
5389 --- /dev/null
5390 +++ b/arch/arm/mach-kirkwood/common.c
5391 @@ -0,0 +1,326 @@
5392 +/*
5393 + * arch/arm/mach-kirkwood/common.c
5394 + *
5395 + * Core functions for Marvell Kirkwood SoCs
5396 + *
5397 + * This file is licensed under the terms of the GNU General Public
5398 + * License version 2. This program is licensed "as is" without any
5399 + * warranty of any kind, whether express or implied.
5400 + */
5401 +
5402 +#include <linux/kernel.h>
5403 +#include <linux/init.h>
5404 +#include <linux/platform_device.h>
5405 +#include <linux/serial_8250.h>
5406 +#include <linux/mbus.h>
5407 +#include <linux/mv643xx_eth.h>
5408 +#include <linux/ata_platform.h>
5409 +#include <asm/page.h>
5410 +#include <asm/timex.h>
5411 +#include <asm/mach/map.h>
5412 +#include <asm/mach/time.h>
5413 +#include <asm/arch/kirkwood.h>
5414 +#include <asm/plat-orion/cache-feroceon-l2.h>
5415 +#include <asm/plat-orion/ehci-orion.h>
5416 +#include <asm/plat-orion/orion_nand.h>
5417 +#include <asm/plat-orion/time.h>
5418 +#include "common.h"
5419 +
5420 +/*****************************************************************************
5421 + * I/O Address Mapping
5422 + ****************************************************************************/
5423 +static struct map_desc kirkwood_io_desc[] __initdata = {
5424 + {
5425 + .virtual = KIRKWOOD_PCIE_IO_VIRT_BASE,
5426 + .pfn = __phys_to_pfn(KIRKWOOD_PCIE_IO_PHYS_BASE),
5427 + .length = KIRKWOOD_PCIE_IO_SIZE,
5428 + .type = MT_DEVICE,
5429 + }, {
5430 + .virtual = KIRKWOOD_REGS_VIRT_BASE,
5431 + .pfn = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
5432 + .length = KIRKWOOD_REGS_SIZE,
5433 + .type = MT_DEVICE,
5434 + },
5435 +};
5436 +
5437 +void __init kirkwood_map_io(void)
5438 +{
5439 + iotable_init(kirkwood_io_desc, ARRAY_SIZE(kirkwood_io_desc));
5440 +}
5441 +
5442 +
5443 +/*****************************************************************************
5444 + * EHCI
5445 + ****************************************************************************/
5446 +static struct orion_ehci_data kirkwood_ehci_data = {
5447 + .dram = &kirkwood_mbus_dram_info,
5448 +};
5449 +
5450 +static u64 ehci_dmamask = 0xffffffffUL;
5451 +
5452 +
5453 +/*****************************************************************************
5454 + * EHCI0
5455 + ****************************************************************************/
5456 +static struct resource kirkwood_ehci_resources[] = {
5457 + {
5458 + .start = USB_PHYS_BASE,
5459 + .end = USB_PHYS_BASE + 0x0fff,
5460 + .flags = IORESOURCE_MEM,
5461 + }, {
5462 + .start = IRQ_KIRKWOOD_USB,
5463 + .end = IRQ_KIRKWOOD_USB,
5464 + .flags = IORESOURCE_IRQ,
5465 + },
5466 +};
5467 +
5468 +static struct platform_device kirkwood_ehci = {
5469 + .name = "orion-ehci",
5470 + .id = 0,
5471 + .dev = {
5472 + .dma_mask = &ehci_dmamask,
5473 + .coherent_dma_mask = 0xffffffff,
5474 + .platform_data = &kirkwood_ehci_data,
5475 + },
5476 + .resource = kirkwood_ehci_resources,
5477 + .num_resources = ARRAY_SIZE(kirkwood_ehci_resources),
5478 +};
5479 +
5480 +void __init kirkwood_ehci_init(void)
5481 +{
5482 + platform_device_register(&kirkwood_ehci);
5483 +}
5484 +
5485 +
5486 +/*****************************************************************************
5487 + * GE00
5488 + ****************************************************************************/
5489 +struct mv643xx_eth_shared_platform_data kirkwood_ge00_shared_data = {
5490 + .t_clk = KIRKWOOD_TCLK,
5491 + .dram = &kirkwood_mbus_dram_info,
5492 +};
5493 +
5494 +static struct resource kirkwood_ge00_shared_resources[] = {
5495 + {
5496 + .name = "ge00 base",
5497 + .start = GE00_PHYS_BASE + 0x2000,
5498 + .end = GE00_PHYS_BASE + 0x3fff,
5499 + .flags = IORESOURCE_MEM,
5500 + },
5501 +};
5502 +
5503 +static struct platform_device kirkwood_ge00_shared = {
5504 + .name = MV643XX_ETH_SHARED_NAME,
5505 + .id = 0,
5506 + .dev = {
5507 + .platform_data = &kirkwood_ge00_shared_data,
5508 + },
5509 + .num_resources = 1,
5510 + .resource = kirkwood_ge00_shared_resources,
5511 +};
5512 +
5513 +static struct resource kirkwood_ge00_resources[] = {
5514 + {
5515 + .name = "ge00 irq",
5516 + .start = IRQ_KIRKWOOD_GE00_SUM,
5517 + .end = IRQ_KIRKWOOD_GE00_SUM,
5518 + .flags = IORESOURCE_IRQ,
5519 + },
5520 +};
5521 +
5522 +static struct platform_device kirkwood_ge00 = {
5523 + .name = MV643XX_ETH_NAME,
5524 + .id = 0,
5525 + .num_resources = 1,
5526 + .resource = kirkwood_ge00_resources,
5527 +};
5528 +
5529 +void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data)
5530 +{
5531 + eth_data->shared = &kirkwood_ge00_shared;
5532 + kirkwood_ge00.dev.platform_data = eth_data;
5533 +
5534 + platform_device_register(&kirkwood_ge00_shared);
5535 + platform_device_register(&kirkwood_ge00);
5536 +}
5537 +
5538 +
5539 +/*****************************************************************************
5540 + * SoC RTC
5541 + ****************************************************************************/
5542 +static struct resource kirkwood_rtc_resource = {
5543 + .start = RTC_PHYS_BASE,
5544 + .end = RTC_PHYS_BASE + SZ_16 - 1,
5545 + .flags = IORESOURCE_MEM,
5546 +};
5547 +
5548 +void __init kirkwood_rtc_init(void)
5549 +{
5550 + platform_device_register_simple("rtc-mv", -1, &kirkwood_rtc_resource, 1);
5551 +}
5552 +
5553 +
5554 +/*****************************************************************************
5555 + * SATA
5556 + ****************************************************************************/
5557 +static struct resource kirkwood_sata_resources[] = {
5558 + {
5559 + .name = "sata base",
5560 + .start = SATA_PHYS_BASE,
5561 + .end = SATA_PHYS_BASE + 0x5000 - 1,
5562 + .flags = IORESOURCE_MEM,
5563 + }, {
5564 + .name = "sata irq",
5565 + .start = IRQ_KIRKWOOD_SATA,
5566 + .end = IRQ_KIRKWOOD_SATA,
5567 + .flags = IORESOURCE_IRQ,
5568 + },
5569 +};
5570 +
5571 +static struct platform_device kirkwood_sata = {
5572 + .name = "sata_mv",
5573 + .id = 0,
5574 + .dev = {
5575 + .coherent_dma_mask = 0xffffffff,
5576 + },
5577 + .num_resources = ARRAY_SIZE(kirkwood_sata_resources),
5578 + .resource = kirkwood_sata_resources,
5579 +};
5580 +
5581 +void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data)
5582 +{
5583 + sata_data->dram = &kirkwood_mbus_dram_info;
5584 + kirkwood_sata.dev.platform_data = sata_data;
5585 + platform_device_register(&kirkwood_sata);
5586 +}
5587 +
5588 +
5589 +/*****************************************************************************
5590 + * UART0
5591 + ****************************************************************************/
5592 +static struct plat_serial8250_port kirkwood_uart0_data[] = {
5593 + {
5594 + .mapbase = UART0_PHYS_BASE,
5595 + .membase = (char *)UART0_VIRT_BASE,
5596 + .irq = IRQ_KIRKWOOD_UART_0,
5597 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
5598 + .iotype = UPIO_MEM,
5599 + .regshift = 2,
5600 + .uartclk = KIRKWOOD_TCLK,
5601 + }, {
5602 + },
5603 +};
5604 +
5605 +static struct resource kirkwood_uart0_resources[] = {
5606 + {
5607 + .start = UART0_PHYS_BASE,
5608 + .end = UART0_PHYS_BASE + 0xff,
5609 + .flags = IORESOURCE_MEM,
5610 + }, {
5611 + .start = IRQ_KIRKWOOD_UART_0,
5612 + .end = IRQ_KIRKWOOD_UART_0,
5613 + .flags = IORESOURCE_IRQ,
5614 + },
5615 +};
5616 +
5617 +static struct platform_device kirkwood_uart0 = {
5618 + .name = "serial8250",
5619 + .id = 0,
5620 + .dev = {
5621 + .platform_data = kirkwood_uart0_data,
5622 + },
5623 + .resource = kirkwood_uart0_resources,
5624 + .num_resources = ARRAY_SIZE(kirkwood_uart0_resources),
5625 +};
5626 +
5627 +void __init kirkwood_uart0_init(void)
5628 +{
5629 + platform_device_register(&kirkwood_uart0);
5630 +}
5631 +
5632 +
5633 +/*****************************************************************************
5634 + * UART1
5635 + ****************************************************************************/
5636 +static struct plat_serial8250_port kirkwood_uart1_data[] = {
5637 + {
5638 + .mapbase = UART1_PHYS_BASE,
5639 + .membase = (char *)UART1_VIRT_BASE,
5640 + .irq = IRQ_KIRKWOOD_UART_1,
5641 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
5642 + .iotype = UPIO_MEM,
5643 + .regshift = 2,
5644 + .uartclk = KIRKWOOD_TCLK,
5645 + }, {
5646 + },
5647 +};
5648 +
5649 +static struct resource kirkwood_uart1_resources[] = {
5650 + {
5651 + .start = UART1_PHYS_BASE,
5652 + .end = UART1_PHYS_BASE + 0xff,
5653 + .flags = IORESOURCE_MEM,
5654 + }, {
5655 + .start = IRQ_KIRKWOOD_UART_1,
5656 + .end = IRQ_KIRKWOOD_UART_1,
5657 + .flags = IORESOURCE_IRQ,
5658 + },
5659 +};
5660 +
5661 +static struct platform_device kirkwood_uart1 = {
5662 + .name = "serial8250",
5663 + .id = 1,
5664 + .dev = {
5665 + .platform_data = kirkwood_uart1_data,
5666 + },
5667 + .resource = kirkwood_uart1_resources,
5668 + .num_resources = ARRAY_SIZE(kirkwood_uart1_resources),
5669 +};
5670 +
5671 +void __init kirkwood_uart1_init(void)
5672 +{
5673 + platform_device_register(&kirkwood_uart1);
5674 +}
5675 +
5676 +
5677 +/*****************************************************************************
5678 + * Time handling
5679 + ****************************************************************************/
5680 +static void kirkwood_timer_init(void)
5681 +{
5682 + orion_time_init(IRQ_KIRKWOOD_BRIDGE, KIRKWOOD_TCLK);
5683 +}
5684 +
5685 +struct sys_timer kirkwood_timer = {
5686 + .init = kirkwood_timer_init,
5687 +};
5688 +
5689 +
5690 +/*****************************************************************************
5691 + * General
5692 + ****************************************************************************/
5693 +static char * __init kirkwood_id(void)
5694 +{
5695 + switch (readl(DEVICE_ID) & 0x3) {
5696 + case 0:
5697 + return "88F6180";
5698 + case 1:
5699 + return "88F6192";
5700 + case 2:
5701 + return "88F6281";
5702 + }
5703 +
5704 + return "unknown 88F6000 variant";
5705 +}
5706 +
5707 +void __init kirkwood_init(void)
5708 +{
5709 + printk(KERN_INFO "Kirkwood: %s, TCLK=%d.\n",
5710 + kirkwood_id(), KIRKWOOD_TCLK);
5711 +
5712 + kirkwood_setup_cpu_mbus();
5713 +
5714 +#ifdef CONFIG_CACHE_FEROCEON_L2
5715 + feroceon_l2_init(1);
5716 +#endif
5717 +}
5718 --- /dev/null
5719 +++ b/arch/arm/mach-kirkwood/common.h
5720 @@ -0,0 +1,42 @@
5721 +/*
5722 + * arch/arm/mach-kirkwood/common.h
5723 + *
5724 + * Core functions for Marvell Kirkwood SoCs
5725 + *
5726 + * This file is licensed under the terms of the GNU General Public
5727 + * License version 2. This program is licensed "as is" without any
5728 + * warranty of any kind, whether express or implied.
5729 + */
5730 +
5731 +#ifndef __ARCH_KIRKWOOD_COMMON_H
5732 +#define __ARCH_KIRKWOOD_COMMON_H
5733 +
5734 +struct mv643xx_eth_platform_data;
5735 +struct mv_sata_platform_data;
5736 +
5737 +/*
5738 + * Basic Kirkwood init functions used early by machine-setup.
5739 + */
5740 +void kirkwood_map_io(void);
5741 +void kirkwood_init(void);
5742 +void kirkwood_init_irq(void);
5743 +
5744 +extern struct mbus_dram_target_info kirkwood_mbus_dram_info;
5745 +void kirkwood_setup_cpu_mbus(void);
5746 +void kirkwood_setup_pcie_io_win(int window, u32 base, u32 size,
5747 + int maj, int min);
5748 +void kirkwood_setup_pcie_mem_win(int window, u32 base, u32 size,
5749 + int maj, int min);
5750 +
5751 +void kirkwood_ehci_init(void);
5752 +void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data);
5753 +void kirkwood_pcie_init(void);
5754 +void kirkwood_rtc_init(void);
5755 +void kirkwood_sata_init(struct mv_sata_platform_data *sata_data);
5756 +void kirkwood_uart0_init(void);
5757 +void kirkwood_uart1_init(void);
5758 +
5759 +extern struct sys_timer kirkwood_timer;
5760 +
5761 +
5762 +#endif
5763 --- /dev/null
5764 +++ b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c
5765 @@ -0,0 +1,68 @@
5766 +/*
5767 + * arch/arm/mach-kirkwood/db88f6281-bp-setup.c
5768 + *
5769 + * Marvell DB-88F6281-BP Development Board Setup
5770 + *
5771 + * This file is licensed under the terms of the GNU General Public
5772 + * License version 2. This program is licensed "as is" without any
5773 + * warranty of any kind, whether express or implied.
5774 + */
5775 +
5776 +#include <linux/kernel.h>
5777 +#include <linux/init.h>
5778 +#include <linux/platform_device.h>
5779 +#include <linux/pci.h>
5780 +#include <linux/irq.h>
5781 +#include <linux/mtd/physmap.h>
5782 +#include <linux/mtd/nand.h>
5783 +#include <linux/timer.h>
5784 +#include <linux/ata_platform.h>
5785 +#include <linux/mv643xx_eth.h>
5786 +#include <asm/mach-types.h>
5787 +#include <asm/mach/arch.h>
5788 +#include <asm/mach/pci.h>
5789 +#include <asm/arch/kirkwood.h>
5790 +#include "common.h"
5791 +
5792 +static struct mv643xx_eth_platform_data db88f6281_ge00_data = {
5793 + .phy_addr = 8,
5794 +};
5795 +
5796 +static struct mv_sata_platform_data db88f6281_sata_data = {
5797 + .n_ports = 2,
5798 +};
5799 +
5800 +static void __init db88f6281_init(void)
5801 +{
5802 + /*
5803 + * Basic setup. Needs to be called early.
5804 + */
5805 + kirkwood_init();
5806 +
5807 + kirkwood_ehci_init();
5808 + kirkwood_ge00_init(&db88f6281_ge00_data);
5809 + kirkwood_rtc_init();
5810 + kirkwood_sata_init(&db88f6281_sata_data);
5811 + kirkwood_uart0_init();
5812 + kirkwood_uart1_init();
5813 +}
5814 +
5815 +static int __init db88f6281_pci_init(void)
5816 +{
5817 + if (machine_is_db88f6281_bp())
5818 + kirkwood_pcie_init();
5819 +
5820 + return 0;
5821 +}
5822 +subsys_initcall(db88f6281_pci_init);
5823 +
5824 +MACHINE_START(DB88F6281_BP, "Marvell DB-88F6281-BP Development Board")
5825 + /* Maintainer: Saeed Bishara <saeed@marvell.com> */
5826 + .phys_io = KIRKWOOD_REGS_PHYS_BASE,
5827 + .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
5828 + .boot_params = 0x00000100,
5829 + .init_machine = db88f6281_init,
5830 + .map_io = kirkwood_map_io,
5831 + .init_irq = kirkwood_init_irq,
5832 + .timer = &kirkwood_timer,
5833 +MACHINE_END
5834 --- /dev/null
5835 +++ b/arch/arm/mach-kirkwood/irq.c
5836 @@ -0,0 +1,22 @@
5837 +/*
5838 + * arch/arm/mach-kirkwood/irq.c
5839 + *
5840 + * Kirkwood IRQ handling.
5841 + *
5842 + * This file is licensed under the terms of the GNU General Public
5843 + * License version 2. This program is licensed "as is" without any
5844 + * warranty of any kind, whether express or implied.
5845 + */
5846 +
5847 +#include <linux/kernel.h>
5848 +#include <linux/init.h>
5849 +#include <linux/irq.h>
5850 +#include <linux/io.h>
5851 +#include <asm/plat-orion/irq.h>
5852 +#include "common.h"
5853 +
5854 +void __init kirkwood_init_irq(void)
5855 +{
5856 + orion_irq_init(0, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF));
5857 + orion_irq_init(32, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF));
5858 +}
5859 --- /dev/null
5860 +++ b/arch/arm/mach-kirkwood/pcie.c
5861 @@ -0,0 +1,180 @@
5862 +/*
5863 + * arch/arm/mach-kirkwood/pcie.c
5864 + *
5865 + * PCIe functions for Marvell Kirkwood SoCs
5866 + *
5867 + * This file is licensed under the terms of the GNU General Public
5868 + * License version 2. This program is licensed "as is" without any
5869 + * warranty of any kind, whether express or implied.
5870 + */
5871 +
5872 +#include <linux/kernel.h>
5873 +#include <linux/pci.h>
5874 +#include <linux/mbus.h>
5875 +#include <asm/mach/pci.h>
5876 +#include <asm/plat-orion/pcie.h>
5877 +#include "common.h"
5878 +
5879 +
5880 +#define PCIE_BASE ((void __iomem *)PCIE_VIRT_BASE)
5881 +
5882 +static int pcie_valid_config(int bus, int dev)
5883 +{
5884 + /*
5885 + * Don't go out when trying to access --
5886 + * 1. nonexisting device on local bus
5887 + * 2. where there's no device connected (no link)
5888 + */
5889 + if (bus == 0 && dev == 0)
5890 + return 1;
5891 +
5892 + if (!orion_pcie_link_up(PCIE_BASE))
5893 + return 0;
5894 +
5895 + if (bus == 0 && dev != 1)
5896 + return 0;
5897 +
5898 + return 1;
5899 +}
5900 +
5901 +
5902 +/*
5903 + * PCIe config cycles are done by programming the PCIE_CONF_ADDR register
5904 + * and then reading the PCIE_CONF_DATA register. Need to make sure these
5905 + * transactions are atomic.
5906 + */
5907 +static DEFINE_SPINLOCK(kirkwood_pcie_lock);
5908 +
5909 +static int pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where,
5910 + int size, u32 *val)
5911 +{
5912 + unsigned long flags;
5913 + int ret;
5914 +
5915 + if (pcie_valid_config(bus->number, PCI_SLOT(devfn)) == 0) {
5916 + *val = 0xffffffff;
5917 + return PCIBIOS_DEVICE_NOT_FOUND;
5918 + }
5919 +
5920 + spin_lock_irqsave(&kirkwood_pcie_lock, flags);
5921 + ret = orion_pcie_rd_conf(PCIE_BASE, bus, devfn, where, size, val);
5922 + spin_unlock_irqrestore(&kirkwood_pcie_lock, flags);
5923 +
5924 + return ret;
5925 +}
5926 +
5927 +static int pcie_wr_conf(struct pci_bus *bus, u32 devfn,
5928 + int where, int size, u32 val)
5929 +{
5930 + unsigned long flags;
5931 + int ret;
5932 +
5933 + if (pcie_valid_config(bus->number, PCI_SLOT(devfn)) == 0)
5934 + return PCIBIOS_DEVICE_NOT_FOUND;
5935 +
5936 + spin_lock_irqsave(&kirkwood_pcie_lock, flags);
5937 + ret = orion_pcie_wr_conf(PCIE_BASE, bus, devfn, where, size, val);
5938 + spin_unlock_irqrestore(&kirkwood_pcie_lock, flags);
5939 +
5940 + return ret;
5941 +}
5942 +
5943 +static struct pci_ops pcie_ops = {
5944 + .read = pcie_rd_conf,
5945 + .write = pcie_wr_conf,
5946 +};
5947 +
5948 +
5949 +static int kirkwood_pcie_setup(int nr, struct pci_sys_data *sys)
5950 +{
5951 + struct resource *res;
5952 +
5953 + /*
5954 + * Generic PCIe unit setup.
5955 + */
5956 + orion_pcie_setup(PCIE_BASE, &kirkwood_mbus_dram_info);
5957 +
5958 + /*
5959 + * Request resources.
5960 + */
5961 + res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL);
5962 + if (!res)
5963 + panic("pcie_setup unable to alloc resources");
5964 +
5965 + /*
5966 + * IORESOURCE_IO
5967 + */
5968 + res[0].name = "PCIe I/O Space";
5969 + res[0].flags = IORESOURCE_IO;
5970 + res[0].start = KIRKWOOD_PCIE_IO_PHYS_BASE;
5971 + res[0].end = res[0].start + KIRKWOOD_PCIE_IO_SIZE - 1;
5972 + if (request_resource(&ioport_resource, &res[0]))
5973 + panic("Request PCIe IO resource failed\n");
5974 + sys->resource[0] = &res[0];
5975 +
5976 + /*
5977 + * IORESOURCE_MEM
5978 + */
5979 + res[1].name = "PCIe Memory Space";
5980 + res[1].flags = IORESOURCE_MEM;
5981 + res[1].start = KIRKWOOD_PCIE_MEM_PHYS_BASE;
5982 + res[1].end = res[1].start + KIRKWOOD_PCIE_MEM_SIZE - 1;
5983 + if (request_resource(&iomem_resource, &res[1]))
5984 + panic("Request PCIe Memory resource failed\n");
5985 + sys->resource[1] = &res[1];
5986 +
5987 + sys->resource[2] = NULL;
5988 + sys->io_offset = 0;
5989 +
5990 + return 1;
5991 +}
5992 +
5993 +static void __devinit rc_pci_fixup(struct pci_dev *dev)
5994 +{
5995 + /*
5996 + * Prevent enumeration of root complex.
5997 + */
5998 + if (dev->bus->parent == NULL && dev->devfn == 0) {
5999 + int i;
6000 +
6001 + for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
6002 + dev->resource[i].start = 0;
6003 + dev->resource[i].end = 0;
6004 + dev->resource[i].flags = 0;
6005 + }
6006 + }
6007 +}
6008 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_ANY_ID, rc_pci_fixup);
6009 +
6010 +static struct pci_bus __init *
6011 +kirkwood_pcie_scan_bus(int nr, struct pci_sys_data *sys)
6012 +{
6013 + struct pci_bus *bus;
6014 +
6015 + if (nr == 0) {
6016 + bus = pci_scan_bus(sys->busnr, &pcie_ops, sys);
6017 + } else {
6018 + bus = NULL;
6019 + BUG();
6020 + }
6021 +
6022 + return bus;
6023 +}
6024 +
6025 +static int __init kirkwood_pcie_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
6026 +{
6027 + return IRQ_KIRKWOOD_PCIE;
6028 +}
6029 +
6030 +static struct hw_pci kirkwood_pci __initdata = {
6031 + .nr_controllers = 1,
6032 + .swizzle = pci_std_swizzle,
6033 + .setup = kirkwood_pcie_setup,
6034 + .scan = kirkwood_pcie_scan_bus,
6035 + .map_irq = kirkwood_pcie_map_irq,
6036 +};
6037 +
6038 +void __init kirkwood_pcie_init(void)
6039 +{
6040 + pci_common_init(&kirkwood_pci);
6041 +}
6042 --- /dev/null
6043 +++ b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c
6044 @@ -0,0 +1,69 @@
6045 +/*
6046 + * arch/arm/mach-kirkwood/rd88f6192-nas-setup.c
6047 + *
6048 + * Marvell RD-88F6192-NAS Reference Board Setup
6049 + *
6050 + * This file is licensed under the terms of the GNU General Public
6051 + * License version 2. This program is licensed "as is" without any
6052 + * warranty of any kind, whether express or implied.
6053 + */
6054 +
6055 +#include <linux/kernel.h>
6056 +#include <linux/init.h>
6057 +#include <linux/platform_device.h>
6058 +#include <linux/pci.h>
6059 +#include <linux/irq.h>
6060 +#include <linux/mtd/physmap.h>
6061 +#include <linux/mtd/nand.h>
6062 +#include <linux/timer.h>
6063 +#include <linux/ata_platform.h>
6064 +#include <linux/mv643xx_eth.h>
6065 +#include <asm/mach-types.h>
6066 +#include <asm/mach/arch.h>
6067 +#include <asm/mach/pci.h>
6068 +#include <asm/arch/kirkwood.h>
6069 +#include "common.h"
6070 +
6071 +#define RD88F6192_GPIO_USB_VBUS 10
6072 +
6073 +static struct mv643xx_eth_platform_data rd88f6192_ge00_data = {
6074 + .phy_addr = 8,
6075 +};
6076 +
6077 +static struct mv_sata_platform_data rd88f6192_sata_data = {
6078 + .n_ports = 2,
6079 +};
6080 +
6081 +static void __init rd88f6192_init(void)
6082 +{
6083 + /*
6084 + * Basic setup. Needs to be called early.
6085 + */
6086 + kirkwood_init();
6087 +
6088 + kirkwood_ehci_init();
6089 + kirkwood_ge00_init(&rd88f6192_ge00_data);
6090 + kirkwood_rtc_init();
6091 + kirkwood_sata_init(&rd88f6192_sata_data);
6092 + kirkwood_uart0_init();
6093 +}
6094 +
6095 +static int __init rd88f6192_pci_init(void)
6096 +{
6097 + if (machine_is_rd88f6192_nas())
6098 + kirkwood_pcie_init();
6099 +
6100 + return 0;
6101 +}
6102 +subsys_initcall(rd88f6192_pci_init);
6103 +
6104 +MACHINE_START(RD88F6192_NAS, "Marvell RD-88F6192-NAS Development Board")
6105 + /* Maintainer: Saeed Bishara <saeed@marvell.com> */
6106 + .phys_io = KIRKWOOD_REGS_PHYS_BASE,
6107 + .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
6108 + .boot_params = 0x00000100,
6109 + .init_machine = rd88f6192_init,
6110 + .map_io = kirkwood_map_io,
6111 + .init_irq = kirkwood_init_irq,
6112 + .timer = &kirkwood_timer,
6113 +MACHINE_END
6114 --- /dev/null
6115 +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c
6116 @@ -0,0 +1,112 @@
6117 +/*
6118 + * arch/arm/mach-kirkwood/rd88f6281-setup.c
6119 + *
6120 + * Marvell RD-88F6281 Reference Board Setup
6121 + *
6122 + * This file is licensed under the terms of the GNU General Public
6123 + * License version 2. This program is licensed "as is" without any
6124 + * warranty of any kind, whether express or implied.
6125 + */
6126 +
6127 +#include <linux/kernel.h>
6128 +#include <linux/init.h>
6129 +#include <linux/platform_device.h>
6130 +#include <linux/pci.h>
6131 +#include <linux/irq.h>
6132 +#include <linux/mtd/physmap.h>
6133 +#include <linux/mtd/nand.h>
6134 +#include <linux/timer.h>
6135 +#include <linux/ata_platform.h>
6136 +#include <linux/mv643xx_eth.h>
6137 +#include <asm/mach-types.h>
6138 +#include <asm/mach/arch.h>
6139 +#include <asm/mach/pci.h>
6140 +#include <asm/arch/kirkwood.h>
6141 +#include <asm/plat-orion/orion_nand.h>
6142 +#include "common.h"
6143 +
6144 +static struct mtd_partition rd88f6281_nand_parts[] = {
6145 + {
6146 + .name = "u-boot",
6147 + .offset = 0,
6148 + .size = SZ_1M
6149 + }, {
6150 + .name = "uImage",
6151 + .offset = MTDPART_OFS_NXTBLK,
6152 + .size = SZ_2M
6153 + }, {
6154 + .name = "root",
6155 + .offset = MTDPART_OFS_NXTBLK,
6156 + .size = MTDPART_SIZ_FULL
6157 + },
6158 +};
6159 +
6160 +static struct resource rd88f6281_nand_resource = {
6161 + .flags = IORESOURCE_MEM,
6162 + .start = KIRKWOOD_NAND_MEM_PHYS_BASE,
6163 + .end = KIRKWOOD_NAND_MEM_PHYS_BASE +
6164 + KIRKWOOD_NAND_MEM_SIZE - 1,
6165 +};
6166 +
6167 +static struct orion_nand_data rd88f6281_nand_data = {
6168 + .parts = rd88f6281_nand_parts,
6169 + .nr_parts = ARRAY_SIZE(rd88f6281_nand_parts),
6170 + .cle = 0,
6171 + .ale = 1,
6172 + .width = 8,
6173 +};
6174 +
6175 +static struct platform_device rd88f6281_nand_flash = {
6176 + .name = "orion_nand",
6177 + .id = -1,
6178 + .dev = {
6179 + .platform_data = &rd88f6281_nand_data,
6180 + },
6181 + .resource = &rd88f6281_nand_resource,
6182 + .num_resources = 1,
6183 +};
6184 +
6185 +static struct mv643xx_eth_platform_data rd88f6281_ge00_data = {
6186 + .phy_addr = -1,
6187 +};
6188 +
6189 +static struct mv_sata_platform_data rd88f6281_sata_data = {
6190 + .n_ports = 2,
6191 +};
6192 +
6193 +static void __init rd88f6281_init(void)
6194 +{
6195 + /*
6196 + * Basic setup. Needs to be called early.
6197 + */
6198 + kirkwood_init();
6199 +
6200 + kirkwood_ehci_init();
6201 + kirkwood_ge00_init(&rd88f6281_ge00_data);
6202 + kirkwood_rtc_init();
6203 + kirkwood_sata_init(&rd88f6281_sata_data);
6204 + kirkwood_uart0_init();
6205 + kirkwood_uart1_init();
6206 +
6207 + platform_device_register(&rd88f6281_nand_flash);
6208 +}
6209 +
6210 +static int __init rd88f6281_pci_init(void)
6211 +{
6212 + if (machine_is_rd88f6281())
6213 + kirkwood_pcie_init();
6214 +
6215 + return 0;
6216 +}
6217 +subsys_initcall(rd88f6281_pci_init);
6218 +
6219 +MACHINE_START(RD88F6281, "Marvell RD-88F6281 Reference Board")
6220 + /* Maintainer: Saeed Bishara <saeed@marvell.com> */
6221 + .phys_io = KIRKWOOD_REGS_PHYS_BASE,
6222 + .io_pg_offst = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
6223 + .boot_params = 0x00000100,
6224 + .init_machine = rd88f6281_init,
6225 + .map_io = kirkwood_map_io,
6226 + .init_irq = kirkwood_init_irq,
6227 + .timer = &kirkwood_timer,
6228 +MACHINE_END
6229 --- /dev/null
6230 +++ b/arch/arm/mach-loki/Kconfig
6231 @@ -0,0 +1,13 @@
6232 +if ARCH_LOKI
6233 +
6234 +menu "Marvell Loki (88RC8480) Implementations"
6235 +
6236 +config MACH_LB88RC8480
6237 + bool "Marvell LB88RC8480 Development Board"
6238 + help
6239 + Say 'Y' here if you want your kernel to support the
6240 + Marvell LB88RC8480 Development Board.
6241 +
6242 +endmenu
6243 +
6244 +endif
6245 --- /dev/null
6246 +++ b/arch/arm/mach-loki/Makefile
6247 @@ -0,0 +1,3 @@
6248 +obj-y += common.o addr-map.o irq.o
6249 +
6250 +obj-$(CONFIG_MACH_LB88RC8480) += lb88rc8480-setup.o
6251 --- /dev/null
6252 +++ b/arch/arm/mach-loki/Makefile.boot
6253 @@ -0,0 +1,3 @@
6254 + zreladdr-y := 0x00008000
6255 +params_phys-y := 0x00000100
6256 +initrd_phys-y := 0x00800000
6257 --- /dev/null
6258 +++ b/arch/arm/mach-loki/addr-map.c
6259 @@ -0,0 +1,121 @@
6260 +/*
6261 + * arch/arm/mach-loki/addr-map.c
6262 + *
6263 + * Address map functions for Marvell Loki (88RC8480) SoCs
6264 + *
6265 + * This file is licensed under the terms of the GNU General Public
6266 + * License version 2. This program is licensed "as is" without any
6267 + * warranty of any kind, whether express or implied.
6268 + */
6269 +
6270 +#include <linux/kernel.h>
6271 +#include <linux/init.h>
6272 +#include <linux/mbus.h>
6273 +#include <asm/hardware.h>
6274 +#include <asm/io.h>
6275 +#include "common.h"
6276 +
6277 +/*
6278 + * Generic Address Decode Windows bit settings
6279 + */
6280 +#define TARGET_DDR 0
6281 +#define TARGET_DEV_BUS 1
6282 +#define TARGET_PCIE0 3
6283 +#define TARGET_PCIE1 4
6284 +#define ATTR_DEV_BOOT 0x0f
6285 +#define ATTR_DEV_CS2 0x1b
6286 +#define ATTR_DEV_CS1 0x1d
6287 +#define ATTR_DEV_CS0 0x1e
6288 +#define ATTR_PCIE_IO 0x51
6289 +#define ATTR_PCIE_MEM 0x59
6290 +
6291 +/*
6292 + * Helpers to get DDR bank info
6293 + */
6294 +#define DDR_SIZE_CS(n) DDR_REG(0x1500 + ((n) << 3))
6295 +#define DDR_BASE_CS(n) DDR_REG(0x1504 + ((n) << 3))
6296 +
6297 +/*
6298 + * CPU Address Decode Windows registers
6299 + */
6300 +#define CPU_WIN_CTRL(n) BRIDGE_REG(0x000 | ((n) << 4))
6301 +#define CPU_WIN_BASE(n) BRIDGE_REG(0x004 | ((n) << 4))
6302 +#define CPU_WIN_REMAP_LO(n) BRIDGE_REG(0x008 | ((n) << 4))
6303 +#define CPU_WIN_REMAP_HI(n) BRIDGE_REG(0x00c | ((n) << 4))
6304 +
6305 +
6306 +struct mbus_dram_target_info loki_mbus_dram_info;
6307 +
6308 +static void __init setup_cpu_win(int win, u32 base, u32 size,
6309 + u8 target, u8 attr, int remap)
6310 +{
6311 + u32 ctrl;
6312 +
6313 + base &= 0xffff0000;
6314 + ctrl = ((size - 1) & 0xffff0000) | (attr << 8) | (1 << 5) | target;
6315 +
6316 + writel(base, CPU_WIN_BASE(win));
6317 + writel(ctrl, CPU_WIN_CTRL(win));
6318 + if (win < 2) {
6319 + if (remap < 0)
6320 + remap = base;
6321 +
6322 + writel(remap & 0xffff0000, CPU_WIN_REMAP_LO(win));
6323 + writel(0, CPU_WIN_REMAP_HI(win));
6324 + }
6325 +}
6326 +
6327 +void __init loki_setup_cpu_mbus(void)
6328 +{
6329 + int i;
6330 + int cs;
6331 +
6332 + /*
6333 + * First, disable and clear windows.
6334 + */
6335 + for (i = 0; i < 8; i++) {
6336 + writel(0, CPU_WIN_BASE(i));
6337 + writel(0, CPU_WIN_CTRL(i));
6338 + if (i < 2) {
6339 + writel(0, CPU_WIN_REMAP_LO(i));
6340 + writel(0, CPU_WIN_REMAP_HI(i));
6341 + }
6342 + }
6343 +
6344 + /*
6345 + * Setup windows for PCIe IO+MEM space.
6346 + */
6347 + setup_cpu_win(2, LOKI_PCIE0_MEM_PHYS_BASE, LOKI_PCIE0_MEM_SIZE,
6348 + TARGET_PCIE0, ATTR_PCIE_MEM, -1);
6349 + setup_cpu_win(3, LOKI_PCIE1_MEM_PHYS_BASE, LOKI_PCIE1_MEM_SIZE,
6350 + TARGET_PCIE1, ATTR_PCIE_MEM, -1);
6351 +
6352 + /*
6353 + * Setup MBUS dram target info.
6354 + */
6355 + loki_mbus_dram_info.mbus_dram_target_id = TARGET_DDR;
6356 +
6357 + for (i = 0, cs = 0; i < 4; i++) {
6358 + u32 base = readl(DDR_BASE_CS(i));
6359 + u32 size = readl(DDR_SIZE_CS(i));
6360 +
6361 + /*
6362 + * Chip select enabled?
6363 + */
6364 + if (size & 1) {
6365 + struct mbus_dram_window *w;
6366 +
6367 + w = &loki_mbus_dram_info.cs[cs++];
6368 + w->cs_index = i;
6369 + w->mbus_attr = 0xf & ~(1 << i);
6370 + w->base = base & 0xffff0000;
6371 + w->size = (size | 0x0000ffff) + 1;
6372 + }
6373 + }
6374 + loki_mbus_dram_info.num_cs = cs;
6375 +}
6376 +
6377 +void __init loki_setup_dev_boot_win(u32 base, u32 size)
6378 +{
6379 + setup_cpu_win(4, base, size, TARGET_DEV_BUS, ATTR_DEV_BOOT, -1);
6380 +}
6381 --- /dev/null
6382 +++ b/arch/arm/mach-loki/common.c
6383 @@ -0,0 +1,305 @@
6384 +/*
6385 + * arch/arm/mach-loki/common.c
6386 + *
6387 + * Core functions for Marvell Loki (88RC8480) SoCs
6388 + *
6389 + * This file is licensed under the terms of the GNU General Public
6390 + * License version 2. This program is licensed "as is" without any
6391 + * warranty of any kind, whether express or implied.
6392 + */
6393 +
6394 +#include <linux/kernel.h>
6395 +#include <linux/init.h>
6396 +#include <linux/platform_device.h>
6397 +#include <linux/serial_8250.h>
6398 +#include <linux/mbus.h>
6399 +#include <linux/mv643xx_eth.h>
6400 +#include <asm/page.h>
6401 +#include <asm/timex.h>
6402 +#include <asm/mach/map.h>
6403 +#include <asm/mach/time.h>
6404 +#include <asm/arch/loki.h>
6405 +#include <asm/plat-orion/orion_nand.h>
6406 +#include <asm/plat-orion/time.h>
6407 +#include "common.h"
6408 +
6409 +/*****************************************************************************
6410 + * I/O Address Mapping
6411 + ****************************************************************************/
6412 +static struct map_desc loki_io_desc[] __initdata = {
6413 + {
6414 + .virtual = LOKI_REGS_VIRT_BASE,
6415 + .pfn = __phys_to_pfn(LOKI_REGS_PHYS_BASE),
6416 + .length = LOKI_REGS_SIZE,
6417 + .type = MT_DEVICE,
6418 + },
6419 +};
6420 +
6421 +void __init loki_map_io(void)
6422 +{
6423 + iotable_init(loki_io_desc, ARRAY_SIZE(loki_io_desc));
6424 +}
6425 +
6426 +
6427 +/*****************************************************************************
6428 + * GE0
6429 + ****************************************************************************/
6430 +struct mv643xx_eth_shared_platform_data loki_ge0_shared_data = {
6431 + .t_clk = LOKI_TCLK,
6432 + .dram = &loki_mbus_dram_info,
6433 +};
6434 +
6435 +static struct resource loki_ge0_shared_resources[] = {
6436 + {
6437 + .name = "ge0 base",
6438 + .start = GE0_PHYS_BASE + 0x2000,
6439 + .end = GE0_PHYS_BASE + 0x3fff,
6440 + .flags = IORESOURCE_MEM,
6441 + },
6442 +};
6443 +
6444 +static struct platform_device loki_ge0_shared = {
6445 + .name = MV643XX_ETH_SHARED_NAME,
6446 + .id = 0,
6447 + .dev = {
6448 + .platform_data = &loki_ge0_shared_data,
6449 + },
6450 + .num_resources = 1,
6451 + .resource = loki_ge0_shared_resources,
6452 +};
6453 +
6454 +static struct resource loki_ge0_resources[] = {
6455 + {
6456 + .name = "ge0 irq",
6457 + .start = IRQ_LOKI_GBE_A_INT,
6458 + .end = IRQ_LOKI_GBE_A_INT,
6459 + .flags = IORESOURCE_IRQ,
6460 + },
6461 +};
6462 +
6463 +static struct platform_device loki_ge0 = {
6464 + .name = MV643XX_ETH_NAME,
6465 + .id = 0,
6466 + .num_resources = 1,
6467 + .resource = loki_ge0_resources,
6468 +};
6469 +
6470 +void __init loki_ge0_init(struct mv643xx_eth_platform_data *eth_data)
6471 +{
6472 + eth_data->shared = &loki_ge0_shared;
6473 + loki_ge0.dev.platform_data = eth_data;
6474 +
6475 + writel(0x00079220, GE0_VIRT_BASE + 0x20b0);
6476 + platform_device_register(&loki_ge0_shared);
6477 + platform_device_register(&loki_ge0);
6478 +}
6479 +
6480 +
6481 +/*****************************************************************************
6482 + * GE1
6483 + ****************************************************************************/
6484 +struct mv643xx_eth_shared_platform_data loki_ge1_shared_data = {
6485 + .t_clk = LOKI_TCLK,
6486 + .dram = &loki_mbus_dram_info,
6487 +};
6488 +
6489 +static struct resource loki_ge1_shared_resources[] = {
6490 + {
6491 + .name = "ge1 base",
6492 + .start = GE1_PHYS_BASE + 0x2000,
6493 + .end = GE1_PHYS_BASE + 0x3fff,
6494 + .flags = IORESOURCE_MEM,
6495 + },
6496 +};
6497 +
6498 +static struct platform_device loki_ge1_shared = {
6499 + .name = MV643XX_ETH_SHARED_NAME,
6500 + .id = 1,
6501 + .dev = {
6502 + .platform_data = &loki_ge1_shared_data,
6503 + },
6504 + .num_resources = 1,
6505 + .resource = loki_ge1_shared_resources,
6506 +};
6507 +
6508 +static struct resource loki_ge1_resources[] = {
6509 + {
6510 + .name = "ge1 irq",
6511 + .start = IRQ_LOKI_GBE_B_INT,
6512 + .end = IRQ_LOKI_GBE_B_INT,
6513 + .flags = IORESOURCE_IRQ,
6514 + },
6515 +};
6516 +
6517 +static struct platform_device loki_ge1 = {
6518 + .name = MV643XX_ETH_NAME,
6519 + .id = 1,
6520 + .num_resources = 1,
6521 + .resource = loki_ge1_resources,
6522 +};
6523 +
6524 +void __init loki_ge1_init(struct mv643xx_eth_platform_data *eth_data)
6525 +{
6526 + eth_data->shared = &loki_ge1_shared;
6527 + loki_ge1.dev.platform_data = eth_data;
6528 +
6529 + writel(0x00079220, GE1_VIRT_BASE + 0x20b0);
6530 + platform_device_register(&loki_ge1_shared);
6531 + platform_device_register(&loki_ge1);
6532 +}
6533 +
6534 +
6535 +/*****************************************************************************
6536 + * SAS/SATA
6537 + ****************************************************************************/
6538 +static struct resource loki_sas_resources[] = {
6539 + {
6540 + .name = "mvsas0 mem",
6541 + .start = SAS0_PHYS_BASE,
6542 + .end = SAS0_PHYS_BASE + 0x01ff,
6543 + .flags = IORESOURCE_MEM,
6544 + }, {
6545 + .name = "mvsas0 irq",
6546 + .start = IRQ_LOKI_SAS_A,
6547 + .end = IRQ_LOKI_SAS_A,
6548 + .flags = IORESOURCE_IRQ,
6549 + }, {
6550 + .name = "mvsas1 mem",
6551 + .start = SAS1_PHYS_BASE,
6552 + .end = SAS1_PHYS_BASE + 0x01ff,
6553 + .flags = IORESOURCE_MEM,
6554 + }, {
6555 + .name = "mvsas1 irq",
6556 + .start = IRQ_LOKI_SAS_B,
6557 + .end = IRQ_LOKI_SAS_B,
6558 + .flags = IORESOURCE_IRQ,
6559 + },
6560 +};
6561 +
6562 +static struct platform_device loki_sas = {
6563 + .name = "mvsas",
6564 + .id = 0,
6565 + .dev = {
6566 + .coherent_dma_mask = 0xffffffff,
6567 + },
6568 + .num_resources = ARRAY_SIZE(loki_sas_resources),
6569 + .resource = loki_sas_resources,
6570 +};
6571 +
6572 +void __init loki_sas_init(void)
6573 +{
6574 + writel(0x8300f707, DDR_REG(0x1424));
6575 + platform_device_register(&loki_sas);
6576 +}
6577 +
6578 +
6579 +/*****************************************************************************
6580 + * UART0
6581 + ****************************************************************************/
6582 +static struct plat_serial8250_port loki_uart0_data[] = {
6583 + {
6584 + .mapbase = UART0_PHYS_BASE,
6585 + .membase = (char *)UART0_VIRT_BASE,
6586 + .irq = IRQ_LOKI_UART0,
6587 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
6588 + .iotype = UPIO_MEM,
6589 + .regshift = 2,
6590 + .uartclk = LOKI_TCLK,
6591 + }, {
6592 + },
6593 +};
6594 +
6595 +static struct resource loki_uart0_resources[] = {
6596 + {
6597 + .start = UART0_PHYS_BASE,
6598 + .end = UART0_PHYS_BASE + 0xff,
6599 + .flags = IORESOURCE_MEM,
6600 + }, {
6601 + .start = IRQ_LOKI_UART0,
6602 + .end = IRQ_LOKI_UART0,
6603 + .flags = IORESOURCE_IRQ,
6604 + },
6605 +};
6606 +
6607 +static struct platform_device loki_uart0 = {
6608 + .name = "serial8250",
6609 + .id = 0,
6610 + .dev = {
6611 + .platform_data = loki_uart0_data,
6612 + },
6613 + .resource = loki_uart0_resources,
6614 + .num_resources = ARRAY_SIZE(loki_uart0_resources),
6615 +};
6616 +
6617 +void __init loki_uart0_init(void)
6618 +{
6619 + platform_device_register(&loki_uart0);
6620 +}
6621 +
6622 +
6623 +/*****************************************************************************
6624 + * UART1
6625 + ****************************************************************************/
6626 +static struct plat_serial8250_port loki_uart1_data[] = {
6627 + {
6628 + .mapbase = UART1_PHYS_BASE,
6629 + .membase = (char *)UART1_VIRT_BASE,
6630 + .irq = IRQ_LOKI_UART1,
6631 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
6632 + .iotype = UPIO_MEM,
6633 + .regshift = 2,
6634 + .uartclk = LOKI_TCLK,
6635 + }, {
6636 + },
6637 +};
6638 +
6639 +static struct resource loki_uart1_resources[] = {
6640 + {
6641 + .start = UART1_PHYS_BASE,
6642 + .end = UART1_PHYS_BASE + 0xff,
6643 + .flags = IORESOURCE_MEM,
6644 + }, {
6645 + .start = IRQ_LOKI_UART1,
6646 + .end = IRQ_LOKI_UART1,
6647 + .flags = IORESOURCE_IRQ,
6648 + },
6649 +};
6650 +
6651 +static struct platform_device loki_uart1 = {
6652 + .name = "serial8250",
6653 + .id = 1,
6654 + .dev = {
6655 + .platform_data = loki_uart1_data,
6656 + },
6657 + .resource = loki_uart1_resources,
6658 + .num_resources = ARRAY_SIZE(loki_uart1_resources),
6659 +};
6660 +
6661 +void __init loki_uart1_init(void)
6662 +{
6663 + platform_device_register(&loki_uart1);
6664 +}
6665 +
6666 +
6667 +/*****************************************************************************
6668 + * Time handling
6669 + ****************************************************************************/
6670 +static void loki_timer_init(void)
6671 +{
6672 + orion_time_init(IRQ_LOKI_BRIDGE, LOKI_TCLK);
6673 +}
6674 +
6675 +struct sys_timer loki_timer = {
6676 + .init = loki_timer_init,
6677 +};
6678 +
6679 +
6680 +/*****************************************************************************
6681 + * General
6682 + ****************************************************************************/
6683 +void __init loki_init(void)
6684 +{
6685 + printk(KERN_INFO "Loki ID: 88RC8480. TCLK=%d.\n", LOKI_TCLK);
6686 +
6687 + loki_setup_cpu_mbus();
6688 +}
6689 --- /dev/null
6690 +++ b/arch/arm/mach-loki/common.h
6691 @@ -0,0 +1,36 @@
6692 +/*
6693 + * arch/arm/mach-loki/common.h
6694 + *
6695 + * Core functions for Marvell Loki (88RC8480) SoCs
6696 + *
6697 + * This file is licensed under the terms of the GNU General Public
6698 + * License version 2. This program is licensed "as is" without any
6699 + * warranty of any kind, whether express or implied.
6700 + */
6701 +
6702 +#ifndef __ARCH_LOKI_COMMON_H
6703 +#define __ARCH_LOKI_COMMON_H
6704 +
6705 +struct mv643xx_eth_platform_data;
6706 +
6707 +/*
6708 + * Basic Loki init functions used early by machine-setup.
6709 + */
6710 +void loki_map_io(void);
6711 +void loki_init(void);
6712 +void loki_init_irq(void);
6713 +
6714 +extern struct mbus_dram_target_info loki_mbus_dram_info;
6715 +void loki_setup_cpu_mbus(void);
6716 +void loki_setup_dev_boot_win(u32 base, u32 size);
6717 +
6718 +void loki_ge0_init(struct mv643xx_eth_platform_data *eth_data);
6719 +void loki_ge1_init(struct mv643xx_eth_platform_data *eth_data);
6720 +void loki_sas_init(void);
6721 +void loki_uart0_init(void);
6722 +void loki_uart1_init(void);
6723 +
6724 +extern struct sys_timer loki_timer;
6725 +
6726 +
6727 +#endif
6728 --- /dev/null
6729 +++ b/arch/arm/mach-loki/irq.c
6730 @@ -0,0 +1,21 @@
6731 +/*
6732 + * arch/arm/mach-loki/irq.c
6733 + *
6734 + * Marvell Loki (88RC8480) IRQ handling.
6735 + *
6736 + * This file is licensed under the terms of the GNU General Public
6737 + * License version 2. This program is licensed "as is" without any
6738 + * warranty of any kind, whether express or implied.
6739 + */
6740 +
6741 +#include <linux/kernel.h>
6742 +#include <linux/init.h>
6743 +#include <linux/irq.h>
6744 +#include <asm/io.h>
6745 +#include <asm/plat-orion/irq.h>
6746 +#include "common.h"
6747 +
6748 +void __init loki_init_irq(void)
6749 +{
6750 + orion_irq_init(0, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_OFF));
6751 +}
6752 --- /dev/null
6753 +++ b/arch/arm/mach-loki/lb88rc8480-setup.c
6754 @@ -0,0 +1,100 @@
6755 +/*
6756 + * arch/arm/mach-loki/lb88rc8480-setup.c
6757 + *
6758 + * Marvell LB88RC8480 Development Board Setup
6759 + *
6760 + * This file is licensed under the terms of the GNU General Public
6761 + * License version 2. This program is licensed "as is" without any
6762 + * warranty of any kind, whether express or implied.
6763 + */
6764 +
6765 +#include <linux/kernel.h>
6766 +#include <linux/init.h>
6767 +#include <linux/platform_device.h>
6768 +#include <linux/irq.h>
6769 +#include <linux/mtd/physmap.h>
6770 +#include <linux/mtd/nand.h>
6771 +#include <linux/timer.h>
6772 +#include <linux/ata_platform.h>
6773 +#include <linux/mv643xx_eth.h>
6774 +#include <asm/mach-types.h>
6775 +#include <asm/mach/arch.h>
6776 +#include <asm/arch/loki.h>
6777 +#include "common.h"
6778 +
6779 +#define LB88RC8480_FLASH_BOOT_CS_BASE 0xf8000000
6780 +#define LB88RC8480_FLASH_BOOT_CS_SIZE SZ_128M
6781 +
6782 +#define LB88RC8480_NOR_BOOT_BASE 0xff000000
6783 +#define LB88RC8480_NOR_BOOT_SIZE SZ_16M
6784 +
6785 +static struct mtd_partition lb88rc8480_boot_flash_parts[] = {
6786 + {
6787 + .name = "kernel",
6788 + .offset = 0,
6789 + .size = SZ_2M,
6790 + }, {
6791 + .name = "root-fs",
6792 + .offset = SZ_2M,
6793 + .size = (SZ_8M + SZ_4M + SZ_1M),
6794 + }, {
6795 + .name = "u-boot",
6796 + .offset = (SZ_8M + SZ_4M + SZ_2M + SZ_1M),
6797 + .size = SZ_1M,
6798 + },
6799 +};
6800 +
6801 +static struct physmap_flash_data lb88rc8480_boot_flash_data = {
6802 + .parts = lb88rc8480_boot_flash_parts,
6803 + .nr_parts = ARRAY_SIZE(lb88rc8480_boot_flash_parts),
6804 + .width = 1, /* 8 bit bus width */
6805 +};
6806 +
6807 +static struct resource lb88rc8480_boot_flash_resource = {
6808 + .flags = IORESOURCE_MEM,
6809 + .start = LB88RC8480_NOR_BOOT_BASE,
6810 + .end = LB88RC8480_NOR_BOOT_BASE + LB88RC8480_NOR_BOOT_SIZE - 1,
6811 +};
6812 +
6813 +static struct platform_device lb88rc8480_boot_flash = {
6814 + .name = "physmap-flash",
6815 + .id = 0,
6816 + .dev = {
6817 + .platform_data = &lb88rc8480_boot_flash_data,
6818 + },
6819 + .num_resources = 1,
6820 + .resource = &lb88rc8480_boot_flash_resource,
6821 +};
6822 +
6823 +static struct mv643xx_eth_platform_data lb88rc8480_ge0_data = {
6824 + .phy_addr = 1,
6825 + .mac_addr = { 0x00, 0x50, 0x43, 0x11, 0x22, 0x33 },
6826 +};
6827 +
6828 +static void __init lb88rc8480_init(void)
6829 +{
6830 + /*
6831 + * Basic setup. Needs to be called early.
6832 + */
6833 + loki_init();
6834 +
6835 + loki_ge0_init(&lb88rc8480_ge0_data);
6836 + loki_sas_init();
6837 + loki_uart0_init();
6838 + loki_uart1_init();
6839 +
6840 + loki_setup_dev_boot_win(LB88RC8480_FLASH_BOOT_CS_BASE,
6841 + LB88RC8480_FLASH_BOOT_CS_SIZE);
6842 + platform_device_register(&lb88rc8480_boot_flash);
6843 +}
6844 +
6845 +MACHINE_START(LB88RC8480, "Marvell LB88RC8480 Development Board")
6846 + /* Maintainer: Ke Wei <kewei@marvell.com> */
6847 + .phys_io = LOKI_REGS_PHYS_BASE,
6848 + .io_pg_offst = ((LOKI_REGS_VIRT_BASE) >> 18) & 0xfffc,
6849 + .boot_params = 0x00000100,
6850 + .init_machine = lb88rc8480_init,
6851 + .map_io = loki_map_io,
6852 + .init_irq = loki_init_irq,
6853 + .timer = &loki_timer,
6854 +MACHINE_END
6855 --- /dev/null
6856 +++ b/arch/arm/mach-mv78xx0/Kconfig
6857 @@ -0,0 +1,13 @@
6858 +if ARCH_MV78XX0
6859 +
6860 +menu "Marvell MV78xx0 Implementations"
6861 +
6862 +config MACH_DB78X00_BP
6863 + bool "Marvell DB-78x00-BP Development Board"
6864 + help
6865 + Say 'Y' here if you want your kernel to support the
6866 + Marvell DB-78x00-BP Development Board.
6867 +
6868 +endmenu
6869 +
6870 +endif
6871 --- /dev/null
6872 +++ b/arch/arm/mach-mv78xx0/Makefile
6873 @@ -0,0 +1,2 @@
6874 +obj-y += common.o addr-map.o irq.o pcie.o
6875 +obj-$(CONFIG_MACH_DB78X00_BP) += db78x00-bp-setup.o
6876 --- /dev/null
6877 +++ b/arch/arm/mach-mv78xx0/Makefile.boot
6878 @@ -0,0 +1,3 @@
6879 + zreladdr-y := 0x00008000
6880 +params_phys-y := 0x00000100
6881 +initrd_phys-y := 0x00800000
6882 --- /dev/null
6883 +++ b/arch/arm/mach-mv78xx0/addr-map.c
6884 @@ -0,0 +1,156 @@
6885 +/*
6886 + * arch/arm/mach-mv78xx0/addr-map.c
6887 + *
6888 + * Address map functions for Marvell MV78xx0 SoCs
6889 + *
6890 + * This file is licensed under the terms of the GNU General Public
6891 + * License version 2. This program is licensed "as is" without any
6892 + * warranty of any kind, whether express or implied.
6893 + */
6894 +
6895 +#include <linux/kernel.h>
6896 +#include <linux/init.h>
6897 +#include <linux/mbus.h>
6898 +#include <asm/io.h>
6899 +#include "common.h"
6900 +
6901 +/*
6902 + * Generic Address Decode Windows bit settings
6903 + */
6904 +#define TARGET_DDR 0
6905 +#define TARGET_DEV_BUS 1
6906 +#define TARGET_PCIE0 4
6907 +#define TARGET_PCIE1 8
6908 +#define TARGET_PCIE(i) ((i) ? TARGET_PCIE1 : TARGET_PCIE0)
6909 +#define ATTR_DEV_SPI_ROM 0x1f
6910 +#define ATTR_DEV_BOOT 0x2f
6911 +#define ATTR_DEV_CS3 0x37
6912 +#define ATTR_DEV_CS2 0x3b
6913 +#define ATTR_DEV_CS1 0x3d
6914 +#define ATTR_DEV_CS0 0x3e
6915 +#define ATTR_PCIE_IO(l) (0xf0 & ~(0x10 << (l)))
6916 +#define ATTR_PCIE_MEM(l) (0xf8 & ~(0x10 << (l)))
6917 +
6918 +/*
6919 + * Helpers to get DDR bank info
6920 + */
6921 +#define DDR_BASE_CS_OFF(n) (0x0000 + ((n) << 3))
6922 +#define DDR_SIZE_CS_OFF(n) (0x0004 + ((n) << 3))
6923 +
6924 +/*
6925 + * CPU Address Decode Windows registers
6926 + */
6927 +#define WIN0_OFF(n) (BRIDGE_VIRT_BASE + 0x0000 + ((n) << 4))
6928 +#define WIN8_OFF(n) (BRIDGE_VIRT_BASE + 0x0900 + (((n) - 8) << 4))
6929 +#define WIN_CTRL_OFF 0x0000
6930 +#define WIN_BASE_OFF 0x0004
6931 +#define WIN_REMAP_LO_OFF 0x0008
6932 +#define WIN_REMAP_HI_OFF 0x000c
6933 +
6934 +
6935 +struct mbus_dram_target_info mv78xx0_mbus_dram_info;
6936 +
6937 +static void __init __iomem *win_cfg_base(int win)
6938 +{
6939 + /*
6940 + * Find the control register base address for this window.
6941 + *
6942 + * BRIDGE_VIRT_BASE points to the right (CPU0's or CPU1's)
6943 + * MBUS bridge depending on which CPU core we're running on,
6944 + * so we don't need to take that into account here.
6945 + */
6946 +
6947 + return (void __iomem *)((win < 8) ? WIN0_OFF(win) : WIN8_OFF(win));
6948 +}
6949 +
6950 +static int __init cpu_win_can_remap(int win)
6951 +{
6952 + if (win < 8)
6953 + return 1;
6954 +
6955 + return 0;
6956 +}
6957 +
6958 +static void __init setup_cpu_win(int win, u32 base, u32 size,
6959 + u8 target, u8 attr, int remap)
6960 +{
6961 + void __iomem *addr = win_cfg_base(win);
6962 + u32 ctrl;
6963 +
6964 + base &= 0xffff0000;
6965 + ctrl = ((size - 1) & 0xffff0000) | (attr << 8) | (target << 4) | 1;
6966 +
6967 + writel(base, addr + WIN_BASE_OFF);
6968 + writel(ctrl, addr + WIN_CTRL_OFF);
6969 + if (cpu_win_can_remap(win)) {
6970 + if (remap < 0)
6971 + remap = base;
6972 +
6973 + writel(remap & 0xffff0000, addr + WIN_REMAP_LO_OFF);
6974 + writel(0, addr + WIN_REMAP_HI_OFF);
6975 + }
6976 +}
6977 +
6978 +void __init mv78xx0_setup_cpu_mbus(void)
6979 +{
6980 + void __iomem *addr;
6981 + int i;
6982 + int cs;
6983 +
6984 + /*
6985 + * First, disable and clear windows.
6986 + */
6987 + for (i = 0; i < 14; i++) {
6988 + addr = win_cfg_base(i);
6989 +
6990 + writel(0, addr + WIN_BASE_OFF);
6991 + writel(0, addr + WIN_CTRL_OFF);
6992 + if (cpu_win_can_remap(i)) {
6993 + writel(0, addr + WIN_REMAP_LO_OFF);
6994 + writel(0, addr + WIN_REMAP_HI_OFF);
6995 + }
6996 + }
6997 +
6998 + /*
6999 + * Setup MBUS dram target info.
7000 + */
7001 + mv78xx0_mbus_dram_info.mbus_dram_target_id = TARGET_DDR;
7002 +
7003 + if (mv78xx0_core_index() == 0)
7004 + addr = (void __iomem *)DDR_WINDOW_CPU0_BASE;
7005 + else
7006 + addr = (void __iomem *)DDR_WINDOW_CPU1_BASE;
7007 +
7008 + for (i = 0, cs = 0; i < 4; i++) {
7009 + u32 base = readl(addr + DDR_BASE_CS_OFF(i));
7010 + u32 size = readl(addr + DDR_SIZE_CS_OFF(i));
7011 +
7012 + /*
7013 + * Chip select enabled?
7014 + */
7015 + if (size & 1) {
7016 + struct mbus_dram_window *w;
7017 +
7018 + w = &mv78xx0_mbus_dram_info.cs[cs++];
7019 + w->cs_index = i;
7020 + w->mbus_attr = 0xf & ~(1 << i);
7021 + w->base = base & 0xffff0000;
7022 + w->size = (size | 0x0000ffff) + 1;
7023 + }
7024 + }
7025 + mv78xx0_mbus_dram_info.num_cs = cs;
7026 +}
7027 +
7028 +void __init mv78xx0_setup_pcie_io_win(int window, u32 base, u32 size,
7029 + int maj, int min)
7030 +{
7031 + setup_cpu_win(window, base, size, TARGET_PCIE(maj),
7032 + ATTR_PCIE_IO(min), -1);
7033 +}
7034 +
7035 +void __init mv78xx0_setup_pcie_mem_win(int window, u32 base, u32 size,
7036 + int maj, int min)
7037 +{
7038 + setup_cpu_win(window, base, size, TARGET_PCIE(maj),
7039 + ATTR_PCIE_MEM(min), -1);
7040 +}
7041 --- /dev/null
7042 +++ b/arch/arm/mach-mv78xx0/common.c
7043 @@ -0,0 +1,754 @@
7044 +/*
7045 + * arch/arm/mach-mv78xx0/common.c
7046 + *
7047 + * Core functions for Marvell MV78xx0 SoCs
7048 + *
7049 + * This file is licensed under the terms of the GNU General Public
7050 + * License version 2. This program is licensed "as is" without any
7051 + * warranty of any kind, whether express or implied.
7052 + */
7053 +
7054 +#include <linux/kernel.h>
7055 +#include <linux/init.h>
7056 +#include <linux/platform_device.h>
7057 +#include <linux/serial_8250.h>
7058 +#include <linux/mbus.h>
7059 +#include <linux/mv643xx_eth.h>
7060 +#include <linux/ata_platform.h>
7061 +#include <asm/mach/map.h>
7062 +#include <asm/mach/time.h>
7063 +#include <asm/arch/mv78xx0.h>
7064 +#include <asm/plat-orion/cache-feroceon-l2.h>
7065 +#include <asm/plat-orion/ehci-orion.h>
7066 +#include <asm/plat-orion/orion_nand.h>
7067 +#include <asm/plat-orion/time.h>
7068 +#include "common.h"
7069 +
7070 +
7071 +/*****************************************************************************
7072 + * Common bits
7073 + ****************************************************************************/
7074 +int mv78xx0_core_index(void)
7075 +{
7076 + u32 extra;
7077 +
7078 + /*
7079 + * Read Extra Features register.
7080 + */
7081 + __asm__("mrc p15, 1, %0, c15, c1, 0" : "=r" (extra));
7082 +
7083 + return !!(extra & 0x00004000);
7084 +}
7085 +
7086 +static int get_hclk(void)
7087 +{
7088 + int hclk;
7089 +
7090 + /*
7091 + * HCLK tick rate is configured by DEV_D[7:5] pins.
7092 + */
7093 + switch ((readl(SAMPLE_AT_RESET_LOW) >> 5) & 7) {
7094 + case 0:
7095 + hclk = 166666667;
7096 + break;
7097 + case 1:
7098 + hclk = 200000000;
7099 + break;
7100 + case 2:
7101 + hclk = 266666667;
7102 + break;
7103 + case 3:
7104 + hclk = 333333333;
7105 + break;
7106 + case 4:
7107 + hclk = 400000000;
7108 + break;
7109 + default:
7110 + panic("unknown HCLK PLL setting: %.8x\n",
7111 + readl(SAMPLE_AT_RESET_LOW));
7112 + }
7113 +
7114 + return hclk;
7115 +}
7116 +
7117 +static void get_pclk_l2clk(int hclk, int core_index, int *pclk, int *l2clk)
7118 +{
7119 + u32 cfg;
7120 +
7121 + /*
7122 + * Core #0 PCLK/L2CLK is configured by bits [13:8], core #1
7123 + * PCLK/L2CLK by bits [19:14].
7124 + */
7125 + if (core_index == 0) {
7126 + cfg = (readl(SAMPLE_AT_RESET_LOW) >> 8) & 0x3f;
7127 + } else {
7128 + cfg = (readl(SAMPLE_AT_RESET_LOW) >> 14) & 0x3f;
7129 + }
7130 +
7131 + /*
7132 + * Bits [11:8] ([17:14] for core #1) configure the PCLK:HCLK
7133 + * ratio (1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6).
7134 + */
7135 + *pclk = ((u64)hclk * (2 + (cfg & 0xf))) >> 1;
7136 +
7137 + /*
7138 + * Bits [13:12] ([19:18] for core #1) configure the PCLK:L2CLK
7139 + * ratio (1, 2, 3).
7140 + */
7141 + *l2clk = *pclk / (((cfg >> 4) & 3) + 1);
7142 +}
7143 +
7144 +static int get_tclk(void)
7145 +{
7146 + int tclk;
7147 +
7148 + /*
7149 + * TCLK tick rate is configured by DEV_A[2:0] strap pins.
7150 + */
7151 + switch ((readl(SAMPLE_AT_RESET_HIGH) >> 6) & 7) {
7152 + case 1:
7153 + tclk = 166666667;
7154 + break;
7155 + case 3:
7156 + tclk = 200000000;
7157 + break;
7158 + default:
7159 + panic("unknown TCLK PLL setting: %.8x\n",
7160 + readl(SAMPLE_AT_RESET_HIGH));
7161 + }
7162 +
7163 + return tclk;
7164 +}
7165 +
7166 +
7167 +/*****************************************************************************
7168 + * I/O Address Mapping
7169 + ****************************************************************************/
7170 +static struct map_desc mv78xx0_io_desc[] __initdata = {
7171 + {
7172 + .virtual = MV78XX0_CORE_REGS_VIRT_BASE,
7173 + .pfn = 0,
7174 + .length = MV78XX0_CORE_REGS_SIZE,
7175 + .type = MT_DEVICE,
7176 + }, {
7177 + .virtual = MV78XX0_PCIE_IO_VIRT_BASE(0),
7178 + .pfn = __phys_to_pfn(MV78XX0_PCIE_IO_PHYS_BASE(0)),
7179 + .length = MV78XX0_PCIE_IO_SIZE * 8,
7180 + .type = MT_DEVICE,
7181 + }, {
7182 + .virtual = MV78XX0_REGS_VIRT_BASE,
7183 + .pfn = __phys_to_pfn(MV78XX0_REGS_PHYS_BASE),
7184 + .length = MV78XX0_REGS_SIZE,
7185 + .type = MT_DEVICE,
7186 + },
7187 +};
7188 +
7189 +void __init mv78xx0_map_io(void)
7190 +{
7191 + unsigned long phys;
7192 +
7193 + /*
7194 + * Map the right set of per-core registers depending on
7195 + * which core we are running on.
7196 + */
7197 + if (mv78xx0_core_index() == 0) {
7198 + phys = MV78XX0_CORE0_REGS_PHYS_BASE;
7199 + } else {
7200 + phys = MV78XX0_CORE1_REGS_PHYS_BASE;
7201 + }
7202 + mv78xx0_io_desc[0].pfn = __phys_to_pfn(phys);
7203 +
7204 + iotable_init(mv78xx0_io_desc, ARRAY_SIZE(mv78xx0_io_desc));
7205 +}
7206 +
7207 +
7208 +/*****************************************************************************
7209 + * EHCI
7210 + ****************************************************************************/
7211 +static struct orion_ehci_data mv78xx0_ehci_data = {
7212 + .dram = &mv78xx0_mbus_dram_info,
7213 +};
7214 +
7215 +static u64 ehci_dmamask = 0xffffffffUL;
7216 +
7217 +
7218 +/*****************************************************************************
7219 + * EHCI0
7220 + ****************************************************************************/
7221 +static struct resource mv78xx0_ehci0_resources[] = {
7222 + {
7223 + .start = USB0_PHYS_BASE,
7224 + .end = USB0_PHYS_BASE + 0x0fff,
7225 + .flags = IORESOURCE_MEM,
7226 + }, {
7227 + .start = IRQ_MV78XX0_USB_0,
7228 + .end = IRQ_MV78XX0_USB_0,
7229 + .flags = IORESOURCE_IRQ,
7230 + },
7231 +};
7232 +
7233 +static struct platform_device mv78xx0_ehci0 = {
7234 + .name = "orion-ehci",
7235 + .id = 0,
7236 + .dev = {
7237 + .dma_mask = &ehci_dmamask,
7238 + .coherent_dma_mask = 0xffffffff,
7239 + .platform_data = &mv78xx0_ehci_data,
7240 + },
7241 + .resource = mv78xx0_ehci0_resources,
7242 + .num_resources = ARRAY_SIZE(mv78xx0_ehci0_resources),
7243 +};
7244 +
7245 +void __init mv78xx0_ehci0_init(void)
7246 +{
7247 + platform_device_register(&mv78xx0_ehci0);
7248 +}
7249 +
7250 +
7251 +/*****************************************************************************
7252 + * EHCI1
7253 + ****************************************************************************/
7254 +static struct resource mv78xx0_ehci1_resources[] = {
7255 + {
7256 + .start = USB1_PHYS_BASE,
7257 + .end = USB1_PHYS_BASE + 0x0fff,
7258 + .flags = IORESOURCE_MEM,
7259 + }, {
7260 + .start = IRQ_MV78XX0_USB_1,
7261 + .end = IRQ_MV78XX0_USB_1,
7262 + .flags = IORESOURCE_IRQ,
7263 + },
7264 +};
7265 +
7266 +static struct platform_device mv78xx0_ehci1 = {
7267 + .name = "orion-ehci",
7268 + .id = 1,
7269 + .dev = {
7270 + .dma_mask = &ehci_dmamask,
7271 + .coherent_dma_mask = 0xffffffff,
7272 + .platform_data = &mv78xx0_ehci_data,
7273 + },
7274 + .resource = mv78xx0_ehci1_resources,
7275 + .num_resources = ARRAY_SIZE(mv78xx0_ehci1_resources),
7276 +};
7277 +
7278 +void __init mv78xx0_ehci1_init(void)
7279 +{
7280 + platform_device_register(&mv78xx0_ehci1);
7281 +}
7282 +
7283 +
7284 +/*****************************************************************************
7285 + * EHCI2
7286 + ****************************************************************************/
7287 +static struct resource mv78xx0_ehci2_resources[] = {
7288 + {
7289 + .start = USB2_PHYS_BASE,
7290 + .end = USB2_PHYS_BASE + 0x0fff,
7291 + .flags = IORESOURCE_MEM,
7292 + }, {
7293 + .start = IRQ_MV78XX0_USB_2,
7294 + .end = IRQ_MV78XX0_USB_2,
7295 + .flags = IORESOURCE_IRQ,
7296 + },
7297 +};
7298 +
7299 +static struct platform_device mv78xx0_ehci2 = {
7300 + .name = "orion-ehci",
7301 + .id = 2,
7302 + .dev = {
7303 + .dma_mask = &ehci_dmamask,
7304 + .coherent_dma_mask = 0xffffffff,
7305 + .platform_data = &mv78xx0_ehci_data,
7306 + },
7307 + .resource = mv78xx0_ehci2_resources,
7308 + .num_resources = ARRAY_SIZE(mv78xx0_ehci2_resources),
7309 +};
7310 +
7311 +void __init mv78xx0_ehci2_init(void)
7312 +{
7313 + platform_device_register(&mv78xx0_ehci2);
7314 +}
7315 +
7316 +
7317 +/*****************************************************************************
7318 + * GE00
7319 + ****************************************************************************/
7320 +struct mv643xx_eth_shared_platform_data mv78xx0_ge00_shared_data = {
7321 + .t_clk = 0,
7322 + .dram = &mv78xx0_mbus_dram_info,
7323 +};
7324 +
7325 +static struct resource mv78xx0_ge00_shared_resources[] = {
7326 + {
7327 + .name = "ge00 base",
7328 + .start = GE00_PHYS_BASE + 0x2000,
7329 + .end = GE00_PHYS_BASE + 0x3fff,
7330 + .flags = IORESOURCE_MEM,
7331 + },
7332 +};
7333 +
7334 +static struct platform_device mv78xx0_ge00_shared = {
7335 + .name = MV643XX_ETH_SHARED_NAME,
7336 + .id = 0,
7337 + .dev = {
7338 + .platform_data = &mv78xx0_ge00_shared_data,
7339 + },
7340 + .num_resources = 1,
7341 + .resource = mv78xx0_ge00_shared_resources,
7342 +};
7343 +
7344 +static struct resource mv78xx0_ge00_resources[] = {
7345 + {
7346 + .name = "ge00 irq",
7347 + .start = IRQ_MV78XX0_GE00_SUM,
7348 + .end = IRQ_MV78XX0_GE00_SUM,
7349 + .flags = IORESOURCE_IRQ,
7350 + },
7351 +};
7352 +
7353 +static struct platform_device mv78xx0_ge00 = {
7354 + .name = MV643XX_ETH_NAME,
7355 + .id = 0,
7356 + .num_resources = 1,
7357 + .resource = mv78xx0_ge00_resources,
7358 +};
7359 +
7360 +void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data)
7361 +{
7362 + eth_data->shared = &mv78xx0_ge00_shared;
7363 + mv78xx0_ge00.dev.platform_data = eth_data;
7364 +
7365 + platform_device_register(&mv78xx0_ge00_shared);
7366 + platform_device_register(&mv78xx0_ge00);
7367 +}
7368 +
7369 +
7370 +/*****************************************************************************
7371 + * GE01
7372 + ****************************************************************************/
7373 +struct mv643xx_eth_shared_platform_data mv78xx0_ge01_shared_data = {
7374 + .t_clk = 0,
7375 + .dram = &mv78xx0_mbus_dram_info,
7376 +};
7377 +
7378 +static struct resource mv78xx0_ge01_shared_resources[] = {
7379 + {
7380 + .name = "ge01 base",
7381 + .start = GE01_PHYS_BASE + 0x2000,
7382 + .end = GE01_PHYS_BASE + 0x3fff,
7383 + .flags = IORESOURCE_MEM,
7384 + },
7385 +};
7386 +
7387 +static struct platform_device mv78xx0_ge01_shared = {
7388 + .name = MV643XX_ETH_SHARED_NAME,
7389 + .id = 1,
7390 + .dev = {
7391 + .platform_data = &mv78xx0_ge01_shared_data,
7392 + },
7393 + .num_resources = 1,
7394 + .resource = mv78xx0_ge01_shared_resources,
7395 +};
7396 +
7397 +static struct resource mv78xx0_ge01_resources[] = {
7398 + {
7399 + .name = "ge01 irq",
7400 + .start = IRQ_MV78XX0_GE01_SUM,
7401 + .end = IRQ_MV78XX0_GE01_SUM,
7402 + .flags = IORESOURCE_IRQ,
7403 + },
7404 +};
7405 +
7406 +static struct platform_device mv78xx0_ge01 = {
7407 + .name = MV643XX_ETH_NAME,
7408 + .id = 1,
7409 + .num_resources = 1,
7410 + .resource = mv78xx0_ge01_resources,
7411 +};
7412 +
7413 +void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data)
7414 +{
7415 + eth_data->shared = &mv78xx0_ge01_shared;
7416 + eth_data->shared_smi = &mv78xx0_ge00_shared;
7417 + mv78xx0_ge01.dev.platform_data = eth_data;
7418 +
7419 + platform_device_register(&mv78xx0_ge01_shared);
7420 + platform_device_register(&mv78xx0_ge01);
7421 +}
7422 +
7423 +
7424 +/*****************************************************************************
7425 + * GE10
7426 + ****************************************************************************/
7427 +struct mv643xx_eth_shared_platform_data mv78xx0_ge10_shared_data = {
7428 + .t_clk = 0,
7429 + .dram = &mv78xx0_mbus_dram_info,
7430 +};
7431 +
7432 +static struct resource mv78xx0_ge10_shared_resources[] = {
7433 + {
7434 + .name = "ge10 base",
7435 + .start = GE10_PHYS_BASE + 0x2000,
7436 + .end = GE10_PHYS_BASE + 0x3fff,
7437 + .flags = IORESOURCE_MEM,
7438 + },
7439 +};
7440 +
7441 +static struct platform_device mv78xx0_ge10_shared = {
7442 + .name = MV643XX_ETH_SHARED_NAME,
7443 + .id = 2,
7444 + .dev = {
7445 + .platform_data = &mv78xx0_ge10_shared_data,
7446 + },
7447 + .num_resources = 1,
7448 + .resource = mv78xx0_ge10_shared_resources,
7449 +};
7450 +
7451 +static struct resource mv78xx0_ge10_resources[] = {
7452 + {
7453 + .name = "ge10 irq",
7454 + .start = IRQ_MV78XX0_GE10_SUM,
7455 + .end = IRQ_MV78XX0_GE10_SUM,
7456 + .flags = IORESOURCE_IRQ,
7457 + },
7458 +};
7459 +
7460 +static struct platform_device mv78xx0_ge10 = {
7461 + .name = MV643XX_ETH_NAME,
7462 + .id = 2,
7463 + .num_resources = 1,
7464 + .resource = mv78xx0_ge10_resources,
7465 +};
7466 +
7467 +void __init mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data)
7468 +{
7469 + eth_data->shared = &mv78xx0_ge10_shared;
7470 + eth_data->shared_smi = &mv78xx0_ge00_shared;
7471 + mv78xx0_ge10.dev.platform_data = eth_data;
7472 +
7473 + platform_device_register(&mv78xx0_ge10_shared);
7474 + platform_device_register(&mv78xx0_ge10);
7475 +}
7476 +
7477 +
7478 +/*****************************************************************************
7479 + * GE11
7480 + ****************************************************************************/
7481 +struct mv643xx_eth_shared_platform_data mv78xx0_ge11_shared_data = {
7482 + .t_clk = 0,
7483 + .dram = &mv78xx0_mbus_dram_info,
7484 +};
7485 +
7486 +static struct resource mv78xx0_ge11_shared_resources[] = {
7487 + {
7488 + .name = "ge11 base",
7489 + .start = GE11_PHYS_BASE + 0x2000,
7490 + .end = GE11_PHYS_BASE + 0x3fff,
7491 + .flags = IORESOURCE_MEM,
7492 + },
7493 +};
7494 +
7495 +static struct platform_device mv78xx0_ge11_shared = {
7496 + .name = MV643XX_ETH_SHARED_NAME,
7497 + .id = 3,
7498 + .dev = {
7499 + .platform_data = &mv78xx0_ge11_shared_data,
7500 + },
7501 + .num_resources = 1,
7502 + .resource = mv78xx0_ge11_shared_resources,
7503 +};
7504 +
7505 +static struct resource mv78xx0_ge11_resources[] = {
7506 + {
7507 + .name = "ge11 irq",
7508 + .start = IRQ_MV78XX0_GE11_SUM,
7509 + .end = IRQ_MV78XX0_GE11_SUM,
7510 + .flags = IORESOURCE_IRQ,
7511 + },
7512 +};
7513 +
7514 +static struct platform_device mv78xx0_ge11 = {
7515 + .name = MV643XX_ETH_NAME,
7516 + .id = 3,
7517 + .num_resources = 1,
7518 + .resource = mv78xx0_ge11_resources,
7519 +};
7520 +
7521 +void __init mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data)
7522 +{
7523 + eth_data->shared = &mv78xx0_ge11_shared;
7524 + eth_data->shared_smi = &mv78xx0_ge00_shared;
7525 + mv78xx0_ge11.dev.platform_data = eth_data;
7526 +
7527 + platform_device_register(&mv78xx0_ge11_shared);
7528 + platform_device_register(&mv78xx0_ge11);
7529 +}
7530 +
7531 +
7532 +/*****************************************************************************
7533 + * SATA
7534 + ****************************************************************************/
7535 +static struct resource mv78xx0_sata_resources[] = {
7536 + {
7537 + .name = "sata base",
7538 + .start = SATA_PHYS_BASE,
7539 + .end = SATA_PHYS_BASE + 0x5000 - 1,
7540 + .flags = IORESOURCE_MEM,
7541 + }, {
7542 + .name = "sata irq",
7543 + .start = IRQ_MV78XX0_SATA,
7544 + .end = IRQ_MV78XX0_SATA,
7545 + .flags = IORESOURCE_IRQ,
7546 + },
7547 +};
7548 +
7549 +static struct platform_device mv78xx0_sata = {
7550 + .name = "sata_mv",
7551 + .id = 0,
7552 + .dev = {
7553 + .coherent_dma_mask = 0xffffffff,
7554 + },
7555 + .num_resources = ARRAY_SIZE(mv78xx0_sata_resources),
7556 + .resource = mv78xx0_sata_resources,
7557 +};
7558 +
7559 +void __init mv78xx0_sata_init(struct mv_sata_platform_data *sata_data)
7560 +{
7561 + sata_data->dram = &mv78xx0_mbus_dram_info;
7562 + mv78xx0_sata.dev.platform_data = sata_data;
7563 + platform_device_register(&mv78xx0_sata);
7564 +}
7565 +
7566 +
7567 +/*****************************************************************************
7568 + * UART0
7569 + ****************************************************************************/
7570 +static struct plat_serial8250_port mv78xx0_uart0_data[] = {
7571 + {
7572 + .mapbase = UART0_PHYS_BASE,
7573 + .membase = (char *)UART0_VIRT_BASE,
7574 + .irq = IRQ_MV78XX0_UART_0,
7575 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
7576 + .iotype = UPIO_MEM,
7577 + .regshift = 2,
7578 + .uartclk = 0,
7579 + }, {
7580 + },
7581 +};
7582 +
7583 +static struct resource mv78xx0_uart0_resources[] = {
7584 + {
7585 + .start = UART0_PHYS_BASE,
7586 + .end = UART0_PHYS_BASE + 0xff,
7587 + .flags = IORESOURCE_MEM,
7588 + }, {
7589 + .start = IRQ_MV78XX0_UART_0,
7590 + .end = IRQ_MV78XX0_UART_0,
7591 + .flags = IORESOURCE_IRQ,
7592 + },
7593 +};
7594 +
7595 +static struct platform_device mv78xx0_uart0 = {
7596 + .name = "serial8250",
7597 + .id = 0,
7598 + .dev = {
7599 + .platform_data = mv78xx0_uart0_data,
7600 + },
7601 + .resource = mv78xx0_uart0_resources,
7602 + .num_resources = ARRAY_SIZE(mv78xx0_uart0_resources),
7603 +};
7604 +
7605 +void __init mv78xx0_uart0_init(void)
7606 +{
7607 + platform_device_register(&mv78xx0_uart0);
7608 +}
7609 +
7610 +
7611 +/*****************************************************************************
7612 + * UART1
7613 + ****************************************************************************/
7614 +static struct plat_serial8250_port mv78xx0_uart1_data[] = {
7615 + {
7616 + .mapbase = UART1_PHYS_BASE,
7617 + .membase = (char *)UART1_VIRT_BASE,
7618 + .irq = IRQ_MV78XX0_UART_1,
7619 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
7620 + .iotype = UPIO_MEM,
7621 + .regshift = 2,
7622 + .uartclk = 0,
7623 + }, {
7624 + },
7625 +};
7626 +
7627 +static struct resource mv78xx0_uart1_resources[] = {
7628 + {
7629 + .start = UART1_PHYS_BASE,
7630 + .end = UART1_PHYS_BASE + 0xff,
7631 + .flags = IORESOURCE_MEM,
7632 + }, {
7633 + .start = IRQ_MV78XX0_UART_1,
7634 + .end = IRQ_MV78XX0_UART_1,
7635 + .flags = IORESOURCE_IRQ,
7636 + },
7637 +};
7638 +
7639 +static struct platform_device mv78xx0_uart1 = {
7640 + .name = "serial8250",
7641 + .id = 1,
7642 + .dev = {
7643 + .platform_data = mv78xx0_uart1_data,
7644 + },
7645 + .resource = mv78xx0_uart1_resources,
7646 + .num_resources = ARRAY_SIZE(mv78xx0_uart1_resources),
7647 +};
7648 +
7649 +void __init mv78xx0_uart1_init(void)
7650 +{
7651 + platform_device_register(&mv78xx0_uart1);
7652 +}
7653 +
7654 +
7655 +/*****************************************************************************
7656 + * UART2
7657 + ****************************************************************************/
7658 +static struct plat_serial8250_port mv78xx0_uart2_data[] = {
7659 + {
7660 + .mapbase = UART2_PHYS_BASE,
7661 + .membase = (char *)UART2_VIRT_BASE,
7662 + .irq = IRQ_MV78XX0_UART_2,
7663 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
7664 + .iotype = UPIO_MEM,
7665 + .regshift = 2,
7666 + .uartclk = 0,
7667 + }, {
7668 + },
7669 +};
7670 +
7671 +static struct resource mv78xx0_uart2_resources[] = {
7672 + {
7673 + .start = UART2_PHYS_BASE,
7674 + .end = UART2_PHYS_BASE + 0xff,
7675 + .flags = IORESOURCE_MEM,
7676 + }, {
7677 + .start = IRQ_MV78XX0_UART_2,
7678 + .end = IRQ_MV78XX0_UART_2,
7679 + .flags = IORESOURCE_IRQ,
7680 + },
7681 +};
7682 +
7683 +static struct platform_device mv78xx0_uart2 = {
7684 + .name = "serial8250",
7685 + .id = 2,
7686 + .dev = {
7687 + .platform_data = mv78xx0_uart2_data,
7688 + },
7689 + .resource = mv78xx0_uart2_resources,
7690 + .num_resources = ARRAY_SIZE(mv78xx0_uart2_resources),
7691 +};
7692 +
7693 +void __init mv78xx0_uart2_init(void)
7694 +{
7695 + platform_device_register(&mv78xx0_uart2);
7696 +}
7697 +
7698 +
7699 +/*****************************************************************************
7700 + * UART3
7701 + ****************************************************************************/
7702 +static struct plat_serial8250_port mv78xx0_uart3_data[] = {
7703 + {
7704 + .mapbase = UART3_PHYS_BASE,
7705 + .membase = (char *)UART3_VIRT_BASE,
7706 + .irq = IRQ_MV78XX0_UART_3,
7707 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
7708 + .iotype = UPIO_MEM,
7709 + .regshift = 2,
7710 + .uartclk = 0,
7711 + }, {
7712 + },
7713 +};
7714 +
7715 +static struct resource mv78xx0_uart3_resources[] = {
7716 + {
7717 + .start = UART3_PHYS_BASE,
7718 + .end = UART3_PHYS_BASE + 0xff,
7719 + .flags = IORESOURCE_MEM,
7720 + }, {
7721 + .start = IRQ_MV78XX0_UART_3,
7722 + .end = IRQ_MV78XX0_UART_3,
7723 + .flags = IORESOURCE_IRQ,
7724 + },
7725 +};
7726 +
7727 +static struct platform_device mv78xx0_uart3 = {
7728 + .name = "serial8250",
7729 + .id = 3,
7730 + .dev = {
7731 + .platform_data = mv78xx0_uart3_data,
7732 + },
7733 + .resource = mv78xx0_uart3_resources,
7734 + .num_resources = ARRAY_SIZE(mv78xx0_uart3_resources),
7735 +};
7736 +
7737 +void __init mv78xx0_uart3_init(void)
7738 +{
7739 + platform_device_register(&mv78xx0_uart3);
7740 +}
7741 +
7742 +
7743 +/*****************************************************************************
7744 + * Time handling
7745 + ****************************************************************************/
7746 +static void mv78xx0_timer_init(void)
7747 +{
7748 + orion_time_init(IRQ_MV78XX0_TIMER_1, get_tclk());
7749 +}
7750 +
7751 +struct sys_timer mv78xx0_timer = {
7752 + .init = mv78xx0_timer_init,
7753 +};
7754 +
7755 +
7756 +/*****************************************************************************
7757 + * General
7758 + ****************************************************************************/
7759 +static int __init is_l2_writethrough(void)
7760 +{
7761 + return !!(readl(CPU_CONTROL) & L2_WRITETHROUGH);
7762 +}
7763 +
7764 +void __init mv78xx0_init(void)
7765 +{
7766 + int core_index;
7767 + int hclk;
7768 + int pclk;
7769 + int l2clk;
7770 + int tclk;
7771 +
7772 + core_index = mv78xx0_core_index();
7773 + hclk = get_hclk();
7774 + get_pclk_l2clk(hclk, core_index, &pclk, &l2clk);
7775 + tclk = get_tclk();
7776 +
7777 + printk(KERN_INFO "MV78xx0 core #%d, ", core_index);
7778 + printk("PCLK = %dMHz, ", (pclk + 499999) / 1000000);
7779 + printk("L2 = %dMHz, ", (l2clk + 499999) / 1000000);
7780 + printk("HCLK = %dMHz, ", (hclk + 499999) / 1000000);
7781 + printk("TCLK = %dMHz\n", (tclk + 499999) / 1000000);
7782 +
7783 + mv78xx0_setup_cpu_mbus();
7784 +
7785 +#ifdef CONFIG_CACHE_FEROCEON_L2
7786 + feroceon_l2_init(is_l2_writethrough());
7787 +#endif
7788 +
7789 + mv78xx0_ge00_shared_data.t_clk = tclk;
7790 + mv78xx0_ge01_shared_data.t_clk = tclk;
7791 + mv78xx0_ge10_shared_data.t_clk = tclk;
7792 + mv78xx0_ge11_shared_data.t_clk = tclk;
7793 + mv78xx0_uart0_data[0].uartclk = tclk;
7794 + mv78xx0_uart1_data[0].uartclk = tclk;
7795 + mv78xx0_uart2_data[0].uartclk = tclk;
7796 + mv78xx0_uart3_data[0].uartclk = tclk;
7797 +}
7798 --- /dev/null
7799 +++ b/arch/arm/mach-mv78xx0/common.h
7800 @@ -0,0 +1,49 @@
7801 +/*
7802 + * arch/arm/mach-mv78xx0/common.h
7803 + *
7804 + * Core functions for Marvell MV78xx0 SoCs
7805 + *
7806 + * This file is licensed under the terms of the GNU General Public
7807 + * License version 2. This program is licensed "as is" without any
7808 + * warranty of any kind, whether express or implied.
7809 + */
7810 +
7811 +#ifndef __ARCH_MV78XX0_COMMON_H
7812 +#define __ARCH_MV78XX0_COMMON_H
7813 +
7814 +struct mv643xx_eth_platform_data;
7815 +struct mv_sata_platform_data;
7816 +
7817 +/*
7818 + * Basic MV78xx0 init functions used early by machine-setup.
7819 + */
7820 +int mv78xx0_core_index(void);
7821 +void mv78xx0_map_io(void);
7822 +void mv78xx0_init(void);
7823 +void mv78xx0_init_irq(void);
7824 +
7825 +extern struct mbus_dram_target_info mv78xx0_mbus_dram_info;
7826 +void mv78xx0_setup_cpu_mbus(void);
7827 +void mv78xx0_setup_pcie_io_win(int window, u32 base, u32 size,
7828 + int maj, int min);
7829 +void mv78xx0_setup_pcie_mem_win(int window, u32 base, u32 size,
7830 + int maj, int min);
7831 +
7832 +void mv78xx0_ehci0_init(void);
7833 +void mv78xx0_ehci1_init(void);
7834 +void mv78xx0_ehci2_init(void);
7835 +void mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data);
7836 +void mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data);
7837 +void mv78xx0_ge10_init(struct mv643xx_eth_platform_data *eth_data);
7838 +void mv78xx0_ge11_init(struct mv643xx_eth_platform_data *eth_data);
7839 +void mv78xx0_pcie_init(int init_port0, int init_port1);
7840 +void mv78xx0_sata_init(struct mv_sata_platform_data *sata_data);
7841 +void mv78xx0_uart0_init(void);
7842 +void mv78xx0_uart1_init(void);
7843 +void mv78xx0_uart2_init(void);
7844 +void mv78xx0_uart3_init(void);
7845 +
7846 +extern struct sys_timer mv78xx0_timer;
7847 +
7848 +
7849 +#endif
7850 --- /dev/null
7851 +++ b/arch/arm/mach-mv78xx0/db78x00-bp-setup.c
7852 @@ -0,0 +1,94 @@
7853 +/*
7854 + * arch/arm/mach-mv78xx0/db78x00-bp-setup.c
7855 + *
7856 + * Marvell DB-78x00-BP Development Board Setup
7857 + *
7858 + * This file is licensed under the terms of the GNU General Public
7859 + * License version 2. This program is licensed "as is" without any
7860 + * warranty of any kind, whether express or implied.
7861 + */
7862 +
7863 +#include <linux/kernel.h>
7864 +#include <linux/init.h>
7865 +#include <linux/platform_device.h>
7866 +#include <linux/ata_platform.h>
7867 +#include <linux/mv643xx_eth.h>
7868 +#include <asm/arch/mv78xx0.h>
7869 +#include <asm/mach-types.h>
7870 +#include <asm/mach/arch.h>
7871 +#include "common.h"
7872 +
7873 +static struct mv643xx_eth_platform_data db78x00_ge00_data = {
7874 + .phy_addr = 8,
7875 +};
7876 +
7877 +static struct mv643xx_eth_platform_data db78x00_ge01_data = {
7878 + .phy_addr = 9,
7879 +};
7880 +
7881 +static struct mv643xx_eth_platform_data db78x00_ge10_data = {
7882 + .phy_addr = -1,
7883 +};
7884 +
7885 +static struct mv643xx_eth_platform_data db78x00_ge11_data = {
7886 + .phy_addr = -1,
7887 +};
7888 +
7889 +static struct mv_sata_platform_data db78x00_sata_data = {
7890 + .n_ports = 2,
7891 +};
7892 +
7893 +static void __init db78x00_init(void)
7894 +{
7895 + /*
7896 + * Basic MV78xx0 setup. Needs to be called early.
7897 + */
7898 + mv78xx0_init();
7899 +
7900 + /*
7901 + * Partition on-chip peripherals between the two CPU cores.
7902 + */
7903 + if (mv78xx0_core_index() == 0) {
7904 + mv78xx0_ehci0_init();
7905 + mv78xx0_ehci1_init();
7906 + mv78xx0_ehci2_init();
7907 + mv78xx0_ge00_init(&db78x00_ge00_data);
7908 + mv78xx0_ge01_init(&db78x00_ge01_data);
7909 + mv78xx0_ge10_init(&db78x00_ge10_data);
7910 + mv78xx0_ge11_init(&db78x00_ge11_data);
7911 + mv78xx0_sata_init(&db78x00_sata_data);
7912 + mv78xx0_uart0_init();
7913 + mv78xx0_uart2_init();
7914 + } else {
7915 + mv78xx0_uart1_init();
7916 + mv78xx0_uart3_init();
7917 + }
7918 +}
7919 +
7920 +static int __init db78x00_pci_init(void)
7921 +{
7922 + if (machine_is_db78x00_bp()) {
7923 + /*
7924 + * Assign the x16 PCIe slot on the board to CPU core
7925 + * #0, and let CPU core #1 have the four x1 slots.
7926 + */
7927 + if (mv78xx0_core_index() == 0)
7928 + mv78xx0_pcie_init(0, 1);
7929 + else
7930 + mv78xx0_pcie_init(1, 0);
7931 + }
7932 +
7933 + return 0;
7934 +}
7935 +subsys_initcall(db78x00_pci_init);
7936 +
7937 +MACHINE_START(DB78X00_BP, "Marvell DB-78x00-BP Development Board")
7938 + /* Maintainer: Lennert Buytenhek <buytenh@marvell.com> */
7939 + .phys_io = MV78XX0_REGS_PHYS_BASE,
7940 + .io_pg_offst = ((MV78XX0_REGS_VIRT_BASE) >> 18) & 0xfffc,
7941 + .boot_params = 0x00000100,
7942 + .init_machine = db78x00_init,
7943 + .map_io = mv78xx0_map_io,
7944 + .init_irq = mv78xx0_init_irq,
7945 + .timer = &mv78xx0_timer,
7946 +MACHINE_END
7947 --- /dev/null
7948 +++ b/arch/arm/mach-mv78xx0/irq.c
7949 @@ -0,0 +1,22 @@
7950 +/*
7951 + * arch/arm/mach-mv78xx0/irq.c
7952 + *
7953 + * MV78xx0 IRQ handling.
7954 + *
7955 + * This file is licensed under the terms of the GNU General Public
7956 + * License version 2. This program is licensed "as is" without any
7957 + * warranty of any kind, whether express or implied.
7958 + */
7959 +
7960 +#include <linux/kernel.h>
7961 +#include <linux/init.h>
7962 +#include <linux/pci.h>
7963 +#include <asm/arch/mv78xx0.h>
7964 +#include <asm/plat-orion/irq.h>
7965 +#include "common.h"
7966 +
7967 +void __init mv78xx0_init_irq(void)
7968 +{
7969 + orion_irq_init(0, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF));
7970 + orion_irq_init(32, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF));
7971 +}
7972 --- /dev/null
7973 +++ b/arch/arm/mach-mv78xx0/pcie.c
7974 @@ -0,0 +1,312 @@
7975 +/*
7976 + * arch/arm/mach-mv78xx0/pcie.c
7977 + *
7978 + * PCIe functions for Marvell MV78xx0 SoCs
7979 + *
7980 + * This file is licensed under the terms of the GNU General Public
7981 + * License version 2. This program is licensed "as is" without any
7982 + * warranty of any kind, whether express or implied.
7983 + */
7984 +
7985 +#include <linux/kernel.h>
7986 +#include <linux/pci.h>
7987 +#include <linux/mbus.h>
7988 +#include <asm/mach/pci.h>
7989 +#include <asm/plat-orion/pcie.h>
7990 +#include "common.h"
7991 +
7992 +struct pcie_port {
7993 + u8 maj;
7994 + u8 min;
7995 + u8 root_bus_nr;
7996 + void __iomem *base;
7997 + spinlock_t conf_lock;
7998 + char io_space_name[16];
7999 + char mem_space_name[16];
8000 + struct resource res[2];
8001 +};
8002 +
8003 +static struct pcie_port pcie_port[8];
8004 +static int num_pcie_ports;
8005 +static struct resource pcie_io_space;
8006 +static struct resource pcie_mem_space;
8007 +
8008 +
8009 +static void __init mv78xx0_pcie_preinit(void)
8010 +{
8011 + int i;
8012 + u32 size_each;
8013 + u32 start;
8014 + int win;
8015 +
8016 + pcie_io_space.name = "PCIe I/O Space";
8017 + pcie_io_space.start = MV78XX0_PCIE_IO_PHYS_BASE(0);
8018 + pcie_io_space.end =
8019 + MV78XX0_PCIE_IO_PHYS_BASE(0) + MV78XX0_PCIE_IO_SIZE * 8 - 1;
8020 + pcie_io_space.flags = IORESOURCE_IO;
8021 + if (request_resource(&iomem_resource, &pcie_io_space))
8022 + panic("can't allocate PCIe I/O space");
8023 +
8024 + pcie_mem_space.name = "PCIe MEM Space";
8025 + pcie_mem_space.start = MV78XX0_PCIE_MEM_PHYS_BASE;
8026 + pcie_mem_space.end =
8027 + MV78XX0_PCIE_MEM_PHYS_BASE + MV78XX0_PCIE_MEM_SIZE - 1;
8028 + pcie_mem_space.flags = IORESOURCE_MEM;
8029 + if (request_resource(&iomem_resource, &pcie_mem_space))
8030 + panic("can't allocate PCIe MEM space");
8031 +
8032 + for (i = 0; i < num_pcie_ports; i++) {
8033 + struct pcie_port *pp = pcie_port + i;
8034 +
8035 + snprintf(pp->io_space_name, sizeof(pp->io_space_name),
8036 + "PCIe %d.%d I/O", pp->maj, pp->min);
8037 + pp->io_space_name[sizeof(pp->io_space_name) - 1] = 0;
8038 + pp->res[0].name = pp->io_space_name;
8039 + pp->res[0].start = MV78XX0_PCIE_IO_PHYS_BASE(i);
8040 + pp->res[0].end = pp->res[0].start + MV78XX0_PCIE_IO_SIZE - 1;
8041 + pp->res[0].flags = IORESOURCE_IO;
8042 +
8043 + snprintf(pp->mem_space_name, sizeof(pp->mem_space_name),
8044 + "PCIe %d.%d MEM", pp->maj, pp->min);
8045 + pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0;
8046 + pp->res[1].name = pp->mem_space_name;
8047 + pp->res[1].flags = IORESOURCE_MEM;
8048 + }
8049 +
8050 + switch (num_pcie_ports) {
8051 + case 0:
8052 + size_each = 0;
8053 + break;
8054 +
8055 + case 1:
8056 + size_each = 0x30000000;
8057 + break;
8058 +
8059 + case 2 ... 3:
8060 + size_each = 0x10000000;
8061 + break;
8062 +
8063 + case 4 ... 6:
8064 + size_each = 0x08000000;
8065 + break;
8066 +
8067 + case 7:
8068 + size_each = 0x04000000;
8069 + break;
8070 +
8071 + default:
8072 + panic("invalid number of PCIe ports");
8073 + }
8074 +
8075 + start = MV78XX0_PCIE_MEM_PHYS_BASE;
8076 + for (i = 0; i < num_pcie_ports; i++) {
8077 + struct pcie_port *pp = pcie_port + i;
8078 +
8079 + pp->res[1].start = start;
8080 + pp->res[1].end = start + size_each - 1;
8081 + start += size_each;
8082 + }
8083 +
8084 + for (i = 0; i < num_pcie_ports; i++) {
8085 + struct pcie_port *pp = pcie_port + i;
8086 +
8087 + if (request_resource(&pcie_io_space, &pp->res[0]))
8088 + panic("can't allocate PCIe I/O sub-space");
8089 +
8090 + if (request_resource(&pcie_mem_space, &pp->res[1]))
8091 + panic("can't allocate PCIe MEM sub-space");
8092 + }
8093 +
8094 + win = 0;
8095 + for (i = 0; i < num_pcie_ports; i++) {
8096 + struct pcie_port *pp = pcie_port + i;
8097 +
8098 + mv78xx0_setup_pcie_io_win(win++, pp->res[0].start,
8099 + pp->res[0].end - pp->res[0].start + 1,
8100 + pp->maj, pp->min);
8101 +
8102 + mv78xx0_setup_pcie_mem_win(win++, pp->res[1].start,
8103 + pp->res[1].end - pp->res[1].start + 1,
8104 + pp->maj, pp->min);
8105 + }
8106 +}
8107 +
8108 +static int __init mv78xx0_pcie_setup(int nr, struct pci_sys_data *sys)
8109 +{
8110 + struct pcie_port *pp;
8111 +
8112 + if (nr >= num_pcie_ports)
8113 + return 0;
8114 +
8115 + pp = &pcie_port[nr];
8116 + pp->root_bus_nr = sys->busnr;
8117 +
8118 + /*
8119 + * Generic PCIe unit setup.
8120 + */
8121 + orion_pcie_set_local_bus_nr(pp->base, sys->busnr);
8122 + orion_pcie_setup(pp->base, &mv78xx0_mbus_dram_info);
8123 +
8124 + sys->resource[0] = &pp->res[0];
8125 + sys->resource[1] = &pp->res[1];
8126 + sys->resource[2] = NULL;
8127 +
8128 + return 1;
8129 +}
8130 +
8131 +static struct pcie_port *bus_to_port(int bus)
8132 +{
8133 + int i;
8134 +
8135 + for (i = num_pcie_ports - 1; i >= 0; i--) {
8136 + int rbus = pcie_port[i].root_bus_nr;
8137 + if (rbus != -1 && rbus <= bus)
8138 + break;
8139 + }
8140 +
8141 + return i >= 0 ? pcie_port + i : NULL;
8142 +}
8143 +
8144 +static int pcie_valid_config(struct pcie_port *pp, int bus, int dev)
8145 +{
8146 + /*
8147 + * Don't go out when trying to access nonexisting devices
8148 + * on the local bus.
8149 + */
8150 + if (bus == pp->root_bus_nr && dev > 1)
8151 + return 0;
8152 +
8153 + return 1;
8154 +}
8155 +
8156 +static int pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where,
8157 + int size, u32 *val)
8158 +{
8159 + struct pcie_port *pp = bus_to_port(bus->number);
8160 + unsigned long flags;
8161 + int ret;
8162 +
8163 + if (pcie_valid_config(pp, bus->number, PCI_SLOT(devfn)) == 0) {
8164 + *val = 0xffffffff;
8165 + return PCIBIOS_DEVICE_NOT_FOUND;
8166 + }
8167 +
8168 + spin_lock_irqsave(&pp->conf_lock, flags);
8169 + ret = orion_pcie_rd_conf(pp->base, bus, devfn, where, size, val);
8170 + spin_unlock_irqrestore(&pp->conf_lock, flags);
8171 +
8172 + return ret;
8173 +}
8174 +
8175 +static int pcie_wr_conf(struct pci_bus *bus, u32 devfn,
8176 + int where, int size, u32 val)
8177 +{
8178 + struct pcie_port *pp = bus_to_port(bus->number);
8179 + unsigned long flags;
8180 + int ret;
8181 +
8182 + if (pcie_valid_config(pp, bus->number, PCI_SLOT(devfn)) == 0)
8183 + return PCIBIOS_DEVICE_NOT_FOUND;
8184 +
8185 + spin_lock_irqsave(&pp->conf_lock, flags);
8186 + ret = orion_pcie_wr_conf(pp->base, bus, devfn, where, size, val);
8187 + spin_unlock_irqrestore(&pp->conf_lock, flags);
8188 +
8189 + return ret;
8190 +}
8191 +
8192 +static struct pci_ops pcie_ops = {
8193 + .read = pcie_rd_conf,
8194 + .write = pcie_wr_conf,
8195 +};
8196 +
8197 +static void __devinit rc_pci_fixup(struct pci_dev *dev)
8198 +{
8199 + /*
8200 + * Prevent enumeration of root complex.
8201 + */
8202 + if (dev->bus->parent == NULL && dev->devfn == 0) {
8203 + int i;
8204 +
8205 + for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
8206 + dev->resource[i].start = 0;
8207 + dev->resource[i].end = 0;
8208 + dev->resource[i].flags = 0;
8209 + }
8210 + }
8211 +}
8212 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL, PCI_ANY_ID, rc_pci_fixup);
8213 +
8214 +static struct pci_bus __init *
8215 +mv78xx0_pcie_scan_bus(int nr, struct pci_sys_data *sys)
8216 +{
8217 + struct pci_bus *bus;
8218 +
8219 + if (nr < num_pcie_ports) {
8220 + bus = pci_scan_bus(sys->busnr, &pcie_ops, sys);
8221 + } else {
8222 + bus = NULL;
8223 + BUG();
8224 + }
8225 +
8226 + return bus;
8227 +}
8228 +
8229 +static int __init mv78xx0_pcie_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
8230 +{
8231 + struct pcie_port *pp = bus_to_port(dev->bus->number);
8232 +
8233 + return IRQ_MV78XX0_PCIE_00 + (pp->maj << 2) + pp->min;
8234 +}
8235 +
8236 +static struct hw_pci mv78xx0_pci __initdata = {
8237 + .nr_controllers = 8,
8238 + .preinit = mv78xx0_pcie_preinit,
8239 + .swizzle = pci_std_swizzle,
8240 + .setup = mv78xx0_pcie_setup,
8241 + .scan = mv78xx0_pcie_scan_bus,
8242 + .map_irq = mv78xx0_pcie_map_irq,
8243 +};
8244 +
8245 +static void __init add_pcie_port(int maj, int min, unsigned long base)
8246 +{
8247 + printk(KERN_INFO "MV78xx0 PCIe port %d.%d: ", maj, min);
8248 +
8249 + if (orion_pcie_link_up((void __iomem *)base)) {
8250 + struct pcie_port *pp = &pcie_port[num_pcie_ports++];
8251 +
8252 + printk("link up\n");
8253 +
8254 + pp->maj = maj;
8255 + pp->min = min;
8256 + pp->root_bus_nr = -1;
8257 + pp->base = (void __iomem *)base;
8258 + spin_lock_init(&pp->conf_lock);
8259 + memset(pp->res, 0, sizeof(pp->res));
8260 + } else {
8261 + printk("link down, ignoring\n");
8262 + }
8263 +}
8264 +
8265 +void __init mv78xx0_pcie_init(int init_port0, int init_port1)
8266 +{
8267 + if (init_port0) {
8268 + add_pcie_port(0, 0, PCIE00_VIRT_BASE);
8269 + if (!orion_pcie_x4_mode((void __iomem *)PCIE00_VIRT_BASE)) {
8270 + add_pcie_port(0, 1, PCIE01_VIRT_BASE);
8271 + add_pcie_port(0, 2, PCIE02_VIRT_BASE);
8272 + add_pcie_port(0, 3, PCIE03_VIRT_BASE);
8273 + }
8274 + }
8275 +
8276 + if (init_port1) {
8277 + add_pcie_port(1, 0, PCIE10_VIRT_BASE);
8278 + if (!orion_pcie_x4_mode((void __iomem *)PCIE10_VIRT_BASE)) {
8279 + add_pcie_port(1, 1, PCIE11_VIRT_BASE);
8280 + add_pcie_port(1, 2, PCIE12_VIRT_BASE);
8281 + add_pcie_port(1, 3, PCIE13_VIRT_BASE);
8282 + }
8283 + }
8284 +
8285 + pci_common_init(&mv78xx0_pci);
8286 +}
8287 --- a/arch/arm/mach-orion5x/Kconfig
8288 +++ b/arch/arm/mach-orion5x/Kconfig
8289 @@ -44,6 +44,36 @@
8290 Buffalo Linkstation Pro/Live platform. Both v1 and
8291 v2 devices are supported.
8292
8293 +config MACH_TS409
8294 + bool "QNAP TS-409"
8295 + help
8296 + Say 'Y' here if you want your kernel to support the
8297 + QNAP TS-409 platform.
8298 +
8299 +config MACH_WRT350N_V2
8300 + bool "Linksys WRT350N v2"
8301 + help
8302 + Say 'Y' here if you want your kernel to support the
8303 + Linksys WRT350N v2 platform.
8304 +
8305 +config MACH_TS78XX
8306 + bool "Technologic Systems TS-78xx"
8307 + help
8308 + Say 'Y' here if you want your kernel to support the
8309 + Technologic Systems TS-78xx platform.
8310 +
8311 +config MACH_MV2120
8312 + bool "HP Media Vault mv2120"
8313 + help
8314 + Say 'Y' here if you want your kernel to support the
8315 + HP Media Vault mv2120 or mv5100.
8316 +
8317 +config MACH_MSS2
8318 + bool "Maxtor Shared Storage II"
8319 + help
8320 + Say 'Y' here if you want your kernel to support the
8321 + Maxtor Shared Storage II platform.
8322 +
8323 endmenu
8324
8325 endif
8326 --- a/arch/arm/mach-orion5x/Makefile
8327 +++ b/arch/arm/mach-orion5x/Makefile
8328 @@ -1,7 +1,12 @@
8329 -obj-y += common.o addr-map.o pci.o gpio.o irq.o
8330 +obj-y += common.o addr-map.o pci.o gpio.o irq.o mpp.o
8331 obj-$(CONFIG_MACH_DB88F5281) += db88f5281-setup.o
8332 obj-$(CONFIG_MACH_RD88F5182) += rd88f5182-setup.o
8333 obj-$(CONFIG_MACH_KUROBOX_PRO) += kurobox_pro-setup.o
8334 obj-$(CONFIG_MACH_LINKSTATION_PRO) += kurobox_pro-setup.o
8335 obj-$(CONFIG_MACH_DNS323) += dns323-setup.o
8336 -obj-$(CONFIG_MACH_TS209) += ts209-setup.o
8337 +obj-$(CONFIG_MACH_TS209) += ts209-setup.o tsx09-common.o
8338 +obj-$(CONFIG_MACH_TS409) += ts409-setup.o tsx09-common.o
8339 +obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o
8340 +obj-$(CONFIG_MACH_TS78XX) += ts78xx-setup.o
8341 +obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o
8342 +obj-$(CONFIG_MACH_MSS2) += mss2-setup.o
8343 --- a/arch/arm/mach-orion5x/addr-map.c
8344 +++ b/arch/arm/mach-orion5x/addr-map.c
8345 @@ -70,6 +70,7 @@
8346
8347
8348 struct mbus_dram_target_info orion5x_mbus_dram_info;
8349 +static int __initdata win_alloc_count;
8350
8351 static int __init orion5x_cpu_win_can_remap(int win)
8352 {
8353 @@ -87,16 +88,22 @@
8354 static void __init setup_cpu_win(int win, u32 base, u32 size,
8355 u8 target, u8 attr, int remap)
8356 {
8357 - orion5x_write(CPU_WIN_BASE(win), base & 0xffff0000);
8358 - orion5x_write(CPU_WIN_CTRL(win),
8359 - ((size - 1) & 0xffff0000) | (attr << 8) | (target << 4) | 1);
8360 + if (win >= 8) {
8361 + printk(KERN_ERR "setup_cpu_win: trying to allocate "
8362 + "window %d\n", win);
8363 + return;
8364 + }
8365 +
8366 + writel(base & 0xffff0000, CPU_WIN_BASE(win));
8367 + writel(((size - 1) & 0xffff0000) | (attr << 8) | (target << 4) | 1,
8368 + CPU_WIN_CTRL(win));
8369
8370 if (orion5x_cpu_win_can_remap(win)) {
8371 if (remap < 0)
8372 remap = base;
8373
8374 - orion5x_write(CPU_WIN_REMAP_LO(win), remap & 0xffff0000);
8375 - orion5x_write(CPU_WIN_REMAP_HI(win), 0);
8376 + writel(remap & 0xffff0000, CPU_WIN_REMAP_LO(win));
8377 + writel(0, CPU_WIN_REMAP_HI(win));
8378 }
8379 }
8380
8381 @@ -109,11 +116,11 @@
8382 * First, disable and clear windows.
8383 */
8384 for (i = 0; i < 8; i++) {
8385 - orion5x_write(CPU_WIN_BASE(i), 0);
8386 - orion5x_write(CPU_WIN_CTRL(i), 0);
8387 + writel(0, CPU_WIN_BASE(i));
8388 + writel(0, CPU_WIN_CTRL(i));
8389 if (orion5x_cpu_win_can_remap(i)) {
8390 - orion5x_write(CPU_WIN_REMAP_LO(i), 0);
8391 - orion5x_write(CPU_WIN_REMAP_HI(i), 0);
8392 + writel(0, CPU_WIN_REMAP_LO(i));
8393 + writel(0, CPU_WIN_REMAP_HI(i));
8394 }
8395 }
8396
8397 @@ -128,6 +135,7 @@
8398 TARGET_PCIE, ATTR_PCIE_MEM, -1);
8399 setup_cpu_win(3, ORION5X_PCI_MEM_PHYS_BASE, ORION5X_PCI_MEM_SIZE,
8400 TARGET_PCI, ATTR_PCI_MEM, -1);
8401 + win_alloc_count = 4;
8402
8403 /*
8404 * Setup MBUS dram target info.
8405 @@ -147,8 +155,8 @@
8406 w = &orion5x_mbus_dram_info.cs[cs++];
8407 w->cs_index = i;
8408 w->mbus_attr = 0xf & ~(1 << i);
8409 - w->base = base & 0xff000000;
8410 - w->size = (size | 0x00ffffff) + 1;
8411 + w->base = base & 0xffff0000;
8412 + w->size = (size | 0x0000ffff) + 1;
8413 }
8414 }
8415 orion5x_mbus_dram_info.num_cs = cs;
8416 @@ -156,25 +164,30 @@
8417
8418 void __init orion5x_setup_dev_boot_win(u32 base, u32 size)
8419 {
8420 - setup_cpu_win(4, base, size, TARGET_DEV_BUS, ATTR_DEV_BOOT, -1);
8421 + setup_cpu_win(win_alloc_count++, base, size,
8422 + TARGET_DEV_BUS, ATTR_DEV_BOOT, -1);
8423 }
8424
8425 void __init orion5x_setup_dev0_win(u32 base, u32 size)
8426 {
8427 - setup_cpu_win(5, base, size, TARGET_DEV_BUS, ATTR_DEV_CS0, -1);
8428 + setup_cpu_win(win_alloc_count++, base, size,
8429 + TARGET_DEV_BUS, ATTR_DEV_CS0, -1);
8430 }
8431
8432 void __init orion5x_setup_dev1_win(u32 base, u32 size)
8433 {
8434 - setup_cpu_win(6, base, size, TARGET_DEV_BUS, ATTR_DEV_CS1, -1);
8435 + setup_cpu_win(win_alloc_count++, base, size,
8436 + TARGET_DEV_BUS, ATTR_DEV_CS1, -1);
8437 }
8438
8439 void __init orion5x_setup_dev2_win(u32 base, u32 size)
8440 {
8441 - setup_cpu_win(7, base, size, TARGET_DEV_BUS, ATTR_DEV_CS2, -1);
8442 + setup_cpu_win(win_alloc_count++, base, size,
8443 + TARGET_DEV_BUS, ATTR_DEV_CS2, -1);
8444 }
8445
8446 void __init orion5x_setup_pcie_wa_win(u32 base, u32 size)
8447 {
8448 - setup_cpu_win(7, base, size, TARGET_PCIE, ATTR_PCIE_WA, -1);
8449 + setup_cpu_win(win_alloc_count++, base, size,
8450 + TARGET_PCIE, ATTR_PCIE_WA, -1);
8451 }
8452 --- a/arch/arm/mach-orion5x/common.c
8453 +++ b/arch/arm/mach-orion5x/common.c
8454 @@ -39,25 +39,22 @@
8455 .virtual = ORION5X_REGS_VIRT_BASE,
8456 .pfn = __phys_to_pfn(ORION5X_REGS_PHYS_BASE),
8457 .length = ORION5X_REGS_SIZE,
8458 - .type = MT_DEVICE
8459 - },
8460 - {
8461 + .type = MT_DEVICE,
8462 + }, {
8463 .virtual = ORION5X_PCIE_IO_VIRT_BASE,
8464 .pfn = __phys_to_pfn(ORION5X_PCIE_IO_PHYS_BASE),
8465 .length = ORION5X_PCIE_IO_SIZE,
8466 - .type = MT_DEVICE
8467 - },
8468 - {
8469 + .type = MT_DEVICE,
8470 + }, {
8471 .virtual = ORION5X_PCI_IO_VIRT_BASE,
8472 .pfn = __phys_to_pfn(ORION5X_PCI_IO_PHYS_BASE),
8473 .length = ORION5X_PCI_IO_SIZE,
8474 - .type = MT_DEVICE
8475 - },
8476 - {
8477 + .type = MT_DEVICE,
8478 + }, {
8479 .virtual = ORION5X_PCIE_WA_VIRT_BASE,
8480 .pfn = __phys_to_pfn(ORION5X_PCIE_WA_PHYS_BASE),
8481 .length = ORION5X_PCIE_WA_SIZE,
8482 - .type = MT_DEVICE
8483 + .type = MT_DEVICE,
8484 },
8485 };
8486
8487 @@ -66,101 +63,32 @@
8488 iotable_init(orion5x_io_desc, ARRAY_SIZE(orion5x_io_desc));
8489 }
8490
8491 +
8492 /*****************************************************************************
8493 - * UART
8494 + * EHCI
8495 ****************************************************************************/
8496 -
8497 -static struct resource orion5x_uart_resources[] = {
8498 - {
8499 - .start = UART0_PHYS_BASE,
8500 - .end = UART0_PHYS_BASE + 0xff,
8501 - .flags = IORESOURCE_MEM,
8502 - },
8503 - {
8504 - .start = IRQ_ORION5X_UART0,
8505 - .end = IRQ_ORION5X_UART0,
8506 - .flags = IORESOURCE_IRQ,
8507 - },
8508 - {
8509 - .start = UART1_PHYS_BASE,
8510 - .end = UART1_PHYS_BASE + 0xff,
8511 - .flags = IORESOURCE_MEM,
8512 - },
8513 - {
8514 - .start = IRQ_ORION5X_UART1,
8515 - .end = IRQ_ORION5X_UART1,
8516 - .flags = IORESOURCE_IRQ,
8517 - },
8518 -};
8519 -
8520 -static struct plat_serial8250_port orion5x_uart_data[] = {
8521 - {
8522 - .mapbase = UART0_PHYS_BASE,
8523 - .membase = (char *)UART0_VIRT_BASE,
8524 - .irq = IRQ_ORION5X_UART0,
8525 - .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
8526 - .iotype = UPIO_MEM,
8527 - .regshift = 2,
8528 - .uartclk = ORION5X_TCLK,
8529 - },
8530 - {
8531 - .mapbase = UART1_PHYS_BASE,
8532 - .membase = (char *)UART1_VIRT_BASE,
8533 - .irq = IRQ_ORION5X_UART1,
8534 - .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
8535 - .iotype = UPIO_MEM,
8536 - .regshift = 2,
8537 - .uartclk = ORION5X_TCLK,
8538 - },
8539 - { },
8540 +static struct orion_ehci_data orion5x_ehci_data = {
8541 + .dram = &orion5x_mbus_dram_info,
8542 };
8543
8544 -static struct platform_device orion5x_uart = {
8545 - .name = "serial8250",
8546 - .id = PLAT8250_DEV_PLATFORM,
8547 - .dev = {
8548 - .platform_data = orion5x_uart_data,
8549 - },
8550 - .resource = orion5x_uart_resources,
8551 - .num_resources = ARRAY_SIZE(orion5x_uart_resources),
8552 -};
8553 +static u64 ehci_dmamask = 0xffffffffUL;
8554
8555 -/*******************************************************************************
8556 - * USB Controller - 2 interfaces
8557 - ******************************************************************************/
8558
8559 +/*****************************************************************************
8560 + * EHCI0
8561 + ****************************************************************************/
8562 static struct resource orion5x_ehci0_resources[] = {
8563 {
8564 .start = ORION5X_USB0_PHYS_BASE,
8565 .end = ORION5X_USB0_PHYS_BASE + SZ_4K - 1,
8566 .flags = IORESOURCE_MEM,
8567 - },
8568 - {
8569 + }, {
8570 .start = IRQ_ORION5X_USB0_CTRL,
8571 .end = IRQ_ORION5X_USB0_CTRL,
8572 .flags = IORESOURCE_IRQ,
8573 },
8574 };
8575
8576 -static struct resource orion5x_ehci1_resources[] = {
8577 - {
8578 - .start = ORION5X_USB1_PHYS_BASE,
8579 - .end = ORION5X_USB1_PHYS_BASE + SZ_4K - 1,
8580 - .flags = IORESOURCE_MEM,
8581 - },
8582 - {
8583 - .start = IRQ_ORION5X_USB1_CTRL,
8584 - .end = IRQ_ORION5X_USB1_CTRL,
8585 - .flags = IORESOURCE_IRQ,
8586 - },
8587 -};
8588 -
8589 -static struct orion_ehci_data orion5x_ehci_data = {
8590 - .dram = &orion5x_mbus_dram_info,
8591 -};
8592 -
8593 -static u64 ehci_dmamask = 0xffffffffUL;
8594 -
8595 static struct platform_device orion5x_ehci0 = {
8596 .name = "orion-ehci",
8597 .id = 0,
8598 @@ -173,6 +101,27 @@
8599 .num_resources = ARRAY_SIZE(orion5x_ehci0_resources),
8600 };
8601
8602 +void __init orion5x_ehci0_init(void)
8603 +{
8604 + platform_device_register(&orion5x_ehci0);
8605 +}
8606 +
8607 +
8608 +/*****************************************************************************
8609 + * EHCI1
8610 + ****************************************************************************/
8611 +static struct resource orion5x_ehci1_resources[] = {
8612 + {
8613 + .start = ORION5X_USB1_PHYS_BASE,
8614 + .end = ORION5X_USB1_PHYS_BASE + SZ_4K - 1,
8615 + .flags = IORESOURCE_MEM,
8616 + }, {
8617 + .start = IRQ_ORION5X_USB1_CTRL,
8618 + .end = IRQ_ORION5X_USB1_CTRL,
8619 + .flags = IORESOURCE_IRQ,
8620 + },
8621 +};
8622 +
8623 static struct platform_device orion5x_ehci1 = {
8624 .name = "orion-ehci",
8625 .id = 1,
8626 @@ -185,11 +134,15 @@
8627 .num_resources = ARRAY_SIZE(orion5x_ehci1_resources),
8628 };
8629
8630 +void __init orion5x_ehci1_init(void)
8631 +{
8632 + platform_device_register(&orion5x_ehci1);
8633 +}
8634 +
8635 +
8636 /*****************************************************************************
8637 - * Gigabit Ethernet port
8638 - * (The Orion and Discovery (MV643xx) families use the same Ethernet driver)
8639 + * GigE
8640 ****************************************************************************/
8641 -
8642 struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = {
8643 .dram = &orion5x_mbus_dram_info,
8644 .t_clk = ORION5X_TCLK,
8645 @@ -219,7 +172,7 @@
8646 .start = IRQ_ORION5X_ETH_SUM,
8647 .end = IRQ_ORION5X_ETH_SUM,
8648 .flags = IORESOURCE_IRQ,
8649 - }
8650 + },
8651 };
8652
8653 static struct platform_device orion5x_eth = {
8654 @@ -238,11 +191,10 @@
8655 platform_device_register(&orion5x_eth);
8656 }
8657
8658 +
8659 /*****************************************************************************
8660 - * I2C controller
8661 - * (The Orion and Discovery (MV643xx) families share the same I2C controller)
8662 + * I2C
8663 ****************************************************************************/
8664 -
8665 static struct mv64xxx_i2c_pdata orion5x_i2c_pdata = {
8666 .freq_m = 8, /* assumes 166 MHz TCLK */
8667 .freq_n = 3,
8668 @@ -251,16 +203,15 @@
8669
8670 static struct resource orion5x_i2c_resources[] = {
8671 {
8672 - .name = "i2c base",
8673 - .start = I2C_PHYS_BASE,
8674 - .end = I2C_PHYS_BASE + 0x20 -1,
8675 - .flags = IORESOURCE_MEM,
8676 - },
8677 - {
8678 - .name = "i2c irq",
8679 - .start = IRQ_ORION5X_I2C,
8680 - .end = IRQ_ORION5X_I2C,
8681 - .flags = IORESOURCE_IRQ,
8682 + .name = "i2c base",
8683 + .start = I2C_PHYS_BASE,
8684 + .end = I2C_PHYS_BASE + 0x1f,
8685 + .flags = IORESOURCE_MEM,
8686 + }, {
8687 + .name = "i2c irq",
8688 + .start = IRQ_ORION5X_I2C,
8689 + .end = IRQ_ORION5X_I2C,
8690 + .flags = IORESOURCE_IRQ,
8691 },
8692 };
8693
8694 @@ -270,36 +221,41 @@
8695 .num_resources = ARRAY_SIZE(orion5x_i2c_resources),
8696 .resource = orion5x_i2c_resources,
8697 .dev = {
8698 - .platform_data = &orion5x_i2c_pdata,
8699 + .platform_data = &orion5x_i2c_pdata,
8700 },
8701 };
8702
8703 +void __init orion5x_i2c_init(void)
8704 +{
8705 + platform_device_register(&orion5x_i2c);
8706 +}
8707 +
8708 +
8709 /*****************************************************************************
8710 - * Sata port
8711 + * SATA
8712 ****************************************************************************/
8713 static struct resource orion5x_sata_resources[] = {
8714 - {
8715 - .name = "sata base",
8716 - .start = ORION5X_SATA_PHYS_BASE,
8717 - .end = ORION5X_SATA_PHYS_BASE + 0x5000 - 1,
8718 - .flags = IORESOURCE_MEM,
8719 - },
8720 {
8721 - .name = "sata irq",
8722 - .start = IRQ_ORION5X_SATA,
8723 - .end = IRQ_ORION5X_SATA,
8724 - .flags = IORESOURCE_IRQ,
8725 - },
8726 + .name = "sata base",
8727 + .start = ORION5X_SATA_PHYS_BASE,
8728 + .end = ORION5X_SATA_PHYS_BASE + 0x5000 - 1,
8729 + .flags = IORESOURCE_MEM,
8730 + }, {
8731 + .name = "sata irq",
8732 + .start = IRQ_ORION5X_SATA,
8733 + .end = IRQ_ORION5X_SATA,
8734 + .flags = IORESOURCE_IRQ,
8735 + },
8736 };
8737
8738 static struct platform_device orion5x_sata = {
8739 - .name = "sata_mv",
8740 - .id = 0,
8741 + .name = "sata_mv",
8742 + .id = 0,
8743 .dev = {
8744 .coherent_dma_mask = 0xffffffff,
8745 },
8746 - .num_resources = ARRAY_SIZE(orion5x_sata_resources),
8747 - .resource = orion5x_sata_resources,
8748 + .num_resources = ARRAY_SIZE(orion5x_sata_resources),
8749 + .resource = orion5x_sata_resources,
8750 };
8751
8752 void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data)
8753 @@ -309,23 +265,111 @@
8754 platform_device_register(&orion5x_sata);
8755 }
8756
8757 +
8758 /*****************************************************************************
8759 - * Time handling
8760 + * UART0
8761 + ****************************************************************************/
8762 +static struct plat_serial8250_port orion5x_uart0_data[] = {
8763 + {
8764 + .mapbase = UART0_PHYS_BASE,
8765 + .membase = (char *)UART0_VIRT_BASE,
8766 + .irq = IRQ_ORION5X_UART0,
8767 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
8768 + .iotype = UPIO_MEM,
8769 + .regshift = 2,
8770 + .uartclk = ORION5X_TCLK,
8771 + }, {
8772 + },
8773 +};
8774 +
8775 +static struct resource orion5x_uart0_resources[] = {
8776 + {
8777 + .start = UART0_PHYS_BASE,
8778 + .end = UART0_PHYS_BASE + 0xff,
8779 + .flags = IORESOURCE_MEM,
8780 + }, {
8781 + .start = IRQ_ORION5X_UART0,
8782 + .end = IRQ_ORION5X_UART0,
8783 + .flags = IORESOURCE_IRQ,
8784 + },
8785 +};
8786 +
8787 +static struct platform_device orion5x_uart0 = {
8788 + .name = "serial8250",
8789 + .id = PLAT8250_DEV_PLATFORM,
8790 + .dev = {
8791 + .platform_data = orion5x_uart0_data,
8792 + },
8793 + .resource = orion5x_uart0_resources,
8794 + .num_resources = ARRAY_SIZE(orion5x_uart0_resources),
8795 +};
8796 +
8797 +void __init orion5x_uart0_init(void)
8798 +{
8799 + platform_device_register(&orion5x_uart0);
8800 +}
8801 +
8802 +
8803 +/*****************************************************************************
8804 + * UART1
8805 ****************************************************************************/
8806 +static struct plat_serial8250_port orion5x_uart1_data[] = {
8807 + {
8808 + .mapbase = UART1_PHYS_BASE,
8809 + .membase = (char *)UART1_VIRT_BASE,
8810 + .irq = IRQ_ORION5X_UART1,
8811 + .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
8812 + .iotype = UPIO_MEM,
8813 + .regshift = 2,
8814 + .uartclk = ORION5X_TCLK,
8815 + }, {
8816 + },
8817 +};
8818 +
8819 +static struct resource orion5x_uart1_resources[] = {
8820 + {
8821 + .start = UART1_PHYS_BASE,
8822 + .end = UART1_PHYS_BASE + 0xff,
8823 + .flags = IORESOURCE_MEM,
8824 + }, {
8825 + .start = IRQ_ORION5X_UART1,
8826 + .end = IRQ_ORION5X_UART1,
8827 + .flags = IORESOURCE_IRQ,
8828 + },
8829 +};
8830 +
8831 +static struct platform_device orion5x_uart1 = {
8832 + .name = "serial8250",
8833 + .id = PLAT8250_DEV_PLATFORM1,
8834 + .dev = {
8835 + .platform_data = orion5x_uart1_data,
8836 + },
8837 + .resource = orion5x_uart1_resources,
8838 + .num_resources = ARRAY_SIZE(orion5x_uart1_resources),
8839 +};
8840 +
8841 +void __init orion5x_uart1_init(void)
8842 +{
8843 + platform_device_register(&orion5x_uart1);
8844 +}
8845 +
8846
8847 +/*****************************************************************************
8848 + * Time handling
8849 + ****************************************************************************/
8850 static void orion5x_timer_init(void)
8851 {
8852 orion_time_init(IRQ_ORION5X_BRIDGE, ORION5X_TCLK);
8853 }
8854
8855 struct sys_timer orion5x_timer = {
8856 - .init = orion5x_timer_init,
8857 + .init = orion5x_timer_init,
8858 };
8859
8860 +
8861 /*****************************************************************************
8862 * General
8863 ****************************************************************************/
8864 -
8865 /*
8866 * Identify device ID and rev from PCIe configuration header space '0'.
8867 */
8868 @@ -350,8 +394,10 @@
8869 } else if (*dev == MV88F5181_DEV_ID) {
8870 if (*rev == MV88F5181_REV_B1) {
8871 *dev_name = "MV88F5181-Rev-B1";
8872 + } else if (*rev == MV88F5181L_REV_A1) {
8873 + *dev_name = "MV88F5181L-Rev-A1";
8874 } else {
8875 - *dev_name = "MV88F5181-Rev-Unsupported";
8876 + *dev_name = "MV88F5181(L)-Rev-Unsupported";
8877 }
8878 } else {
8879 *dev_name = "Device-Unknown";
8880 @@ -370,15 +416,6 @@
8881 * Setup Orion address map
8882 */
8883 orion5x_setup_cpu_mbus_bridge();
8884 -
8885 - /*
8886 - * Register devices.
8887 - */
8888 - platform_device_register(&orion5x_uart);
8889 - platform_device_register(&orion5x_ehci0);
8890 - if (dev == MV88F5182_DEV_ID)
8891 - platform_device_register(&orion5x_ehci1);
8892 - platform_device_register(&orion5x_i2c);
8893 }
8894
8895 /*
8896 --- a/arch/arm/mach-orion5x/common.h
8897 +++ b/arch/arm/mach-orion5x/common.h
8898 @@ -1,10 +1,12 @@
8899 #ifndef __ARCH_ORION5X_COMMON_H
8900 #define __ARCH_ORION5X_COMMON_H
8901
8902 +struct mv643xx_eth_platform_data;
8903 +struct mv_sata_platform_data;
8904 +
8905 /*
8906 * Basic Orion init functions used early by machine-setup.
8907 */
8908 -
8909 void orion5x_map_io(void);
8910 void orion5x_init_irq(void);
8911 void orion5x_init(void);
8912 @@ -23,13 +25,19 @@
8913 void orion5x_setup_dev2_win(u32 base, u32 size);
8914 void orion5x_setup_pcie_wa_win(u32 base, u32 size);
8915
8916 +void orion5x_ehci0_init(void);
8917 +void orion5x_ehci1_init(void);
8918 +void orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data);
8919 +void orion5x_i2c_init(void);
8920 +void orion5x_sata_init(struct mv_sata_platform_data *sata_data);
8921 +void orion5x_uart0_init(void);
8922 +void orion5x_uart1_init(void);
8923 +
8924 /*
8925 - * Shared code used internally by other Orion core functions.
8926 - * (/mach-orion/pci.c)
8927 + * PCIe/PCI functions.
8928 */
8929 -
8930 -struct pci_sys_data;
8931 struct pci_bus;
8932 +struct pci_sys_data;
8933
8934 void orion5x_pcie_id(u32 *dev, u32 *rev);
8935 int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys);
8936 @@ -40,26 +48,9 @@
8937 * Valid GPIO pins according to MPP setup, used by machine-setup.
8938 * (/mach-orion/gpio.c).
8939 */
8940 -
8941 -void orion5x_gpio_set_valid_pins(u32 pins);
8942 +void orion5x_gpio_set_valid(unsigned pin, int valid);
8943 void gpio_display(void); /* debug */
8944
8945 -/*
8946 - * Pull in Orion Ethernet platform_data, used by machine-setup
8947 - */
8948 -
8949 -struct mv643xx_eth_platform_data;
8950 -
8951 -void orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data);
8952 -
8953 -/*
8954 - * Orion Sata platform_data, used by machine-setup
8955 - */
8956 -
8957 -struct mv_sata_platform_data;
8958 -
8959 -void orion5x_sata_init(struct mv_sata_platform_data *sata_data);
8960 -
8961 struct machine_desc;
8962 struct meminfo;
8963 struct tag;
8964 --- a/arch/arm/mach-orion5x/db88f5281-setup.c
8965 +++ b/arch/arm/mach-orion5x/db88f5281-setup.c
8966 @@ -27,6 +27,7 @@
8967 #include <asm/arch/orion5x.h>
8968 #include <asm/plat-orion/orion_nand.h>
8969 #include "common.h"
8970 +#include "mpp.h"
8971
8972 /*****************************************************************************
8973 * DB-88F5281 on board devices
8974 @@ -86,7 +87,7 @@
8975 .name = "physmap-flash",
8976 .id = 0,
8977 .dev = {
8978 - .platform_data = &db88f5281_boot_flash_data,
8979 + .platform_data = &db88f5281_boot_flash_data,
8980 },
8981 .num_resources = 1,
8982 .resource = &db88f5281_boot_flash_resource,
8983 @@ -110,7 +111,7 @@
8984 .name = "physmap-flash",
8985 .id = 1,
8986 .dev = {
8987 - .platform_data = &db88f5281_nor_flash_data,
8988 + .platform_data = &db88f5281_nor_flash_data,
8989 },
8990 .num_resources = 1,
8991 .resource = &db88f5281_nor_flash_resource,
8992 @@ -125,18 +126,15 @@
8993 .name = "kernel",
8994 .offset = 0,
8995 .size = SZ_2M,
8996 - },
8997 - {
8998 + }, {
8999 .name = "root",
9000 .offset = SZ_2M,
9001 .size = (SZ_16M - SZ_2M),
9002 - },
9003 - {
9004 + }, {
9005 .name = "user",
9006 .offset = SZ_16M,
9007 .size = SZ_8M,
9008 - },
9009 - {
9010 + }, {
9011 .name = "recovery",
9012 .offset = (SZ_16M + SZ_8M),
9013 .size = SZ_8M,
9014 @@ -288,7 +286,6 @@
9015 ****************************************************************************/
9016 static struct mv643xx_eth_platform_data db88f5281_eth_data = {
9017 .phy_addr = 8,
9018 - .force_phy_addr = 1,
9019 };
9020
9021 /*****************************************************************************
9022 @@ -301,11 +298,28 @@
9023 /*****************************************************************************
9024 * General Setup
9025 ****************************************************************************/
9026 -
9027 -static struct platform_device *db88f5281_devs[] __initdata = {
9028 - &db88f5281_boot_flash,
9029 - &db88f5281_nor_flash,
9030 - &db88f5281_nand_flash,
9031 +static struct orion5x_mpp_mode db88f5281_mpp_modes[] __initdata = {
9032 + { 0, MPP_GPIO }, /* USB Over Current */
9033 + { 1, MPP_GPIO }, /* USB Vbat input */
9034 + { 2, MPP_PCI_ARB }, /* PCI_REQn[2] */
9035 + { 3, MPP_PCI_ARB }, /* PCI_GNTn[2] */
9036 + { 4, MPP_PCI_ARB }, /* PCI_REQn[3] */
9037 + { 5, MPP_PCI_ARB }, /* PCI_GNTn[3] */
9038 + { 6, MPP_GPIO }, /* JP0, CON17.2 */
9039 + { 7, MPP_GPIO }, /* JP1, CON17.1 */
9040 + { 8, MPP_GPIO }, /* JP2, CON11.2 */
9041 + { 9, MPP_GPIO }, /* JP3, CON11.3 */
9042 + { 10, MPP_GPIO }, /* RTC int */
9043 + { 11, MPP_GPIO }, /* Baud Rate Generator */
9044 + { 12, MPP_GPIO }, /* PCI int 1 */
9045 + { 13, MPP_GPIO }, /* PCI int 2 */
9046 + { 14, MPP_NAND }, /* NAND_REn[2] */
9047 + { 15, MPP_NAND }, /* NAND_WEn[2] */
9048 + { 16, MPP_UART }, /* UART1_RX */
9049 + { 17, MPP_UART }, /* UART1_TX */
9050 + { 18, MPP_UART }, /* UART1_CTSn */
9051 + { 19, MPP_UART }, /* UART1_RTSn */
9052 + { -1 },
9053 };
9054
9055 static void __init db88f5281_init(void)
9056 @@ -315,39 +329,31 @@
9057 */
9058 orion5x_init();
9059
9060 + orion5x_mpp_conf(db88f5281_mpp_modes);
9061 + writel(0, MPP_DEV_CTRL); /* DEV_D[31:16] */
9062 +
9063 /*
9064 - * Setup the CPU address decode windows for our on-board devices
9065 + * Configure peripherals.
9066 */
9067 + orion5x_ehci0_init();
9068 + orion5x_eth_init(&db88f5281_eth_data);
9069 + orion5x_i2c_init();
9070 + orion5x_uart0_init();
9071 + orion5x_uart1_init();
9072 +
9073 orion5x_setup_dev_boot_win(DB88F5281_NOR_BOOT_BASE,
9074 DB88F5281_NOR_BOOT_SIZE);
9075 + platform_device_register(&db88f5281_boot_flash);
9076 +
9077 orion5x_setup_dev0_win(DB88F5281_7SEG_BASE, DB88F5281_7SEG_SIZE);
9078 - orion5x_setup_dev1_win(DB88F5281_NOR_BASE, DB88F5281_NOR_SIZE);
9079 - orion5x_setup_dev2_win(DB88F5281_NAND_BASE, DB88F5281_NAND_SIZE);
9080
9081 - /*
9082 - * Setup Multiplexing Pins:
9083 - * MPP0: GPIO (USB Over Current) MPP1: GPIO (USB Vbat input)
9084 - * MPP2: PCI_REQn[2] MPP3: PCI_GNTn[2]
9085 - * MPP4: PCI_REQn[3] MPP5: PCI_GNTn[3]
9086 - * MPP6: GPIO (JP0, CON17.2) MPP7: GPIO (JP1, CON17.1)
9087 - * MPP8: GPIO (JP2, CON11.2) MPP9: GPIO (JP3, CON11.3)
9088 - * MPP10: GPIO (RTC int) MPP11: GPIO (Baud Rate Generator)
9089 - * MPP12: GPIO (PCI int 1) MPP13: GPIO (PCI int 2)
9090 - * MPP14: NAND_REn[2] MPP15: NAND_WEn[2]
9091 - * MPP16: UART1_RX MPP17: UART1_TX
9092 - * MPP18: UART1_CTS MPP19: UART1_RTS
9093 - * MPP-DEV: DEV_D[16:31]
9094 - */
9095 - orion5x_write(MPP_0_7_CTRL, 0x00222203);
9096 - orion5x_write(MPP_8_15_CTRL, 0x44000000);
9097 - orion5x_write(MPP_16_19_CTRL, 0);
9098 - orion5x_write(MPP_DEV_CTRL, 0);
9099 + orion5x_setup_dev1_win(DB88F5281_NOR_BASE, DB88F5281_NOR_SIZE);
9100 + platform_device_register(&db88f5281_nor_flash);
9101
9102 - orion5x_gpio_set_valid_pins(0x00003fc3);
9103 + orion5x_setup_dev2_win(DB88F5281_NAND_BASE, DB88F5281_NAND_SIZE);
9104 + platform_device_register(&db88f5281_nand_flash);
9105
9106 - platform_add_devices(db88f5281_devs, ARRAY_SIZE(db88f5281_devs));
9107 i2c_register_board_info(0, &db88f5281_i2c_rtc, 1);
9108 - orion5x_eth_init(&db88f5281_eth_data);
9109 }
9110
9111 MACHINE_START(DB88F5281, "Marvell Orion-2 Development Board")
9112 --- a/arch/arm/mach-orion5x/dns323-setup.c
9113 +++ b/arch/arm/mach-orion5x/dns323-setup.c
9114 @@ -27,6 +27,7 @@
9115 #include <asm/mach/pci.h>
9116 #include <asm/arch/orion5x.h>
9117 #include "common.h"
9118 +#include "mpp.h"
9119
9120 #define DNS323_GPIO_LED_RIGHT_AMBER 1
9121 #define DNS323_GPIO_LED_LEFT_AMBER 2
9122 @@ -52,8 +53,6 @@
9123 if (irq != -1)
9124 return irq;
9125
9126 - pr_err("%s: requested mapping for unknown device\n", __func__);
9127 -
9128 return -1;
9129 }
9130
9131 @@ -81,7 +80,6 @@
9132
9133 static struct mv643xx_eth_platform_data dns323_eth_data = {
9134 .phy_addr = 8,
9135 - .force_phy_addr = 1,
9136 };
9137
9138 /****************************************************************************
9139 @@ -119,7 +117,7 @@
9140 .name = "u-boot",
9141 .size = 0x00030000,
9142 .offset = 0x007d0000,
9143 - }
9144 + },
9145 };
9146
9147 static struct physmap_flash_data dns323_nor_flash_data = {
9148 @@ -137,7 +135,9 @@
9149 static struct platform_device dns323_nor_flash = {
9150 .name = "physmap-flash",
9151 .id = 0,
9152 - .dev = { .platform_data = &dns323_nor_flash_data, },
9153 + .dev = {
9154 + .platform_data = &dns323_nor_flash_data,
9155 + },
9156 .resource = &dns323_nor_flash_resource,
9157 .num_resources = 1,
9158 };
9159 @@ -170,7 +170,9 @@
9160 static struct platform_device dns323_gpio_leds = {
9161 .name = "leds-gpio",
9162 .id = -1,
9163 - .dev = { .platform_data = &dns323_led_data, },
9164 + .dev = {
9165 + .platform_data = &dns323_led_data,
9166 + },
9167 };
9168
9169 /****************************************************************************
9170 @@ -183,35 +185,53 @@
9171 .gpio = DNS323_GPIO_KEY_RESET,
9172 .desc = "Reset Button",
9173 .active_low = 1,
9174 - },
9175 - {
9176 + }, {
9177 .code = KEY_POWER,
9178 .gpio = DNS323_GPIO_KEY_POWER,
9179 .desc = "Power Button",
9180 .active_low = 1,
9181 - }
9182 + },
9183 };
9184
9185 static struct gpio_keys_platform_data dns323_button_data = {
9186 .buttons = dns323_buttons,
9187 - .nbuttons = ARRAY_SIZE(dns323_buttons),
9188 + .nbuttons = ARRAY_SIZE(dns323_buttons),
9189 };
9190
9191 static struct platform_device dns323_button_device = {
9192 .name = "gpio-keys",
9193 .id = -1,
9194 .num_resources = 0,
9195 - .dev = { .platform_data = &dns323_button_data, },
9196 + .dev = {
9197 + .platform_data = &dns323_button_data,
9198 + },
9199 };
9200
9201 /****************************************************************************
9202 * General Setup
9203 */
9204 -
9205 -static struct platform_device *dns323_plat_devices[] __initdata = {
9206 - &dns323_nor_flash,
9207 - &dns323_gpio_leds,
9208 - &dns323_button_device,
9209 +static struct orion5x_mpp_mode dns323_mpp_modes[] __initdata = {
9210 + { 0, MPP_PCIE_RST_OUTn },
9211 + { 1, MPP_GPIO }, /* right amber LED (sata ch0) */
9212 + { 2, MPP_GPIO }, /* left amber LED (sata ch1) */
9213 + { 3, MPP_UNUSED },
9214 + { 4, MPP_GPIO }, /* power button LED */
9215 + { 5, MPP_GPIO }, /* power button LED */
9216 + { 6, MPP_GPIO }, /* GMT G751-2f overtemp */
9217 + { 7, MPP_GPIO }, /* M41T80 nIRQ/OUT/SQW */
9218 + { 8, MPP_GPIO }, /* triggers power off */
9219 + { 9, MPP_GPIO }, /* power button switch */
9220 + { 10, MPP_GPIO }, /* reset button switch */
9221 + { 11, MPP_UNUSED },
9222 + { 12, MPP_UNUSED },
9223 + { 13, MPP_UNUSED },
9224 + { 14, MPP_UNUSED },
9225 + { 15, MPP_UNUSED },
9226 + { 16, MPP_UNUSED },
9227 + { 17, MPP_UNUSED },
9228 + { 18, MPP_UNUSED },
9229 + { 19, MPP_UNUSED },
9230 + { -1 },
9231 };
9232
9233 /*
9234 @@ -225,17 +245,15 @@
9235 static struct i2c_board_info __initdata dns323_i2c_devices[] = {
9236 {
9237 I2C_BOARD_INFO("g760a", 0x3e),
9238 - },
9239 #if 0
9240 /* this entry requires the new-style driver model lm75 driver,
9241 * for the meantime "insmod lm75.ko force_lm75=0,0x48" is needed */
9242 - {
9243 + }, {
9244 I2C_BOARD_INFO("g751", 0x48),
9245 - },
9246 #endif
9247 - {
9248 + }, {
9249 I2C_BOARD_INFO("m41t80", 0x68),
9250 - }
9251 + },
9252 };
9253
9254 /* DNS-323 specific power off method */
9255 @@ -250,62 +268,35 @@
9256 /* Setup basic Orion functions. Need to be called early. */
9257 orion5x_init();
9258
9259 + orion5x_mpp_conf(dns323_mpp_modes);
9260 + writel(0, MPP_DEV_CTRL); /* DEV_D[31:16] */
9261 +
9262 + /*
9263 + * Configure peripherals.
9264 + */
9265 + orion5x_ehci0_init();
9266 + orion5x_eth_init(&dns323_eth_data);
9267 + orion5x_i2c_init();
9268 + orion5x_uart0_init();
9269 +
9270 /* setup flash mapping
9271 * CS3 holds a 8 MB Spansion S29GL064M90TFIR4
9272 */
9273 orion5x_setup_dev_boot_win(DNS323_NOR_BOOT_BASE, DNS323_NOR_BOOT_SIZE);
9274 + platform_device_register(&dns323_nor_flash);
9275
9276 - /* DNS-323 has a Marvell 88X7042 SATA controller attached via PCIe
9277 - *
9278 - * Open a special address decode windows for the PCIe WA.
9279 - */
9280 - orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
9281 - ORION5X_PCIE_WA_SIZE);
9282 -
9283 - /* set MPP to 0 as D-Link's 2.6.12.6 kernel did */
9284 - orion5x_write(MPP_0_7_CTRL, 0);
9285 - orion5x_write(MPP_8_15_CTRL, 0);
9286 - orion5x_write(MPP_16_19_CTRL, 0);
9287 - orion5x_write(MPP_DEV_CTRL, 0);
9288 -
9289 - /* Define used GPIO pins
9290 -
9291 - GPIO Map:
9292 -
9293 - | 0 | | PEX_RST_OUT (not controlled by GPIO)
9294 - | 1 | Out | right amber LED (= sata ch0 LED) (low-active)
9295 - | 2 | Out | left amber LED (= sata ch1 LED) (low-active)
9296 - | 3 | Out | //unknown//
9297 - | 4 | Out | power button LED (low-active, together with pin #5)
9298 - | 5 | Out | power button LED (low-active, together with pin #4)
9299 - | 6 | In | GMT G751-2f overtemp. shutdown signal (low-active)
9300 - | 7 | In | M41T80 nIRQ/OUT/SQW signal
9301 - | 8 | Out | triggers power off (high-active)
9302 - | 9 | In | power button switch (low-active)
9303 - | 10 | In | reset button switch (low-active)
9304 - | 11 | Out | //unknown//
9305 - | 12 | Out | //unknown//
9306 - | 13 | Out | //unknown//
9307 - | 14 | Out | //unknown//
9308 - | 15 | Out | //unknown//
9309 - */
9310 - orion5x_gpio_set_valid_pins(0x07f6);
9311 -
9312 - /* register dns323 specific power-off method */
9313 - if ((gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0)
9314 - || (gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0))
9315 - pr_err("DNS323: failed to setup power-off GPIO\n");
9316 -
9317 - pm_power_off = dns323_power_off;
9318 + platform_device_register(&dns323_gpio_leds);
9319
9320 - /* register flash and other platform devices */
9321 - platform_add_devices(dns323_plat_devices,
9322 - ARRAY_SIZE(dns323_plat_devices));
9323 + platform_device_register(&dns323_button_device);
9324
9325 i2c_register_board_info(0, dns323_i2c_devices,
9326 ARRAY_SIZE(dns323_i2c_devices));
9327
9328 - orion5x_eth_init(&dns323_eth_data);
9329 + /* register dns323 specific power-off method */
9330 + if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
9331 + gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
9332 + pr_err("DNS323: failed to setup power-off GPIO\n");
9333 + pm_power_off = dns323_power_off;
9334 }
9335
9336 /* Warning: D-Link uses a wrong mach-type (=526) in their bootloader */
9337 --- a/arch/arm/mach-orion5x/gpio.c
9338 +++ b/arch/arm/mach-orion5x/gpio.c
9339 @@ -24,9 +24,12 @@
9340 static unsigned long gpio_valid[BITS_TO_LONGS(GPIO_MAX)];
9341 static const char *gpio_label[GPIO_MAX]; /* non null for allocated GPIOs */
9342
9343 -void __init orion5x_gpio_set_valid_pins(u32 pins)
9344 +void __init orion5x_gpio_set_valid(unsigned pin, int valid)
9345 {
9346 - gpio_valid[0] = pins;
9347 + if (valid)
9348 + __set_bit(pin, gpio_valid);
9349 + else
9350 + __clear_bit(pin, gpio_valid);
9351 }
9352
9353 /*
9354 @@ -93,10 +96,10 @@
9355 {
9356 int val, mask = 1 << pin;
9357
9358 - if (orion5x_read(GPIO_IO_CONF) & mask)
9359 - val = orion5x_read(GPIO_DATA_IN) ^ orion5x_read(GPIO_IN_POL);
9360 + if (readl(GPIO_IO_CONF) & mask)
9361 + val = readl(GPIO_DATA_IN) ^ readl(GPIO_IN_POL);
9362 else
9363 - val = orion5x_read(GPIO_OUT);
9364 + val = readl(GPIO_OUT);
9365
9366 return val & mask;
9367 }
9368 @@ -188,39 +191,39 @@
9369 printk("GPIO, free\n");
9370 } else {
9371 printk("GPIO, used by %s, ", gpio_label[i]);
9372 - if (orion5x_read(GPIO_IO_CONF) & (1 << i)) {
9373 + if (readl(GPIO_IO_CONF) & (1 << i)) {
9374 printk("input, active %s, level %s, edge %s\n",
9375 - ((orion5x_read(GPIO_IN_POL) >> i) & 1) ? "low" : "high",
9376 - ((orion5x_read(GPIO_LEVEL_MASK) >> i) & 1) ? "enabled" : "masked",
9377 - ((orion5x_read(GPIO_EDGE_MASK) >> i) & 1) ? "enabled" : "masked");
9378 + ((readl(GPIO_IN_POL) >> i) & 1) ? "low" : "high",
9379 + ((readl(GPIO_LEVEL_MASK) >> i) & 1) ? "enabled" : "masked",
9380 + ((readl(GPIO_EDGE_MASK) >> i) & 1) ? "enabled" : "masked");
9381 } else {
9382 - printk("output, val=%d\n", (orion5x_read(GPIO_OUT) >> i) & 1);
9383 + printk("output, val=%d\n", (readl(GPIO_OUT) >> i) & 1);
9384 }
9385 }
9386 }
9387
9388 printk(KERN_DEBUG "MPP_0_7_CTRL (0x%08x) = 0x%08x\n",
9389 - MPP_0_7_CTRL, orion5x_read(MPP_0_7_CTRL));
9390 + MPP_0_7_CTRL, readl(MPP_0_7_CTRL));
9391 printk(KERN_DEBUG "MPP_8_15_CTRL (0x%08x) = 0x%08x\n",
9392 - MPP_8_15_CTRL, orion5x_read(MPP_8_15_CTRL));
9393 + MPP_8_15_CTRL, readl(MPP_8_15_CTRL));
9394 printk(KERN_DEBUG "MPP_16_19_CTRL (0x%08x) = 0x%08x\n",
9395 - MPP_16_19_CTRL, orion5x_read(MPP_16_19_CTRL));
9396 + MPP_16_19_CTRL, readl(MPP_16_19_CTRL));
9397 printk(KERN_DEBUG "MPP_DEV_CTRL (0x%08x) = 0x%08x\n",
9398 - MPP_DEV_CTRL, orion5x_read(MPP_DEV_CTRL));
9399 + MPP_DEV_CTRL, readl(MPP_DEV_CTRL));
9400 printk(KERN_DEBUG "GPIO_OUT (0x%08x) = 0x%08x\n",
9401 - GPIO_OUT, orion5x_read(GPIO_OUT));
9402 + GPIO_OUT, readl(GPIO_OUT));
9403 printk(KERN_DEBUG "GPIO_IO_CONF (0x%08x) = 0x%08x\n",
9404 - GPIO_IO_CONF, orion5x_read(GPIO_IO_CONF));
9405 + GPIO_IO_CONF, readl(GPIO_IO_CONF));
9406 printk(KERN_DEBUG "GPIO_BLINK_EN (0x%08x) = 0x%08x\n",
9407 - GPIO_BLINK_EN, orion5x_read(GPIO_BLINK_EN));
9408 + GPIO_BLINK_EN, readl(GPIO_BLINK_EN));
9409 printk(KERN_DEBUG "GPIO_IN_POL (0x%08x) = 0x%08x\n",
9410 - GPIO_IN_POL, orion5x_read(GPIO_IN_POL));
9411 + GPIO_IN_POL, readl(GPIO_IN_POL));
9412 printk(KERN_DEBUG "GPIO_DATA_IN (0x%08x) = 0x%08x\n",
9413 - GPIO_DATA_IN, orion5x_read(GPIO_DATA_IN));
9414 + GPIO_DATA_IN, readl(GPIO_DATA_IN));
9415 printk(KERN_DEBUG "GPIO_LEVEL_MASK (0x%08x) = 0x%08x\n",
9416 - GPIO_LEVEL_MASK, orion5x_read(GPIO_LEVEL_MASK));
9417 + GPIO_LEVEL_MASK, readl(GPIO_LEVEL_MASK));
9418 printk(KERN_DEBUG "GPIO_EDGE_CAUSE (0x%08x) = 0x%08x\n",
9419 - GPIO_EDGE_CAUSE, orion5x_read(GPIO_EDGE_CAUSE));
9420 + GPIO_EDGE_CAUSE, readl(GPIO_EDGE_CAUSE));
9421 printk(KERN_DEBUG "GPIO_EDGE_MASK (0x%08x) = 0x%08x\n",
9422 - GPIO_EDGE_MASK, orion5x_read(GPIO_EDGE_MASK));
9423 + GPIO_EDGE_MASK, readl(GPIO_EDGE_MASK));
9424 }
9425 --- a/arch/arm/mach-orion5x/irq.c
9426 +++ b/arch/arm/mach-orion5x/irq.c
9427 @@ -82,7 +82,7 @@
9428 int pin = irq_to_gpio(irq);
9429 struct irq_desc *desc;
9430
9431 - if ((orion5x_read(GPIO_IO_CONF) & (1 << pin)) == 0) {
9432 + if ((readl(GPIO_IO_CONF) & (1 << pin)) == 0) {
9433 printk(KERN_ERR "orion5x_gpio_set_irq_type failed "
9434 "(irq %d, pin %d).\n", irq, pin);
9435 return -EINVAL;
9436 @@ -117,7 +117,7 @@
9437 /*
9438 * set initial polarity based on current input level
9439 */
9440 - if ((orion5x_read(GPIO_IN_POL) ^ orion5x_read(GPIO_DATA_IN))
9441 + if ((readl(GPIO_IN_POL) ^ readl(GPIO_DATA_IN))
9442 & (1 << pin))
9443 orion5x_setbits(GPIO_IN_POL, (1 << pin)); /* falling */
9444 else
9445 @@ -149,8 +149,8 @@
9446
9447 BUG_ON(irq < IRQ_ORION5X_GPIO_0_7 || irq > IRQ_ORION5X_GPIO_24_31);
9448 offs = (irq - IRQ_ORION5X_GPIO_0_7) * 8;
9449 - cause = (orion5x_read(GPIO_DATA_IN) & orion5x_read(GPIO_LEVEL_MASK)) |
9450 - (orion5x_read(GPIO_EDGE_CAUSE) & orion5x_read(GPIO_EDGE_MASK));
9451 + cause = (readl(GPIO_DATA_IN) & readl(GPIO_LEVEL_MASK)) |
9452 + (readl(GPIO_EDGE_CAUSE) & readl(GPIO_EDGE_MASK));
9453
9454 for (pin = offs; pin < offs + 8; pin++) {
9455 if (cause & (1 << pin)) {
9456 @@ -158,9 +158,9 @@
9457 desc = irq_desc + irq;
9458 if ((desc->status & IRQ_TYPE_SENSE_MASK) == IRQT_BOTHEDGE) {
9459 /* Swap polarity (race with GPIO line) */
9460 - u32 polarity = orion5x_read(GPIO_IN_POL);
9461 + u32 polarity = readl(GPIO_IN_POL);
9462 polarity ^= 1 << pin;
9463 - orion5x_write(GPIO_IN_POL, polarity);
9464 + writel(polarity, GPIO_IN_POL);
9465 }
9466 desc_handle_irq(irq, desc);
9467 }
9468 @@ -175,9 +175,9 @@
9469 /*
9470 * Mask and clear GPIO IRQ interrupts
9471 */
9472 - orion5x_write(GPIO_LEVEL_MASK, 0x0);
9473 - orion5x_write(GPIO_EDGE_MASK, 0x0);
9474 - orion5x_write(GPIO_EDGE_CAUSE, 0x0);
9475 + writel(0x0, GPIO_LEVEL_MASK);
9476 + writel(0x0, GPIO_EDGE_MASK);
9477 + writel(0x0, GPIO_EDGE_CAUSE);
9478
9479 /*
9480 * Register chained level handlers for GPIO IRQs by default.
9481 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
9482 +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
9483 @@ -13,10 +13,12 @@
9484 #include <linux/platform_device.h>
9485 #include <linux/pci.h>
9486 #include <linux/irq.h>
9487 +#include <linux/delay.h>
9488 #include <linux/mtd/physmap.h>
9489 #include <linux/mtd/nand.h>
9490 #include <linux/mv643xx_eth.h>
9491 #include <linux/i2c.h>
9492 +#include <linux/serial_reg.h>
9493 #include <linux/ata_platform.h>
9494 #include <asm/mach-types.h>
9495 #include <asm/gpio.h>
9496 @@ -25,6 +27,7 @@
9497 #include <asm/arch/orion5x.h>
9498 #include <asm/plat-orion/orion_nand.h>
9499 #include "common.h"
9500 +#include "mpp.h"
9501
9502 /*****************************************************************************
9503 * KUROBOX-PRO Info
9504 @@ -53,13 +56,11 @@
9505 .name = "uImage",
9506 .offset = 0,
9507 .size = SZ_4M,
9508 - },
9509 - {
9510 + }, {
9511 .name = "rootfs",
9512 .offset = SZ_4M,
9513 .size = SZ_64M,
9514 - },
9515 - {
9516 + }, {
9517 .name = "extra",
9518 .offset = SZ_4M + SZ_64M,
9519 .size = SZ_256M - (SZ_4M + SZ_64M),
9520 @@ -132,8 +133,6 @@
9521 /*
9522 * PCI isn't used on the Kuro
9523 */
9524 - printk(KERN_ERR "kurobox_pro_pci_map_irq failed, unknown bus\n");
9525 -
9526 return -1;
9527 }
9528
9529 @@ -161,7 +160,6 @@
9530
9531 static struct mv643xx_eth_platform_data kurobox_pro_eth_data = {
9532 .phy_addr = 8,
9533 - .force_phy_addr = 1,
9534 };
9535
9536 /*****************************************************************************
9537 @@ -175,12 +173,169 @@
9538 * SATA
9539 ****************************************************************************/
9540 static struct mv_sata_platform_data kurobox_pro_sata_data = {
9541 - .n_ports = 2,
9542 + .n_ports = 2,
9543 };
9544
9545 /*****************************************************************************
9546 + * Kurobox Pro specific power off method via UART1-attached microcontroller
9547 + ****************************************************************************/
9548 +
9549 +#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
9550 +
9551 +static int kurobox_pro_miconread(unsigned char *buf, int count)
9552 +{
9553 + int i;
9554 + int timeout;
9555 +
9556 + for (i = 0; i < count; i++) {
9557 + timeout = 10;
9558 +
9559 + while (!(readl(UART1_REG(LSR)) & UART_LSR_DR)) {
9560 + if (--timeout == 0)
9561 + break;
9562 + udelay(1000);
9563 + }
9564 +
9565 + if (timeout == 0)
9566 + break;
9567 + buf[i] = readl(UART1_REG(RX));
9568 + }
9569 +
9570 + /* return read bytes */
9571 + return i;
9572 +}
9573 +
9574 +static int kurobox_pro_miconwrite(const unsigned char *buf, int count)
9575 +{
9576 + int i = 0;
9577 +
9578 + while (count--) {
9579 + while (!(readl(UART1_REG(LSR)) & UART_LSR_THRE))
9580 + barrier();
9581 + writel(buf[i++], UART1_REG(TX));
9582 + }
9583 +
9584 + return 0;
9585 +}
9586 +
9587 +static int kurobox_pro_miconsend(const unsigned char *data, int count)
9588 +{
9589 + int i;
9590 + unsigned char checksum = 0;
9591 + unsigned char recv_buf[40];
9592 + unsigned char send_buf[40];
9593 + unsigned char correct_ack[3];
9594 + int retry = 2;
9595 +
9596 + /* Generate checksum */
9597 + for (i = 0; i < count; i++)
9598 + checksum -= data[i];
9599 +
9600 + do {
9601 + /* Send data */
9602 + kurobox_pro_miconwrite(data, count);
9603 +
9604 + /* send checksum */
9605 + kurobox_pro_miconwrite(&checksum, 1);
9606 +
9607 + if (kurobox_pro_miconread(recv_buf, sizeof(recv_buf)) <= 3) {
9608 + printk(KERN_ERR ">%s: receive failed.\n", __func__);
9609 +
9610 + /* send preamble to clear the receive buffer */
9611 + memset(&send_buf, 0xff, sizeof(send_buf));
9612 + kurobox_pro_miconwrite(send_buf, sizeof(send_buf));
9613 +
9614 + /* make dummy reads */
9615 + mdelay(100);
9616 + kurobox_pro_miconread(recv_buf, sizeof(recv_buf));
9617 + } else {
9618 + /* Generate expected ack */
9619 + correct_ack[0] = 0x01;
9620 + correct_ack[1] = data[1];
9621 + correct_ack[2] = 0x00;
9622 +
9623 + /* checksum Check */
9624 + if ((recv_buf[0] + recv_buf[1] + recv_buf[2] +
9625 + recv_buf[3]) & 0xFF) {
9626 + printk(KERN_ERR ">%s: Checksum Error : "
9627 + "Received data[%02x, %02x, %02x, %02x]"
9628 + "\n", __func__, recv_buf[0],
9629 + recv_buf[1], recv_buf[2], recv_buf[3]);
9630 + } else {
9631 + /* Check Received Data */
9632 + if (correct_ack[0] == recv_buf[0] &&
9633 + correct_ack[1] == recv_buf[1] &&
9634 + correct_ack[2] == recv_buf[2]) {
9635 + /* Interval for next command */
9636 + mdelay(10);
9637 +
9638 + /* Receive ACK */
9639 + return 0;
9640 + }
9641 + }
9642 + /* Received NAK or illegal Data */
9643 + printk(KERN_ERR ">%s: Error : NAK or Illegal Data "
9644 + "Received\n", __func__);
9645 + }
9646 + } while (retry--);
9647 +
9648 + /* Interval for next command */
9649 + mdelay(10);
9650 +
9651 + return -1;
9652 +}
9653 +
9654 +static void kurobox_pro_power_off(void)
9655 +{
9656 + const unsigned char watchdogkill[] = {0x01, 0x35, 0x00};
9657 + const unsigned char shutdownwait[] = {0x00, 0x0c};
9658 + const unsigned char poweroff[] = {0x00, 0x06};
9659 + /* 38400 baud divisor */
9660 + const unsigned divisor = ((ORION5X_TCLK + (8 * 38400)) / (16 * 38400));
9661 +
9662 + pr_info("%s: triggering power-off...\n", __func__);
9663 +
9664 + /* hijack uart1 and reset into sane state (38400,8n1,even parity) */
9665 + writel(0x83, UART1_REG(LCR));
9666 + writel(divisor & 0xff, UART1_REG(DLL));
9667 + writel((divisor >> 8) & 0xff, UART1_REG(DLM));
9668 + writel(0x1b, UART1_REG(LCR));
9669 + writel(0x00, UART1_REG(IER));
9670 + writel(0x07, UART1_REG(FCR));
9671 + writel(0x00, UART1_REG(MCR));
9672 +
9673 + /* Send the commands to shutdown the Kurobox Pro */
9674 + kurobox_pro_miconsend(watchdogkill, sizeof(watchdogkill)) ;
9675 + kurobox_pro_miconsend(shutdownwait, sizeof(shutdownwait)) ;
9676 + kurobox_pro_miconsend(poweroff, sizeof(poweroff));
9677 +}
9678 +
9679 +/*****************************************************************************
9680 * General Setup
9681 ****************************************************************************/
9682 +static struct orion5x_mpp_mode kurobox_pro_mpp_modes[] __initdata = {
9683 + { 0, MPP_UNUSED },
9684 + { 1, MPP_UNUSED },
9685 + { 2, MPP_GPIO }, /* GPIO Micon */
9686 + { 3, MPP_GPIO }, /* GPIO Rtc */
9687 + { 4, MPP_UNUSED },
9688 + { 5, MPP_UNUSED },
9689 + { 6, MPP_NAND }, /* NAND Flash REn */
9690 + { 7, MPP_NAND }, /* NAND Flash WEn */
9691 + { 8, MPP_UNUSED },
9692 + { 9, MPP_UNUSED },
9693 + { 10, MPP_UNUSED },
9694 + { 11, MPP_UNUSED },
9695 + { 12, MPP_SATA_LED }, /* SATA 0 presence */
9696 + { 13, MPP_SATA_LED }, /* SATA 1 presence */
9697 + { 14, MPP_SATA_LED }, /* SATA 0 active */
9698 + { 15, MPP_SATA_LED }, /* SATA 1 active */
9699 + { 16, MPP_UART }, /* UART1 RXD */
9700 + { 17, MPP_UART }, /* UART1 TXD */
9701 + { 18, MPP_UART }, /* UART1 CTSn */
9702 + { 19, MPP_UART }, /* UART1 RTSn */
9703 + { -1 },
9704 +};
9705
9706 static void __init kurobox_pro_init(void)
9707 {
9708 @@ -189,46 +344,32 @@
9709 */
9710 orion5x_init();
9711
9712 - /*
9713 - * Setup the CPU address decode windows for our devices
9714 - */
9715 - orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE,
9716 - KUROBOX_PRO_NOR_BOOT_SIZE);
9717 - orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE, KUROBOX_PRO_NAND_SIZE);
9718 + orion5x_mpp_conf(kurobox_pro_mpp_modes);
9719
9720 /*
9721 - * Open a special address decode windows for the PCIe WA.
9722 + * Configure peripherals.
9723 */
9724 - orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
9725 - ORION5X_PCIE_WA_SIZE);
9726 -
9727 - /*
9728 - * Setup Multiplexing Pins --
9729 - * MPP[0-1] Not used
9730 - * MPP[2] GPIO Micon
9731 - * MPP[3] GPIO RTC
9732 - * MPP[4-5] Not used
9733 - * MPP[6] Nand Flash REn
9734 - * MPP[7] Nand Flash WEn
9735 - * MPP[8-11] Not used
9736 - * MPP[12] SATA 0 presence Indication
9737 - * MPP[13] SATA 1 presence Indication
9738 - * MPP[14] SATA 0 active Indication
9739 - * MPP[15] SATA 1 active indication
9740 - * MPP[16-19] Not used
9741 - */
9742 - orion5x_write(MPP_0_7_CTRL, 0x44220003);
9743 - orion5x_write(MPP_8_15_CTRL, 0x55550000);
9744 - orion5x_write(MPP_16_19_CTRL, 0x0);
9745 -
9746 - orion5x_gpio_set_valid_pins(0x0000000c);
9747 + orion5x_ehci0_init();
9748 + orion5x_ehci1_init();
9749 + orion5x_eth_init(&kurobox_pro_eth_data);
9750 + orion5x_i2c_init();
9751 + orion5x_sata_init(&kurobox_pro_sata_data);
9752 + orion5x_uart0_init();
9753
9754 + orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE,
9755 + KUROBOX_PRO_NOR_BOOT_SIZE);
9756 platform_device_register(&kurobox_pro_nor_flash);
9757 - if (machine_is_kurobox_pro())
9758 +
9759 + if (machine_is_kurobox_pro()) {
9760 + orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE,
9761 + KUROBOX_PRO_NAND_SIZE);
9762 platform_device_register(&kurobox_pro_nand_flash);
9763 + }
9764 +
9765 i2c_register_board_info(0, &kurobox_pro_i2c_rtc, 1);
9766 - orion5x_eth_init(&kurobox_pro_eth_data);
9767 - orion5x_sata_init(&kurobox_pro_sata_data);
9768 +
9769 + /* register Kurobox Pro specific power-off method */
9770 + pm_power_off = kurobox_pro_power_off;
9771 }
9772
9773 #ifdef CONFIG_MACH_KUROBOX_PRO
9774 --- /dev/null
9775 +++ b/arch/arm/mach-orion5x/mpp.c
9776 @@ -0,0 +1,163 @@
9777 +/*
9778 + * arch/arm/mach-orion5x/mpp.c
9779 + *
9780 + * MPP functions for Marvell Orion 5x SoCs
9781 + *
9782 + * This file is licensed under the terms of the GNU General Public
9783 + * License version 2. This program is licensed "as is" without any
9784 + * warranty of any kind, whether express or implied.
9785 + */
9786 +
9787 +#include <linux/kernel.h>
9788 +#include <linux/init.h>
9789 +#include <linux/mbus.h>
9790 +#include <asm/hardware.h>
9791 +#include <asm/io.h>
9792 +#include "common.h"
9793 +#include "mpp.h"
9794 +
9795 +static int is_5181l(void)
9796 +{
9797 + u32 dev;
9798 + u32 rev;
9799 +
9800 + orion5x_pcie_id(&dev, &rev);
9801 +
9802 + return !!(dev == MV88F5181_DEV_ID && rev >= MV88F5181L_REV_A0);
9803 +}
9804 +
9805 +static int is_5182(void)
9806 +{
9807 + u32 dev;
9808 + u32 rev;
9809 +
9810 + orion5x_pcie_id(&dev, &rev);
9811 +
9812 + return !!(dev == MV88F5182_DEV_ID);
9813 +}
9814 +
9815 +static int is_5281(void)
9816 +{
9817 + u32 dev;
9818 + u32 rev;
9819 +
9820 + orion5x_pcie_id(&dev, &rev);
9821 +
9822 + return !!(dev == MV88F5281_DEV_ID);
9823 +}
9824 +
9825 +static int __init determine_type_encoding(int mpp, enum orion5x_mpp_type type)
9826 +{
9827 + switch (type) {
9828 + case MPP_UNUSED:
9829 + case MPP_GPIO:
9830 + if (mpp == 0)
9831 + return 3;
9832 + if (mpp >= 1 && mpp <= 15)
9833 + return 0;
9834 + if (mpp >= 16 && mpp <= 19) {
9835 + if (is_5182())
9836 + return 5;
9837 + if (type == MPP_UNUSED)
9838 + return 0;
9839 + }
9840 + return -1;
9841 +
9842 + case MPP_PCIE_RST_OUTn:
9843 + if (mpp == 0)
9844 + return 0;
9845 + return -1;
9846 +
9847 + case MPP_PCI_ARB:
9848 + if (mpp >= 0 && mpp <= 7)
9849 + return 2;
9850 + return -1;
9851 +
9852 + case MPP_PCI_PMEn:
9853 + if (mpp == 2)
9854 + return 3;
9855 + return -1;
9856 +
9857 + case MPP_GIGE:
9858 + if (mpp >= 8 && mpp <= 19)
9859 + return 1;
9860 + return -1;
9861 +
9862 + case MPP_NAND:
9863 + if (is_5182() || is_5281()) {
9864 + if (mpp >= 4 && mpp <= 7)
9865 + return 4;
9866 + if (mpp >= 12 && mpp <= 17)
9867 + return 4;
9868 + }
9869 + return -1;
9870 +
9871 + case MPP_PCI_CLK:
9872 + if (is_5181l() && mpp >= 6 && mpp <= 7)
9873 + return 5;
9874 + return -1;
9875 +
9876 + case MPP_SATA_LED:
9877 + if (is_5182()) {
9878 + if (mpp >= 4 && mpp <= 7)
9879 + return 5;
9880 + if (mpp >= 12 && mpp <= 15)
9881 + return 5;
9882 + }
9883 + return -1;
9884 +
9885 + case MPP_UART:
9886 + if (mpp >= 16 && mpp <= 19)
9887 + return 0;
9888 + return -1;
9889 + }
9890 +
9891 + printk(KERN_INFO "unknown MPP type %d\n", type);
9892 +
9893 + return -1;
9894 +}
9895 +
9896 +void __init orion5x_mpp_conf(struct orion5x_mpp_mode *mode)
9897 +{
9898 + u32 mpp_0_7_ctrl = readl(MPP_0_7_CTRL);
9899 + u32 mpp_8_15_ctrl = readl(MPP_8_15_CTRL);
9900 + u32 mpp_16_19_ctrl = readl(MPP_16_19_CTRL);
9901 +
9902 + while (mode->mpp >= 0) {
9903 + u32 *reg;
9904 + int num_type;
9905 + int shift;
9906 +
9907 + if (mode->mpp >= 0 && mode->mpp <= 7)
9908 + reg = &mpp_0_7_ctrl;
9909 + else if (mode->mpp >= 8 && mode->mpp <= 15)
9910 + reg = &mpp_8_15_ctrl;
9911 + else if (mode->mpp >= 16 && mode->mpp <= 19)
9912 + reg = &mpp_16_19_ctrl;
9913 + else {
9914 + printk(KERN_ERR "orion5x_mpp_conf: invalid MPP "
9915 + "(%d)\n", mode->mpp);
9916 + continue;
9917 + }
9918 +
9919 + num_type = determine_type_encoding(mode->mpp, mode->type);
9920 + if (num_type < 0) {
9921 + printk(KERN_ERR "orion5x_mpp_conf: invalid MPP "
9922 + "combination (%d, %d)\n", mode->mpp,
9923 + mode->type);
9924 + continue;
9925 + }
9926 +
9927 + shift = (mode->mpp & 7) << 2;
9928 + *reg &= ~(0xf << shift);
9929 + *reg |= (num_type & 0xf) << shift;
9930 +
9931 + orion5x_gpio_set_valid(mode->mpp, !!(mode->type == MPP_GPIO));
9932 +
9933 + mode++;
9934 + }
9935 +
9936 + writel(mpp_0_7_ctrl, MPP_0_7_CTRL);
9937 + writel(mpp_8_15_ctrl, MPP_8_15_CTRL);
9938 + writel(mpp_16_19_ctrl, MPP_16_19_CTRL);
9939 +}
9940 --- /dev/null
9941 +++ b/arch/arm/mach-orion5x/mpp.h
9942 @@ -0,0 +1,74 @@
9943 +#ifndef __ARCH_ORION5X_MPP_H
9944 +#define __ARCH_ORION5X_MPP_H
9945 +
9946 +enum orion5x_mpp_type {
9947 + /*
9948 + * This MPP is unused.
9949 + */
9950 + MPP_UNUSED,
9951 +
9952 + /*
9953 + * This MPP pin is used as a generic GPIO pin. Valid for
9954 + * MPPs 0-15 and device bus data pins 16-31. On 5182, also
9955 + * valid for MPPs 16-19.
9956 + */
9957 + MPP_GPIO,
9958 +
9959 + /*
9960 + * This MPP is used as PCIe_RST_OUTn pin. Valid for
9961 + * MPP 0 only.
9962 + */
9963 + MPP_PCIE_RST_OUTn,
9964 +
9965 + /*
9966 + * This MPP is used as PCI arbiter pin (REQn/GNTn).
9967 + * Valid for MPPs 0-7 only.
9968 + */
9969 + MPP_PCI_ARB,
9970 +
9971 + /*
9972 + * This MPP is used as PCI_PMEn pin. Valid for MPP 2 only.
9973 + */
9974 + MPP_PCI_PMEn,
9975 +
9976 + /*
9977 + * This MPP is used as GigE half-duplex (COL, CRS) or GMII
9978 + * (RXERR, CRS, TXERR, TXD[7:4], RXD[7:4]) pin. Valid for
9979 + * MPPs 8-19 only.
9980 + */
9981 + MPP_GIGE,
9982 +
9983 + /*
9984 + * This MPP is used as NAND REn/WEn pin. Valid for MPPs
9985 + * 4-7 and 12-17 only, and only on the 5181l/5182/5281.
9986 + */
9987 + MPP_NAND,
9988 +
9989 + /*
9990 + * This MPP is used as a PCI clock output pin. Valid for
9991 + * MPPs 6-7 only, and only on the 5181l.
9992 + */
9993 + MPP_PCI_CLK,
9994 +
9995 + /*
9996 + * This MPP is used as a SATA presence/activity LED.
9997 + * Valid for MPPs 4-7 and 12-15 only, and only on the 5182.
9998 + */
9999 + MPP_SATA_LED,
10000 +
10001 + /*
10002 + * This MPP is used as UART1 RXD/TXD/CTSn/RTSn pin.
10003 + * Valid for MPPs 16-19 only.
10004 + */
10005 + MPP_UART,
10006 +};
10007 +
10008 +struct orion5x_mpp_mode {
10009 + int mpp;
10010 + enum orion5x_mpp_type type;
10011 +};
10012 +
10013 +void orion5x_mpp_conf(struct orion5x_mpp_mode *mode);
10014 +
10015 +
10016 +#endif
10017 --- /dev/null
10018 +++ b/arch/arm/mach-orion5x/mss2-setup.c
10019 @@ -0,0 +1,270 @@
10020 +/*
10021 + * Maxtor Shared Storage II Board Setup
10022 + *
10023 + * Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com>
10024 + *
10025 + * This program is free software; you can redistribute it and/or
10026 + * modify it under the terms of the GNU General Public License
10027 + * as published by the Free Software Foundation; either version
10028 + * 2 of the License, or (at your option) any later version.
10029 + */
10030 +
10031 +#include <linux/kernel.h>
10032 +#include <linux/init.h>
10033 +#include <linux/platform_device.h>
10034 +#include <linux/pci.h>
10035 +#include <linux/irq.h>
10036 +#include <linux/mtd/physmap.h>
10037 +#include <linux/mv643xx_eth.h>
10038 +#include <linux/leds.h>
10039 +#include <linux/gpio_keys.h>
10040 +#include <linux/input.h>
10041 +#include <linux/i2c.h>
10042 +#include <linux/ata_platform.h>
10043 +#include <linux/gpio.h>
10044 +#include <asm/mach-types.h>
10045 +#include <asm/mach/arch.h>
10046 +#include <asm/mach/pci.h>
10047 +#include <asm/arch/orion5x.h>
10048 +#include "common.h"
10049 +#include "mpp.h"
10050 +
10051 +#define MSS2_NOR_BOOT_BASE 0xff800000
10052 +#define MSS2_NOR_BOOT_SIZE SZ_256K
10053 +
10054 +/*****************************************************************************
10055 + * Maxtor Shared Storage II Info
10056 + ****************************************************************************/
10057 +
10058 +/*
10059 + * Maxtor Shared Storage II hardware :
10060 + * - Marvell 88F5182-A2 C500
10061 + * - Marvell 88E1111 Gigabit Ethernet PHY
10062 + * - RTC M41T81 (@0x68) on I2C bus
10063 + * - 256KB NOR flash
10064 + * - 64MB of RAM
10065 + */
10066 +
10067 +/*****************************************************************************
10068 + * 256KB NOR Flash on BOOT Device
10069 + ****************************************************************************/
10070 +
10071 +static struct physmap_flash_data mss2_nor_flash_data = {
10072 + .width = 1,
10073 +};
10074 +
10075 +static struct resource mss2_nor_flash_resource = {
10076 + .flags = IORESOURCE_MEM,
10077 + .start = MSS2_NOR_BOOT_BASE,
10078 + .end = MSS2_NOR_BOOT_BASE + MSS2_NOR_BOOT_SIZE - 1,
10079 +};
10080 +
10081 +static struct platform_device mss2_nor_flash = {
10082 + .name = "physmap-flash",
10083 + .id = 0,
10084 + .dev = {
10085 + .platform_data = &mss2_nor_flash_data,
10086 + },
10087 + .resource = &mss2_nor_flash_resource,
10088 + .num_resources = 1,
10089 +};
10090 +
10091 +/****************************************************************************
10092 + * PCI setup
10093 + ****************************************************************************/
10094 +static int __init mss2_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
10095 +{
10096 + int irq;
10097 +
10098 + /*
10099 + * Check for devices with hard-wired IRQs.
10100 + */
10101 + irq = orion5x_pci_map_irq(dev, slot, pin);
10102 + if (irq != -1)
10103 + return irq;
10104 +
10105 + return -1;
10106 +}
10107 +
10108 +static struct hw_pci mss2_pci __initdata = {
10109 + .nr_controllers = 2,
10110 + .swizzle = pci_std_swizzle,
10111 + .setup = orion5x_pci_sys_setup,
10112 + .scan = orion5x_pci_sys_scan_bus,
10113 + .map_irq = mss2_pci_map_irq,
10114 +};
10115 +
10116 +static int __init mss2_pci_init(void)
10117 +{
10118 + if (machine_is_mss2())
10119 + pci_common_init(&mss2_pci);
10120 +
10121 + return 0;
10122 +}
10123 +subsys_initcall(mss2_pci_init);
10124 +
10125 +
10126 +/*****************************************************************************
10127 + * Ethernet
10128 + ****************************************************************************/
10129 +
10130 +static struct mv643xx_eth_platform_data mss2_eth_data = {
10131 + .phy_addr = 8,
10132 +};
10133 +
10134 +/*****************************************************************************
10135 + * SATA
10136 + ****************************************************************************/
10137 +
10138 +static struct mv_sata_platform_data mss2_sata_data = {
10139 + .n_ports = 2,
10140 +};
10141 +
10142 +/*****************************************************************************
10143 + * GPIO buttons
10144 + ****************************************************************************/
10145 +
10146 +#define MSS2_GPIO_KEY_RESET 12
10147 +#define MSS2_GPIO_KEY_POWER 11
10148 +
10149 +static struct gpio_keys_button mss2_buttons[] = {
10150 + {
10151 + .code = KEY_POWER,
10152 + .gpio = MSS2_GPIO_KEY_POWER,
10153 + .desc = "Power",
10154 + .active_low = 1,
10155 + }, {
10156 + .code = KEY_RESTART,
10157 + .gpio = MSS2_GPIO_KEY_RESET,
10158 + .desc = "Reset",
10159 + .active_low = 1,
10160 + },
10161 +};
10162 +
10163 +static struct gpio_keys_platform_data mss2_button_data = {
10164 + .buttons = mss2_buttons,
10165 + .nbuttons = ARRAY_SIZE(mss2_buttons),
10166 +};
10167 +
10168 +static struct platform_device mss2_button_device = {
10169 + .name = "gpio-keys",
10170 + .id = -1,
10171 + .dev = {
10172 + .platform_data = &mss2_button_data,
10173 + },
10174 +};
10175 +
10176 +/*****************************************************************************
10177 + * RTC m41t81 on I2C bus
10178 + ****************************************************************************/
10179 +
10180 +#define MSS2_GPIO_RTC_IRQ 3
10181 +
10182 +static struct i2c_board_info __initdata mss2_i2c_rtc = {
10183 + I2C_BOARD_INFO("m41t81", 0x68),
10184 +};
10185 +
10186 +/*****************************************************************************
10187 + * MSS2 power off method
10188 + ****************************************************************************/
10189 +/*
10190 + * On the Maxtor Shared Storage II, the shutdown process is the following :
10191 + * - Userland modifies U-boot env to tell U-boot to go idle at next boot
10192 + * - The board reboots
10193 + * - U-boot starts and go into an idle mode until the user press "power"
10194 + */
10195 +static void mss2_power_off(void)
10196 +{
10197 + u32 reg;
10198 +
10199 + /*
10200 + * Enable and issue soft reset
10201 + */
10202 + reg = readl(CPU_RESET_MASK);
10203 + reg |= 1 << 2;
10204 + writel(reg, CPU_RESET_MASK);
10205 +
10206 + reg = readl(CPU_SOFT_RESET);
10207 + reg |= 1;
10208 + writel(reg, CPU_SOFT_RESET);
10209 +}
10210 +
10211 +/****************************************************************************
10212 + * General Setup
10213 + ****************************************************************************/
10214 +static struct orion5x_mpp_mode mss2_mpp_modes[] __initdata = {
10215 + { 0, MPP_GPIO }, /* Power LED */
10216 + { 1, MPP_GPIO }, /* Error LED */
10217 + { 2, MPP_UNUSED },
10218 + { 3, MPP_GPIO }, /* RTC interrupt */
10219 + { 4, MPP_GPIO }, /* HDD ind. (Single/Dual)*/
10220 + { 5, MPP_GPIO }, /* HD0 5V control */
10221 + { 6, MPP_GPIO }, /* HD0 12V control */
10222 + { 7, MPP_GPIO }, /* HD1 5V control */
10223 + { 8, MPP_GPIO }, /* HD1 12V control */
10224 + { 9, MPP_UNUSED },
10225 + { 10, MPP_GPIO }, /* Fan control */
10226 + { 11, MPP_GPIO }, /* Power button */
10227 + { 12, MPP_GPIO }, /* Reset button */
10228 + { 13, MPP_UNUSED },
10229 + { 14, MPP_SATA_LED }, /* SATA 0 active */
10230 + { 15, MPP_SATA_LED }, /* SATA 1 active */
10231 + { 16, MPP_UNUSED },
10232 + { 17, MPP_UNUSED },
10233 + { 18, MPP_UNUSED },
10234 + { 19, MPP_UNUSED },
10235 + { -1 },
10236 +};
10237 +
10238 +static void __init mss2_init(void)
10239 +{
10240 + /* Setup basic Orion functions. Need to be called early. */
10241 + orion5x_init();
10242 +
10243 + orion5x_mpp_conf(mss2_mpp_modes);
10244 +
10245 + /*
10246 + * MPP[20] Unused
10247 + * MPP[21] PCI clock
10248 + * MPP[22] USB 0 over current
10249 + * MPP[23] USB 1 over current
10250 + */
10251 +
10252 + /*
10253 + * Configure peripherals.
10254 + */
10255 + orion5x_ehci0_init();
10256 + orion5x_ehci1_init();
10257 + orion5x_eth_init(&mss2_eth_data);
10258 + orion5x_i2c_init();
10259 + orion5x_sata_init(&mss2_sata_data);
10260 + orion5x_uart0_init();
10261 +
10262 + orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE);
10263 + platform_device_register(&mss2_nor_flash);
10264 +
10265 + platform_device_register(&mss2_button_device);
10266 +
10267 + if (gpio_request(MSS2_GPIO_RTC_IRQ, "rtc") == 0) {
10268 + if (gpio_direction_input(MSS2_GPIO_RTC_IRQ) == 0)
10269 + mss2_i2c_rtc.irq = gpio_to_irq(MSS2_GPIO_RTC_IRQ);
10270 + else
10271 + gpio_free(MSS2_GPIO_RTC_IRQ);
10272 + }
10273 + i2c_register_board_info(0, &mss2_i2c_rtc, 1);
10274 +
10275 + /* register mss2 specific power-off method */
10276 + pm_power_off = mss2_power_off;
10277 +}
10278 +
10279 +MACHINE_START(MSS2, "Maxtor Shared Storage II")
10280 + /* Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> */
10281 + .phys_io = ORION5X_REGS_PHYS_BASE,
10282 + .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
10283 + .boot_params = 0x00000100,
10284 + .init_machine = mss2_init,
10285 + .map_io = orion5x_map_io,
10286 + .init_irq = orion5x_init_irq,
10287 + .timer = &orion5x_timer,
10288 + .fixup = tag_fixup_mem32
10289 +MACHINE_END
10290 --- /dev/null
10291 +++ b/arch/arm/mach-orion5x/mv2120-setup.c
10292 @@ -0,0 +1,194 @@
10293 +/*
10294 + * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
10295 + * Copyright (C) 2008 Martin Michlmayr <tbm@cyrius.com>
10296 + *
10297 + * This program is free software; you can redistribute it and/or modify
10298 + * it under the terms of the GNU Lesser General Public License as
10299 + * published by the Free Software Foundation; either version 2 of the
10300 + * License, or (at your option) any later version.
10301 + */
10302 +
10303 +#include <linux/kernel.h>
10304 +#include <linux/init.h>
10305 +#include <linux/platform_device.h>
10306 +#include <linux/irq.h>
10307 +#include <linux/mtd/physmap.h>
10308 +#include <linux/mv643xx_eth.h>
10309 +#include <linux/leds.h>
10310 +#include <linux/gpio_keys.h>
10311 +#include <linux/input.h>
10312 +#include <linux/i2c.h>
10313 +#include <linux/ata_platform.h>
10314 +#include <asm/mach-types.h>
10315 +#include <asm/gpio.h>
10316 +#include <asm/mach/arch.h>
10317 +#include <asm/arch/orion5x.h>
10318 +#include "common.h"
10319 +#include "mpp.h"
10320 +
10321 +#define MV2120_NOR_BOOT_BASE 0xf4000000
10322 +#define MV2120_NOR_BOOT_SIZE SZ_512K
10323 +
10324 +#define MV2120_GPIO_RTC_IRQ 3
10325 +#define MV2120_GPIO_KEY_RESET 17
10326 +#define MV2120_GPIO_KEY_POWER 18
10327 +#define MV2120_GPIO_POWER_OFF 19
10328 +
10329 +
10330 +/*****************************************************************************
10331 + * Ethernet
10332 + ****************************************************************************/
10333 +static struct mv643xx_eth_platform_data mv2120_eth_data = {
10334 + .phy_addr = 8,
10335 +};
10336 +
10337 +static struct mv_sata_platform_data mv2120_sata_data = {
10338 + .n_ports = 2,
10339 +};
10340 +
10341 +static struct mtd_partition mv2120_partitions[] = {
10342 + {
10343 + .name = "firmware",
10344 + .size = 0x00080000,
10345 + .offset = 0,
10346 + },
10347 +};
10348 +
10349 +static struct physmap_flash_data mv2120_nor_flash_data = {
10350 + .width = 1,
10351 + .parts = mv2120_partitions,
10352 + .nr_parts = ARRAY_SIZE(mv2120_partitions)
10353 +};
10354 +
10355 +static struct resource mv2120_nor_flash_resource = {
10356 + .flags = IORESOURCE_MEM,
10357 + .start = MV2120_NOR_BOOT_BASE,
10358 + .end = MV2120_NOR_BOOT_BASE + MV2120_NOR_BOOT_SIZE - 1,
10359 +};
10360 +
10361 +static struct platform_device mv2120_nor_flash = {
10362 + .name = "physmap-flash",
10363 + .id = 0,
10364 + .dev = {
10365 + .platform_data = &mv2120_nor_flash_data,
10366 + },
10367 + .resource = &mv2120_nor_flash_resource,
10368 + .num_resources = 1,
10369 +};
10370 +
10371 +static struct gpio_keys_button mv2120_buttons[] = {
10372 + {
10373 + .code = KEY_RESTART,
10374 + .gpio = MV2120_GPIO_KEY_RESET,
10375 + .desc = "reset",
10376 + .active_low = 1,
10377 + }, {
10378 + .code = KEY_POWER,
10379 + .gpio = MV2120_GPIO_KEY_POWER,
10380 + .desc = "power",
10381 + .active_low = 1,
10382 + },
10383 +};
10384 +
10385 +static struct gpio_keys_platform_data mv2120_button_data = {
10386 + .buttons = mv2120_buttons,
10387 + .nbuttons = ARRAY_SIZE(mv2120_buttons),
10388 +};
10389 +
10390 +static struct platform_device mv2120_button_device = {
10391 + .name = "gpio-keys",
10392 + .id = -1,
10393 + .num_resources = 0,
10394 + .dev = {
10395 + .platform_data = &mv2120_button_data,
10396 + },
10397 +};
10398 +
10399 +
10400 +/****************************************************************************
10401 + * General Setup
10402 + ****************************************************************************/
10403 +static struct orion5x_mpp_mode mv2120_mpp_modes[] __initdata = {
10404 + { 0, MPP_GPIO }, /* Sys status LED */
10405 + { 1, MPP_GPIO }, /* Sys error LED */
10406 + { 2, MPP_GPIO }, /* OverTemp interrupt */
10407 + { 3, MPP_GPIO }, /* RTC interrupt */
10408 + { 4, MPP_GPIO }, /* V_LED 5V */
10409 + { 5, MPP_GPIO }, /* V_LED 3.3V */
10410 + { 6, MPP_UNUSED },
10411 + { 7, MPP_UNUSED },
10412 + { 8, MPP_GPIO }, /* SATA 0 fail LED */
10413 + { 9, MPP_GPIO }, /* SATA 1 fail LED */
10414 + { 10, MPP_UNUSED },
10415 + { 11, MPP_UNUSED },
10416 + { 12, MPP_SATA_LED }, /* SATA 0 presence */
10417 + { 13, MPP_SATA_LED }, /* SATA 1 presence */
10418 + { 14, MPP_SATA_LED }, /* SATA 0 active */
10419 + { 15, MPP_SATA_LED }, /* SATA 1 active */
10420 + { 16, MPP_UNUSED },
10421 + { 17, MPP_GPIO }, /* Reset button */
10422 + { 18, MPP_GPIO }, /* Power button */
10423 + { 19, MPP_GPIO }, /* Power off */
10424 + { -1 },
10425 +};
10426 +
10427 +static struct i2c_board_info __initdata mv2120_i2c_rtc = {
10428 + I2C_BOARD_INFO("rtc-pcf8563", 0x51),
10429 + .irq = 0,
10430 +};
10431 +
10432 +static void mv2120_power_off(void)
10433 +{
10434 + pr_info("%s: triggering power-off...\n", __func__);
10435 + gpio_set_value(MV2120_GPIO_POWER_OFF, 0);
10436 +}
10437 +
10438 +static void __init mv2120_init(void)
10439 +{
10440 + /* Setup basic Orion functions. Need to be called early. */
10441 + orion5x_init();
10442 +
10443 + orion5x_mpp_conf(mv2120_mpp_modes);
10444 +
10445 + /*
10446 + * Configure peripherals.
10447 + */
10448 + orion5x_ehci0_init();
10449 + orion5x_ehci1_init();
10450 + orion5x_eth_init(&mv2120_eth_data);
10451 + orion5x_i2c_init();
10452 + orion5x_sata_init(&mv2120_sata_data);
10453 + orion5x_uart0_init();
10454 +
10455 + orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE);
10456 + platform_device_register(&mv2120_nor_flash);
10457 +
10458 + platform_device_register(&mv2120_button_device);
10459 +
10460 + if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) {
10461 + if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0)
10462 + mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ);
10463 + else
10464 + gpio_free(MV2120_GPIO_RTC_IRQ);
10465 + }
10466 + i2c_register_board_info(0, &mv2120_i2c_rtc, 1);
10467 +
10468 + /* register mv2120 specific power-off method */
10469 + if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 ||
10470 + gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0)
10471 + pr_err("mv2120: failed to setup power-off GPIO\n");
10472 + pm_power_off = mv2120_power_off;
10473 +}
10474 +
10475 +/* Warning: HP uses a wrong mach-type (=526) in their bootloader */
10476 +MACHINE_START(MV2120, "HP Media Vault mv2120")
10477 + /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */
10478 + .phys_io = ORION5X_REGS_PHYS_BASE,
10479 + .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
10480 + .boot_params = 0x00000100,
10481 + .init_machine = mv2120_init,
10482 + .map_io = orion5x_map_io,
10483 + .init_irq = orion5x_init_irq,
10484 + .timer = &orion5x_timer,
10485 + .fixup = tag_fixup_mem32
10486 +MACHINE_END
10487 --- a/arch/arm/mach-orion5x/pci.c
10488 +++ b/arch/arm/mach-orion5x/pci.c
10489 @@ -152,6 +152,8 @@
10490 if (dev == MV88F5181_DEV_ID || dev == MV88F5182_DEV_ID) {
10491 printk(KERN_NOTICE "Applying Orion-1/Orion-NAS PCIe config "
10492 "read transaction workaround\n");
10493 + orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
10494 + ORION5X_PCIE_WA_SIZE);
10495 pcie_ops.read = pcie_rd_conf_wa;
10496 }
10497
10498 @@ -240,13 +242,13 @@
10499 * PCI Address Decode Windows registers
10500 */
10501 #define PCI_BAR_SIZE_DDR_CS(n) (((n) == 0) ? ORION5X_PCI_REG(0xc08) : \
10502 - ((n) == 1) ? ORION5X_PCI_REG(0xd08) : \
10503 - ((n) == 2) ? ORION5X_PCI_REG(0xc0c) : \
10504 - ((n) == 3) ? ORION5X_PCI_REG(0xd0c) : 0)
10505 -#define PCI_BAR_REMAP_DDR_CS(n) (((n) ==0) ? ORION5X_PCI_REG(0xc48) : \
10506 - ((n) == 1) ? ORION5X_PCI_REG(0xd48) : \
10507 - ((n) == 2) ? ORION5X_PCI_REG(0xc4c) : \
10508 - ((n) == 3) ? ORION5X_PCI_REG(0xd4c) : 0)
10509 + ((n) == 1) ? ORION5X_PCI_REG(0xd08) : \
10510 + ((n) == 2) ? ORION5X_PCI_REG(0xc0c) : \
10511 + ((n) == 3) ? ORION5X_PCI_REG(0xd0c) : 0)
10512 +#define PCI_BAR_REMAP_DDR_CS(n) (((n) == 0) ? ORION5X_PCI_REG(0xc48) : \
10513 + ((n) == 1) ? ORION5X_PCI_REG(0xd48) : \
10514 + ((n) == 2) ? ORION5X_PCI_REG(0xc4c) : \
10515 + ((n) == 3) ? ORION5X_PCI_REG(0xd4c) : 0)
10516 #define PCI_BAR_ENABLE ORION5X_PCI_REG(0xc3c)
10517 #define PCI_ADDR_DECODE_CTRL ORION5X_PCI_REG(0xd3c)
10518
10519 @@ -266,7 +268,7 @@
10520
10521 static int orion5x_pci_local_bus_nr(void)
10522 {
10523 - u32 conf = orion5x_read(PCI_P2P_CONF);
10524 + u32 conf = readl(PCI_P2P_CONF);
10525 return((conf & PCI_P2P_BUS_MASK) >> PCI_P2P_BUS_OFFS);
10526 }
10527
10528 @@ -276,11 +278,11 @@
10529 unsigned long flags;
10530 spin_lock_irqsave(&orion5x_pci_lock, flags);
10531
10532 - orion5x_write(PCI_CONF_ADDR, PCI_CONF_BUS(bus) |
10533 - PCI_CONF_DEV(dev) | PCI_CONF_REG(where) |
10534 - PCI_CONF_FUNC(func) | PCI_CONF_ADDR_EN);
10535 + writel(PCI_CONF_BUS(bus) |
10536 + PCI_CONF_DEV(dev) | PCI_CONF_REG(where) |
10537 + PCI_CONF_FUNC(func) | PCI_CONF_ADDR_EN, PCI_CONF_ADDR);
10538
10539 - *val = orion5x_read(PCI_CONF_DATA);
10540 + *val = readl(PCI_CONF_DATA);
10541
10542 if (size == 1)
10543 *val = (*val >> (8*(where & 0x3))) & 0xff;
10544 @@ -300,9 +302,9 @@
10545
10546 spin_lock_irqsave(&orion5x_pci_lock, flags);
10547
10548 - orion5x_write(PCI_CONF_ADDR, PCI_CONF_BUS(bus) |
10549 - PCI_CONF_DEV(dev) | PCI_CONF_REG(where) |
10550 - PCI_CONF_FUNC(func) | PCI_CONF_ADDR_EN);
10551 + writel(PCI_CONF_BUS(bus) |
10552 + PCI_CONF_DEV(dev) | PCI_CONF_REG(where) |
10553 + PCI_CONF_FUNC(func) | PCI_CONF_ADDR_EN, PCI_CONF_ADDR);
10554
10555 if (size == 4) {
10556 __raw_writel(val, PCI_CONF_DATA);
10557 @@ -353,9 +355,9 @@
10558
10559 static void __init orion5x_pci_set_bus_nr(int nr)
10560 {
10561 - u32 p2p = orion5x_read(PCI_P2P_CONF);
10562 + u32 p2p = readl(PCI_P2P_CONF);
10563
10564 - if (orion5x_read(PCI_MODE) & PCI_MODE_PCIX) {
10565 + if (readl(PCI_MODE) & PCI_MODE_PCIX) {
10566 /*
10567 * PCI-X mode
10568 */
10569 @@ -372,7 +374,7 @@
10570 */
10571 p2p &= ~PCI_P2P_BUS_MASK;
10572 p2p |= (nr << PCI_P2P_BUS_OFFS);
10573 - orion5x_write(PCI_P2P_CONF, p2p);
10574 + writel(p2p, PCI_P2P_CONF);
10575 }
10576 }
10577
10578 @@ -399,7 +401,7 @@
10579 * First, disable windows.
10580 */
10581 win_enable = 0xffffffff;
10582 - orion5x_write(PCI_BAR_ENABLE, win_enable);
10583 + writel(win_enable, PCI_BAR_ENABLE);
10584
10585 /*
10586 * Setup windows for DDR banks.
10587 @@ -425,10 +427,10 @@
10588 */
10589 reg = PCI_CONF_REG_BAR_HI_CS(cs->cs_index);
10590 orion5x_pci_hw_wr_conf(bus, 0, func, reg, 4, 0);
10591 - orion5x_write(PCI_BAR_SIZE_DDR_CS(cs->cs_index),
10592 - (cs->size - 1) & 0xfffff000);
10593 - orion5x_write(PCI_BAR_REMAP_DDR_CS(cs->cs_index),
10594 - cs->base & 0xfffff000);
10595 + writel((cs->size - 1) & 0xfffff000,
10596 + PCI_BAR_SIZE_DDR_CS(cs->cs_index));
10597 + writel(cs->base & 0xfffff000,
10598 + PCI_BAR_REMAP_DDR_CS(cs->cs_index));
10599
10600 /*
10601 * Enable decode window for this chip select.
10602 @@ -439,7 +441,7 @@
10603 /*
10604 * Re-enable decode windows.
10605 */
10606 - orion5x_write(PCI_BAR_ENABLE, win_enable);
10607 + writel(win_enable, PCI_BAR_ENABLE);
10608
10609 /*
10610 * Disable automatic update of address remaping when writing to BARs.
10611 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c
10612 +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c
10613 @@ -26,6 +26,7 @@
10614 #include <asm/mach/pci.h>
10615 #include <asm/arch/orion5x.h>
10616 #include "common.h"
10617 +#include "mpp.h"
10618
10619 /*****************************************************************************
10620 * RD-88F5182 Info
10621 @@ -125,6 +126,7 @@
10622
10623 leds_event = rd88f5182_dbgled_event;
10624 }
10625 +
10626 return 0;
10627 }
10628
10629 @@ -220,7 +222,6 @@
10630
10631 static struct mv643xx_eth_platform_data rd88f5182_eth_data = {
10632 .phy_addr = 8,
10633 - .force_phy_addr = 1,
10634 };
10635
10636 /*****************************************************************************
10637 @@ -234,15 +235,34 @@
10638 * Sata
10639 ****************************************************************************/
10640 static struct mv_sata_platform_data rd88f5182_sata_data = {
10641 - .n_ports = 2,
10642 + .n_ports = 2,
10643 };
10644
10645 /*****************************************************************************
10646 * General Setup
10647 ****************************************************************************/
10648 -
10649 -static struct platform_device *rd88f5182_devices[] __initdata = {
10650 - &rd88f5182_nor_flash,
10651 +static struct orion5x_mpp_mode rd88f5182_mpp_modes[] __initdata = {
10652 + { 0, MPP_GPIO }, /* Debug Led */
10653 + { 1, MPP_GPIO }, /* Reset Switch */
10654 + { 2, MPP_UNUSED },
10655 + { 3, MPP_GPIO }, /* RTC Int */
10656 + { 4, MPP_GPIO },
10657 + { 5, MPP_GPIO },
10658 + { 6, MPP_GPIO }, /* PCI_intA */
10659 + { 7, MPP_GPIO }, /* PCI_intB */
10660 + { 8, MPP_UNUSED },
10661 + { 9, MPP_UNUSED },
10662 + { 10, MPP_UNUSED },
10663 + { 11, MPP_UNUSED },
10664 + { 12, MPP_SATA_LED }, /* SATA 0 presence */
10665 + { 13, MPP_SATA_LED }, /* SATA 1 presence */
10666 + { 14, MPP_SATA_LED }, /* SATA 0 active */
10667 + { 15, MPP_SATA_LED }, /* SATA 1 active */
10668 + { 16, MPP_UNUSED },
10669 + { 17, MPP_UNUSED },
10670 + { 18, MPP_UNUSED },
10671 + { 19, MPP_UNUSED },
10672 + { -1 },
10673 };
10674
10675 static void __init rd88f5182_init(void)
10676 @@ -252,35 +272,9 @@
10677 */
10678 orion5x_init();
10679
10680 - /*
10681 - * Setup the CPU address decode windows for our devices
10682 - */
10683 - orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE,
10684 - RD88F5182_NOR_BOOT_SIZE);
10685 - orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
10686 -
10687 - /*
10688 - * Open a special address decode windows for the PCIe WA.
10689 - */
10690 - orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
10691 - ORION5X_PCIE_WA_SIZE);
10692 + orion5x_mpp_conf(rd88f5182_mpp_modes);
10693
10694 /*
10695 - * Setup Multiplexing Pins --
10696 - * MPP[0] Debug Led (GPIO - Out)
10697 - * MPP[1] Debug Led (GPIO - Out)
10698 - * MPP[2] N/A
10699 - * MPP[3] RTC_Int (GPIO - In)
10700 - * MPP[4] GPIO
10701 - * MPP[5] GPIO
10702 - * MPP[6] PCI_intA (GPIO - In)
10703 - * MPP[7] PCI_intB (GPIO - In)
10704 - * MPP[8-11] N/A
10705 - * MPP[12] SATA 0 presence Indication
10706 - * MPP[13] SATA 1 presence Indication
10707 - * MPP[14] SATA 0 active Indication
10708 - * MPP[15] SATA 1 active indication
10709 - * MPP[16-19] Not used
10710 * MPP[20] PCI Clock to MV88F5182
10711 * MPP[21] PCI Clock to mini PCI CON11
10712 * MPP[22] USB 0 over current indication
10713 @@ -289,16 +283,23 @@
10714 * MPP[25] USB 0 over current enable
10715 */
10716
10717 - orion5x_write(MPP_0_7_CTRL, 0x00000003);
10718 - orion5x_write(MPP_8_15_CTRL, 0x55550000);
10719 - orion5x_write(MPP_16_19_CTRL, 0x5555);
10720 + /*
10721 + * Configure peripherals.
10722 + */
10723 + orion5x_ehci0_init();
10724 + orion5x_ehci1_init();
10725 + orion5x_eth_init(&rd88f5182_eth_data);
10726 + orion5x_i2c_init();
10727 + orion5x_sata_init(&rd88f5182_sata_data);
10728 + orion5x_uart0_init();
10729
10730 - orion5x_gpio_set_valid_pins(0x000000fb);
10731 + orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE,
10732 + RD88F5182_NOR_BOOT_SIZE);
10733 +
10734 + orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
10735 + platform_device_register(&rd88f5182_nor_flash);
10736
10737 - platform_add_devices(rd88f5182_devices, ARRAY_SIZE(rd88f5182_devices));
10738 i2c_register_board_info(0, &rd88f5182_i2c_rtc, 1);
10739 - orion5x_eth_init(&rd88f5182_eth_data);
10740 - orion5x_sata_init(&rd88f5182_sata_data);
10741 }
10742
10743 MACHINE_START(RD88F5182, "Marvell Orion-NAS Reference Design")
10744 --- a/arch/arm/mach-orion5x/ts209-setup.c
10745 +++ b/arch/arm/mach-orion5x/ts209-setup.c
10746 @@ -28,6 +28,8 @@
10747 #include <asm/mach/pci.h>
10748 #include <asm/arch/orion5x.h>
10749 #include "common.h"
10750 +#include "mpp.h"
10751 +#include "tsx09-common.h"
10752
10753 #define QNAP_TS209_NOR_BOOT_BASE 0xf4000000
10754 #define QNAP_TS209_NOR_BOOT_SIZE SZ_8M
10755 @@ -47,52 +49,54 @@
10756 ***************************************************************************/
10757 static struct mtd_partition qnap_ts209_partitions[] = {
10758 {
10759 - .name = "U-Boot",
10760 - .size = 0x00080000,
10761 - .offset = 0x00780000,
10762 - .mask_flags = MTD_WRITEABLE,
10763 + .name = "U-Boot",
10764 + .size = 0x00080000,
10765 + .offset = 0x00780000,
10766 + .mask_flags = MTD_WRITEABLE,
10767 }, {
10768 - .name = "Kernel",
10769 - .size = 0x00200000,
10770 - .offset = 0,
10771 + .name = "Kernel",
10772 + .size = 0x00200000,
10773 + .offset = 0,
10774 }, {
10775 - .name = "RootFS1",
10776 - .size = 0x00400000,
10777 - .offset = 0x00200000,
10778 + .name = "RootFS1",
10779 + .size = 0x00400000,
10780 + .offset = 0x00200000,
10781 }, {
10782 - .name = "RootFS2",
10783 - .size = 0x00100000,
10784 - .offset = 0x00600000,
10785 + .name = "RootFS2",
10786 + .size = 0x00100000,
10787 + .offset = 0x00600000,
10788 }, {
10789 - .name = "U-Boot Config",
10790 - .size = 0x00020000,
10791 - .offset = 0x00760000,
10792 + .name = "U-Boot Config",
10793 + .size = 0x00020000,
10794 + .offset = 0x00760000,
10795 }, {
10796 - .name = "NAS Config",
10797 - .size = 0x00060000,
10798 - .offset = 0x00700000,
10799 - .mask_flags = MTD_WRITEABLE,
10800 - }
10801 + .name = "NAS Config",
10802 + .size = 0x00060000,
10803 + .offset = 0x00700000,
10804 + .mask_flags = MTD_WRITEABLE,
10805 + },
10806 };
10807
10808 static struct physmap_flash_data qnap_ts209_nor_flash_data = {
10809 - .width = 1,
10810 - .parts = qnap_ts209_partitions,
10811 - .nr_parts = ARRAY_SIZE(qnap_ts209_partitions)
10812 + .width = 1,
10813 + .parts = qnap_ts209_partitions,
10814 + .nr_parts = ARRAY_SIZE(qnap_ts209_partitions)
10815 };
10816
10817 static struct resource qnap_ts209_nor_flash_resource = {
10818 - .flags = IORESOURCE_MEM,
10819 - .start = QNAP_TS209_NOR_BOOT_BASE,
10820 - .end = QNAP_TS209_NOR_BOOT_BASE + QNAP_TS209_NOR_BOOT_SIZE - 1,
10821 + .flags = IORESOURCE_MEM,
10822 + .start = QNAP_TS209_NOR_BOOT_BASE,
10823 + .end = QNAP_TS209_NOR_BOOT_BASE + QNAP_TS209_NOR_BOOT_SIZE - 1,
10824 };
10825
10826 static struct platform_device qnap_ts209_nor_flash = {
10827 - .name = "physmap-flash",
10828 - .id = 0,
10829 - .dev = { .platform_data = &qnap_ts209_nor_flash_data, },
10830 - .resource = &qnap_ts209_nor_flash_resource,
10831 - .num_resources = 1,
10832 + .name = "physmap-flash",
10833 + .id = 0,
10834 + .dev = {
10835 + .platform_data = &qnap_ts209_nor_flash_data,
10836 + },
10837 + .resource = &qnap_ts209_nor_flash_resource,
10838 + .num_resources = 1,
10839 };
10840
10841 /*****************************************************************************
10842 @@ -164,12 +168,12 @@
10843 }
10844
10845 static struct hw_pci qnap_ts209_pci __initdata = {
10846 - .nr_controllers = 2,
10847 - .preinit = qnap_ts209_pci_preinit,
10848 - .swizzle = pci_std_swizzle,
10849 - .setup = orion5x_pci_sys_setup,
10850 - .scan = orion5x_pci_sys_scan_bus,
10851 - .map_irq = qnap_ts209_pci_map_irq,
10852 + .nr_controllers = 2,
10853 + .preinit = qnap_ts209_pci_preinit,
10854 + .swizzle = pci_std_swizzle,
10855 + .setup = orion5x_pci_sys_setup,
10856 + .scan = orion5x_pci_sys_scan_bus,
10857 + .map_irq = qnap_ts209_pci_map_irq,
10858 };
10859
10860 static int __init qnap_ts209_pci_init(void)
10861 @@ -183,96 +187,6 @@
10862 subsys_initcall(qnap_ts209_pci_init);
10863
10864 /*****************************************************************************
10865 - * Ethernet
10866 - ****************************************************************************/
10867 -
10868 -static struct mv643xx_eth_platform_data qnap_ts209_eth_data = {
10869 - .phy_addr = 8,
10870 - .force_phy_addr = 1,
10871 -};
10872 -
10873 -static int __init parse_hex_nibble(char n)
10874 -{
10875 - if (n >= '0' && n <= '9')
10876 - return n - '0';
10877 -
10878 - if (n >= 'A' && n <= 'F')
10879 - return n - 'A' + 10;
10880 -
10881 - if (n >= 'a' && n <= 'f')
10882 - return n - 'a' + 10;
10883 -
10884 - return -1;
10885 -}
10886 -
10887 -static int __init parse_hex_byte(const char *b)
10888 -{
10889 - int hi;
10890 - int lo;
10891 -
10892 - hi = parse_hex_nibble(b[0]);
10893 - lo = parse_hex_nibble(b[1]);
10894 -
10895 - if (hi < 0 || lo < 0)
10896 - return -1;
10897 -
10898 - return (hi << 4) | lo;
10899 -}
10900 -
10901 -static int __init check_mac_addr(const char *addr_str)
10902 -{
10903 - u_int8_t addr[6];
10904 - int i;
10905 -
10906 - for (i = 0; i < 6; i++) {
10907 - int byte;
10908 -
10909 - /*
10910 - * Enforce "xx:xx:xx:xx:xx:xx\n" format.
10911 - */
10912 - if (addr_str[(i * 3) + 2] != ((i < 5) ? ':' : '\n'))
10913 - return -1;
10914 -
10915 - byte = parse_hex_byte(addr_str + (i * 3));
10916 - if (byte < 0)
10917 - return -1;
10918 - addr[i] = byte;
10919 - }
10920 -
10921 - printk(KERN_INFO "ts209: found ethernet mac address ");
10922 - for (i = 0; i < 6; i++)
10923 - printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n");
10924 -
10925 - memcpy(qnap_ts209_eth_data.mac_addr, addr, 6);
10926 -
10927 - return 0;
10928 -}
10929 -
10930 -/*
10931 - * The 'NAS Config' flash partition has an ext2 filesystem which
10932 - * contains a file that has the ethernet MAC address in plain text
10933 - * (format "xx:xx:xx:xx:xx:xx\n".)
10934 - */
10935 -static void __init ts209_find_mac_addr(void)
10936 -{
10937 - unsigned long addr;
10938 -
10939 - for (addr = 0x00700000; addr < 0x00760000; addr += 1024) {
10940 - char *nor_page;
10941 - int ret = 0;
10942 -
10943 - nor_page = ioremap(QNAP_TS209_NOR_BOOT_BASE + addr, 1024);
10944 - if (nor_page != NULL) {
10945 - ret = check_mac_addr(nor_page);
10946 - iounmap(nor_page);
10947 - }
10948 -
10949 - if (ret == 0)
10950 - break;
10951 - }
10952 -}
10953 -
10954 -/*****************************************************************************
10955 * RTC S35390A on I2C bus
10956 ****************************************************************************/
10957
10958 @@ -280,7 +194,7 @@
10959
10960 static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = {
10961 I2C_BOARD_INFO("s35390a", 0x30),
10962 - .irq = 0,
10963 + .irq = 0,
10964 };
10965
10966 /****************************************************************************
10967 @@ -297,70 +211,63 @@
10968 .gpio = QNAP_TS209_GPIO_KEY_MEDIA,
10969 .desc = "USB Copy Button",
10970 .active_low = 1,
10971 - },
10972 - {
10973 + }, {
10974 .code = KEY_POWER,
10975 .gpio = QNAP_TS209_GPIO_KEY_RESET,
10976 .desc = "Reset Button",
10977 .active_low = 1,
10978 - }
10979 + },
10980 };
10981
10982 static struct gpio_keys_platform_data qnap_ts209_button_data = {
10983 .buttons = qnap_ts209_buttons,
10984 - .nbuttons = ARRAY_SIZE(qnap_ts209_buttons),
10985 + .nbuttons = ARRAY_SIZE(qnap_ts209_buttons),
10986 };
10987
10988 static struct platform_device qnap_ts209_button_device = {
10989 .name = "gpio-keys",
10990 .id = -1,
10991 .num_resources = 0,
10992 - .dev = { .platform_data = &qnap_ts209_button_data, },
10993 + .dev = {
10994 + .platform_data = &qnap_ts209_button_data,
10995 + },
10996 };
10997
10998 /*****************************************************************************
10999 * SATA
11000 ****************************************************************************/
11001 static struct mv_sata_platform_data qnap_ts209_sata_data = {
11002 - .n_ports = 2,
11003 + .n_ports = 2,
11004 };
11005
11006 /*****************************************************************************
11007
11008 * General Setup
11009 ****************************************************************************/
11010 -
11011 -static struct platform_device *qnap_ts209_devices[] __initdata = {
11012 - &qnap_ts209_nor_flash,
11013 - &qnap_ts209_button_device,
11014 +static struct orion5x_mpp_mode ts209_mpp_modes[] __initdata = {
11015 + { 0, MPP_UNUSED },
11016 + { 1, MPP_GPIO }, /* USB copy button */
11017 + { 2, MPP_GPIO }, /* Load defaults button */
11018 + { 3, MPP_GPIO }, /* GPIO RTC */
11019 + { 4, MPP_UNUSED },
11020 + { 5, MPP_UNUSED },
11021 + { 6, MPP_GPIO }, /* PCI Int A */
11022 + { 7, MPP_GPIO }, /* PCI Int B */
11023 + { 8, MPP_UNUSED },
11024 + { 9, MPP_UNUSED },
11025 + { 10, MPP_UNUSED },
11026 + { 11, MPP_UNUSED },
11027 + { 12, MPP_SATA_LED }, /* SATA 0 presence */
11028 + { 13, MPP_SATA_LED }, /* SATA 1 presence */
11029 + { 14, MPP_SATA_LED }, /* SATA 0 active */
11030 + { 15, MPP_SATA_LED }, /* SATA 1 active */
11031 + { 16, MPP_UART }, /* UART1 RXD */
11032 + { 17, MPP_UART }, /* UART1 TXD */
11033 + { 18, MPP_GPIO }, /* SW_RST */
11034 + { 19, MPP_UNUSED },
11035 + { -1 },
11036 };
11037
11038 -/*
11039 - * QNAP TS-[12]09 specific power off method via UART1-attached PIC
11040 - */
11041 -
11042 -#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
11043 -
11044 -static void qnap_ts209_power_off(void)
11045 -{
11046 - /* 19200 baud divisor */
11047 - const unsigned divisor = ((ORION5X_TCLK + (8 * 19200)) / (16 * 19200));
11048 -
11049 - pr_info("%s: triggering power-off...\n", __func__);
11050 -
11051 - /* hijack uart1 and reset into sane state (19200,8n1) */
11052 - orion5x_write(UART1_REG(LCR), 0x83);
11053 - orion5x_write(UART1_REG(DLL), divisor & 0xff);
11054 - orion5x_write(UART1_REG(DLM), (divisor >> 8) & 0xff);
11055 - orion5x_write(UART1_REG(LCR), 0x03);
11056 - orion5x_write(UART1_REG(IER), 0x00);
11057 - orion5x_write(UART1_REG(FCR), 0x00);
11058 - orion5x_write(UART1_REG(MCR), 0x00);
11059 -
11060 - /* send the power-off command 'A' to PIC */
11061 - orion5x_write(UART1_REG(TX), 'A');
11062 -}
11063 -
11064 static void __init qnap_ts209_init(void)
11065 {
11066 /*
11067 @@ -368,51 +275,33 @@
11068 */
11069 orion5x_init();
11070
11071 - /*
11072 - * Setup flash mapping
11073 - */
11074 - orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE,
11075 - QNAP_TS209_NOR_BOOT_SIZE);
11076 -
11077 - /*
11078 - * Open a special address decode windows for the PCIe WA.
11079 - */
11080 - orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
11081 - ORION5X_PCIE_WA_SIZE);
11082 + orion5x_mpp_conf(ts209_mpp_modes);
11083
11084 /*
11085 - * Setup Multiplexing Pins --
11086 - * MPP[0] Reserved
11087 - * MPP[1] USB copy button (0 active)
11088 - * MPP[2] Load defaults button (0 active)
11089 - * MPP[3] GPIO RTC
11090 - * MPP[4-5] Reserved
11091 - * MPP[6] PCI Int A
11092 - * MPP[7] PCI Int B
11093 - * MPP[8-11] Reserved
11094 - * MPP[12] SATA 0 presence
11095 - * MPP[13] SATA 1 presence
11096 - * MPP[14] SATA 0 active
11097 - * MPP[15] SATA 1 active
11098 - * MPP[16] UART1 RXD
11099 - * MPP[17] UART1 TXD
11100 - * MPP[18] SW_RST (0 active)
11101 - * MPP[19] Reserved
11102 * MPP[20] PCI clock 0
11103 * MPP[21] PCI clock 1
11104 * MPP[22] USB 0 over current
11105 * MPP[23-25] Reserved
11106 */
11107 - orion5x_write(MPP_0_7_CTRL, 0x3);
11108 - orion5x_write(MPP_8_15_CTRL, 0x55550000);
11109 - orion5x_write(MPP_16_19_CTRL, 0x5500);
11110 - orion5x_gpio_set_valid_pins(0x3cc0fff);
11111
11112 - /* register ts209 specific power-off method */
11113 - pm_power_off = qnap_ts209_power_off;
11114 + /*
11115 + * Configure peripherals.
11116 + */
11117 + orion5x_ehci0_init();
11118 + orion5x_ehci1_init();
11119 + qnap_tsx09_find_mac_addr(QNAP_TS209_NOR_BOOT_BASE +
11120 + qnap_ts209_partitions[5].offset,
11121 + qnap_ts209_partitions[5].size);
11122 + orion5x_eth_init(&qnap_tsx09_eth_data);
11123 + orion5x_i2c_init();
11124 + orion5x_sata_init(&qnap_ts209_sata_data);
11125 + orion5x_uart0_init();
11126 +
11127 + orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE,
11128 + QNAP_TS209_NOR_BOOT_SIZE);
11129 + platform_device_register(&qnap_ts209_nor_flash);
11130
11131 - platform_add_devices(qnap_ts209_devices,
11132 - ARRAY_SIZE(qnap_ts209_devices));
11133 + platform_device_register(&qnap_ts209_button_device);
11134
11135 /* Get RTC IRQ and register the chip */
11136 if (gpio_request(TS209_RTC_GPIO, "rtc") == 0) {
11137 @@ -425,14 +314,12 @@
11138 pr_warning("qnap_ts209_init: failed to get RTC IRQ\n");
11139 i2c_register_board_info(0, &qnap_ts209_i2c_rtc, 1);
11140
11141 - ts209_find_mac_addr();
11142 - orion5x_eth_init(&qnap_ts209_eth_data);
11143 -
11144 - orion5x_sata_init(&qnap_ts209_sata_data);
11145 + /* register tsx09 specific power-off method */
11146 + pm_power_off = qnap_tsx09_power_off;
11147 }
11148
11149 MACHINE_START(TS209, "QNAP TS-109/TS-209")
11150 - /* Maintainer: Byron Bradley <byron.bbradley@gmail.com> */
11151 + /* Maintainer: Byron Bradley <byron.bbradley@gmail.com> */
11152 .phys_io = ORION5X_REGS_PHYS_BASE,
11153 .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
11154 .boot_params = 0x00000100,
11155 --- /dev/null
11156 +++ b/arch/arm/mach-orion5x/ts409-setup.c
11157 @@ -0,0 +1,273 @@
11158 +/*
11159 + * QNAP TS-409 Board Setup
11160 + *
11161 + * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com>
11162 + *
11163 + * This program is free software; you can redistribute it and/or
11164 + * modify it under the terms of the GNU General Public License
11165 + * as published by the Free Software Foundation; either version
11166 + * 2 of the License, or (at your option) any later version.
11167 + */
11168 +
11169 +#include <linux/kernel.h>
11170 +#include <linux/init.h>
11171 +#include <linux/platform_device.h>
11172 +#include <linux/pci.h>
11173 +#include <linux/irq.h>
11174 +#include <linux/mtd/physmap.h>
11175 +#include <linux/mv643xx_eth.h>
11176 +#include <linux/gpio_keys.h>
11177 +#include <linux/input.h>
11178 +#include <linux/i2c.h>
11179 +#include <linux/serial_reg.h>
11180 +#include <asm/mach-types.h>
11181 +#include <asm/gpio.h>
11182 +#include <asm/mach/arch.h>
11183 +#include <asm/mach/pci.h>
11184 +#include <asm/arch/orion5x.h>
11185 +#include "common.h"
11186 +#include "mpp.h"
11187 +#include "tsx09-common.h"
11188 +
11189 +/*****************************************************************************
11190 + * QNAP TS-409 Info
11191 + ****************************************************************************/
11192 +
11193 +/*
11194 + * QNAP TS-409 hardware :
11195 + * - Marvell 88F5281-D0
11196 + * - Marvell 88SX7042 SATA controller (PCIe)
11197 + * - Marvell 88E1118 Gigabit Ethernet PHY
11198 + * - RTC S35390A (@0x30) on I2C bus
11199 + * - 8MB NOR flash
11200 + * - 256MB of DDR-2 RAM
11201 + */
11202 +
11203 +/*
11204 + * 8MB NOR flash Device bus boot chip select
11205 + */
11206 +
11207 +#define QNAP_TS409_NOR_BOOT_BASE 0xff800000
11208 +#define QNAP_TS409_NOR_BOOT_SIZE SZ_8M
11209 +
11210 +/****************************************************************************
11211 + * 8MiB NOR flash. The struct mtd_partition is not in the same order as the
11212 + * partitions on the device because we want to keep compatability with
11213 + * existing QNAP firmware.
11214 + *
11215 + * Layout as used by QNAP:
11216 + * [2] 0x00000000-0x00200000 : "Kernel"
11217 + * [3] 0x00200000-0x00600000 : "RootFS1"
11218 + * [4] 0x00600000-0x00700000 : "RootFS2"
11219 + * [6] 0x00700000-0x00760000 : "NAS Config" (read-only)
11220 + * [5] 0x00760000-0x00780000 : "U-Boot Config"
11221 + * [1] 0x00780000-0x00800000 : "U-Boot" (read-only)
11222 + ***************************************************************************/
11223 +static struct mtd_partition qnap_ts409_partitions[] = {
11224 + {
11225 + .name = "U-Boot",
11226 + .size = 0x00080000,
11227 + .offset = 0x00780000,
11228 + .mask_flags = MTD_WRITEABLE,
11229 + }, {
11230 + .name = "Kernel",
11231 + .size = 0x00200000,
11232 + .offset = 0,
11233 + }, {
11234 + .name = "RootFS1",
11235 + .size = 0x00400000,
11236 + .offset = 0x00200000,
11237 + }, {
11238 + .name = "RootFS2",
11239 + .size = 0x00100000,
11240 + .offset = 0x00600000,
11241 + }, {
11242 + .name = "U-Boot Config",
11243 + .size = 0x00020000,
11244 + .offset = 0x00760000,
11245 + }, {
11246 + .name = "NAS Config",
11247 + .size = 0x00060000,
11248 + .offset = 0x00700000,
11249 + .mask_flags = MTD_WRITEABLE,
11250 + },
11251 +};
11252 +
11253 +static struct physmap_flash_data qnap_ts409_nor_flash_data = {
11254 + .width = 1,
11255 + .parts = qnap_ts409_partitions,
11256 + .nr_parts = ARRAY_SIZE(qnap_ts409_partitions)
11257 +};
11258 +
11259 +static struct resource qnap_ts409_nor_flash_resource = {
11260 + .flags = IORESOURCE_MEM,
11261 + .start = QNAP_TS409_NOR_BOOT_BASE,
11262 + .end = QNAP_TS409_NOR_BOOT_BASE + QNAP_TS409_NOR_BOOT_SIZE - 1,
11263 +};
11264 +
11265 +static struct platform_device qnap_ts409_nor_flash = {
11266 + .name = "physmap-flash",
11267 + .id = 0,
11268 + .dev = { .platform_data = &qnap_ts409_nor_flash_data, },
11269 + .num_resources = 1,
11270 + .resource = &qnap_ts409_nor_flash_resource,
11271 +};
11272 +
11273 +/*****************************************************************************
11274 + * PCI
11275 + ****************************************************************************/
11276 +
11277 +static int __init qnap_ts409_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
11278 +{
11279 + int irq;
11280 +
11281 + /*
11282 + * Check for devices with hard-wired IRQs.
11283 + */
11284 + irq = orion5x_pci_map_irq(dev, slot, pin);
11285 + if (irq != -1)
11286 + return irq;
11287 +
11288 + /*
11289 + * PCI isn't used on the TS-409
11290 + */
11291 + return -1;
11292 +}
11293 +
11294 +static struct hw_pci qnap_ts409_pci __initdata = {
11295 + .nr_controllers = 2,
11296 + .swizzle = pci_std_swizzle,
11297 + .setup = orion5x_pci_sys_setup,
11298 + .scan = orion5x_pci_sys_scan_bus,
11299 + .map_irq = qnap_ts409_pci_map_irq,
11300 +};
11301 +
11302 +static int __init qnap_ts409_pci_init(void)
11303 +{
11304 + if (machine_is_ts409())
11305 + pci_common_init(&qnap_ts409_pci);
11306 +
11307 + return 0;
11308 +}
11309 +
11310 +subsys_initcall(qnap_ts409_pci_init);
11311 +
11312 +/*****************************************************************************
11313 + * RTC S35390A on I2C bus
11314 + ****************************************************************************/
11315 +
11316 +#define TS409_RTC_GPIO 10
11317 +
11318 +static struct i2c_board_info __initdata qnap_ts409_i2c_rtc = {
11319 + I2C_BOARD_INFO("s35390a", 0x30),
11320 +};
11321 +
11322 +/****************************************************************************
11323 + * GPIO Attached Keys
11324 + * Power button is attached to the PIC microcontroller
11325 + ****************************************************************************/
11326 +
11327 +#define QNAP_TS409_GPIO_KEY_MEDIA 15
11328 +
11329 +static struct gpio_keys_button qnap_ts409_buttons[] = {
11330 + {
11331 + .code = KEY_RESTART,
11332 + .gpio = QNAP_TS409_GPIO_KEY_MEDIA,
11333 + .desc = "USB Copy Button",
11334 + .active_low = 1,
11335 + },
11336 +};
11337 +
11338 +static struct gpio_keys_platform_data qnap_ts409_button_data = {
11339 + .buttons = qnap_ts409_buttons,
11340 + .nbuttons = ARRAY_SIZE(qnap_ts409_buttons),
11341 +};
11342 +
11343 +static struct platform_device qnap_ts409_button_device = {
11344 + .name = "gpio-keys",
11345 + .id = -1,
11346 + .num_resources = 0,
11347 + .dev = {
11348 + .platform_data = &qnap_ts409_button_data,
11349 + },
11350 +};
11351 +
11352 +/*****************************************************************************
11353 + * General Setup
11354 + ****************************************************************************/
11355 +static struct orion5x_mpp_mode ts409_mpp_modes[] __initdata = {
11356 + { 0, MPP_UNUSED },
11357 + { 1, MPP_UNUSED },
11358 + { 2, MPP_UNUSED },
11359 + { 3, MPP_UNUSED },
11360 + { 4, MPP_GPIO }, /* HDD 1 status */
11361 + { 5, MPP_GPIO }, /* HDD 2 status */
11362 + { 6, MPP_GPIO }, /* HDD 3 status */
11363 + { 7, MPP_GPIO }, /* HDD 4 status */
11364 + { 8, MPP_UNUSED },
11365 + { 9, MPP_UNUSED },
11366 + { 10, MPP_GPIO }, /* RTC int */
11367 + { 11, MPP_UNUSED },
11368 + { 12, MPP_UNUSED },
11369 + { 13, MPP_UNUSED },
11370 + { 14, MPP_GPIO }, /* SW_RST */
11371 + { 15, MPP_GPIO }, /* USB copy button */
11372 + { 16, MPP_UART }, /* UART1 RXD */
11373 + { 17, MPP_UART }, /* UART1 TXD */
11374 + { 18, MPP_UNUSED },
11375 + { 19, MPP_UNUSED },
11376 + { -1 },
11377 +};
11378 +
11379 +static void __init qnap_ts409_init(void)
11380 +{
11381 + /*
11382 + * Setup basic Orion functions. Need to be called early.
11383 + */
11384 + orion5x_init();
11385 +
11386 + orion5x_mpp_conf(ts409_mpp_modes);
11387 +
11388 + /*
11389 + * Configure peripherals.
11390 + */
11391 + orion5x_ehci0_init();
11392 + qnap_tsx09_find_mac_addr(QNAP_TS409_NOR_BOOT_BASE +
11393 + qnap_ts409_partitions[5].offset,
11394 + qnap_ts409_partitions[5].size);
11395 + orion5x_eth_init(&qnap_tsx09_eth_data);
11396 + orion5x_i2c_init();
11397 + orion5x_uart0_init();
11398 +
11399 + orion5x_setup_dev_boot_win(QNAP_TS409_NOR_BOOT_BASE,
11400 + QNAP_TS409_NOR_BOOT_SIZE);
11401 + platform_device_register(&qnap_ts409_nor_flash);
11402 +
11403 + platform_device_register(&qnap_ts409_button_device);
11404 +
11405 + /* Get RTC IRQ and register the chip */
11406 + if (gpio_request(TS409_RTC_GPIO, "rtc") == 0) {
11407 + if (gpio_direction_input(TS409_RTC_GPIO) == 0)
11408 + qnap_ts409_i2c_rtc.irq = gpio_to_irq(TS409_RTC_GPIO);
11409 + else
11410 + gpio_free(TS409_RTC_GPIO);
11411 + }
11412 + if (qnap_ts409_i2c_rtc.irq == 0)
11413 + pr_warning("qnap_ts409_init: failed to get RTC IRQ\n");
11414 + i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1);
11415 +
11416 + /* register tsx09 specific power-off method */
11417 + pm_power_off = qnap_tsx09_power_off;
11418 +}
11419 +
11420 +MACHINE_START(TS409, "QNAP TS-409")
11421 + /* Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com> */
11422 + .phys_io = ORION5X_REGS_PHYS_BASE,
11423 + .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
11424 + .boot_params = 0x00000100,
11425 + .init_machine = qnap_ts409_init,
11426 + .map_io = orion5x_map_io,
11427 + .init_irq = orion5x_init_irq,
11428 + .timer = &orion5x_timer,
11429 + .fixup = tag_fixup_mem32,
11430 +MACHINE_END
11431 --- /dev/null
11432 +++ b/arch/arm/mach-orion5x/ts78xx-setup.c
11433 @@ -0,0 +1,277 @@
11434 +/*
11435 + * arch/arm/mach-orion5x/ts78xx-setup.c
11436 + *
11437 + * Maintainer: Alexander Clouter <alex@digriz.org.uk>
11438 + *
11439 + * This file is licensed under the terms of the GNU General Public
11440 + * License version 2. This program is licensed "as is" without any
11441 + * warranty of any kind, whether express or implied.
11442 + */
11443 +
11444 +#include <linux/kernel.h>
11445 +#include <linux/init.h>
11446 +#include <linux/platform_device.h>
11447 +#include <linux/mtd/physmap.h>
11448 +#include <linux/mv643xx_eth.h>
11449 +#include <linux/ata_platform.h>
11450 +#include <linux/m48t86.h>
11451 +#include <asm/mach-types.h>
11452 +#include <asm/mach/arch.h>
11453 +#include <asm/mach/map.h>
11454 +#include <asm/arch/orion5x.h>
11455 +#include "common.h"
11456 +#include "mpp.h"
11457 +
11458 +/*****************************************************************************
11459 + * TS-78xx Info
11460 + ****************************************************************************/
11461 +
11462 +/*
11463 + * FPGA - lives where the PCI bus would be at ORION5X_PCI_MEM_PHYS_BASE
11464 + */
11465 +#define TS78XX_FPGA_REGS_PHYS_BASE 0xe8000000
11466 +#define TS78XX_FPGA_REGS_VIRT_BASE 0xff900000
11467 +#define TS78XX_FPGA_REGS_SIZE SZ_1M
11468 +
11469 +#define TS78XX_FPGA_REGS_SYSCON_ID (TS78XX_FPGA_REGS_VIRT_BASE | 0x000)
11470 +#define TS78XX_FPGA_REGS_SYSCON_LCDI (TS78XX_FPGA_REGS_VIRT_BASE | 0x004)
11471 +#define TS78XX_FPGA_REGS_SYSCON_LCDO (TS78XX_FPGA_REGS_VIRT_BASE | 0x008)
11472 +
11473 +#define TS78XX_FPGA_REGS_RTC_CTRL (TS78XX_FPGA_REGS_VIRT_BASE | 0x808)
11474 +#define TS78XX_FPGA_REGS_RTC_DATA (TS78XX_FPGA_REGS_VIRT_BASE | 0x80c)
11475 +
11476 +/*
11477 + * 512kB NOR flash Device
11478 + */
11479 +#define TS78XX_NOR_BOOT_BASE 0xff800000
11480 +#define TS78XX_NOR_BOOT_SIZE SZ_512K
11481 +
11482 +/*****************************************************************************
11483 + * I/O Address Mapping
11484 + ****************************************************************************/
11485 +static struct map_desc ts78xx_io_desc[] __initdata = {
11486 + {
11487 + .virtual = TS78XX_FPGA_REGS_VIRT_BASE,
11488 + .pfn = __phys_to_pfn(TS78XX_FPGA_REGS_PHYS_BASE),
11489 + .length = TS78XX_FPGA_REGS_SIZE,
11490 + .type = MT_DEVICE,
11491 + },
11492 +};
11493 +
11494 +void __init ts78xx_map_io(void)
11495 +{
11496 + orion5x_map_io();
11497 + iotable_init(ts78xx_io_desc, ARRAY_SIZE(ts78xx_io_desc));
11498 +}
11499 +
11500 +/*****************************************************************************
11501 + * 512kB NOR Boot Flash - the chip is a M25P40
11502 + ****************************************************************************/
11503 +static struct mtd_partition ts78xx_nor_boot_flash_resources[] = {
11504 + {
11505 + .name = "ts-bootrom",
11506 + .offset = 0,
11507 + /* only the first 256kB is used */
11508 + .size = SZ_256K,
11509 + .mask_flags = MTD_WRITEABLE,
11510 + },
11511 +};
11512 +
11513 +static struct physmap_flash_data ts78xx_nor_boot_flash_data = {
11514 + .width = 1,
11515 + .parts = ts78xx_nor_boot_flash_resources,
11516 + .nr_parts = ARRAY_SIZE(ts78xx_nor_boot_flash_resources),
11517 +};
11518 +
11519 +static struct resource ts78xx_nor_boot_flash_resource = {
11520 + .flags = IORESOURCE_MEM,
11521 + .start = TS78XX_NOR_BOOT_BASE,
11522 + .end = TS78XX_NOR_BOOT_BASE + TS78XX_NOR_BOOT_SIZE - 1,
11523 +};
11524 +
11525 +static struct platform_device ts78xx_nor_boot_flash = {
11526 + .name = "physmap-flash",
11527 + .id = -1,
11528 + .dev = {
11529 + .platform_data = &ts78xx_nor_boot_flash_data,
11530 + },
11531 + .num_resources = 1,
11532 + .resource = &ts78xx_nor_boot_flash_resource,
11533 +};
11534 +
11535 +/*****************************************************************************
11536 + * Ethernet
11537 + ****************************************************************************/
11538 +static struct mv643xx_eth_platform_data ts78xx_eth_data = {
11539 + .phy_addr = 0,
11540 + .force_phy_addr = 1,
11541 +};
11542 +
11543 +/*****************************************************************************
11544 + * RTC M48T86 - nicked^Wborrowed from arch/arm/mach-ep93xx/ts72xx.c
11545 + ****************************************************************************/
11546 +#ifdef CONFIG_RTC_DRV_M48T86
11547 +static unsigned char ts78xx_rtc_readbyte(unsigned long addr)
11548 +{
11549 + writeb(addr, TS78XX_FPGA_REGS_RTC_CTRL);
11550 + return readb(TS78XX_FPGA_REGS_RTC_DATA);
11551 +}
11552 +
11553 +static void ts78xx_rtc_writebyte(unsigned char value, unsigned long addr)
11554 +{
11555 + writeb(addr, TS78XX_FPGA_REGS_RTC_CTRL);
11556 + writeb(value, TS78XX_FPGA_REGS_RTC_DATA);
11557 +}
11558 +
11559 +static struct m48t86_ops ts78xx_rtc_ops = {
11560 + .readbyte = ts78xx_rtc_readbyte,
11561 + .writebyte = ts78xx_rtc_writebyte,
11562 +};
11563 +
11564 +static struct platform_device ts78xx_rtc_device = {
11565 + .name = "rtc-m48t86",
11566 + .id = -1,
11567 + .dev = {
11568 + .platform_data = &ts78xx_rtc_ops,
11569 + },
11570 + .num_resources = 0,
11571 +};
11572 +
11573 +/*
11574 + * TS uses some of the user storage space on the RTC chip so see if it is
11575 + * present; as it's an optional feature at purchase time and not all boards
11576 + * will have it present
11577 + *
11578 + * I've used the method TS use in their rtc7800.c example for the detection
11579 + *
11580 + * TODO: track down a guinea pig without an RTC to see if we can work out a
11581 + * better RTC detection routine
11582 + */
11583 +static int __init ts78xx_rtc_init(void)
11584 +{
11585 + unsigned char tmp_rtc0, tmp_rtc1;
11586 +
11587 + tmp_rtc0 = ts78xx_rtc_readbyte(126);
11588 + tmp_rtc1 = ts78xx_rtc_readbyte(127);
11589 +
11590 + ts78xx_rtc_writebyte(0x00, 126);
11591 + ts78xx_rtc_writebyte(0x55, 127);
11592 + if (ts78xx_rtc_readbyte(127) == 0x55) {
11593 + ts78xx_rtc_writebyte(0xaa, 127);
11594 + if (ts78xx_rtc_readbyte(127) == 0xaa
11595 + && ts78xx_rtc_readbyte(126) == 0x00) {
11596 + ts78xx_rtc_writebyte(tmp_rtc0, 126);
11597 + ts78xx_rtc_writebyte(tmp_rtc1, 127);
11598 + platform_device_register(&ts78xx_rtc_device);
11599 + return 1;
11600 + }
11601 + }
11602 +
11603 + return 0;
11604 +};
11605 +#else
11606 +static int __init ts78xx_rtc_init(void)
11607 +{
11608 + return 0;
11609 +}
11610 +#endif
11611 +
11612 +/*****************************************************************************
11613 + * SATA
11614 + ****************************************************************************/
11615 +static struct mv_sata_platform_data ts78xx_sata_data = {
11616 + .n_ports = 2,
11617 +};
11618 +
11619 +/*****************************************************************************
11620 + * print some information regarding the board
11621 + ****************************************************************************/
11622 +static void __init ts78xx_print_board_id(void)
11623 +{
11624 + unsigned int board_info;
11625 +
11626 + board_info = readl(TS78XX_FPGA_REGS_SYSCON_ID);
11627 + printk(KERN_INFO "TS-78xx Info: FPGA rev=%.2x, Board Magic=%.6x, ",
11628 + board_info & 0xff,
11629 + (board_info >> 8) & 0xffffff);
11630 + board_info = readl(TS78XX_FPGA_REGS_SYSCON_LCDI);
11631 + printk("JP1=%d, JP2=%d\n",
11632 + (board_info >> 30) & 0x1,
11633 + (board_info >> 31) & 0x1);
11634 +};
11635 +
11636 +/*****************************************************************************
11637 + * General Setup
11638 + ****************************************************************************/
11639 +static struct orion5x_mpp_mode ts78xx_mpp_modes[] __initdata = {
11640 + { 0, MPP_UNUSED },
11641 + { 1, MPP_GPIO }, /* JTAG Clock */
11642 + { 2, MPP_GPIO }, /* JTAG Data In */
11643 + { 3, MPP_GPIO }, /* Lat ECP2 256 FPGA - PB2B */
11644 + { 4, MPP_GPIO }, /* JTAG Data Out */
11645 + { 5, MPP_GPIO }, /* JTAG TMS */
11646 + { 6, MPP_GPIO }, /* Lat ECP2 256 FPGA - PB31A_CLK4+ */
11647 + { 7, MPP_GPIO }, /* Lat ECP2 256 FPGA - PB22B */
11648 + { 8, MPP_UNUSED },
11649 + { 9, MPP_UNUSED },
11650 + { 10, MPP_UNUSED },
11651 + { 11, MPP_UNUSED },
11652 + { 12, MPP_UNUSED },
11653 + { 13, MPP_UNUSED },
11654 + { 14, MPP_UNUSED },
11655 + { 15, MPP_UNUSED },
11656 + { 16, MPP_UART },
11657 + { 17, MPP_UART },
11658 + { 18, MPP_UART },
11659 + { 19, MPP_UART },
11660 + { -1 },
11661 +};
11662 +
11663 +static void __init ts78xx_init(void)
11664 +{
11665 + /*
11666 + * Setup basic Orion functions. Need to be called early.
11667 + */
11668 + orion5x_init();
11669 +
11670 + ts78xx_print_board_id();
11671 +
11672 + orion5x_mpp_conf(ts78xx_mpp_modes);
11673 +
11674 + /*
11675 + * MPP[20] PCI Clock Out 1
11676 + * MPP[21] PCI Clock Out 0
11677 + * MPP[22] Unused
11678 + * MPP[23] Unused
11679 + * MPP[24] Unused
11680 + * MPP[25] Unused
11681 + */
11682 +
11683 + /*
11684 + * Configure peripherals.
11685 + */
11686 + orion5x_ehci0_init();
11687 + orion5x_ehci1_init();
11688 + orion5x_eth_init(&ts78xx_eth_data);
11689 + orion5x_sata_init(&ts78xx_sata_data);
11690 + orion5x_uart0_init();
11691 + orion5x_uart1_init();
11692 +
11693 + orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE,
11694 + TS78XX_NOR_BOOT_SIZE);
11695 + platform_device_register(&ts78xx_nor_boot_flash);
11696 +
11697 + if (!ts78xx_rtc_init())
11698 + printk(KERN_INFO "TS-78xx RTC not detected or enabled\n");
11699 +}
11700 +
11701 +MACHINE_START(TS78XX, "Technologic Systems TS-78xx SBC")
11702 + /* Maintainer: Alexander Clouter <alex@digriz.org.uk> */
11703 + .phys_io = ORION5X_REGS_PHYS_BASE,
11704 + .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
11705 + .boot_params = 0x00000100,
11706 + .init_machine = ts78xx_init,
11707 + .map_io = ts78xx_map_io,
11708 + .init_irq = orion5x_init_irq,
11709 + .timer = &orion5x_timer,
11710 +MACHINE_END
11711 --- /dev/null
11712 +++ b/arch/arm/mach-orion5x/tsx09-common.c
11713 @@ -0,0 +1,132 @@
11714 +/*
11715 + * QNAP TS-x09 Boards common functions
11716 + *
11717 + * Maintainers: Lennert Buytenhek <buytenh@marvell.com>
11718 + * Byron Bradley <byron.bbradley@gmail.com>
11719 + *
11720 + * This program is free software; you can redistribute it and/or
11721 + * modify it under the terms of the GNU General Public License
11722 + * as published by the Free Software Foundation; either version
11723 + * 2 of the License, or (at your option) any later version.
11724 + */
11725 +
11726 +#include <linux/kernel.h>
11727 +#include <linux/pci.h>
11728 +#include <linux/mv643xx_eth.h>
11729 +#include <linux/serial_reg.h>
11730 +#include "tsx09-common.h"
11731 +
11732 +/*****************************************************************************
11733 + * QNAP TS-x09 specific power off method via UART1-attached PIC
11734 + ****************************************************************************/
11735 +
11736 +#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
11737 +
11738 +void qnap_tsx09_power_off(void)
11739 +{
11740 + /* 19200 baud divisor */
11741 + const unsigned divisor = ((ORION5X_TCLK + (8 * 19200)) / (16 * 19200));
11742 +
11743 + pr_info("%s: triggering power-off...\n", __func__);
11744 +
11745 + /* hijack uart1 and reset into sane state (19200,8n1) */
11746 + writel(0x83, UART1_REG(LCR));
11747 + writel(divisor & 0xff, UART1_REG(DLL));
11748 + writel((divisor >> 8) & 0xff, UART1_REG(DLM));
11749 + writel(0x03, UART1_REG(LCR));
11750 + writel(0x00, UART1_REG(IER));
11751 + writel(0x00, UART1_REG(FCR));
11752 + writel(0x00, UART1_REG(MCR));
11753 +
11754 + /* send the power-off command 'A' to PIC */
11755 + writel('A', UART1_REG(TX));
11756 +}
11757 +
11758 +/*****************************************************************************
11759 + * Ethernet
11760 + ****************************************************************************/
11761 +
11762 +struct mv643xx_eth_platform_data qnap_tsx09_eth_data = {
11763 + .phy_addr = 8,
11764 +};
11765 +
11766 +static int __init qnap_tsx09_parse_hex_nibble(char n)
11767 +{
11768 + if (n >= '0' && n <= '9')
11769 + return n - '0';
11770 +
11771 + if (n >= 'A' && n <= 'F')
11772 + return n - 'A' + 10;
11773 +
11774 + if (n >= 'a' && n <= 'f')
11775 + return n - 'a' + 10;
11776 +
11777 + return -1;
11778 +}
11779 +
11780 +static int __init qnap_tsx09_parse_hex_byte(const char *b)
11781 +{
11782 + int hi;
11783 + int lo;
11784 +
11785 + hi = qnap_tsx09_parse_hex_nibble(b[0]);
11786 + lo = qnap_tsx09_parse_hex_nibble(b[1]);
11787 +
11788 + if (hi < 0 || lo < 0)
11789 + return -1;
11790 +
11791 + return (hi << 4) | lo;
11792 +}
11793 +
11794 +static int __init qnap_tsx09_check_mac_addr(const char *addr_str)
11795 +{
11796 + u_int8_t addr[6];
11797 + int i;
11798 +
11799 + for (i = 0; i < 6; i++) {
11800 + int byte;
11801 +
11802 + /*
11803 + * Enforce "xx:xx:xx:xx:xx:xx\n" format.
11804 + */
11805 + if (addr_str[(i * 3) + 2] != ((i < 5) ? ':' : '\n'))
11806 + return -1;
11807 +
11808 + byte = qnap_tsx09_parse_hex_byte(addr_str + (i * 3));
11809 + if (byte < 0)
11810 + return -1;
11811 + addr[i] = byte;
11812 + }
11813 +
11814 + printk(KERN_INFO "tsx09: found ethernet mac address ");
11815 + for (i = 0; i < 6; i++)
11816 + printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n");
11817 +
11818 + memcpy(qnap_tsx09_eth_data.mac_addr, addr, 6);
11819 +
11820 + return 0;
11821 +}
11822 +
11823 +/*
11824 + * The 'NAS Config' flash partition has an ext2 filesystem which
11825 + * contains a file that has the ethernet MAC address in plain text
11826 + * (format "xx:xx:xx:xx:xx:xx\n").
11827 + */
11828 +void __init qnap_tsx09_find_mac_addr(u32 mem_base, u32 size)
11829 +{
11830 + unsigned long addr;
11831 +
11832 + for (addr = mem_base; addr < (mem_base + size); addr += 1024) {
11833 + char *nor_page;
11834 + int ret = 0;
11835 +
11836 + nor_page = ioremap(addr, 1024);
11837 + if (nor_page != NULL) {
11838 + ret = qnap_tsx09_check_mac_addr(nor_page);
11839 + iounmap(nor_page);
11840 + }
11841 +
11842 + if (ret == 0)
11843 + break;
11844 + }
11845 +}
11846 --- /dev/null
11847 +++ b/arch/arm/mach-orion5x/tsx09-common.h
11848 @@ -0,0 +1,20 @@
11849 +#ifndef __ARCH_ORION5X_TSX09_COMMON_H
11850 +#define __ARCH_ORION5X_TSX09_COMMON_H
11851 +
11852 +/*
11853 + * QNAP TS-x09 Boards power-off function
11854 + */
11855 +extern void qnap_tsx09_power_off(void);
11856 +
11857 +/*
11858 + * QNAP TS-x09 Boards function to find Ethernet MAC address in flash memory
11859 + */
11860 +extern void __init qnap_tsx09_find_mac_addr(u32 mem_base, u32 size);
11861 +
11862 +/*
11863 + * QNAP TS-x09 Boards ethernet declaration
11864 + */
11865 +extern struct mv643xx_eth_platform_data qnap_tsx09_eth_data;
11866 +
11867 +
11868 +#endif
11869 --- /dev/null
11870 +++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c
11871 @@ -0,0 +1,173 @@
11872 +/*
11873 + * arch/arm/mach-orion5x/wrt350n-v2-setup.c
11874 + *
11875 + * This file is licensed under the terms of the GNU General Public
11876 + * License version 2. This program is licensed "as is" without any
11877 + * warranty of any kind, whether express or implied.
11878 + */
11879 +
11880 +#include <linux/kernel.h>
11881 +#include <linux/init.h>
11882 +#include <linux/platform_device.h>
11883 +#include <linux/pci.h>
11884 +#include <linux/irq.h>
11885 +#include <linux/delay.h>
11886 +#include <linux/mtd/physmap.h>
11887 +#include <linux/mv643xx_eth.h>
11888 +#include <asm/mach-types.h>
11889 +#include <asm/gpio.h>
11890 +#include <asm/mach/arch.h>
11891 +#include <asm/mach/pci.h>
11892 +#include <asm/arch/orion5x.h>
11893 +#include "common.h"
11894 +#include "mpp.h"
11895 +
11896 +static struct orion5x_mpp_mode wrt350n_v2_mpp_modes[] __initdata = {
11897 + { 0, MPP_GPIO }, /* Power LED green (0=on) */
11898 + { 1, MPP_GPIO }, /* Security LED (0=on) */
11899 + { 2, MPP_GPIO }, /* Internal Button (0=on) */
11900 + { 3, MPP_GPIO }, /* Reset Button (0=on) */
11901 + { 4, MPP_GPIO }, /* PCI int */
11902 + { 5, MPP_GPIO }, /* Power LED orange (0=on) */
11903 + { 6, MPP_GPIO }, /* USB LED (0=on) */
11904 + { 7, MPP_GPIO }, /* Wireless LED (0=on) */
11905 + { 8, MPP_UNUSED }, /* ??? */
11906 + { 9, MPP_GIGE }, /* GE_RXERR */
11907 + { 10, MPP_UNUSED }, /* ??? */
11908 + { 11, MPP_UNUSED }, /* ??? */
11909 + { 12, MPP_GIGE }, /* GE_TXD[4] */
11910 + { 13, MPP_GIGE }, /* GE_TXD[5] */
11911 + { 14, MPP_GIGE }, /* GE_TXD[6] */
11912 + { 15, MPP_GIGE }, /* GE_TXD[7] */
11913 + { 16, MPP_GIGE }, /* GE_RXD[4] */
11914 + { 17, MPP_GIGE }, /* GE_RXD[5] */
11915 + { 18, MPP_GIGE }, /* GE_RXD[6] */
11916 + { 19, MPP_GIGE }, /* GE_RXD[7] */
11917 + { -1 },
11918 +};
11919 +
11920 +/*
11921 + * 8M NOR flash Device bus boot chip select
11922 + */
11923 +#define WRT350N_V2_NOR_BOOT_BASE 0xf4000000
11924 +#define WRT350N_V2_NOR_BOOT_SIZE SZ_8M
11925 +
11926 +static struct mtd_partition wrt350n_v2_nor_flash_partitions[] = {
11927 + {
11928 + .name = "kernel",
11929 + .offset = 0x00000000,
11930 + .size = 0x00760000,
11931 + }, {
11932 + .name = "rootfs",
11933 + .offset = 0x001a0000,
11934 + .size = 0x005c0000,
11935 + }, {
11936 + .name = "lang",
11937 + .offset = 0x00760000,
11938 + .size = 0x00040000,
11939 + }, {
11940 + .name = "nvram",
11941 + .offset = 0x007a0000,
11942 + .size = 0x00020000,
11943 + }, {
11944 + .name = "u-boot",
11945 + .offset = 0x007c0000,
11946 + .size = 0x00040000,
11947 + },
11948 +};
11949 +
11950 +static struct physmap_flash_data wrt350n_v2_nor_flash_data = {
11951 + .width = 1,
11952 + .parts = wrt350n_v2_nor_flash_partitions,
11953 + .nr_parts = ARRAY_SIZE(wrt350n_v2_nor_flash_partitions),
11954 +};
11955 +
11956 +static struct resource wrt350n_v2_nor_flash_resource = {
11957 + .flags = IORESOURCE_MEM,
11958 + .start = WRT350N_V2_NOR_BOOT_BASE,
11959 + .end = WRT350N_V2_NOR_BOOT_BASE + WRT350N_V2_NOR_BOOT_SIZE - 1,
11960 +};
11961 +
11962 +static struct platform_device wrt350n_v2_nor_flash = {
11963 + .name = "physmap-flash",
11964 + .id = 0,
11965 + .dev = {
11966 + .platform_data = &wrt350n_v2_nor_flash_data,
11967 + },
11968 + .num_resources = 1,
11969 + .resource = &wrt350n_v2_nor_flash_resource,
11970 +};
11971 +
11972 +static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = {
11973 + .phy_addr = -1,
11974 +};
11975 +
11976 +static void __init wrt350n_v2_init(void)
11977 +{
11978 + /*
11979 + * Setup basic Orion functions. Need to be called early.
11980 + */
11981 + orion5x_init();
11982 +
11983 + orion5x_mpp_conf(wrt350n_v2_mpp_modes);
11984 +
11985 + /*
11986 + * Configure peripherals.
11987 + */
11988 + orion5x_ehci0_init();
11989 + orion5x_eth_init(&wrt350n_v2_eth_data);
11990 + orion5x_uart0_init();
11991 +
11992 + orion5x_setup_dev_boot_win(WRT350N_V2_NOR_BOOT_BASE,
11993 + WRT350N_V2_NOR_BOOT_SIZE);
11994 + platform_device_register(&wrt350n_v2_nor_flash);
11995 +}
11996 +
11997 +static int __init wrt350n_v2_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
11998 +{
11999 + int irq;
12000 +
12001 + /*
12002 + * Check for devices with hard-wired IRQs.
12003 + */
12004 + irq = orion5x_pci_map_irq(dev, slot, pin);
12005 + if (irq != -1)
12006 + return irq;
12007 +
12008 + /*
12009 + * Mini-PCI slot.
12010 + */
12011 + if (slot == 7)
12012 + return gpio_to_irq(4);
12013 +
12014 + return -1;
12015 +}
12016 +
12017 +static struct hw_pci wrt350n_v2_pci __initdata = {
12018 + .nr_controllers = 2,
12019 + .swizzle = pci_std_swizzle,
12020 + .setup = orion5x_pci_sys_setup,
12021 + .scan = orion5x_pci_sys_scan_bus,
12022 + .map_irq = wrt350n_v2_pci_map_irq,
12023 +};
12024 +
12025 +static int __init wrt350n_v2_pci_init(void)
12026 +{
12027 + if (machine_is_wrt350n_v2())
12028 + pci_common_init(&wrt350n_v2_pci);
12029 +
12030 + return 0;
12031 +}
12032 +subsys_initcall(wrt350n_v2_pci_init);
12033 +
12034 +MACHINE_START(WRT350N_V2, "Linksys WRT350N v2")
12035 + /* Maintainer: Lennert Buytenhek <buytenh@marvell.com> */
12036 + .phys_io = ORION5X_REGS_PHYS_BASE,
12037 + .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
12038 + .boot_params = 0x00000100,
12039 + .init_machine = wrt350n_v2_init,
12040 + .map_io = orion5x_map_io,
12041 + .init_irq = orion5x_init_irq,
12042 + .timer = &orion5x_timer,
12043 + .fixup = tag_fixup_mem32,
12044 +MACHINE_END
12045 --- a/arch/arm/mm/Kconfig
12046 +++ b/arch/arm/mm/Kconfig
12047 @@ -365,7 +365,7 @@
12048 # Feroceon
12049 config CPU_FEROCEON
12050 bool
12051 - depends on ARCH_ORION5X
12052 + depends on ARCH_ORION5X || ARCH_LOKI || ARCH_KIRKWOOD || ARCH_MV78XX0
12053 default y
12054 select CPU_32v5
12055 select CPU_ABRT_EV5T
12056 @@ -373,7 +373,7 @@
12057 select CPU_CACHE_VIVT
12058 select CPU_CP15_MMU
12059 select CPU_COPY_FEROCEON if MMU
12060 - select CPU_TLB_V4WBI if MMU
12061 + select CPU_TLB_FEROCEON if MMU
12062
12063 config CPU_FEROCEON_OLD_ID
12064 bool "Accept early Feroceon cores with an ARM926 ID"
12065 @@ -551,6 +551,11 @@
12066 ARM Architecture Version 4 TLB with writeback cache and invalidate
12067 instruction cache entry.
12068
12069 +config CPU_TLB_FEROCEON
12070 + bool
12071 + help
12072 + Feroceon TLB (v4wbi with non-outer-cachable page table walks).
12073 +
12074 config CPU_TLB_V6
12075 bool
12076
12077 @@ -709,6 +714,14 @@
12078 bool
12079 default n
12080
12081 +config CACHE_FEROCEON_L2
12082 + bool "Enable the Feroceon L2 cache controller"
12083 + depends on ARCH_KIRKWOOD || ARCH_MV78XX0
12084 + default y
12085 + select OUTER_CACHE
12086 + help
12087 + This option enables the Feroceon L2 cache controller.
12088 +
12089 config CACHE_L2X0
12090 bool "Enable the L2x0 outer cache controller"
12091 depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176
12092 --- a/arch/arm/mm/Makefile
12093 +++ b/arch/arm/mm/Makefile
12094 @@ -46,6 +46,7 @@
12095 obj-$(CONFIG_CPU_TLB_V4WT) += tlb-v4.o
12096 obj-$(CONFIG_CPU_TLB_V4WB) += tlb-v4wb.o
12097 obj-$(CONFIG_CPU_TLB_V4WBI) += tlb-v4wbi.o
12098 +obj-$(CONFIG_CPU_TLB_FEROCEON) += tlb-v4wbi.o # reuse v4wbi TLB functions
12099 obj-$(CONFIG_CPU_TLB_V6) += tlb-v6.o
12100 obj-$(CONFIG_CPU_TLB_V7) += tlb-v7.o
12101
12102 @@ -73,4 +74,5 @@
12103 obj-$(CONFIG_CPU_V6) += proc-v6.o
12104 obj-$(CONFIG_CPU_V7) += proc-v7.o
12105
12106 +obj-$(CONFIG_CACHE_FEROCEON_L2) += cache-feroceon-l2.o
12107 obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o
12108 --- /dev/null
12109 +++ b/arch/arm/mm/cache-feroceon-l2.c
12110 @@ -0,0 +1,318 @@
12111 +/*
12112 + * arch/arm/mm/cache-feroceon-l2.c - Feroceon L2 cache controller support
12113 + *
12114 + * Copyright (C) 2008 Marvell Semiconductor
12115 + *
12116 + * This file is licensed under the terms of the GNU General Public
12117 + * License version 2. This program is licensed "as is" without any
12118 + * warranty of any kind, whether express or implied.
12119 + *
12120 + * References:
12121 + * - Unified Layer 2 Cache for Feroceon CPU Cores,
12122 + * Document ID MV-S104858-00, Rev. A, October 23 2007.
12123 + */
12124 +
12125 +#include <linux/init.h>
12126 +#include <asm/cacheflush.h>
12127 +#include <asm/plat-orion/cache-feroceon-l2.h>
12128 +
12129 +
12130 +/*
12131 + * Low-level cache maintenance operations.
12132 + *
12133 + * As well as the regular 'clean/invalidate/flush L2 cache line by
12134 + * MVA' instructions, the Feroceon L2 cache controller also features
12135 + * 'clean/invalidate L2 range by MVA' operations.
12136 + *
12137 + * Cache range operations are initiated by writing the start and
12138 + * end addresses to successive cp15 registers, and process every
12139 + * cache line whose first byte address lies in the inclusive range
12140 + * [start:end].
12141 + *
12142 + * The cache range operations stall the CPU pipeline until completion.
12143 + *
12144 + * The range operations require two successive cp15 writes, in
12145 + * between which we don't want to be preempted.
12146 + */
12147 +static inline void l2_clean_pa(unsigned long addr)
12148 +{
12149 + __asm__("mcr p15, 1, %0, c15, c9, 3" : : "r" (addr));
12150 +}
12151 +
12152 +static inline void l2_clean_mva_range(unsigned long start, unsigned long end)
12153 +{
12154 + unsigned long flags;
12155 +
12156 + /*
12157 + * Make sure 'start' and 'end' reference the same page, as
12158 + * L2 is PIPT and range operations only do a TLB lookup on
12159 + * the start address.
12160 + */
12161 + BUG_ON((start ^ end) & ~(PAGE_SIZE - 1));
12162 +
12163 + raw_local_irq_save(flags);
12164 + __asm__("mcr p15, 1, %0, c15, c9, 4" : : "r" (start));
12165 + __asm__("mcr p15, 1, %0, c15, c9, 5" : : "r" (end));
12166 + raw_local_irq_restore(flags);
12167 +}
12168 +
12169 +static inline void l2_clean_pa_range(unsigned long start, unsigned long end)
12170 +{
12171 + l2_clean_mva_range(__phys_to_virt(start), __phys_to_virt(end));
12172 +}
12173 +
12174 +static inline void l2_clean_inv_pa(unsigned long addr)
12175 +{
12176 + __asm__("mcr p15, 1, %0, c15, c10, 3" : : "r" (addr));
12177 +}
12178 +
12179 +static inline void l2_inv_pa(unsigned long addr)
12180 +{
12181 + __asm__("mcr p15, 1, %0, c15, c11, 3" : : "r" (addr));
12182 +}
12183 +
12184 +static inline void l2_inv_mva_range(unsigned long start, unsigned long end)
12185 +{
12186 + unsigned long flags;
12187 +
12188 + /*
12189 + * Make sure 'start' and 'end' reference the same page, as
12190 + * L2 is PIPT and range operations only do a TLB lookup on
12191 + * the start address.
12192 + */
12193 + BUG_ON((start ^ end) & ~(PAGE_SIZE - 1));
12194 +
12195 + raw_local_irq_save(flags);
12196 + __asm__("mcr p15, 1, %0, c15, c11, 4" : : "r" (start));
12197 + __asm__("mcr p15, 1, %0, c15, c11, 5" : : "r" (end));
12198 + raw_local_irq_restore(flags);
12199 +}
12200 +
12201 +static inline void l2_inv_pa_range(unsigned long start, unsigned long end)
12202 +{
12203 + l2_inv_mva_range(__phys_to_virt(start), __phys_to_virt(end));
12204 +}
12205 +
12206 +
12207 +/*
12208 + * Linux primitives.
12209 + *
12210 + * Note that the end addresses passed to Linux primitives are
12211 + * noninclusive, while the hardware cache range operations use
12212 + * inclusive start and end addresses.
12213 + */
12214 +#define CACHE_LINE_SIZE 32
12215 +#define MAX_RANGE_SIZE 1024
12216 +
12217 +static int l2_wt_override;
12218 +
12219 +static unsigned long calc_range_end(unsigned long start, unsigned long end)
12220 +{
12221 + unsigned long range_end;
12222 +
12223 + BUG_ON(start & (CACHE_LINE_SIZE - 1));
12224 + BUG_ON(end & (CACHE_LINE_SIZE - 1));
12225 +
12226 + /*
12227 + * Try to process all cache lines between 'start' and 'end'.
12228 + */
12229 + range_end = end;
12230 +
12231 + /*
12232 + * Limit the number of cache lines processed at once,
12233 + * since cache range operations stall the CPU pipeline
12234 + * until completion.
12235 + */
12236 + if (range_end > start + MAX_RANGE_SIZE)
12237 + range_end = start + MAX_RANGE_SIZE;
12238 +
12239 + /*
12240 + * Cache range operations can't straddle a page boundary.
12241 + */
12242 + if (range_end > (start | (PAGE_SIZE - 1)) + 1)
12243 + range_end = (start | (PAGE_SIZE - 1)) + 1;
12244 +
12245 + return range_end;
12246 +}
12247 +
12248 +static void feroceon_l2_inv_range(unsigned long start, unsigned long end)
12249 +{
12250 + /*
12251 + * Clean and invalidate partial first cache line.
12252 + */
12253 + if (start & (CACHE_LINE_SIZE - 1)) {
12254 + l2_clean_inv_pa(start & ~(CACHE_LINE_SIZE - 1));
12255 + start = (start | (CACHE_LINE_SIZE - 1)) + 1;
12256 + }
12257 +
12258 + /*
12259 + * Clean and invalidate partial last cache line.
12260 + */
12261 + if (end & (CACHE_LINE_SIZE - 1)) {
12262 + l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1));
12263 + end &= ~(CACHE_LINE_SIZE - 1);
12264 + }
12265 +
12266 + /*
12267 + * Invalidate all full cache lines between 'start' and 'end'.
12268 + */
12269 + while (start != end) {
12270 + unsigned long range_end = calc_range_end(start, end);
12271 + l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE);
12272 + start = range_end;
12273 + }
12274 +
12275 + dsb();
12276 +}
12277 +
12278 +static void feroceon_l2_clean_range(unsigned long start, unsigned long end)
12279 +{
12280 + /*
12281 + * If L2 is forced to WT, the L2 will always be clean and we
12282 + * don't need to do anything here.
12283 + */
12284 + if (!l2_wt_override) {
12285 + start &= ~(CACHE_LINE_SIZE - 1);
12286 + end = (end + CACHE_LINE_SIZE - 1) & ~(CACHE_LINE_SIZE - 1);
12287 + while (start != end) {
12288 + unsigned long range_end = calc_range_end(start, end);
12289 + l2_clean_pa_range(start, range_end - CACHE_LINE_SIZE);
12290 + start = range_end;
12291 + }
12292 + }
12293 +
12294 + dsb();
12295 +}
12296 +
12297 +static void feroceon_l2_flush_range(unsigned long start, unsigned long end)
12298 +{
12299 + start &= ~(CACHE_LINE_SIZE - 1);
12300 + end = (end + CACHE_LINE_SIZE - 1) & ~(CACHE_LINE_SIZE - 1);
12301 + while (start != end) {
12302 + unsigned long range_end = calc_range_end(start, end);
12303 + if (!l2_wt_override)
12304 + l2_clean_pa_range(start, range_end - CACHE_LINE_SIZE);
12305 + l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE);
12306 + start = range_end;
12307 + }
12308 +
12309 + dsb();
12310 +}
12311 +
12312 +
12313 +/*
12314 + * Routines to disable and re-enable the D-cache and I-cache at run
12315 + * time. These are necessary because the L2 cache can only be enabled
12316 + * or disabled while the L1 Dcache and Icache are both disabled.
12317 + */
12318 +static void __init invalidate_and_disable_dcache(void)
12319 +{
12320 + u32 cr;
12321 +
12322 + cr = get_cr();
12323 + if (cr & CR_C) {
12324 + unsigned long flags;
12325 +
12326 + raw_local_irq_save(flags);
12327 + flush_cache_all();
12328 + set_cr(cr & ~CR_C);
12329 + raw_local_irq_restore(flags);
12330 + }
12331 +}
12332 +
12333 +static void __init enable_dcache(void)
12334 +{
12335 + u32 cr;
12336 +
12337 + cr = get_cr();
12338 + if (!(cr & CR_C))
12339 + set_cr(cr | CR_C);
12340 +}
12341 +
12342 +static void __init __invalidate_icache(void)
12343 +{
12344 + int dummy;
12345 +
12346 + __asm__ __volatile__("mcr p15, 0, %0, c7, c5, 0\n" : "=r" (dummy));
12347 +}
12348 +
12349 +static void __init invalidate_and_disable_icache(void)
12350 +{
12351 + u32 cr;
12352 +
12353 + cr = get_cr();
12354 + if (cr & CR_I) {
12355 + set_cr(cr & ~CR_I);
12356 + __invalidate_icache();
12357 + }
12358 +}
12359 +
12360 +static void __init enable_icache(void)
12361 +{
12362 + u32 cr;
12363 +
12364 + cr = get_cr();
12365 + if (!(cr & CR_I))
12366 + set_cr(cr | CR_I);
12367 +}
12368 +
12369 +static inline u32 read_extra_features(void)
12370 +{
12371 + u32 u;
12372 +
12373 + __asm__("mrc p15, 1, %0, c15, c1, 0" : "=r" (u));
12374 +
12375 + return u;
12376 +}
12377 +
12378 +static inline void write_extra_features(u32 u)
12379 +{
12380 + __asm__("mcr p15, 1, %0, c15, c1, 0" : : "r" (u));
12381 +}
12382 +
12383 +static void __init disable_l2_prefetch(void)
12384 +{
12385 + u32 u;
12386 +
12387 + /*
12388 + * Read the CPU Extra Features register and verify that the
12389 + * Disable L2 Prefetch bit is set.
12390 + */
12391 + u = read_extra_features();
12392 + if (!(u & 0x01000000)) {
12393 + printk(KERN_INFO "Feroceon L2: Disabling L2 prefetch.\n");
12394 + write_extra_features(u | 0x01000000);
12395 + }
12396 +}
12397 +
12398 +static void __init enable_l2(void)
12399 +{
12400 + u32 u;
12401 +
12402 + u = read_extra_features();
12403 + if (!(u & 0x00400000)) {
12404 + printk(KERN_INFO "Feroceon L2: Enabling L2\n");
12405 +
12406 + invalidate_and_disable_dcache();
12407 + invalidate_and_disable_icache();
12408 + write_extra_features(u | 0x00400000);
12409 + enable_icache();
12410 + enable_dcache();
12411 + }
12412 +}
12413 +
12414 +void __init feroceon_l2_init(int __l2_wt_override)
12415 +{
12416 + l2_wt_override = __l2_wt_override;
12417 +
12418 + disable_l2_prefetch();
12419 +
12420 + outer_cache.inv_range = feroceon_l2_inv_range;
12421 + outer_cache.clean_range = feroceon_l2_clean_range;
12422 + outer_cache.flush_range = feroceon_l2_flush_range;
12423 +
12424 + enable_l2();
12425 +
12426 + printk(KERN_INFO "Feroceon L2: Cache support initialised%s.\n",
12427 + l2_wt_override ? ", in WT override mode" : "");
12428 +}
12429 --- a/arch/arm/mm/proc-feroceon.S
12430 +++ b/arch/arm/mm/proc-feroceon.S
12431 @@ -44,11 +44,31 @@
12432 */
12433 #define CACHE_DLINESIZE 32
12434
12435 + .bss
12436 + .align 3
12437 +__cache_params_loc:
12438 + .space 8
12439 +
12440 .text
12441 +__cache_params:
12442 + .word __cache_params_loc
12443 +
12444 /*
12445 * cpu_feroceon_proc_init()
12446 */
12447 ENTRY(cpu_feroceon_proc_init)
12448 + mrc p15, 0, r0, c0, c0, 1 @ read cache type register
12449 + ldr r1, __cache_params
12450 + mov r2, #(16 << 5)
12451 + tst r0, #(1 << 16) @ get way
12452 + mov r0, r0, lsr #18 @ get cache size order
12453 + movne r3, #((4 - 1) << 30) @ 4-way
12454 + and r0, r0, #0xf
12455 + moveq r3, #0 @ 1-way
12456 + mov r2, r2, lsl r0 @ actual cache size
12457 + movne r2, r2, lsr #2 @ turned into # of sets
12458 + sub r2, r2, #(1 << 5)
12459 + stmia r1, {r2, r3}
12460 mov pc, lr
12461
12462 /*
12463 @@ -59,6 +79,13 @@
12464 mov ip, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
12465 msr cpsr_c, ip
12466 bl feroceon_flush_kern_cache_all
12467 +
12468 +#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
12469 + mov r0, #0
12470 + mcr p15, 1, r0, c15, c9, 0 @ clean L2
12471 + mcr p15, 0, r0, c7, c10, 4 @ drain WB
12472 +#endif
12473 +
12474 mrc p15, 0, r0, c1, c0, 0 @ ctrl register
12475 bic r0, r0, #0x1000 @ ...i............
12476 bic r0, r0, #0x000e @ ............wca.
12477 @@ -117,11 +144,19 @@
12478 */
12479 ENTRY(feroceon_flush_kern_cache_all)
12480 mov r2, #VM_EXEC
12481 - mov ip, #0
12482 +
12483 __flush_whole_cache:
12484 -1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate
12485 - bne 1b
12486 + ldr r1, __cache_params
12487 + ldmia r1, {r1, r3}
12488 +1: orr ip, r1, r3
12489 +2: mcr p15, 0, ip, c7, c14, 2 @ clean + invalidate D set/way
12490 + subs ip, ip, #(1 << 30) @ next way
12491 + bcs 2b
12492 + subs r1, r1, #(1 << 5) @ next set
12493 + bcs 1b
12494 +
12495 tst r2, #VM_EXEC
12496 + mov ip, #0
12497 mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache
12498 mcrne p15, 0, ip, c7, c10, 4 @ drain WB
12499 mov pc, lr
12500 @@ -138,7 +173,6 @@
12501 */
12502 .align 5
12503 ENTRY(feroceon_flush_user_cache_range)
12504 - mov ip, #0
12505 sub r3, r1, r0 @ calculate total size
12506 cmp r3, #CACHE_DLIMIT
12507 bgt __flush_whole_cache
12508 @@ -152,6 +186,7 @@
12509 cmp r0, r1
12510 blo 1b
12511 tst r2, #VM_EXEC
12512 + mov ip, #0
12513 mcrne p15, 0, ip, c7, c10, 4 @ drain WB
12514 mov pc, lr
12515
12516 @@ -209,6 +244,20 @@
12517 mcr p15, 0, r0, c7, c10, 4 @ drain WB
12518 mov pc, lr
12519
12520 + .align 5
12521 +ENTRY(feroceon_range_flush_kern_dcache_page)
12522 + mrs r2, cpsr
12523 + add r1, r0, #PAGE_SZ - CACHE_DLINESIZE @ top addr is inclusive
12524 + orr r3, r2, #PSR_I_BIT
12525 + msr cpsr_c, r3 @ disable interrupts
12526 + mcr p15, 5, r0, c15, c15, 0 @ D clean/inv range start
12527 + mcr p15, 5, r1, c15, c15, 1 @ D clean/inv range top
12528 + msr cpsr_c, r2 @ restore interrupts
12529 + mov r0, #0
12530 + mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
12531 + mcr p15, 0, r0, c7, c10, 4 @ drain WB
12532 + mov pc, lr
12533 +
12534 /*
12535 * dma_inv_range(start, end)
12536 *
12537 @@ -225,10 +274,10 @@
12538 .align 5
12539 ENTRY(feroceon_dma_inv_range)
12540 tst r0, #CACHE_DLINESIZE - 1
12541 + bic r0, r0, #CACHE_DLINESIZE - 1
12542 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
12543 tst r1, #CACHE_DLINESIZE - 1
12544 mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
12545 - bic r0, r0, #CACHE_DLINESIZE - 1
12546 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
12547 add r0, r0, #CACHE_DLINESIZE
12548 cmp r0, r1
12549 @@ -236,6 +285,22 @@
12550 mcr p15, 0, r0, c7, c10, 4 @ drain WB
12551 mov pc, lr
12552
12553 + .align 5
12554 +ENTRY(feroceon_range_dma_inv_range)
12555 + mrs r2, cpsr
12556 + tst r0, #CACHE_DLINESIZE - 1
12557 + mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
12558 + tst r1, #CACHE_DLINESIZE - 1
12559 + mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
12560 + cmp r1, r0
12561 + subne r1, r1, #1 @ top address is inclusive
12562 + orr r3, r2, #PSR_I_BIT
12563 + msr cpsr_c, r3 @ disable interrupts
12564 + mcr p15, 5, r0, c15, c14, 0 @ D inv range start
12565 + mcr p15, 5, r1, c15, c14, 1 @ D inv range top
12566 + msr cpsr_c, r2 @ restore interrupts
12567 + mov pc, lr
12568 +
12569 /*
12570 * dma_clean_range(start, end)
12571 *
12572 @@ -256,6 +321,19 @@
12573 mcr p15, 0, r0, c7, c10, 4 @ drain WB
12574 mov pc, lr
12575
12576 + .align 5
12577 +ENTRY(feroceon_range_dma_clean_range)
12578 + mrs r2, cpsr
12579 + cmp r1, r0
12580 + subne r1, r1, #1 @ top address is inclusive
12581 + orr r3, r2, #PSR_I_BIT
12582 + msr cpsr_c, r3 @ disable interrupts
12583 + mcr p15, 5, r0, c15, c13, 0 @ D clean range start
12584 + mcr p15, 5, r1, c15, c13, 1 @ D clean range top
12585 + msr cpsr_c, r2 @ restore interrupts
12586 + mcr p15, 0, r0, c7, c10, 4 @ drain WB
12587 + mov pc, lr
12588 +
12589 /*
12590 * dma_flush_range(start, end)
12591 *
12592 @@ -274,6 +352,19 @@
12593 mcr p15, 0, r0, c7, c10, 4 @ drain WB
12594 mov pc, lr
12595
12596 + .align 5
12597 +ENTRY(feroceon_range_dma_flush_range)
12598 + mrs r2, cpsr
12599 + cmp r1, r0
12600 + subne r1, r1, #1 @ top address is inclusive
12601 + orr r3, r2, #PSR_I_BIT
12602 + msr cpsr_c, r3 @ disable interrupts
12603 + mcr p15, 5, r0, c15, c15, 0 @ D clean/inv range start
12604 + mcr p15, 5, r1, c15, c15, 1 @ D clean/inv range top
12605 + msr cpsr_c, r2 @ restore interrupts
12606 + mcr p15, 0, r0, c7, c10, 4 @ drain WB
12607 + mov pc, lr
12608 +
12609 ENTRY(feroceon_cache_fns)
12610 .long feroceon_flush_kern_cache_all
12611 .long feroceon_flush_user_cache_all
12612 @@ -285,12 +376,33 @@
12613 .long feroceon_dma_clean_range
12614 .long feroceon_dma_flush_range
12615
12616 +ENTRY(feroceon_range_cache_fns)
12617 + .long feroceon_flush_kern_cache_all
12618 + .long feroceon_flush_user_cache_all
12619 + .long feroceon_flush_user_cache_range
12620 + .long feroceon_coherent_kern_range
12621 + .long feroceon_coherent_user_range
12622 + .long feroceon_range_flush_kern_dcache_page
12623 + .long feroceon_range_dma_inv_range
12624 + .long feroceon_range_dma_clean_range
12625 + .long feroceon_range_dma_flush_range
12626 +
12627 .align 5
12628 ENTRY(cpu_feroceon_dcache_clean_area)
12629 +#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
12630 + mov r2, r0
12631 + mov r3, r1
12632 +#endif
12633 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
12634 add r0, r0, #CACHE_DLINESIZE
12635 subs r1, r1, #CACHE_DLINESIZE
12636 bhi 1b
12637 +#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
12638 +1: mcr p15, 1, r2, c15, c9, 1 @ clean L2 entry
12639 + add r2, r2, #CACHE_DLINESIZE
12640 + subs r3, r3, #CACHE_DLINESIZE
12641 + bhi 1b
12642 +#endif
12643 mcr p15, 0, r0, c7, c10, 4 @ drain WB
12644 mov pc, lr
12645
12646 @@ -306,16 +418,25 @@
12647 .align 5
12648 ENTRY(cpu_feroceon_switch_mm)
12649 #ifdef CONFIG_MMU
12650 - mov ip, #0
12651 -@ && 'Clean & Invalidate whole DCache'
12652 -1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate
12653 - bne 1b
12654 - mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
12655 - mcr p15, 0, ip, c7, c10, 4 @ drain WB
12656 + /*
12657 + * Note: we wish to call __flush_whole_cache but we need to preserve
12658 + * lr to do so. The only way without touching main memory is to
12659 + * use r2 which is normally used to test the VM_EXEC flag, and
12660 + * compensate locally for the skipped ops if it is not set.
12661 + */
12662 + mov r2, lr @ abuse r2 to preserve lr
12663 + bl __flush_whole_cache
12664 + @ if r2 contains the VM_EXEC bit then the next 2 ops are done already
12665 + tst r2, #VM_EXEC
12666 + mcreq p15, 0, ip, c7, c5, 0 @ invalidate I cache
12667 + mcreq p15, 0, ip, c7, c10, 4 @ drain WB
12668 +
12669 mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
12670 mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs
12671 -#endif
12672 + mov pc, r2
12673 +#else
12674 mov pc, lr
12675 +#endif
12676
12677 /*
12678 * cpu_feroceon_set_pte_ext(ptep, pte, ext)
12679 @@ -345,6 +466,9 @@
12680 str r2, [r0] @ hardware version
12681 mov r0, r0
12682 mcr p15, 0, r0, c7, c10, 1 @ clean D entry
12683 +#if defined(CONFIG_CACHE_FEROCEON_L2) && !defined(CONFIG_L2_CACHE_WRITETHROUGH)
12684 + mcr p15, 1, r0, c15, c9, 1 @ clean L2 entry
12685 +#endif
12686 mcr p15, 0, r0, c7, c10, 4 @ drain WB
12687 #endif
12688 mov pc, lr
12689 @@ -414,6 +538,21 @@
12690 .asciz "Feroceon"
12691 .size cpu_feroceon_name, . - cpu_feroceon_name
12692
12693 + .type cpu_88fr531_name, #object
12694 +cpu_88fr531_name:
12695 + .asciz "Feroceon 88FR531-vd"
12696 + .size cpu_88fr531_name, . - cpu_88fr531_name
12697 +
12698 + .type cpu_88fr571_name, #object
12699 +cpu_88fr571_name:
12700 + .asciz "Feroceon 88FR571-vd"
12701 + .size cpu_88fr571_name, . - cpu_88fr571_name
12702 +
12703 + .type cpu_88fr131_name, #object
12704 +cpu_88fr131_name:
12705 + .asciz "Feroceon 88FR131"
12706 + .size cpu_88fr131_name, . - cpu_88fr131_name
12707 +
12708 .align
12709
12710 .section ".proc.info.init", #alloc, #execinstr
12711 @@ -421,15 +560,15 @@
12712 #ifdef CONFIG_CPU_FEROCEON_OLD_ID
12713 .type __feroceon_old_id_proc_info,#object
12714 __feroceon_old_id_proc_info:
12715 - .long 0x41069260
12716 - .long 0xfffffff0
12717 - .long PMD_TYPE_SECT | \
12718 + .long 0x41009260
12719 + .long 0xff00fff0
12720 + .long PMD_TYPE_SECT | \
12721 PMD_SECT_BUFFERABLE | \
12722 PMD_SECT_CACHEABLE | \
12723 PMD_BIT4 | \
12724 PMD_SECT_AP_WRITE | \
12725 PMD_SECT_AP_READ
12726 - .long PMD_TYPE_SECT | \
12727 + .long PMD_TYPE_SECT | \
12728 PMD_BIT4 | \
12729 PMD_SECT_AP_WRITE | \
12730 PMD_SECT_AP_READ
12731 @@ -445,17 +584,17 @@
12732 .size __feroceon_old_id_proc_info, . - __feroceon_old_id_proc_info
12733 #endif
12734
12735 - .type __feroceon_proc_info,#object
12736 -__feroceon_proc_info:
12737 + .type __88fr531_proc_info,#object
12738 +__88fr531_proc_info:
12739 .long 0x56055310
12740 .long 0xfffffff0
12741 - .long PMD_TYPE_SECT | \
12742 + .long PMD_TYPE_SECT | \
12743 PMD_SECT_BUFFERABLE | \
12744 PMD_SECT_CACHEABLE | \
12745 PMD_BIT4 | \
12746 PMD_SECT_AP_WRITE | \
12747 PMD_SECT_AP_READ
12748 - .long PMD_TYPE_SECT | \
12749 + .long PMD_TYPE_SECT | \
12750 PMD_BIT4 | \
12751 PMD_SECT_AP_WRITE | \
12752 PMD_SECT_AP_READ
12753 @@ -463,9 +602,59 @@
12754 .long cpu_arch_name
12755 .long cpu_elf_name
12756 .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
12757 - .long cpu_feroceon_name
12758 + .long cpu_88fr531_name
12759 .long feroceon_processor_functions
12760 .long v4wbi_tlb_fns
12761 .long feroceon_user_fns
12762 .long feroceon_cache_fns
12763 - .size __feroceon_proc_info, . - __feroceon_proc_info
12764 + .size __88fr531_proc_info, . - __88fr531_proc_info
12765 +
12766 + .type __88fr571_proc_info,#object
12767 +__88fr571_proc_info:
12768 + .long 0x56155710
12769 + .long 0xfffffff0
12770 + .long PMD_TYPE_SECT | \
12771 + PMD_SECT_BUFFERABLE | \
12772 + PMD_SECT_CACHEABLE | \
12773 + PMD_BIT4 | \
12774 + PMD_SECT_AP_WRITE | \
12775 + PMD_SECT_AP_READ
12776 + .long PMD_TYPE_SECT | \
12777 + PMD_BIT4 | \
12778 + PMD_SECT_AP_WRITE | \
12779 + PMD_SECT_AP_READ
12780 + b __feroceon_setup
12781 + .long cpu_arch_name
12782 + .long cpu_elf_name
12783 + .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
12784 + .long cpu_88fr571_name
12785 + .long feroceon_processor_functions
12786 + .long v4wbi_tlb_fns
12787 + .long feroceon_user_fns
12788 + .long feroceon_range_cache_fns
12789 + .size __88fr571_proc_info, . - __88fr571_proc_info
12790 +
12791 + .type __88fr131_proc_info,#object
12792 +__88fr131_proc_info:
12793 + .long 0x56251310
12794 + .long 0xfffffff0
12795 + .long PMD_TYPE_SECT | \
12796 + PMD_SECT_BUFFERABLE | \
12797 + PMD_SECT_CACHEABLE | \
12798 + PMD_BIT4 | \
12799 + PMD_SECT_AP_WRITE | \
12800 + PMD_SECT_AP_READ
12801 + .long PMD_TYPE_SECT | \
12802 + PMD_BIT4 | \
12803 + PMD_SECT_AP_WRITE | \
12804 + PMD_SECT_AP_READ
12805 + b __feroceon_setup
12806 + .long cpu_arch_name
12807 + .long cpu_elf_name
12808 + .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
12809 + .long cpu_88fr131_name
12810 + .long feroceon_processor_functions
12811 + .long v4wbi_tlb_fns
12812 + .long feroceon_user_fns
12813 + .long feroceon_range_cache_fns
12814 + .size __88fr131_proc_info, . - __88fr131_proc_info
12815 --- a/arch/arm/plat-orion/irq.c
12816 +++ b/arch/arm/plat-orion/irq.c
12817 @@ -36,8 +36,8 @@
12818
12819 static struct irq_chip orion_irq_chip = {
12820 .name = "orion_irq",
12821 - .ack = orion_irq_mask,
12822 .mask = orion_irq_mask,
12823 + .mask_ack = orion_irq_mask,
12824 .unmask = orion_irq_unmask,
12825 };
12826
12827 @@ -59,6 +59,7 @@
12828 set_irq_chip(irq, &orion_irq_chip);
12829 set_irq_chip_data(irq, maskaddr);
12830 set_irq_handler(irq, handle_level_irq);
12831 + irq_desc[irq].status |= IRQ_LEVEL;
12832 set_irq_flags(irq, IRQF_VALID);
12833 }
12834 }
12835 --- a/arch/arm/plat-orion/pcie.c
12836 +++ b/arch/arm/plat-orion/pcie.c
12837 @@ -39,6 +39,7 @@
12838 #define PCIE_CONF_DATA_OFF 0x18fc
12839 #define PCIE_MASK_OFF 0x1910
12840 #define PCIE_CTRL_OFF 0x1a00
12841 +#define PCIE_CTRL_X1_MODE 0x0001
12842 #define PCIE_STAT_OFF 0x1a04
12843 #define PCIE_STAT_DEV_OFFS 20
12844 #define PCIE_STAT_DEV_MASK 0x1f
12845 @@ -62,6 +63,11 @@
12846 return !(readl(base + PCIE_STAT_OFF) & PCIE_STAT_LINK_DOWN);
12847 }
12848
12849 +int __init orion_pcie_x4_mode(void __iomem *base)
12850 +{
12851 + return !(readl(base + PCIE_CTRL_OFF) & PCIE_CTRL_X1_MODE);
12852 +}
12853 +
12854 int orion_pcie_get_local_bus_nr(void __iomem *base)
12855 {
12856 u32 stat = readl(base + PCIE_STAT_OFF);
12857 --- a/arch/arm/plat-orion/time.c
12858 +++ b/arch/arm/plat-orion/time.c
12859 @@ -74,7 +74,7 @@
12860 /*
12861 * Clear and enable clockevent timer interrupt.
12862 */
12863 - writel(~BRIDGE_INT_TIMER1, BRIDGE_CAUSE);
12864 + writel(BRIDGE_INT_TIMER1_CLR, BRIDGE_CAUSE);
12865
12866 u = readl(BRIDGE_MASK);
12867 u |= BRIDGE_INT_TIMER1;
12868 @@ -138,7 +138,7 @@
12869 /*
12870 * ACK pending timer interrupt.
12871 */
12872 - writel(~BRIDGE_INT_TIMER1, BRIDGE_CAUSE);
12873 + writel(BRIDGE_INT_TIMER1_CLR, BRIDGE_CAUSE);
12874
12875 }
12876 local_irq_restore(flags);
12877 @@ -159,7 +159,7 @@
12878 /*
12879 * ACK timer interrupt and call event handler.
12880 */
12881 - writel(~BRIDGE_INT_TIMER1, BRIDGE_CAUSE);
12882 + writel(BRIDGE_INT_TIMER1_CLR, BRIDGE_CAUSE);
12883 orion_clkevt.event_handler(&orion_clkevt);
12884
12885 return IRQ_HANDLED;
12886 --- a/drivers/net/mv643xx_eth.c
12887 +++ b/drivers/net/mv643xx_eth.c
12888 @@ -34,406 +34,145 @@
12889 * along with this program; if not, write to the Free Software
12890 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
12891 */
12892 +
12893 #include <linux/init.h>
12894 #include <linux/dma-mapping.h>
12895 #include <linux/in.h>
12896 -#include <linux/ip.h>
12897 #include <linux/tcp.h>
12898 #include <linux/udp.h>
12899 #include <linux/etherdevice.h>
12900 -
12901 -#include <linux/bitops.h>
12902 #include <linux/delay.h>
12903 #include <linux/ethtool.h>
12904 #include <linux/platform_device.h>
12905 -
12906 #include <linux/module.h>
12907 #include <linux/kernel.h>
12908 #include <linux/spinlock.h>
12909 #include <linux/workqueue.h>
12910 #include <linux/mii.h>
12911 -
12912 #include <linux/mv643xx_eth.h>
12913 -
12914 #include <asm/io.h>
12915 #include <asm/types.h>
12916 -#include <asm/pgtable.h>
12917 #include <asm/system.h>
12918 -#include <asm/delay.h>
12919 -#include <asm/dma-mapping.h>
12920
12921 -#define MV643XX_CHECKSUM_OFFLOAD_TX
12922 -#define MV643XX_NAPI
12923 -#define MV643XX_TX_FAST_REFILL
12924 -#undef MV643XX_COAL
12925 -
12926 -#define MV643XX_TX_COAL 100
12927 -#ifdef MV643XX_COAL
12928 -#define MV643XX_RX_COAL 100
12929 -#endif
12930 +static char mv643xx_eth_driver_name[] = "mv643xx_eth";
12931 +static char mv643xx_eth_driver_version[] = "1.1";
12932
12933 -#ifdef MV643XX_CHECKSUM_OFFLOAD_TX
12934 +#define MV643XX_ETH_CHECKSUM_OFFLOAD_TX
12935 +#define MV643XX_ETH_NAPI
12936 +#define MV643XX_ETH_TX_FAST_REFILL
12937 +
12938 +#ifdef MV643XX_ETH_CHECKSUM_OFFLOAD_TX
12939 #define MAX_DESCS_PER_SKB (MAX_SKB_FRAGS + 1)
12940 #else
12941 #define MAX_DESCS_PER_SKB 1
12942 #endif
12943
12944 -#define ETH_VLAN_HLEN 4
12945 -#define ETH_FCS_LEN 4
12946 -#define ETH_HW_IP_ALIGN 2 /* hw aligns IP header */
12947 -#define ETH_WRAPPER_LEN (ETH_HW_IP_ALIGN + ETH_HLEN + \
12948 - ETH_VLAN_HLEN + ETH_FCS_LEN)
12949 -#define ETH_RX_SKB_SIZE (dev->mtu + ETH_WRAPPER_LEN + \
12950 - dma_get_cache_alignment())
12951 -
12952 /*
12953 * Registers shared between all ports.
12954 */
12955 -#define PHY_ADDR_REG 0x0000
12956 -#define SMI_REG 0x0004
12957 -#define WINDOW_BASE(i) (0x0200 + ((i) << 3))
12958 -#define WINDOW_SIZE(i) (0x0204 + ((i) << 3))
12959 -#define WINDOW_REMAP_HIGH(i) (0x0280 + ((i) << 2))
12960 -#define WINDOW_BAR_ENABLE 0x0290
12961 -#define WINDOW_PROTECT(i) (0x0294 + ((i) << 4))
12962 +#define PHY_ADDR 0x0000
12963 +#define SMI_REG 0x0004
12964 +#define WINDOW_BASE(w) (0x0200 + ((w) << 3))
12965 +#define WINDOW_SIZE(w) (0x0204 + ((w) << 3))
12966 +#define WINDOW_REMAP_HIGH(w) (0x0280 + ((w) << 2))
12967 +#define WINDOW_BAR_ENABLE 0x0290
12968 +#define WINDOW_PROTECT(w) (0x0294 + ((w) << 4))
12969
12970 /*
12971 * Per-port registers.
12972 */
12973 -#define PORT_CONFIG_REG(p) (0x0400 + ((p) << 10))
12974 -#define PORT_CONFIG_EXTEND_REG(p) (0x0404 + ((p) << 10))
12975 -#define MAC_ADDR_LOW(p) (0x0414 + ((p) << 10))
12976 -#define MAC_ADDR_HIGH(p) (0x0418 + ((p) << 10))
12977 -#define SDMA_CONFIG_REG(p) (0x041c + ((p) << 10))
12978 -#define PORT_SERIAL_CONTROL_REG(p) (0x043c + ((p) << 10))
12979 -#define PORT_STATUS_REG(p) (0x0444 + ((p) << 10))
12980 -#define TRANSMIT_QUEUE_COMMAND_REG(p) (0x0448 + ((p) << 10))
12981 -#define MAXIMUM_TRANSMIT_UNIT(p) (0x0458 + ((p) << 10))
12982 -#define INTERRUPT_CAUSE_REG(p) (0x0460 + ((p) << 10))
12983 -#define INTERRUPT_CAUSE_EXTEND_REG(p) (0x0464 + ((p) << 10))
12984 -#define INTERRUPT_MASK_REG(p) (0x0468 + ((p) << 10))
12985 -#define INTERRUPT_EXTEND_MASK_REG(p) (0x046c + ((p) << 10))
12986 -#define TX_FIFO_URGENT_THRESHOLD_REG(p) (0x0474 + ((p) << 10))
12987 -#define RX_CURRENT_QUEUE_DESC_PTR_0(p) (0x060c + ((p) << 10))
12988 -#define RECEIVE_QUEUE_COMMAND_REG(p) (0x0680 + ((p) << 10))
12989 -#define TX_CURRENT_QUEUE_DESC_PTR_0(p) (0x06c0 + ((p) << 10))
12990 -#define MIB_COUNTERS_BASE(p) (0x1000 + ((p) << 7))
12991 -#define DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(p) (0x1400 + ((p) << 10))
12992 -#define DA_FILTER_OTHER_MULTICAST_TABLE_BASE(p) (0x1500 + ((p) << 10))
12993 -#define DA_FILTER_UNICAST_TABLE_BASE(p) (0x1600 + ((p) << 10))
12994 -
12995 -/* These macros describe Ethernet Port configuration reg (Px_cR) bits */
12996 -#define UNICAST_NORMAL_MODE (0 << 0)
12997 -#define UNICAST_PROMISCUOUS_MODE (1 << 0)
12998 -#define DEFAULT_RX_QUEUE(queue) ((queue) << 1)
12999 -#define DEFAULT_RX_ARP_QUEUE(queue) ((queue) << 4)
13000 -#define RECEIVE_BC_IF_NOT_IP_OR_ARP (0 << 7)
13001 -#define REJECT_BC_IF_NOT_IP_OR_ARP (1 << 7)
13002 -#define RECEIVE_BC_IF_IP (0 << 8)
13003 -#define REJECT_BC_IF_IP (1 << 8)
13004 -#define RECEIVE_BC_IF_ARP (0 << 9)
13005 -#define REJECT_BC_IF_ARP (1 << 9)
13006 -#define TX_AM_NO_UPDATE_ERROR_SUMMARY (1 << 12)
13007 -#define CAPTURE_TCP_FRAMES_DIS (0 << 14)
13008 -#define CAPTURE_TCP_FRAMES_EN (1 << 14)
13009 -#define CAPTURE_UDP_FRAMES_DIS (0 << 15)
13010 -#define CAPTURE_UDP_FRAMES_EN (1 << 15)
13011 -#define DEFAULT_RX_TCP_QUEUE(queue) ((queue) << 16)
13012 -#define DEFAULT_RX_UDP_QUEUE(queue) ((queue) << 19)
13013 -#define DEFAULT_RX_BPDU_QUEUE(queue) ((queue) << 22)
13014 -
13015 -#define PORT_CONFIG_DEFAULT_VALUE \
13016 - UNICAST_NORMAL_MODE | \
13017 - DEFAULT_RX_QUEUE(0) | \
13018 - DEFAULT_RX_ARP_QUEUE(0) | \
13019 - RECEIVE_BC_IF_NOT_IP_OR_ARP | \
13020 - RECEIVE_BC_IF_IP | \
13021 - RECEIVE_BC_IF_ARP | \
13022 - CAPTURE_TCP_FRAMES_DIS | \
13023 - CAPTURE_UDP_FRAMES_DIS | \
13024 - DEFAULT_RX_TCP_QUEUE(0) | \
13025 - DEFAULT_RX_UDP_QUEUE(0) | \
13026 - DEFAULT_RX_BPDU_QUEUE(0)
13027 -
13028 -/* These macros describe Ethernet Port configuration extend reg (Px_cXR) bits*/
13029 -#define CLASSIFY_EN (1 << 0)
13030 -#define SPAN_BPDU_PACKETS_AS_NORMAL (0 << 1)
13031 -#define SPAN_BPDU_PACKETS_TO_RX_QUEUE_7 (1 << 1)
13032 -#define PARTITION_DISABLE (0 << 2)
13033 -#define PARTITION_ENABLE (1 << 2)
13034 -
13035 -#define PORT_CONFIG_EXTEND_DEFAULT_VALUE \
13036 - SPAN_BPDU_PACKETS_AS_NORMAL | \
13037 - PARTITION_DISABLE
13038 -
13039 -/* These macros describe Ethernet Port Sdma configuration reg (SDCR) bits */
13040 -#define RIFB (1 << 0)
13041 -#define RX_BURST_SIZE_1_64BIT (0 << 1)
13042 -#define RX_BURST_SIZE_2_64BIT (1 << 1)
13043 +#define PORT_CONFIG(p) (0x0400 + ((p) << 10))
13044 +#define UNICAST_PROMISCUOUS_MODE 0x00000001
13045 +#define PORT_CONFIG_EXT(p) (0x0404 + ((p) << 10))
13046 +#define MAC_ADDR_LOW(p) (0x0414 + ((p) << 10))
13047 +#define MAC_ADDR_HIGH(p) (0x0418 + ((p) << 10))
13048 +#define SDMA_CONFIG(p) (0x041c + ((p) << 10))
13049 +#define PORT_SERIAL_CONTROL(p) (0x043c + ((p) << 10))
13050 +#define PORT_STATUS(p) (0x0444 + ((p) << 10))
13051 +#define TX_FIFO_EMPTY 0x00000400
13052 +#define TXQ_COMMAND(p) (0x0448 + ((p) << 10))
13053 +#define TXQ_FIX_PRIO_CONF(p) (0x044c + ((p) << 10))
13054 +#define TX_BW_RATE(p) (0x0450 + ((p) << 10))
13055 +#define TX_BW_MTU(p) (0x0458 + ((p) << 10))
13056 +#define TX_BW_BURST(p) (0x045c + ((p) << 10))
13057 +#define INT_CAUSE(p) (0x0460 + ((p) << 10))
13058 +#define INT_TX_END 0x07f80000
13059 +#define INT_RX 0x0007fbfc
13060 +#define INT_EXT 0x00000002
13061 +#define INT_CAUSE_EXT(p) (0x0464 + ((p) << 10))
13062 +#define INT_EXT_LINK 0x00100000
13063 +#define INT_EXT_PHY 0x00010000
13064 +#define INT_EXT_TX_ERROR_0 0x00000100
13065 +#define INT_EXT_TX_0 0x00000001
13066 +#define INT_EXT_TX 0x0000ffff
13067 +#define INT_MASK(p) (0x0468 + ((p) << 10))
13068 +#define INT_MASK_EXT(p) (0x046c + ((p) << 10))
13069 +#define TX_FIFO_URGENT_THRESHOLD(p) (0x0474 + ((p) << 10))
13070 +#define TXQ_FIX_PRIO_CONF_MOVED(p) (0x04dc + ((p) << 10))
13071 +#define TX_BW_RATE_MOVED(p) (0x04e0 + ((p) << 10))
13072 +#define TX_BW_MTU_MOVED(p) (0x04e8 + ((p) << 10))
13073 +#define TX_BW_BURST_MOVED(p) (0x04ec + ((p) << 10))
13074 +#define RXQ_CURRENT_DESC_PTR(p, q) (0x060c + ((p) << 10) + ((q) << 4))
13075 +#define RXQ_COMMAND(p) (0x0680 + ((p) << 10))
13076 +#define TXQ_CURRENT_DESC_PTR(p, q) (0x06c0 + ((p) << 10) + ((q) << 2))
13077 +#define TXQ_BW_TOKENS(p, q) (0x0700 + ((p) << 10) + ((q) << 4))
13078 +#define TXQ_BW_CONF(p, q) (0x0704 + ((p) << 10) + ((q) << 4))
13079 +#define TXQ_BW_WRR_CONF(p, q) (0x0708 + ((p) << 10) + ((q) << 4))
13080 +#define MIB_COUNTERS(p) (0x1000 + ((p) << 7))
13081 +#define SPECIAL_MCAST_TABLE(p) (0x1400 + ((p) << 10))
13082 +#define OTHER_MCAST_TABLE(p) (0x1500 + ((p) << 10))
13083 +#define UNICAST_TABLE(p) (0x1600 + ((p) << 10))
13084 +
13085 +
13086 +/*
13087 + * SDMA configuration register.
13088 + */
13089 #define RX_BURST_SIZE_4_64BIT (2 << 1)
13090 -#define RX_BURST_SIZE_8_64BIT (3 << 1)
13091 -#define RX_BURST_SIZE_16_64BIT (4 << 1)
13092 #define BLM_RX_NO_SWAP (1 << 4)
13093 -#define BLM_RX_BYTE_SWAP (0 << 4)
13094 #define BLM_TX_NO_SWAP (1 << 5)
13095 -#define BLM_TX_BYTE_SWAP (0 << 5)
13096 -#define DESCRIPTORS_BYTE_SWAP (1 << 6)
13097 -#define DESCRIPTORS_NO_SWAP (0 << 6)
13098 -#define IPG_INT_RX(value) (((value) & 0x3fff) << 8)
13099 -#define TX_BURST_SIZE_1_64BIT (0 << 22)
13100 -#define TX_BURST_SIZE_2_64BIT (1 << 22)
13101 #define TX_BURST_SIZE_4_64BIT (2 << 22)
13102 -#define TX_BURST_SIZE_8_64BIT (3 << 22)
13103 -#define TX_BURST_SIZE_16_64BIT (4 << 22)
13104
13105 #if defined(__BIG_ENDIAN)
13106 #define PORT_SDMA_CONFIG_DEFAULT_VALUE \
13107 RX_BURST_SIZE_4_64BIT | \
13108 - IPG_INT_RX(0) | \
13109 TX_BURST_SIZE_4_64BIT
13110 #elif defined(__LITTLE_ENDIAN)
13111 #define PORT_SDMA_CONFIG_DEFAULT_VALUE \
13112 RX_BURST_SIZE_4_64BIT | \
13113 BLM_RX_NO_SWAP | \
13114 BLM_TX_NO_SWAP | \
13115 - IPG_INT_RX(0) | \
13116 TX_BURST_SIZE_4_64BIT
13117 #else
13118 #error One of __BIG_ENDIAN or __LITTLE_ENDIAN must be defined
13119 #endif
13120
13121 -/* These macros describe Ethernet Port serial control reg (PSCR) bits */
13122 -#define SERIAL_PORT_DISABLE (0 << 0)
13123 -#define SERIAL_PORT_ENABLE (1 << 0)
13124 -#define DO_NOT_FORCE_LINK_PASS (0 << 1)
13125 -#define FORCE_LINK_PASS (1 << 1)
13126 -#define ENABLE_AUTO_NEG_FOR_DUPLX (0 << 2)
13127 -#define DISABLE_AUTO_NEG_FOR_DUPLX (1 << 2)
13128 -#define ENABLE_AUTO_NEG_FOR_FLOW_CTRL (0 << 3)
13129 -#define DISABLE_AUTO_NEG_FOR_FLOW_CTRL (1 << 3)
13130 -#define ADV_NO_FLOW_CTRL (0 << 4)
13131 -#define ADV_SYMMETRIC_FLOW_CTRL (1 << 4)
13132 -#define FORCE_FC_MODE_NO_PAUSE_DIS_TX (0 << 5)
13133 -#define FORCE_FC_MODE_TX_PAUSE_DIS (1 << 5)
13134 -#define FORCE_BP_MODE_NO_JAM (0 << 7)
13135 -#define FORCE_BP_MODE_JAM_TX (1 << 7)
13136 -#define FORCE_BP_MODE_JAM_TX_ON_RX_ERR (2 << 7)
13137 -#define SERIAL_PORT_CONTROL_RESERVED (1 << 9)
13138 -#define FORCE_LINK_FAIL (0 << 10)
13139 -#define DO_NOT_FORCE_LINK_FAIL (1 << 10)
13140 -#define RETRANSMIT_16_ATTEMPTS (0 << 11)
13141 -#define RETRANSMIT_FOREVER (1 << 11)
13142 -#define ENABLE_AUTO_NEG_SPEED_GMII (0 << 13)
13143 -#define DISABLE_AUTO_NEG_SPEED_GMII (1 << 13)
13144 -#define DTE_ADV_0 (0 << 14)
13145 -#define DTE_ADV_1 (1 << 14)
13146 -#define DISABLE_AUTO_NEG_BYPASS (0 << 15)
13147 -#define ENABLE_AUTO_NEG_BYPASS (1 << 15)
13148 -#define AUTO_NEG_NO_CHANGE (0 << 16)
13149 -#define RESTART_AUTO_NEG (1 << 16)
13150 -#define MAX_RX_PACKET_1518BYTE (0 << 17)
13151 +
13152 +/*
13153 + * Port serial control register.
13154 + */
13155 +#define SET_MII_SPEED_TO_100 (1 << 24)
13156 +#define SET_GMII_SPEED_TO_1000 (1 << 23)
13157 +#define SET_FULL_DUPLEX_MODE (1 << 21)
13158 #define MAX_RX_PACKET_1522BYTE (1 << 17)
13159 -#define MAX_RX_PACKET_1552BYTE (2 << 17)
13160 -#define MAX_RX_PACKET_9022BYTE (3 << 17)
13161 -#define MAX_RX_PACKET_9192BYTE (4 << 17)
13162 #define MAX_RX_PACKET_9700BYTE (5 << 17)
13163 #define MAX_RX_PACKET_MASK (7 << 17)
13164 -#define CLR_EXT_LOOPBACK (0 << 20)
13165 -#define SET_EXT_LOOPBACK (1 << 20)
13166 -#define SET_HALF_DUPLEX_MODE (0 << 21)
13167 -#define SET_FULL_DUPLEX_MODE (1 << 21)
13168 -#define DISABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX (0 << 22)
13169 -#define ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX (1 << 22)
13170 -#define SET_GMII_SPEED_TO_10_100 (0 << 23)
13171 -#define SET_GMII_SPEED_TO_1000 (1 << 23)
13172 -#define SET_MII_SPEED_TO_10 (0 << 24)
13173 -#define SET_MII_SPEED_TO_100 (1 << 24)
13174 +#define DISABLE_AUTO_NEG_SPEED_GMII (1 << 13)
13175 +#define DO_NOT_FORCE_LINK_FAIL (1 << 10)
13176 +#define SERIAL_PORT_CONTROL_RESERVED (1 << 9)
13177 +#define DISABLE_AUTO_NEG_FOR_FLOW_CTRL (1 << 3)
13178 +#define DISABLE_AUTO_NEG_FOR_DUPLEX (1 << 2)
13179 +#define FORCE_LINK_PASS (1 << 1)
13180 +#define SERIAL_PORT_ENABLE (1 << 0)
13181 +
13182 +#define DEFAULT_RX_QUEUE_SIZE 400
13183 +#define DEFAULT_TX_QUEUE_SIZE 800
13184
13185 -#define PORT_SERIAL_CONTROL_DEFAULT_VALUE \
13186 - DO_NOT_FORCE_LINK_PASS | \
13187 - ENABLE_AUTO_NEG_FOR_DUPLX | \
13188 - DISABLE_AUTO_NEG_FOR_FLOW_CTRL | \
13189 - ADV_SYMMETRIC_FLOW_CTRL | \
13190 - FORCE_FC_MODE_NO_PAUSE_DIS_TX | \
13191 - FORCE_BP_MODE_NO_JAM | \
13192 - (1 << 9) /* reserved */ | \
13193 - DO_NOT_FORCE_LINK_FAIL | \
13194 - RETRANSMIT_16_ATTEMPTS | \
13195 - ENABLE_AUTO_NEG_SPEED_GMII | \
13196 - DTE_ADV_0 | \
13197 - DISABLE_AUTO_NEG_BYPASS | \
13198 - AUTO_NEG_NO_CHANGE | \
13199 - MAX_RX_PACKET_9700BYTE | \
13200 - CLR_EXT_LOOPBACK | \
13201 - SET_FULL_DUPLEX_MODE | \
13202 - ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX
13203 -
13204 -/* These macros describe Ethernet Serial Status reg (PSR) bits */
13205 -#define PORT_STATUS_MODE_10_BIT (1 << 0)
13206 -#define PORT_STATUS_LINK_UP (1 << 1)
13207 -#define PORT_STATUS_FULL_DUPLEX (1 << 2)
13208 -#define PORT_STATUS_FLOW_CONTROL (1 << 3)
13209 -#define PORT_STATUS_GMII_1000 (1 << 4)
13210 -#define PORT_STATUS_MII_100 (1 << 5)
13211 -/* PSR bit 6 is undocumented */
13212 -#define PORT_STATUS_TX_IN_PROGRESS (1 << 7)
13213 -#define PORT_STATUS_AUTONEG_BYPASSED (1 << 8)
13214 -#define PORT_STATUS_PARTITION (1 << 9)
13215 -#define PORT_STATUS_TX_FIFO_EMPTY (1 << 10)
13216 -/* PSR bits 11-31 are reserved */
13217 -
13218 -#define PORT_DEFAULT_TRANSMIT_QUEUE_SIZE 800
13219 -#define PORT_DEFAULT_RECEIVE_QUEUE_SIZE 400
13220 -
13221 -#define DESC_SIZE 64
13222 -
13223 -#define ETH_RX_QUEUES_ENABLED (1 << 0) /* use only Q0 for receive */
13224 -#define ETH_TX_QUEUES_ENABLED (1 << 0) /* use only Q0 for transmit */
13225 -
13226 -#define ETH_INT_CAUSE_RX_DONE (ETH_RX_QUEUES_ENABLED << 2)
13227 -#define ETH_INT_CAUSE_RX_ERROR (ETH_RX_QUEUES_ENABLED << 9)
13228 -#define ETH_INT_CAUSE_RX (ETH_INT_CAUSE_RX_DONE | ETH_INT_CAUSE_RX_ERROR)
13229 -#define ETH_INT_CAUSE_EXT 0x00000002
13230 -#define ETH_INT_UNMASK_ALL (ETH_INT_CAUSE_RX | ETH_INT_CAUSE_EXT)
13231 -
13232 -#define ETH_INT_CAUSE_TX_DONE (ETH_TX_QUEUES_ENABLED << 0)
13233 -#define ETH_INT_CAUSE_TX_ERROR (ETH_TX_QUEUES_ENABLED << 8)
13234 -#define ETH_INT_CAUSE_TX (ETH_INT_CAUSE_TX_DONE | ETH_INT_CAUSE_TX_ERROR)
13235 -#define ETH_INT_CAUSE_PHY 0x00010000
13236 -#define ETH_INT_CAUSE_STATE 0x00100000
13237 -#define ETH_INT_UNMASK_ALL_EXT (ETH_INT_CAUSE_TX | ETH_INT_CAUSE_PHY | \
13238 - ETH_INT_CAUSE_STATE)
13239 -
13240 -#define ETH_INT_MASK_ALL 0x00000000
13241 -#define ETH_INT_MASK_ALL_EXT 0x00000000
13242 -
13243 -#define PHY_WAIT_ITERATIONS 1000 /* 1000 iterations * 10uS = 10mS max */
13244 -#define PHY_WAIT_MICRO_SECONDS 10
13245 -
13246 -/* Buffer offset from buffer pointer */
13247 -#define RX_BUF_OFFSET 0x2
13248 -
13249 -/* Gigabit Ethernet Unit Global Registers */
13250 -
13251 -/* MIB Counters register definitions */
13252 -#define ETH_MIB_GOOD_OCTETS_RECEIVED_LOW 0x0
13253 -#define ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH 0x4
13254 -#define ETH_MIB_BAD_OCTETS_RECEIVED 0x8
13255 -#define ETH_MIB_INTERNAL_MAC_TRANSMIT_ERR 0xc
13256 -#define ETH_MIB_GOOD_FRAMES_RECEIVED 0x10
13257 -#define ETH_MIB_BAD_FRAMES_RECEIVED 0x14
13258 -#define ETH_MIB_BROADCAST_FRAMES_RECEIVED 0x18
13259 -#define ETH_MIB_MULTICAST_FRAMES_RECEIVED 0x1c
13260 -#define ETH_MIB_FRAMES_64_OCTETS 0x20
13261 -#define ETH_MIB_FRAMES_65_TO_127_OCTETS 0x24
13262 -#define ETH_MIB_FRAMES_128_TO_255_OCTETS 0x28
13263 -#define ETH_MIB_FRAMES_256_TO_511_OCTETS 0x2c
13264 -#define ETH_MIB_FRAMES_512_TO_1023_OCTETS 0x30
13265 -#define ETH_MIB_FRAMES_1024_TO_MAX_OCTETS 0x34
13266 -#define ETH_MIB_GOOD_OCTETS_SENT_LOW 0x38
13267 -#define ETH_MIB_GOOD_OCTETS_SENT_HIGH 0x3c
13268 -#define ETH_MIB_GOOD_FRAMES_SENT 0x40
13269 -#define ETH_MIB_EXCESSIVE_COLLISION 0x44
13270 -#define ETH_MIB_MULTICAST_FRAMES_SENT 0x48
13271 -#define ETH_MIB_BROADCAST_FRAMES_SENT 0x4c
13272 -#define ETH_MIB_UNREC_MAC_CONTROL_RECEIVED 0x50
13273 -#define ETH_MIB_FC_SENT 0x54
13274 -#define ETH_MIB_GOOD_FC_RECEIVED 0x58
13275 -#define ETH_MIB_BAD_FC_RECEIVED 0x5c
13276 -#define ETH_MIB_UNDERSIZE_RECEIVED 0x60
13277 -#define ETH_MIB_FRAGMENTS_RECEIVED 0x64
13278 -#define ETH_MIB_OVERSIZE_RECEIVED 0x68
13279 -#define ETH_MIB_JABBER_RECEIVED 0x6c
13280 -#define ETH_MIB_MAC_RECEIVE_ERROR 0x70
13281 -#define ETH_MIB_BAD_CRC_EVENT 0x74
13282 -#define ETH_MIB_COLLISION 0x78
13283 -#define ETH_MIB_LATE_COLLISION 0x7c
13284 -
13285 -/* Port serial status reg (PSR) */
13286 -#define ETH_INTERFACE_PCM 0x00000001
13287 -#define ETH_LINK_IS_UP 0x00000002
13288 -#define ETH_PORT_AT_FULL_DUPLEX 0x00000004
13289 -#define ETH_RX_FLOW_CTRL_ENABLED 0x00000008
13290 -#define ETH_GMII_SPEED_1000 0x00000010
13291 -#define ETH_MII_SPEED_100 0x00000020
13292 -#define ETH_TX_IN_PROGRESS 0x00000080
13293 -#define ETH_BYPASS_ACTIVE 0x00000100
13294 -#define ETH_PORT_AT_PARTITION_STATE 0x00000200
13295 -#define ETH_PORT_TX_FIFO_EMPTY 0x00000400
13296 -
13297 -/* SMI reg */
13298 -#define ETH_SMI_BUSY 0x10000000 /* 0 - Write, 1 - Read */
13299 -#define ETH_SMI_READ_VALID 0x08000000 /* 0 - Write, 1 - Read */
13300 -#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read */
13301 -#define ETH_SMI_OPCODE_READ 0x04000000 /* Operation is in progress */
13302 -
13303 -/* Interrupt Cause Register Bit Definitions */
13304 -
13305 -/* SDMA command status fields macros */
13306 -
13307 -/* Tx & Rx descriptors status */
13308 -#define ETH_ERROR_SUMMARY 0x00000001
13309 -
13310 -/* Tx & Rx descriptors command */
13311 -#define ETH_BUFFER_OWNED_BY_DMA 0x80000000
13312 -
13313 -/* Tx descriptors status */
13314 -#define ETH_LC_ERROR 0
13315 -#define ETH_UR_ERROR 0x00000002
13316 -#define ETH_RL_ERROR 0x00000004
13317 -#define ETH_LLC_SNAP_FORMAT 0x00000200
13318 -
13319 -/* Rx descriptors status */
13320 -#define ETH_OVERRUN_ERROR 0x00000002
13321 -#define ETH_MAX_FRAME_LENGTH_ERROR 0x00000004
13322 -#define ETH_RESOURCE_ERROR 0x00000006
13323 -#define ETH_VLAN_TAGGED 0x00080000
13324 -#define ETH_BPDU_FRAME 0x00100000
13325 -#define ETH_UDP_FRAME_OVER_IP_V_4 0x00200000
13326 -#define ETH_OTHER_FRAME_TYPE 0x00400000
13327 -#define ETH_LAYER_2_IS_ETH_V_2 0x00800000
13328 -#define ETH_FRAME_TYPE_IP_V_4 0x01000000
13329 -#define ETH_FRAME_HEADER_OK 0x02000000
13330 -#define ETH_RX_LAST_DESC 0x04000000
13331 -#define ETH_RX_FIRST_DESC 0x08000000
13332 -#define ETH_UNKNOWN_DESTINATION_ADDR 0x10000000
13333 -#define ETH_RX_ENABLE_INTERRUPT 0x20000000
13334 -#define ETH_LAYER_4_CHECKSUM_OK 0x40000000
13335 -
13336 -/* Rx descriptors byte count */
13337 -#define ETH_FRAME_FRAGMENTED 0x00000004
13338 -
13339 -/* Tx descriptors command */
13340 -#define ETH_LAYER_4_CHECKSUM_FIRST_DESC 0x00000400
13341 -#define ETH_FRAME_SET_TO_VLAN 0x00008000
13342 -#define ETH_UDP_FRAME 0x00010000
13343 -#define ETH_GEN_TCP_UDP_CHECKSUM 0x00020000
13344 -#define ETH_GEN_IP_V_4_CHECKSUM 0x00040000
13345 -#define ETH_ZERO_PADDING 0x00080000
13346 -#define ETH_TX_LAST_DESC 0x00100000
13347 -#define ETH_TX_FIRST_DESC 0x00200000
13348 -#define ETH_GEN_CRC 0x00400000
13349 -#define ETH_TX_ENABLE_INTERRUPT 0x00800000
13350 -#define ETH_AUTO_MODE 0x40000000
13351 -
13352 -#define ETH_TX_IHL_SHIFT 11
13353 -
13354 -/* typedefs */
13355 -
13356 -typedef enum _eth_func_ret_status {
13357 - ETH_OK, /* Returned as expected. */
13358 - ETH_ERROR, /* Fundamental error. */
13359 - ETH_RETRY, /* Could not process request. Try later.*/
13360 - ETH_END_OF_JOB, /* Ring has nothing to process. */
13361 - ETH_QUEUE_FULL, /* Ring resource error. */
13362 - ETH_QUEUE_LAST_RESOURCE /* Ring resources about to exhaust. */
13363 -} ETH_FUNC_RET_STATUS;
13364
13365 -/* These are for big-endian machines. Little endian needs different
13366 - * definitions.
13367 +/*
13368 + * RX/TX descriptors.
13369 */
13370 #if defined(__BIG_ENDIAN)
13371 -struct eth_rx_desc {
13372 +struct rx_desc {
13373 u16 byte_cnt; /* Descriptor buffer byte count */
13374 u16 buf_size; /* Buffer size */
13375 u32 cmd_sts; /* Descriptor command status */
13376 @@ -441,7 +180,7 @@
13377 u32 buf_ptr; /* Descriptor buffer pointer */
13378 };
13379
13380 -struct eth_tx_desc {
13381 +struct tx_desc {
13382 u16 byte_cnt; /* buffer byte count */
13383 u16 l4i_chk; /* CPU provided TCP checksum */
13384 u32 cmd_sts; /* Command/status field */
13385 @@ -449,7 +188,7 @@
13386 u32 buf_ptr; /* pointer to buffer for this descriptor*/
13387 };
13388 #elif defined(__LITTLE_ENDIAN)
13389 -struct eth_rx_desc {
13390 +struct rx_desc {
13391 u32 cmd_sts; /* Descriptor command status */
13392 u16 buf_size; /* Buffer size */
13393 u16 byte_cnt; /* Descriptor buffer byte count */
13394 @@ -457,7 +196,7 @@
13395 u32 next_desc_ptr; /* Next descriptor pointer */
13396 };
13397
13398 -struct eth_tx_desc {
13399 +struct tx_desc {
13400 u32 cmd_sts; /* Command/status field */
13401 u16 l4i_chk; /* CPU provided TCP checksum */
13402 u16 byte_cnt; /* buffer byte count */
13403 @@ -468,18 +207,59 @@
13404 #error One of __BIG_ENDIAN or __LITTLE_ENDIAN must be defined
13405 #endif
13406
13407 -/* Unified struct for Rx and Tx operations. The user is not required to */
13408 -/* be familier with neither Tx nor Rx descriptors. */
13409 -struct pkt_info {
13410 - unsigned short byte_cnt; /* Descriptor buffer byte count */
13411 - unsigned short l4i_chk; /* Tx CPU provided TCP Checksum */
13412 - unsigned int cmd_sts; /* Descriptor command status */
13413 - dma_addr_t buf_ptr; /* Descriptor buffer pointer */
13414 - struct sk_buff *return_info; /* User resource return information */
13415 +/* RX & TX descriptor command */
13416 +#define BUFFER_OWNED_BY_DMA 0x80000000
13417 +
13418 +/* RX & TX descriptor status */
13419 +#define ERROR_SUMMARY 0x00000001
13420 +
13421 +/* RX descriptor status */
13422 +#define LAYER_4_CHECKSUM_OK 0x40000000
13423 +#define RX_ENABLE_INTERRUPT 0x20000000
13424 +#define RX_FIRST_DESC 0x08000000
13425 +#define RX_LAST_DESC 0x04000000
13426 +
13427 +/* TX descriptor command */
13428 +#define TX_ENABLE_INTERRUPT 0x00800000
13429 +#define GEN_CRC 0x00400000
13430 +#define TX_FIRST_DESC 0x00200000
13431 +#define TX_LAST_DESC 0x00100000
13432 +#define ZERO_PADDING 0x00080000
13433 +#define GEN_IP_V4_CHECKSUM 0x00040000
13434 +#define GEN_TCP_UDP_CHECKSUM 0x00020000
13435 +#define UDP_FRAME 0x00010000
13436 +
13437 +#define TX_IHL_SHIFT 11
13438 +
13439 +
13440 +/* global *******************************************************************/
13441 +struct mv643xx_eth_shared_private {
13442 + /*
13443 + * Ethernet controller base address.
13444 + */
13445 + void __iomem *base;
13446 +
13447 + /*
13448 + * Protects access to SMI_REG, which is shared between ports.
13449 + */
13450 + spinlock_t phy_lock;
13451 +
13452 + /*
13453 + * Per-port MBUS window access register value.
13454 + */
13455 + u32 win_protect;
13456 +
13457 + /*
13458 + * Hardware-specific parameters.
13459 + */
13460 + unsigned int t_clk;
13461 + int extended_rx_coal_limit;
13462 + int tx_bw_control_moved;
13463 };
13464
13465 -/* Ethernet port specific information */
13466 -struct mv643xx_mib_counters {
13467 +
13468 +/* per-port *****************************************************************/
13469 +struct mib_counters {
13470 u64 good_octets_received;
13471 u32 bad_octets_received;
13472 u32 internal_mac_transmit_err;
13473 @@ -512,461 +292,282 @@
13474 u32 late_collision;
13475 };
13476
13477 -struct mv643xx_shared_private {
13478 - void __iomem *eth_base;
13479 -
13480 - /* used to protect SMI_REG, which is shared across ports */
13481 - spinlock_t phy_lock;
13482 -
13483 - u32 win_protect;
13484 -
13485 - unsigned int t_clk;
13486 -};
13487 -
13488 -struct mv643xx_private {
13489 - struct mv643xx_shared_private *shared;
13490 - int port_num; /* User Ethernet port number */
13491 -
13492 - struct mv643xx_shared_private *shared_smi;
13493 +struct rx_queue {
13494 + int index;
13495
13496 - u32 rx_sram_addr; /* Base address of rx sram area */
13497 - u32 rx_sram_size; /* Size of rx sram area */
13498 - u32 tx_sram_addr; /* Base address of tx sram area */
13499 - u32 tx_sram_size; /* Size of tx sram area */
13500 + int rx_ring_size;
13501
13502 - int rx_resource_err; /* Rx ring resource error flag */
13503 + int rx_desc_count;
13504 + int rx_curr_desc;
13505 + int rx_used_desc;
13506
13507 - /* Tx/Rx rings managment indexes fields. For driver use */
13508 + struct rx_desc *rx_desc_area;
13509 + dma_addr_t rx_desc_dma;
13510 + int rx_desc_area_size;
13511 + struct sk_buff **rx_skb;
13512
13513 - /* Next available and first returning Rx resource */
13514 - int rx_curr_desc_q, rx_used_desc_q;
13515 + struct timer_list rx_oom;
13516 +};
13517
13518 - /* Next available and first returning Tx resource */
13519 - int tx_curr_desc_q, tx_used_desc_q;
13520 +struct tx_queue {
13521 + int index;
13522
13523 -#ifdef MV643XX_TX_FAST_REFILL
13524 - u32 tx_clean_threshold;
13525 -#endif
13526 + int tx_ring_size;
13527
13528 - struct eth_rx_desc *p_rx_desc_area;
13529 - dma_addr_t rx_desc_dma;
13530 - int rx_desc_area_size;
13531 - struct sk_buff **rx_skb;
13532 + int tx_desc_count;
13533 + int tx_curr_desc;
13534 + int tx_used_desc;
13535
13536 - struct eth_tx_desc *p_tx_desc_area;
13537 + struct tx_desc *tx_desc_area;
13538 dma_addr_t tx_desc_dma;
13539 int tx_desc_area_size;
13540 struct sk_buff **tx_skb;
13541 +};
13542
13543 - struct work_struct tx_timeout_task;
13544 +struct mv643xx_eth_private {
13545 + struct mv643xx_eth_shared_private *shared;
13546 + int port_num;
13547
13548 struct net_device *dev;
13549 - struct napi_struct napi;
13550 - struct net_device_stats stats;
13551 - struct mv643xx_mib_counters mib_counters;
13552 +
13553 + struct mv643xx_eth_shared_private *shared_smi;
13554 + int phy_addr;
13555 +
13556 spinlock_t lock;
13557 - /* Size of Tx Ring per queue */
13558 - int tx_ring_size;
13559 - /* Number of tx descriptors in use */
13560 - int tx_desc_count;
13561 - /* Size of Rx Ring per queue */
13562 - int rx_ring_size;
13563 - /* Number of rx descriptors in use */
13564 - int rx_desc_count;
13565 +
13566 + struct mib_counters mib_counters;
13567 + struct work_struct tx_timeout_task;
13568 + struct mii_if_info mii;
13569
13570 /*
13571 - * Used in case RX Ring is empty, which can be caused when
13572 - * system does not have resources (skb's)
13573 + * RX state.
13574 */
13575 - struct timer_list timeout;
13576 -
13577 - u32 rx_int_coal;
13578 - u32 tx_int_coal;
13579 - struct mii_if_info mii;
13580 -};
13581 + int default_rx_ring_size;
13582 + unsigned long rx_desc_sram_addr;
13583 + int rx_desc_sram_size;
13584 + u8 rxq_mask;
13585 + int rxq_primary;
13586 + struct napi_struct napi;
13587 + struct rx_queue rxq[8];
13588
13589 -/* Static function declarations */
13590 -static void eth_port_init(struct mv643xx_private *mp);
13591 -static void eth_port_reset(struct mv643xx_private *mp);
13592 -static void eth_port_start(struct net_device *dev);
13593 -
13594 -static void ethernet_phy_reset(struct mv643xx_private *mp);
13595 -
13596 -static void eth_port_write_smi_reg(struct mv643xx_private *mp,
13597 - unsigned int phy_reg, unsigned int value);
13598 -
13599 -static void eth_port_read_smi_reg(struct mv643xx_private *mp,
13600 - unsigned int phy_reg, unsigned int *value);
13601 -
13602 -static void eth_clear_mib_counters(struct mv643xx_private *mp);
13603 -
13604 -static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp,
13605 - struct pkt_info *p_pkt_info);
13606 -static ETH_FUNC_RET_STATUS eth_rx_return_buff(struct mv643xx_private *mp,
13607 - struct pkt_info *p_pkt_info);
13608 -
13609 -static void eth_port_uc_addr_get(struct mv643xx_private *mp,
13610 - unsigned char *p_addr);
13611 -static void eth_port_uc_addr_set(struct mv643xx_private *mp,
13612 - unsigned char *p_addr);
13613 -static void eth_port_set_multicast_list(struct net_device *);
13614 -static void mv643xx_eth_port_enable_tx(struct mv643xx_private *mp,
13615 - unsigned int queues);
13616 -static void mv643xx_eth_port_enable_rx(struct mv643xx_private *mp,
13617 - unsigned int queues);
13618 -static unsigned int mv643xx_eth_port_disable_tx(struct mv643xx_private *mp);
13619 -static unsigned int mv643xx_eth_port_disable_rx(struct mv643xx_private *mp);
13620 -static int mv643xx_eth_open(struct net_device *);
13621 -static int mv643xx_eth_stop(struct net_device *);
13622 -static void eth_port_init_mac_tables(struct mv643xx_private *mp);
13623 -#ifdef MV643XX_NAPI
13624 -static int mv643xx_poll(struct napi_struct *napi, int budget);
13625 + /*
13626 + * TX state.
13627 + */
13628 + int default_tx_ring_size;
13629 + unsigned long tx_desc_sram_addr;
13630 + int tx_desc_sram_size;
13631 + u8 txq_mask;
13632 + int txq_primary;
13633 + struct tx_queue txq[8];
13634 +#ifdef MV643XX_ETH_TX_FAST_REFILL
13635 + int tx_clean_threshold;
13636 #endif
13637 -static int ethernet_phy_get(struct mv643xx_private *mp);
13638 -static void ethernet_phy_set(struct mv643xx_private *mp, int phy_addr);
13639 -static int ethernet_phy_detect(struct mv643xx_private *mp);
13640 -static int mv643xx_mdio_read(struct net_device *dev, int phy_id, int location);
13641 -static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val);
13642 -static int mv643xx_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
13643 -static const struct ethtool_ops mv643xx_ethtool_ops;
13644 +};
13645
13646 -static char mv643xx_driver_name[] = "mv643xx_eth";
13647 -static char mv643xx_driver_version[] = "1.0";
13648
13649 -static inline u32 rdl(struct mv643xx_private *mp, int offset)
13650 +/* port register accessors **************************************************/
13651 +static inline u32 rdl(struct mv643xx_eth_private *mp, int offset)
13652 {
13653 - return readl(mp->shared->eth_base + offset);
13654 + return readl(mp->shared->base + offset);
13655 }
13656
13657 -static inline void wrl(struct mv643xx_private *mp, int offset, u32 data)
13658 +static inline void wrl(struct mv643xx_eth_private *mp, int offset, u32 data)
13659 {
13660 - writel(data, mp->shared->eth_base + offset);
13661 + writel(data, mp->shared->base + offset);
13662 }
13663
13664 -/*
13665 - * Changes MTU (maximum transfer unit) of the gigabit ethenret port
13666 - *
13667 - * Input : pointer to ethernet interface network device structure
13668 - * new mtu size
13669 - * Output : 0 upon success, -EINVAL upon failure
13670 - */
13671 -static int mv643xx_eth_change_mtu(struct net_device *dev, int new_mtu)
13672 -{
13673 - if ((new_mtu > 9500) || (new_mtu < 64))
13674 - return -EINVAL;
13675 -
13676 - dev->mtu = new_mtu;
13677 - if (!netif_running(dev))
13678 - return 0;
13679 -
13680 - /*
13681 - * Stop and then re-open the interface. This will allocate RX
13682 - * skbs of the new MTU.
13683 - * There is a possible danger that the open will not succeed,
13684 - * due to memory being full, which might fail the open function.
13685 - */
13686 - mv643xx_eth_stop(dev);
13687 - if (mv643xx_eth_open(dev)) {
13688 - printk(KERN_ERR "%s: Fatal error on opening device\n",
13689 - dev->name);
13690 - }
13691 -
13692 - return 0;
13693 -}
13694
13695 -/*
13696 - * mv643xx_eth_rx_refill_descs
13697 - *
13698 - * Fills / refills RX queue on a certain gigabit ethernet port
13699 - *
13700 - * Input : pointer to ethernet interface network device structure
13701 - * Output : N/A
13702 - */
13703 -static void mv643xx_eth_rx_refill_descs(struct net_device *dev)
13704 +/* rxq/txq helper functions *************************************************/
13705 +static struct mv643xx_eth_private *rxq_to_mp(struct rx_queue *rxq)
13706 {
13707 - struct mv643xx_private *mp = netdev_priv(dev);
13708 - struct pkt_info pkt_info;
13709 - struct sk_buff *skb;
13710 - int unaligned;
13711 -
13712 - while (mp->rx_desc_count < mp->rx_ring_size) {
13713 - skb = dev_alloc_skb(ETH_RX_SKB_SIZE + dma_get_cache_alignment());
13714 - if (!skb)
13715 - break;
13716 - mp->rx_desc_count++;
13717 - unaligned = (u32)skb->data & (dma_get_cache_alignment() - 1);
13718 - if (unaligned)
13719 - skb_reserve(skb, dma_get_cache_alignment() - unaligned);
13720 - pkt_info.cmd_sts = ETH_RX_ENABLE_INTERRUPT;
13721 - pkt_info.byte_cnt = ETH_RX_SKB_SIZE;
13722 - pkt_info.buf_ptr = dma_map_single(NULL, skb->data,
13723 - ETH_RX_SKB_SIZE, DMA_FROM_DEVICE);
13724 - pkt_info.return_info = skb;
13725 - if (eth_rx_return_buff(mp, &pkt_info) != ETH_OK) {
13726 - printk(KERN_ERR
13727 - "%s: Error allocating RX Ring\n", dev->name);
13728 - break;
13729 - }
13730 - skb_reserve(skb, ETH_HW_IP_ALIGN);
13731 - }
13732 - /*
13733 - * If RX ring is empty of SKB, set a timer to try allocating
13734 - * again at a later time.
13735 - */
13736 - if (mp->rx_desc_count == 0) {
13737 - printk(KERN_INFO "%s: Rx ring is empty\n", dev->name);
13738 - mp->timeout.expires = jiffies + (HZ / 10); /* 100 mSec */
13739 - add_timer(&mp->timeout);
13740 - }
13741 + return container_of(rxq, struct mv643xx_eth_private, rxq[rxq->index]);
13742 }
13743
13744 -/*
13745 - * mv643xx_eth_rx_refill_descs_timer_wrapper
13746 - *
13747 - * Timer routine to wake up RX queue filling task. This function is
13748 - * used only in case the RX queue is empty, and all alloc_skb has
13749 - * failed (due to out of memory event).
13750 - *
13751 - * Input : pointer to ethernet interface network device structure
13752 - * Output : N/A
13753 - */
13754 -static inline void mv643xx_eth_rx_refill_descs_timer_wrapper(unsigned long data)
13755 +static struct mv643xx_eth_private *txq_to_mp(struct tx_queue *txq)
13756 {
13757 - mv643xx_eth_rx_refill_descs((struct net_device *)data);
13758 + return container_of(txq, struct mv643xx_eth_private, txq[txq->index]);
13759 }
13760
13761 -/*
13762 - * mv643xx_eth_update_mac_address
13763 - *
13764 - * Update the MAC address of the port in the address table
13765 - *
13766 - * Input : pointer to ethernet interface network device structure
13767 - * Output : N/A
13768 - */
13769 -static void mv643xx_eth_update_mac_address(struct net_device *dev)
13770 +static void rxq_enable(struct rx_queue *rxq)
13771 {
13772 - struct mv643xx_private *mp = netdev_priv(dev);
13773 -
13774 - eth_port_init_mac_tables(mp);
13775 - eth_port_uc_addr_set(mp, dev->dev_addr);
13776 + struct mv643xx_eth_private *mp = rxq_to_mp(rxq);
13777 + wrl(mp, RXQ_COMMAND(mp->port_num), 1 << rxq->index);
13778 }
13779
13780 -/*
13781 - * mv643xx_eth_set_rx_mode
13782 - *
13783 - * Change from promiscuos to regular rx mode
13784 - *
13785 - * Input : pointer to ethernet interface network device structure
13786 - * Output : N/A
13787 - */
13788 -static void mv643xx_eth_set_rx_mode(struct net_device *dev)
13789 +static void rxq_disable(struct rx_queue *rxq)
13790 {
13791 - struct mv643xx_private *mp = netdev_priv(dev);
13792 - u32 config_reg;
13793 -
13794 - config_reg = rdl(mp, PORT_CONFIG_REG(mp->port_num));
13795 - if (dev->flags & IFF_PROMISC)
13796 - config_reg |= (u32) UNICAST_PROMISCUOUS_MODE;
13797 - else
13798 - config_reg &= ~(u32) UNICAST_PROMISCUOUS_MODE;
13799 - wrl(mp, PORT_CONFIG_REG(mp->port_num), config_reg);
13800 + struct mv643xx_eth_private *mp = rxq_to_mp(rxq);
13801 + u8 mask = 1 << rxq->index;
13802
13803 - eth_port_set_multicast_list(dev);
13804 + wrl(mp, RXQ_COMMAND(mp->port_num), mask << 8);
13805 + while (rdl(mp, RXQ_COMMAND(mp->port_num)) & mask)
13806 + udelay(10);
13807 }
13808
13809 -/*
13810 - * mv643xx_eth_set_mac_address
13811 - *
13812 - * Change the interface's mac address.
13813 - * No special hardware thing should be done because interface is always
13814 - * put in promiscuous mode.
13815 - *
13816 - * Input : pointer to ethernet interface network device structure and
13817 - * a pointer to the designated entry to be added to the cache.
13818 - * Output : zero upon success, negative upon failure
13819 - */
13820 -static int mv643xx_eth_set_mac_address(struct net_device *dev, void *addr)
13821 +static void txq_enable(struct tx_queue *txq)
13822 {
13823 - int i;
13824 -
13825 - for (i = 0; i < 6; i++)
13826 - /* +2 is for the offset of the HW addr type */
13827 - dev->dev_addr[i] = ((unsigned char *)addr)[i + 2];
13828 - mv643xx_eth_update_mac_address(dev);
13829 - return 0;
13830 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
13831 + wrl(mp, TXQ_COMMAND(mp->port_num), 1 << txq->index);
13832 }
13833
13834 -/*
13835 - * mv643xx_eth_tx_timeout
13836 - *
13837 - * Called upon a timeout on transmitting a packet
13838 - *
13839 - * Input : pointer to ethernet interface network device structure.
13840 - * Output : N/A
13841 - */
13842 -static void mv643xx_eth_tx_timeout(struct net_device *dev)
13843 +static void txq_disable(struct tx_queue *txq)
13844 {
13845 - struct mv643xx_private *mp = netdev_priv(dev);
13846 -
13847 - printk(KERN_INFO "%s: TX timeout ", dev->name);
13848 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
13849 + u8 mask = 1 << txq->index;
13850
13851 - /* Do the reset outside of interrupt context */
13852 - schedule_work(&mp->tx_timeout_task);
13853 + wrl(mp, TXQ_COMMAND(mp->port_num), mask << 8);
13854 + while (rdl(mp, TXQ_COMMAND(mp->port_num)) & mask)
13855 + udelay(10);
13856 }
13857
13858 -/*
13859 - * mv643xx_eth_tx_timeout_task
13860 - *
13861 - * Actual routine to reset the adapter when a timeout on Tx has occurred
13862 - */
13863 -static void mv643xx_eth_tx_timeout_task(struct work_struct *ugly)
13864 +static void __txq_maybe_wake(struct tx_queue *txq)
13865 {
13866 - struct mv643xx_private *mp = container_of(ugly, struct mv643xx_private,
13867 - tx_timeout_task);
13868 - struct net_device *dev = mp->dev;
13869 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
13870
13871 - if (!netif_running(dev))
13872 - return;
13873 + /*
13874 + * netif_{stop,wake}_queue() flow control only applies to
13875 + * the primary queue.
13876 + */
13877 + BUG_ON(txq->index != mp->txq_primary);
13878
13879 - netif_stop_queue(dev);
13880 + if (txq->tx_ring_size - txq->tx_desc_count >= MAX_DESCS_PER_SKB)
13881 + netif_wake_queue(mp->dev);
13882 +}
13883
13884 - eth_port_reset(mp);
13885 - eth_port_start(dev);
13886
13887 - if (mp->tx_ring_size - mp->tx_desc_count >= MAX_DESCS_PER_SKB)
13888 - netif_wake_queue(dev);
13889 -}
13890 +/* rx ***********************************************************************/
13891 +static void txq_reclaim(struct tx_queue *txq, int force);
13892
13893 -/**
13894 - * mv643xx_eth_free_tx_descs - Free the tx desc data for completed descriptors
13895 - *
13896 - * If force is non-zero, frees uncompleted descriptors as well
13897 - */
13898 -static int mv643xx_eth_free_tx_descs(struct net_device *dev, int force)
13899 +static void rxq_refill(struct rx_queue *rxq)
13900 {
13901 - struct mv643xx_private *mp = netdev_priv(dev);
13902 - struct eth_tx_desc *desc;
13903 - u32 cmd_sts;
13904 - struct sk_buff *skb;
13905 + struct mv643xx_eth_private *mp = rxq_to_mp(rxq);
13906 unsigned long flags;
13907 - int tx_index;
13908 - dma_addr_t addr;
13909 - int count;
13910 - int released = 0;
13911 -
13912 - while (mp->tx_desc_count > 0) {
13913 - spin_lock_irqsave(&mp->lock, flags);
13914 -
13915 - /* tx_desc_count might have changed before acquiring the lock */
13916 - if (mp->tx_desc_count <= 0) {
13917 - spin_unlock_irqrestore(&mp->lock, flags);
13918 - return released;
13919 - }
13920 -
13921 - tx_index = mp->tx_used_desc_q;
13922 - desc = &mp->p_tx_desc_area[tx_index];
13923 - cmd_sts = desc->cmd_sts;
13924
13925 - if (!force && (cmd_sts & ETH_BUFFER_OWNED_BY_DMA)) {
13926 - spin_unlock_irqrestore(&mp->lock, flags);
13927 - return released;
13928 - }
13929 + spin_lock_irqsave(&mp->lock, flags);
13930
13931 - mp->tx_used_desc_q = (tx_index + 1) % mp->tx_ring_size;
13932 - mp->tx_desc_count--;
13933 + while (rxq->rx_desc_count < rxq->rx_ring_size) {
13934 + int skb_size;
13935 + struct sk_buff *skb;
13936 + int unaligned;
13937 + int rx;
13938
13939 - addr = desc->buf_ptr;
13940 - count = desc->byte_cnt;
13941 - skb = mp->tx_skb[tx_index];
13942 - if (skb)
13943 - mp->tx_skb[tx_index] = NULL;
13944 + /*
13945 + * Reserve 2+14 bytes for an ethernet header (the
13946 + * hardware automatically prepends 2 bytes of dummy
13947 + * data to each received packet), 4 bytes for a VLAN
13948 + * header, and 4 bytes for the trailing FCS -- 24
13949 + * bytes total.
13950 + */
13951 + skb_size = mp->dev->mtu + 24;
13952
13953 - if (cmd_sts & ETH_ERROR_SUMMARY) {
13954 - printk("%s: Error in TX\n", dev->name);
13955 - dev->stats.tx_errors++;
13956 - }
13957 + skb = dev_alloc_skb(skb_size + dma_get_cache_alignment() - 1);
13958 + if (skb == NULL)
13959 + break;
13960
13961 - spin_unlock_irqrestore(&mp->lock, flags);
13962 + unaligned = (u32)skb->data & (dma_get_cache_alignment() - 1);
13963 + if (unaligned)
13964 + skb_reserve(skb, dma_get_cache_alignment() - unaligned);
13965
13966 - if (cmd_sts & ETH_TX_FIRST_DESC)
13967 - dma_unmap_single(NULL, addr, count, DMA_TO_DEVICE);
13968 - else
13969 - dma_unmap_page(NULL, addr, count, DMA_TO_DEVICE);
13970 + rxq->rx_desc_count++;
13971 + rx = rxq->rx_used_desc;
13972 + rxq->rx_used_desc = (rx + 1) % rxq->rx_ring_size;
13973 +
13974 + rxq->rx_desc_area[rx].buf_ptr = dma_map_single(NULL, skb->data,
13975 + skb_size, DMA_FROM_DEVICE);
13976 + rxq->rx_desc_area[rx].buf_size = skb_size;
13977 + rxq->rx_skb[rx] = skb;
13978 + wmb();
13979 + rxq->rx_desc_area[rx].cmd_sts = BUFFER_OWNED_BY_DMA |
13980 + RX_ENABLE_INTERRUPT;
13981 + wmb();
13982
13983 - if (skb)
13984 - dev_kfree_skb_irq(skb);
13985 + /*
13986 + * The hardware automatically prepends 2 bytes of
13987 + * dummy data to each received packet, so that the
13988 + * IP header ends up 16-byte aligned.
13989 + */
13990 + skb_reserve(skb, 2);
13991 + }
13992
13993 - released = 1;
13994 + if (rxq->rx_desc_count != rxq->rx_ring_size) {
13995 + rxq->rx_oom.expires = jiffies + (HZ / 10);
13996 + add_timer(&rxq->rx_oom);
13997 }
13998
13999 - return released;
14000 + spin_unlock_irqrestore(&mp->lock, flags);
14001 }
14002
14003 -static void mv643xx_eth_free_completed_tx_descs(struct net_device *dev)
14004 +static inline void rxq_refill_timer_wrapper(unsigned long data)
14005 {
14006 - struct mv643xx_private *mp = netdev_priv(dev);
14007 -
14008 - if (mv643xx_eth_free_tx_descs(dev, 0) &&
14009 - mp->tx_ring_size - mp->tx_desc_count >= MAX_DESCS_PER_SKB)
14010 - netif_wake_queue(dev);
14011 + rxq_refill((struct rx_queue *)data);
14012 }
14013
14014 -static void mv643xx_eth_free_all_tx_descs(struct net_device *dev)
14015 +static int rxq_process(struct rx_queue *rxq, int budget)
14016 {
14017 - mv643xx_eth_free_tx_descs(dev, 1);
14018 -}
14019 + struct mv643xx_eth_private *mp = rxq_to_mp(rxq);
14020 + struct net_device_stats *stats = &mp->dev->stats;
14021 + int rx;
14022
14023 -/*
14024 - * mv643xx_eth_receive
14025 - *
14026 - * This function is forward packets that are received from the port's
14027 - * queues toward kernel core or FastRoute them to another interface.
14028 - *
14029 - * Input : dev - a pointer to the required interface
14030 - * max - maximum number to receive (0 means unlimted)
14031 - *
14032 - * Output : number of served packets
14033 - */
14034 -static int mv643xx_eth_receive_queue(struct net_device *dev, int budget)
14035 -{
14036 - struct mv643xx_private *mp = netdev_priv(dev);
14037 - struct net_device_stats *stats = &dev->stats;
14038 - unsigned int received_packets = 0;
14039 - struct sk_buff *skb;
14040 - struct pkt_info pkt_info;
14041 -
14042 - while (budget-- > 0 && eth_port_receive(mp, &pkt_info) == ETH_OK) {
14043 - dma_unmap_single(NULL, pkt_info.buf_ptr, ETH_RX_SKB_SIZE,
14044 - DMA_FROM_DEVICE);
14045 - mp->rx_desc_count--;
14046 - received_packets++;
14047 + rx = 0;
14048 + while (rx < budget) {
14049 + struct rx_desc *rx_desc;
14050 + unsigned int cmd_sts;
14051 + struct sk_buff *skb;
14052 + unsigned long flags;
14053 +
14054 + spin_lock_irqsave(&mp->lock, flags);
14055 +
14056 + rx_desc = &rxq->rx_desc_area[rxq->rx_curr_desc];
14057 +
14058 + cmd_sts = rx_desc->cmd_sts;
14059 + if (cmd_sts & BUFFER_OWNED_BY_DMA) {
14060 + spin_unlock_irqrestore(&mp->lock, flags);
14061 + break;
14062 + }
14063 + rmb();
14064 +
14065 + skb = rxq->rx_skb[rxq->rx_curr_desc];
14066 + rxq->rx_skb[rxq->rx_curr_desc] = NULL;
14067 +
14068 + rxq->rx_curr_desc = (rxq->rx_curr_desc + 1) % rxq->rx_ring_size;
14069 +
14070 + spin_unlock_irqrestore(&mp->lock, flags);
14071 +
14072 + dma_unmap_single(NULL, rx_desc->buf_ptr + 2,
14073 + mp->dev->mtu + 24, DMA_FROM_DEVICE);
14074 + rxq->rx_desc_count--;
14075 + rx++;
14076
14077 /*
14078 * Update statistics.
14079 - * Note byte count includes 4 byte CRC count
14080 + *
14081 + * Note that the descriptor byte count includes 2 dummy
14082 + * bytes automatically inserted by the hardware at the
14083 + * start of the packet (which we don't count), and a 4
14084 + * byte CRC at the end of the packet (which we do count).
14085 */
14086 stats->rx_packets++;
14087 - stats->rx_bytes += pkt_info.byte_cnt;
14088 - skb = pkt_info.return_info;
14089 + stats->rx_bytes += rx_desc->byte_cnt - 2;
14090 +
14091 /*
14092 - * In case received a packet without first / last bits on OR
14093 - * the error summary bit is on, the packets needs to be dropeed.
14094 + * In case we received a packet without first / last bits
14095 + * on, or the error summary bit is set, the packet needs
14096 + * to be dropped.
14097 */
14098 - if (((pkt_info.cmd_sts
14099 - & (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) !=
14100 - (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC))
14101 - || (pkt_info.cmd_sts & ETH_ERROR_SUMMARY)) {
14102 + if (((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
14103 + (RX_FIRST_DESC | RX_LAST_DESC))
14104 + || (cmd_sts & ERROR_SUMMARY)) {
14105 stats->rx_dropped++;
14106 - if ((pkt_info.cmd_sts & (ETH_RX_FIRST_DESC |
14107 - ETH_RX_LAST_DESC)) !=
14108 - (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) {
14109 +
14110 + if ((cmd_sts & (RX_FIRST_DESC | RX_LAST_DESC)) !=
14111 + (RX_FIRST_DESC | RX_LAST_DESC)) {
14112 if (net_ratelimit())
14113 - printk(KERN_ERR
14114 - "%s: Received packet spread "
14115 - "on multiple descriptors\n",
14116 - dev->name);
14117 + dev_printk(KERN_ERR, &mp->dev->dev,
14118 + "received packet spanning "
14119 + "multiple descriptors\n");
14120 }
14121 - if (pkt_info.cmd_sts & ETH_ERROR_SUMMARY)
14122 +
14123 + if (cmd_sts & ERROR_SUMMARY)
14124 stats->rx_errors++;
14125
14126 dev_kfree_skb_irq(skb);
14127 @@ -975,668 +576,120 @@
14128 * The -4 is for the CRC in the trailer of the
14129 * received packet
14130 */
14131 - skb_put(skb, pkt_info.byte_cnt - 4);
14132 + skb_put(skb, rx_desc->byte_cnt - 2 - 4);
14133
14134 - if (pkt_info.cmd_sts & ETH_LAYER_4_CHECKSUM_OK) {
14135 + if (cmd_sts & LAYER_4_CHECKSUM_OK) {
14136 skb->ip_summed = CHECKSUM_UNNECESSARY;
14137 skb->csum = htons(
14138 - (pkt_info.cmd_sts & 0x0007fff8) >> 3);
14139 + (cmd_sts & 0x0007fff8) >> 3);
14140 }
14141 - skb->protocol = eth_type_trans(skb, dev);
14142 -#ifdef MV643XX_NAPI
14143 + skb->protocol = eth_type_trans(skb, mp->dev);
14144 +#ifdef MV643XX_ETH_NAPI
14145 netif_receive_skb(skb);
14146 #else
14147 netif_rx(skb);
14148 #endif
14149 }
14150 - dev->last_rx = jiffies;
14151 +
14152 + mp->dev->last_rx = jiffies;
14153 }
14154 - mv643xx_eth_rx_refill_descs(dev); /* Fill RX ring with skb's */
14155
14156 - return received_packets;
14157 + rxq_refill(rxq);
14158 +
14159 + return rx;
14160 }
14161
14162 -/* Set the mv643xx port configuration register for the speed/duplex mode. */
14163 -static void mv643xx_eth_update_pscr(struct net_device *dev,
14164 - struct ethtool_cmd *ecmd)
14165 +#ifdef MV643XX_ETH_NAPI
14166 +static int mv643xx_eth_poll(struct napi_struct *napi, int budget)
14167 {
14168 - struct mv643xx_private *mp = netdev_priv(dev);
14169 - int port_num = mp->port_num;
14170 - u32 o_pscr, n_pscr;
14171 - unsigned int queues;
14172 + struct mv643xx_eth_private *mp;
14173 + int rx;
14174 + int i;
14175
14176 - o_pscr = rdl(mp, PORT_SERIAL_CONTROL_REG(port_num));
14177 - n_pscr = o_pscr;
14178 + mp = container_of(napi, struct mv643xx_eth_private, napi);
14179
14180 - /* clear speed, duplex and rx buffer size fields */
14181 - n_pscr &= ~(SET_MII_SPEED_TO_100 |
14182 - SET_GMII_SPEED_TO_1000 |
14183 - SET_FULL_DUPLEX_MODE |
14184 - MAX_RX_PACKET_MASK);
14185 -
14186 - if (ecmd->duplex == DUPLEX_FULL)
14187 - n_pscr |= SET_FULL_DUPLEX_MODE;
14188 -
14189 - if (ecmd->speed == SPEED_1000)
14190 - n_pscr |= SET_GMII_SPEED_TO_1000 |
14191 - MAX_RX_PACKET_9700BYTE;
14192 - else {
14193 - if (ecmd->speed == SPEED_100)
14194 - n_pscr |= SET_MII_SPEED_TO_100;
14195 - n_pscr |= MAX_RX_PACKET_1522BYTE;
14196 - }
14197 -
14198 - if (n_pscr != o_pscr) {
14199 - if ((o_pscr & SERIAL_PORT_ENABLE) == 0)
14200 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), n_pscr);
14201 - else {
14202 - queues = mv643xx_eth_port_disable_tx(mp);
14203 +#ifdef MV643XX_ETH_TX_FAST_REFILL
14204 + if (++mp->tx_clean_threshold > 5) {
14205 + mp->tx_clean_threshold = 0;
14206 + for (i = 0; i < 8; i++)
14207 + if (mp->txq_mask & (1 << i))
14208 + txq_reclaim(mp->txq + i, 0);
14209 + }
14210 +#endif
14211
14212 - o_pscr &= ~SERIAL_PORT_ENABLE;
14213 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), o_pscr);
14214 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), n_pscr);
14215 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), n_pscr);
14216 - if (queues)
14217 - mv643xx_eth_port_enable_tx(mp, queues);
14218 - }
14219 + rx = 0;
14220 + for (i = 7; rx < budget && i >= 0; i--)
14221 + if (mp->rxq_mask & (1 << i))
14222 + rx += rxq_process(mp->rxq + i, budget - rx);
14223 +
14224 + if (rx < budget) {
14225 + netif_rx_complete(mp->dev, napi);
14226 + wrl(mp, INT_CAUSE(mp->port_num), 0);
14227 + wrl(mp, INT_CAUSE_EXT(mp->port_num), 0);
14228 + wrl(mp, INT_MASK(mp->port_num), INT_TX_END | INT_RX | INT_EXT);
14229 }
14230 +
14231 + return rx;
14232 }
14233 +#endif
14234
14235 -/*
14236 - * mv643xx_eth_int_handler
14237 - *
14238 - * Main interrupt handler for the gigbit ethernet ports
14239 - *
14240 - * Input : irq - irq number (not used)
14241 - * dev_id - a pointer to the required interface's data structure
14242 - * regs - not used
14243 - * Output : N/A
14244 - */
14245
14246 -static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id)
14247 +/* tx ***********************************************************************/
14248 +static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb)
14249 {
14250 - struct net_device *dev = (struct net_device *)dev_id;
14251 - struct mv643xx_private *mp = netdev_priv(dev);
14252 - u32 eth_int_cause, eth_int_cause_ext = 0;
14253 - unsigned int port_num = mp->port_num;
14254 -
14255 - /* Read interrupt cause registers */
14256 - eth_int_cause = rdl(mp, INTERRUPT_CAUSE_REG(port_num)) &
14257 - ETH_INT_UNMASK_ALL;
14258 - if (eth_int_cause & ETH_INT_CAUSE_EXT) {
14259 - eth_int_cause_ext = rdl(mp,
14260 - INTERRUPT_CAUSE_EXTEND_REG(port_num)) &
14261 - ETH_INT_UNMASK_ALL_EXT;
14262 - wrl(mp, INTERRUPT_CAUSE_EXTEND_REG(port_num),
14263 - ~eth_int_cause_ext);
14264 - }
14265 -
14266 - /* PHY status changed */
14267 - if (eth_int_cause_ext & (ETH_INT_CAUSE_PHY | ETH_INT_CAUSE_STATE)) {
14268 - struct ethtool_cmd cmd;
14269 + int frag;
14270
14271 - if (mii_link_ok(&mp->mii)) {
14272 - mii_ethtool_gset(&mp->mii, &cmd);
14273 - mv643xx_eth_update_pscr(dev, &cmd);
14274 - mv643xx_eth_port_enable_tx(mp, ETH_TX_QUEUES_ENABLED);
14275 - if (!netif_carrier_ok(dev)) {
14276 - netif_carrier_on(dev);
14277 - if (mp->tx_ring_size - mp->tx_desc_count >=
14278 - MAX_DESCS_PER_SKB)
14279 - netif_wake_queue(dev);
14280 - }
14281 - } else if (netif_carrier_ok(dev)) {
14282 - netif_stop_queue(dev);
14283 - netif_carrier_off(dev);
14284 - }
14285 + for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
14286 + skb_frag_t *fragp = &skb_shinfo(skb)->frags[frag];
14287 + if (fragp->size <= 8 && fragp->page_offset & 7)
14288 + return 1;
14289 }
14290
14291 -#ifdef MV643XX_NAPI
14292 - if (eth_int_cause & ETH_INT_CAUSE_RX) {
14293 - /* schedule the NAPI poll routine to maintain port */
14294 - wrl(mp, INTERRUPT_MASK_REG(port_num), ETH_INT_MASK_ALL);
14295 + return 0;
14296 +}
14297
14298 - /* wait for previous write to complete */
14299 - rdl(mp, INTERRUPT_MASK_REG(port_num));
14300 +static int txq_alloc_desc_index(struct tx_queue *txq)
14301 +{
14302 + int tx_desc_curr;
14303
14304 - netif_rx_schedule(dev, &mp->napi);
14305 - }
14306 -#else
14307 - if (eth_int_cause & ETH_INT_CAUSE_RX)
14308 - mv643xx_eth_receive_queue(dev, INT_MAX);
14309 -#endif
14310 - if (eth_int_cause_ext & ETH_INT_CAUSE_TX)
14311 - mv643xx_eth_free_completed_tx_descs(dev);
14312 + BUG_ON(txq->tx_desc_count >= txq->tx_ring_size);
14313
14314 - /*
14315 - * If no real interrupt occured, exit.
14316 - * This can happen when using gigE interrupt coalescing mechanism.
14317 - */
14318 - if ((eth_int_cause == 0x0) && (eth_int_cause_ext == 0x0))
14319 - return IRQ_NONE;
14320 + tx_desc_curr = txq->tx_curr_desc;
14321 + txq->tx_curr_desc = (tx_desc_curr + 1) % txq->tx_ring_size;
14322
14323 - return IRQ_HANDLED;
14324 -}
14325 -
14326 -#ifdef MV643XX_COAL
14327 -
14328 -/*
14329 - * eth_port_set_rx_coal - Sets coalescing interrupt mechanism on RX path
14330 - *
14331 - * DESCRIPTION:
14332 - * This routine sets the RX coalescing interrupt mechanism parameter.
14333 - * This parameter is a timeout counter, that counts in 64 t_clk
14334 - * chunks ; that when timeout event occurs a maskable interrupt
14335 - * occurs.
14336 - * The parameter is calculated using the tClk of the MV-643xx chip
14337 - * , and the required delay of the interrupt in usec.
14338 - *
14339 - * INPUT:
14340 - * struct mv643xx_private *mp Ethernet port
14341 - * unsigned int delay Delay in usec
14342 - *
14343 - * OUTPUT:
14344 - * Interrupt coalescing mechanism value is set in MV-643xx chip.
14345 - *
14346 - * RETURN:
14347 - * The interrupt coalescing value set in the gigE port.
14348 - *
14349 - */
14350 -static unsigned int eth_port_set_rx_coal(struct mv643xx_private *mp,
14351 - unsigned int delay)
14352 -{
14353 - unsigned int port_num = mp->port_num;
14354 - unsigned int coal = ((mp->shared->t_clk / 1000000) * delay) / 64;
14355 -
14356 - /* Set RX Coalescing mechanism */
14357 - wrl(mp, SDMA_CONFIG_REG(port_num),
14358 - ((coal & 0x3fff) << 8) |
14359 - (rdl(mp, SDMA_CONFIG_REG(port_num))
14360 - & 0xffc000ff));
14361 -
14362 - return coal;
14363 -}
14364 -#endif
14365 -
14366 -/*
14367 - * eth_port_set_tx_coal - Sets coalescing interrupt mechanism on TX path
14368 - *
14369 - * DESCRIPTION:
14370 - * This routine sets the TX coalescing interrupt mechanism parameter.
14371 - * This parameter is a timeout counter, that counts in 64 t_clk
14372 - * chunks ; that when timeout event occurs a maskable interrupt
14373 - * occurs.
14374 - * The parameter is calculated using the t_cLK frequency of the
14375 - * MV-643xx chip and the required delay in the interrupt in uSec
14376 - *
14377 - * INPUT:
14378 - * struct mv643xx_private *mp Ethernet port
14379 - * unsigned int delay Delay in uSeconds
14380 - *
14381 - * OUTPUT:
14382 - * Interrupt coalescing mechanism value is set in MV-643xx chip.
14383 - *
14384 - * RETURN:
14385 - * The interrupt coalescing value set in the gigE port.
14386 - *
14387 - */
14388 -static unsigned int eth_port_set_tx_coal(struct mv643xx_private *mp,
14389 - unsigned int delay)
14390 -{
14391 - unsigned int coal = ((mp->shared->t_clk / 1000000) * delay) / 64;
14392 -
14393 - /* Set TX Coalescing mechanism */
14394 - wrl(mp, TX_FIFO_URGENT_THRESHOLD_REG(mp->port_num), coal << 4);
14395 -
14396 - return coal;
14397 -}
14398 -
14399 -/*
14400 - * ether_init_rx_desc_ring - Curve a Rx chain desc list and buffer in memory.
14401 - *
14402 - * DESCRIPTION:
14403 - * This function prepares a Rx chained list of descriptors and packet
14404 - * buffers in a form of a ring. The routine must be called after port
14405 - * initialization routine and before port start routine.
14406 - * The Ethernet SDMA engine uses CPU bus addresses to access the various
14407 - * devices in the system (i.e. DRAM). This function uses the ethernet
14408 - * struct 'virtual to physical' routine (set by the user) to set the ring
14409 - * with physical addresses.
14410 - *
14411 - * INPUT:
14412 - * struct mv643xx_private *mp Ethernet Port Control srtuct.
14413 - *
14414 - * OUTPUT:
14415 - * The routine updates the Ethernet port control struct with information
14416 - * regarding the Rx descriptors and buffers.
14417 - *
14418 - * RETURN:
14419 - * None.
14420 - */
14421 -static void ether_init_rx_desc_ring(struct mv643xx_private *mp)
14422 -{
14423 - volatile struct eth_rx_desc *p_rx_desc;
14424 - int rx_desc_num = mp->rx_ring_size;
14425 - int i;
14426 -
14427 - /* initialize the next_desc_ptr links in the Rx descriptors ring */
14428 - p_rx_desc = (struct eth_rx_desc *)mp->p_rx_desc_area;
14429 - for (i = 0; i < rx_desc_num; i++) {
14430 - p_rx_desc[i].next_desc_ptr = mp->rx_desc_dma +
14431 - ((i + 1) % rx_desc_num) * sizeof(struct eth_rx_desc);
14432 - }
14433 -
14434 - /* Save Rx desc pointer to driver struct. */
14435 - mp->rx_curr_desc_q = 0;
14436 - mp->rx_used_desc_q = 0;
14437 -
14438 - mp->rx_desc_area_size = rx_desc_num * sizeof(struct eth_rx_desc);
14439 -}
14440 -
14441 -/*
14442 - * ether_init_tx_desc_ring - Curve a Tx chain desc list and buffer in memory.
14443 - *
14444 - * DESCRIPTION:
14445 - * This function prepares a Tx chained list of descriptors and packet
14446 - * buffers in a form of a ring. The routine must be called after port
14447 - * initialization routine and before port start routine.
14448 - * The Ethernet SDMA engine uses CPU bus addresses to access the various
14449 - * devices in the system (i.e. DRAM). This function uses the ethernet
14450 - * struct 'virtual to physical' routine (set by the user) to set the ring
14451 - * with physical addresses.
14452 - *
14453 - * INPUT:
14454 - * struct mv643xx_private *mp Ethernet Port Control srtuct.
14455 - *
14456 - * OUTPUT:
14457 - * The routine updates the Ethernet port control struct with information
14458 - * regarding the Tx descriptors and buffers.
14459 - *
14460 - * RETURN:
14461 - * None.
14462 - */
14463 -static void ether_init_tx_desc_ring(struct mv643xx_private *mp)
14464 -{
14465 - int tx_desc_num = mp->tx_ring_size;
14466 - struct eth_tx_desc *p_tx_desc;
14467 - int i;
14468 -
14469 - /* Initialize the next_desc_ptr links in the Tx descriptors ring */
14470 - p_tx_desc = (struct eth_tx_desc *)mp->p_tx_desc_area;
14471 - for (i = 0; i < tx_desc_num; i++) {
14472 - p_tx_desc[i].next_desc_ptr = mp->tx_desc_dma +
14473 - ((i + 1) % tx_desc_num) * sizeof(struct eth_tx_desc);
14474 - }
14475 -
14476 - mp->tx_curr_desc_q = 0;
14477 - mp->tx_used_desc_q = 0;
14478 -
14479 - mp->tx_desc_area_size = tx_desc_num * sizeof(struct eth_tx_desc);
14480 -}
14481 -
14482 -static int mv643xx_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
14483 -{
14484 - struct mv643xx_private *mp = netdev_priv(dev);
14485 - int err;
14486 -
14487 - spin_lock_irq(&mp->lock);
14488 - err = mii_ethtool_sset(&mp->mii, cmd);
14489 - spin_unlock_irq(&mp->lock);
14490 -
14491 - return err;
14492 -}
14493 -
14494 -static int mv643xx_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
14495 -{
14496 - struct mv643xx_private *mp = netdev_priv(dev);
14497 - int err;
14498 -
14499 - spin_lock_irq(&mp->lock);
14500 - err = mii_ethtool_gset(&mp->mii, cmd);
14501 - spin_unlock_irq(&mp->lock);
14502 -
14503 - /* The PHY may support 1000baseT_Half, but the mv643xx does not */
14504 - cmd->supported &= ~SUPPORTED_1000baseT_Half;
14505 - cmd->advertising &= ~ADVERTISED_1000baseT_Half;
14506 -
14507 - return err;
14508 -}
14509 -
14510 -/*
14511 - * mv643xx_eth_open
14512 - *
14513 - * This function is called when openning the network device. The function
14514 - * should initialize all the hardware, initialize cyclic Rx/Tx
14515 - * descriptors chain and buffers and allocate an IRQ to the network
14516 - * device.
14517 - *
14518 - * Input : a pointer to the network device structure
14519 - *
14520 - * Output : zero of success , nonzero if fails.
14521 - */
14522 -
14523 -static int mv643xx_eth_open(struct net_device *dev)
14524 -{
14525 - struct mv643xx_private *mp = netdev_priv(dev);
14526 - unsigned int port_num = mp->port_num;
14527 - unsigned int size;
14528 - int err;
14529 -
14530 - /* Clear any pending ethernet port interrupts */
14531 - wrl(mp, INTERRUPT_CAUSE_REG(port_num), 0);
14532 - wrl(mp, INTERRUPT_CAUSE_EXTEND_REG(port_num), 0);
14533 - /* wait for previous write to complete */
14534 - rdl(mp, INTERRUPT_CAUSE_EXTEND_REG(port_num));
14535 -
14536 - err = request_irq(dev->irq, mv643xx_eth_int_handler,
14537 - IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev);
14538 - if (err) {
14539 - printk(KERN_ERR "%s: Can not assign IRQ\n", dev->name);
14540 - return -EAGAIN;
14541 - }
14542 -
14543 - eth_port_init(mp);
14544 -
14545 - memset(&mp->timeout, 0, sizeof(struct timer_list));
14546 - mp->timeout.function = mv643xx_eth_rx_refill_descs_timer_wrapper;
14547 - mp->timeout.data = (unsigned long)dev;
14548 -
14549 - /* Allocate RX and TX skb rings */
14550 - mp->rx_skb = kmalloc(sizeof(*mp->rx_skb) * mp->rx_ring_size,
14551 - GFP_KERNEL);
14552 - if (!mp->rx_skb) {
14553 - printk(KERN_ERR "%s: Cannot allocate Rx skb ring\n", dev->name);
14554 - err = -ENOMEM;
14555 - goto out_free_irq;
14556 - }
14557 - mp->tx_skb = kmalloc(sizeof(*mp->tx_skb) * mp->tx_ring_size,
14558 - GFP_KERNEL);
14559 - if (!mp->tx_skb) {
14560 - printk(KERN_ERR "%s: Cannot allocate Tx skb ring\n", dev->name);
14561 - err = -ENOMEM;
14562 - goto out_free_rx_skb;
14563 - }
14564 -
14565 - /* Allocate TX ring */
14566 - mp->tx_desc_count = 0;
14567 - size = mp->tx_ring_size * sizeof(struct eth_tx_desc);
14568 - mp->tx_desc_area_size = size;
14569 -
14570 - if (mp->tx_sram_size) {
14571 - mp->p_tx_desc_area = ioremap(mp->tx_sram_addr,
14572 - mp->tx_sram_size);
14573 - mp->tx_desc_dma = mp->tx_sram_addr;
14574 - } else
14575 - mp->p_tx_desc_area = dma_alloc_coherent(NULL, size,
14576 - &mp->tx_desc_dma,
14577 - GFP_KERNEL);
14578 -
14579 - if (!mp->p_tx_desc_area) {
14580 - printk(KERN_ERR "%s: Cannot allocate Tx Ring (size %d bytes)\n",
14581 - dev->name, size);
14582 - err = -ENOMEM;
14583 - goto out_free_tx_skb;
14584 - }
14585 - BUG_ON((u32) mp->p_tx_desc_area & 0xf); /* check 16-byte alignment */
14586 - memset((void *)mp->p_tx_desc_area, 0, mp->tx_desc_area_size);
14587 -
14588 - ether_init_tx_desc_ring(mp);
14589 -
14590 - /* Allocate RX ring */
14591 - mp->rx_desc_count = 0;
14592 - size = mp->rx_ring_size * sizeof(struct eth_rx_desc);
14593 - mp->rx_desc_area_size = size;
14594 -
14595 - if (mp->rx_sram_size) {
14596 - mp->p_rx_desc_area = ioremap(mp->rx_sram_addr,
14597 - mp->rx_sram_size);
14598 - mp->rx_desc_dma = mp->rx_sram_addr;
14599 - } else
14600 - mp->p_rx_desc_area = dma_alloc_coherent(NULL, size,
14601 - &mp->rx_desc_dma,
14602 - GFP_KERNEL);
14603 -
14604 - if (!mp->p_rx_desc_area) {
14605 - printk(KERN_ERR "%s: Cannot allocate Rx ring (size %d bytes)\n",
14606 - dev->name, size);
14607 - printk(KERN_ERR "%s: Freeing previously allocated TX queues...",
14608 - dev->name);
14609 - if (mp->rx_sram_size)
14610 - iounmap(mp->p_tx_desc_area);
14611 - else
14612 - dma_free_coherent(NULL, mp->tx_desc_area_size,
14613 - mp->p_tx_desc_area, mp->tx_desc_dma);
14614 - err = -ENOMEM;
14615 - goto out_free_tx_skb;
14616 - }
14617 - memset((void *)mp->p_rx_desc_area, 0, size);
14618 -
14619 - ether_init_rx_desc_ring(mp);
14620 -
14621 - mv643xx_eth_rx_refill_descs(dev); /* Fill RX ring with skb's */
14622 -
14623 -#ifdef MV643XX_NAPI
14624 - napi_enable(&mp->napi);
14625 -#endif
14626 -
14627 - eth_port_start(dev);
14628 -
14629 - /* Interrupt Coalescing */
14630 -
14631 -#ifdef MV643XX_COAL
14632 - mp->rx_int_coal =
14633 - eth_port_set_rx_coal(mp, MV643XX_RX_COAL);
14634 -#endif
14635 -
14636 - mp->tx_int_coal =
14637 - eth_port_set_tx_coal(mp, MV643XX_TX_COAL);
14638 -
14639 - /* Unmask phy and link status changes interrupts */
14640 - wrl(mp, INTERRUPT_EXTEND_MASK_REG(port_num), ETH_INT_UNMASK_ALL_EXT);
14641 -
14642 - /* Unmask RX buffer and TX end interrupt */
14643 - wrl(mp, INTERRUPT_MASK_REG(port_num), ETH_INT_UNMASK_ALL);
14644 -
14645 - return 0;
14646 -
14647 -out_free_tx_skb:
14648 - kfree(mp->tx_skb);
14649 -out_free_rx_skb:
14650 - kfree(mp->rx_skb);
14651 -out_free_irq:
14652 - free_irq(dev->irq, dev);
14653 -
14654 - return err;
14655 -}
14656 -
14657 -static void mv643xx_eth_free_tx_rings(struct net_device *dev)
14658 -{
14659 - struct mv643xx_private *mp = netdev_priv(dev);
14660 -
14661 - /* Stop Tx Queues */
14662 - mv643xx_eth_port_disable_tx(mp);
14663 -
14664 - /* Free outstanding skb's on TX ring */
14665 - mv643xx_eth_free_all_tx_descs(dev);
14666 -
14667 - BUG_ON(mp->tx_used_desc_q != mp->tx_curr_desc_q);
14668 -
14669 - /* Free TX ring */
14670 - if (mp->tx_sram_size)
14671 - iounmap(mp->p_tx_desc_area);
14672 - else
14673 - dma_free_coherent(NULL, mp->tx_desc_area_size,
14674 - mp->p_tx_desc_area, mp->tx_desc_dma);
14675 -}
14676 -
14677 -static void mv643xx_eth_free_rx_rings(struct net_device *dev)
14678 -{
14679 - struct mv643xx_private *mp = netdev_priv(dev);
14680 - int curr;
14681 -
14682 - /* Stop RX Queues */
14683 - mv643xx_eth_port_disable_rx(mp);
14684 -
14685 - /* Free preallocated skb's on RX rings */
14686 - for (curr = 0; mp->rx_desc_count && curr < mp->rx_ring_size; curr++) {
14687 - if (mp->rx_skb[curr]) {
14688 - dev_kfree_skb(mp->rx_skb[curr]);
14689 - mp->rx_desc_count--;
14690 - }
14691 - }
14692 -
14693 - if (mp->rx_desc_count)
14694 - printk(KERN_ERR
14695 - "%s: Error in freeing Rx Ring. %d skb's still"
14696 - " stuck in RX Ring - ignoring them\n", dev->name,
14697 - mp->rx_desc_count);
14698 - /* Free RX ring */
14699 - if (mp->rx_sram_size)
14700 - iounmap(mp->p_rx_desc_area);
14701 - else
14702 - dma_free_coherent(NULL, mp->rx_desc_area_size,
14703 - mp->p_rx_desc_area, mp->rx_desc_dma);
14704 -}
14705 -
14706 -/*
14707 - * mv643xx_eth_stop
14708 - *
14709 - * This function is used when closing the network device.
14710 - * It updates the hardware,
14711 - * release all memory that holds buffers and descriptors and release the IRQ.
14712 - * Input : a pointer to the device structure
14713 - * Output : zero if success , nonzero if fails
14714 - */
14715 -
14716 -static int mv643xx_eth_stop(struct net_device *dev)
14717 -{
14718 - struct mv643xx_private *mp = netdev_priv(dev);
14719 - unsigned int port_num = mp->port_num;
14720 -
14721 - /* Mask all interrupts on ethernet port */
14722 - wrl(mp, INTERRUPT_MASK_REG(port_num), ETH_INT_MASK_ALL);
14723 - /* wait for previous write to complete */
14724 - rdl(mp, INTERRUPT_MASK_REG(port_num));
14725 -
14726 -#ifdef MV643XX_NAPI
14727 - napi_disable(&mp->napi);
14728 -#endif
14729 - netif_carrier_off(dev);
14730 - netif_stop_queue(dev);
14731 -
14732 - eth_port_reset(mp);
14733 -
14734 - mv643xx_eth_free_tx_rings(dev);
14735 - mv643xx_eth_free_rx_rings(dev);
14736 -
14737 - free_irq(dev->irq, dev);
14738 -
14739 - return 0;
14740 -}
14741 -
14742 -#ifdef MV643XX_NAPI
14743 -/*
14744 - * mv643xx_poll
14745 - *
14746 - * This function is used in case of NAPI
14747 - */
14748 -static int mv643xx_poll(struct napi_struct *napi, int budget)
14749 -{
14750 - struct mv643xx_private *mp = container_of(napi, struct mv643xx_private, napi);
14751 - struct net_device *dev = mp->dev;
14752 - unsigned int port_num = mp->port_num;
14753 - int work_done;
14754 -
14755 -#ifdef MV643XX_TX_FAST_REFILL
14756 - if (++mp->tx_clean_threshold > 5) {
14757 - mv643xx_eth_free_completed_tx_descs(dev);
14758 - mp->tx_clean_threshold = 0;
14759 - }
14760 -#endif
14761 -
14762 - work_done = 0;
14763 - if ((rdl(mp, RX_CURRENT_QUEUE_DESC_PTR_0(port_num)))
14764 - != (u32) mp->rx_used_desc_q)
14765 - work_done = mv643xx_eth_receive_queue(dev, budget);
14766 -
14767 - if (work_done < budget) {
14768 - netif_rx_complete(dev, napi);
14769 - wrl(mp, INTERRUPT_CAUSE_REG(port_num), 0);
14770 - wrl(mp, INTERRUPT_CAUSE_EXTEND_REG(port_num), 0);
14771 - wrl(mp, INTERRUPT_MASK_REG(port_num), ETH_INT_UNMASK_ALL);
14772 - }
14773 -
14774 - return work_done;
14775 -}
14776 -#endif
14777 -
14778 -/**
14779 - * has_tiny_unaligned_frags - check if skb has any small, unaligned fragments
14780 - *
14781 - * Hardware can't handle unaligned fragments smaller than 9 bytes.
14782 - * This helper function detects that case.
14783 - */
14784 -
14785 -static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb)
14786 -{
14787 - unsigned int frag;
14788 - skb_frag_t *fragp;
14789 -
14790 - for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
14791 - fragp = &skb_shinfo(skb)->frags[frag];
14792 - if (fragp->size <= 8 && fragp->page_offset & 0x7)
14793 - return 1;
14794 - }
14795 - return 0;
14796 -}
14797 -
14798 -/**
14799 - * eth_alloc_tx_desc_index - return the index of the next available tx desc
14800 - */
14801 -static int eth_alloc_tx_desc_index(struct mv643xx_private *mp)
14802 -{
14803 - int tx_desc_curr;
14804 -
14805 - BUG_ON(mp->tx_desc_count >= mp->tx_ring_size);
14806 -
14807 - tx_desc_curr = mp->tx_curr_desc_q;
14808 - mp->tx_curr_desc_q = (tx_desc_curr + 1) % mp->tx_ring_size;
14809 -
14810 - BUG_ON(mp->tx_curr_desc_q == mp->tx_used_desc_q);
14811 + BUG_ON(txq->tx_curr_desc == txq->tx_used_desc);
14812
14813 return tx_desc_curr;
14814 }
14815
14816 -/**
14817 - * eth_tx_fill_frag_descs - fill tx hw descriptors for an skb's fragments.
14818 - *
14819 - * Ensure the data for each fragment to be transmitted is mapped properly,
14820 - * then fill in descriptors in the tx hw queue.
14821 - */
14822 -static void eth_tx_fill_frag_descs(struct mv643xx_private *mp,
14823 - struct sk_buff *skb)
14824 +static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb)
14825 {
14826 + int nr_frags = skb_shinfo(skb)->nr_frags;
14827 int frag;
14828 - int tx_index;
14829 - struct eth_tx_desc *desc;
14830 -
14831 - for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
14832 - skb_frag_t *this_frag = &skb_shinfo(skb)->frags[frag];
14833
14834 - tx_index = eth_alloc_tx_desc_index(mp);
14835 - desc = &mp->p_tx_desc_area[tx_index];
14836 + for (frag = 0; frag < nr_frags; frag++) {
14837 + skb_frag_t *this_frag;
14838 + int tx_index;
14839 + struct tx_desc *desc;
14840 +
14841 + this_frag = &skb_shinfo(skb)->frags[frag];
14842 + tx_index = txq_alloc_desc_index(txq);
14843 + desc = &txq->tx_desc_area[tx_index];
14844
14845 - desc->cmd_sts = ETH_BUFFER_OWNED_BY_DMA;
14846 - /* Last Frag enables interrupt and frees the skb */
14847 - if (frag == (skb_shinfo(skb)->nr_frags - 1)) {
14848 - desc->cmd_sts |= ETH_ZERO_PADDING |
14849 - ETH_TX_LAST_DESC |
14850 - ETH_TX_ENABLE_INTERRUPT;
14851 - mp->tx_skb[tx_index] = skb;
14852 - } else
14853 - mp->tx_skb[tx_index] = NULL;
14854 + /*
14855 + * The last fragment will generate an interrupt
14856 + * which will free the skb on TX completion.
14857 + */
14858 + if (frag == nr_frags - 1) {
14859 + desc->cmd_sts = BUFFER_OWNED_BY_DMA |
14860 + ZERO_PADDING | TX_LAST_DESC |
14861 + TX_ENABLE_INTERRUPT;
14862 + txq->tx_skb[tx_index] = skb;
14863 + } else {
14864 + desc->cmd_sts = BUFFER_OWNED_BY_DMA;
14865 + txq->tx_skb[tx_index] = NULL;
14866 + }
14867
14868 - desc = &mp->p_tx_desc_area[tx_index];
14869 desc->l4i_chk = 0;
14870 desc->byte_cnt = this_frag->size;
14871 desc->buf_ptr = dma_map_page(NULL, this_frag->page,
14872 @@ -1651,37 +704,28 @@
14873 return (__force __be16)sum;
14874 }
14875
14876 -/**
14877 - * eth_tx_submit_descs_for_skb - submit data from an skb to the tx hw
14878 - *
14879 - * Ensure the data for an skb to be transmitted is mapped properly,
14880 - * then fill in descriptors in the tx hw queue and start the hardware.
14881 - */
14882 -static void eth_tx_submit_descs_for_skb(struct mv643xx_private *mp,
14883 - struct sk_buff *skb)
14884 +static void txq_submit_skb(struct tx_queue *txq, struct sk_buff *skb)
14885 {
14886 + int nr_frags = skb_shinfo(skb)->nr_frags;
14887 int tx_index;
14888 - struct eth_tx_desc *desc;
14889 + struct tx_desc *desc;
14890 u32 cmd_sts;
14891 int length;
14892 - int nr_frags = skb_shinfo(skb)->nr_frags;
14893
14894 - cmd_sts = ETH_TX_FIRST_DESC | ETH_GEN_CRC | ETH_BUFFER_OWNED_BY_DMA;
14895 + cmd_sts = TX_FIRST_DESC | GEN_CRC | BUFFER_OWNED_BY_DMA;
14896
14897 - tx_index = eth_alloc_tx_desc_index(mp);
14898 - desc = &mp->p_tx_desc_area[tx_index];
14899 + tx_index = txq_alloc_desc_index(txq);
14900 + desc = &txq->tx_desc_area[tx_index];
14901
14902 if (nr_frags) {
14903 - eth_tx_fill_frag_descs(mp, skb);
14904 + txq_submit_frag_skb(txq, skb);
14905
14906 length = skb_headlen(skb);
14907 - mp->tx_skb[tx_index] = NULL;
14908 + txq->tx_skb[tx_index] = NULL;
14909 } else {
14910 - cmd_sts |= ETH_ZERO_PADDING |
14911 - ETH_TX_LAST_DESC |
14912 - ETH_TX_ENABLE_INTERRUPT;
14913 + cmd_sts |= ZERO_PADDING | TX_LAST_DESC | TX_ENABLE_INTERRUPT;
14914 length = skb->len;
14915 - mp->tx_skb[tx_index] = skb;
14916 + txq->tx_skb[tx_index] = skb;
14917 }
14918
14919 desc->byte_cnt = length;
14920 @@ -1690,13 +734,13 @@
14921 if (skb->ip_summed == CHECKSUM_PARTIAL) {
14922 BUG_ON(skb->protocol != htons(ETH_P_IP));
14923
14924 - cmd_sts |= ETH_GEN_TCP_UDP_CHECKSUM |
14925 - ETH_GEN_IP_V_4_CHECKSUM |
14926 - ip_hdr(skb)->ihl << ETH_TX_IHL_SHIFT;
14927 + cmd_sts |= GEN_TCP_UDP_CHECKSUM |
14928 + GEN_IP_V4_CHECKSUM |
14929 + ip_hdr(skb)->ihl << TX_IHL_SHIFT;
14930
14931 switch (ip_hdr(skb)->protocol) {
14932 case IPPROTO_UDP:
14933 - cmd_sts |= ETH_UDP_FRAME;
14934 + cmd_sts |= UDP_FRAME;
14935 desc->l4i_chk = ntohs(sum16_as_be(udp_hdr(skb)->check));
14936 break;
14937 case IPPROTO_TCP:
14938 @@ -1707,7 +751,7 @@
14939 }
14940 } else {
14941 /* Errata BTS #50, IHL must be 5 if no HW checksum */
14942 - cmd_sts |= 5 << ETH_TX_IHL_SHIFT;
14943 + cmd_sts |= 5 << TX_IHL_SHIFT;
14944 desc->l4i_chk = 0;
14945 }
14946
14947 @@ -1717,1649 +761,1818 @@
14948
14949 /* ensure all descriptors are written before poking hardware */
14950 wmb();
14951 - mv643xx_eth_port_enable_tx(mp, ETH_TX_QUEUES_ENABLED);
14952 + txq_enable(txq);
14953
14954 - mp->tx_desc_count += nr_frags + 1;
14955 + txq->tx_desc_count += nr_frags + 1;
14956 }
14957
14958 -/**
14959 - * mv643xx_eth_start_xmit - queue an skb to the hardware for transmission
14960 - *
14961 - */
14962 -static int mv643xx_eth_start_xmit(struct sk_buff *skb, struct net_device *dev)
14963 +static int mv643xx_eth_xmit(struct sk_buff *skb, struct net_device *dev)
14964 {
14965 - struct mv643xx_private *mp = netdev_priv(dev);
14966 + struct mv643xx_eth_private *mp = netdev_priv(dev);
14967 struct net_device_stats *stats = &dev->stats;
14968 + struct tx_queue *txq;
14969 unsigned long flags;
14970
14971 - BUG_ON(netif_queue_stopped(dev));
14972 -
14973 if (has_tiny_unaligned_frags(skb) && __skb_linearize(skb)) {
14974 stats->tx_dropped++;
14975 - printk(KERN_DEBUG "%s: failed to linearize tiny "
14976 - "unaligned fragment\n", dev->name);
14977 + dev_printk(KERN_DEBUG, &dev->dev,
14978 + "failed to linearize skb with tiny "
14979 + "unaligned fragment\n");
14980 return NETDEV_TX_BUSY;
14981 }
14982
14983 spin_lock_irqsave(&mp->lock, flags);
14984
14985 - if (mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB) {
14986 - printk(KERN_ERR "%s: transmit with queue full\n", dev->name);
14987 - netif_stop_queue(dev);
14988 + txq = mp->txq + mp->txq_primary;
14989 +
14990 + if (txq->tx_ring_size - txq->tx_desc_count < MAX_DESCS_PER_SKB) {
14991 spin_unlock_irqrestore(&mp->lock, flags);
14992 - return NETDEV_TX_BUSY;
14993 + if (txq->index == mp->txq_primary && net_ratelimit())
14994 + dev_printk(KERN_ERR, &dev->dev,
14995 + "primary tx queue full?!\n");
14996 + kfree_skb(skb);
14997 + return NETDEV_TX_OK;
14998 }
14999
15000 - eth_tx_submit_descs_for_skb(mp, skb);
15001 + txq_submit_skb(txq, skb);
15002 stats->tx_bytes += skb->len;
15003 stats->tx_packets++;
15004 dev->trans_start = jiffies;
15005
15006 - if (mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB)
15007 - netif_stop_queue(dev);
15008 + if (txq->index == mp->txq_primary) {
15009 + int entries_left;
15010 +
15011 + entries_left = txq->tx_ring_size - txq->tx_desc_count;
15012 + if (entries_left < MAX_DESCS_PER_SKB)
15013 + netif_stop_queue(dev);
15014 + }
15015
15016 spin_unlock_irqrestore(&mp->lock, flags);
15017
15018 return NETDEV_TX_OK;
15019 }
15020
15021 -#ifdef CONFIG_NET_POLL_CONTROLLER
15022 -static void mv643xx_netpoll(struct net_device *netdev)
15023 +
15024 +/* tx rate control **********************************************************/
15025 +/*
15026 + * Set total maximum TX rate (shared by all TX queues for this port)
15027 + * to 'rate' bits per second, with a maximum burst of 'burst' bytes.
15028 + */
15029 +static void tx_set_rate(struct mv643xx_eth_private *mp, int rate, int burst)
15030 {
15031 - struct mv643xx_private *mp = netdev_priv(netdev);
15032 - int port_num = mp->port_num;
15033 + int token_rate;
15034 + int mtu;
15035 + int bucket_size;
15036 +
15037 + token_rate = ((rate / 1000) * 64) / (mp->shared->t_clk / 1000);
15038 + if (token_rate > 1023)
15039 + token_rate = 1023;
15040
15041 - wrl(mp, INTERRUPT_MASK_REG(port_num), ETH_INT_MASK_ALL);
15042 - /* wait for previous write to complete */
15043 - rdl(mp, INTERRUPT_MASK_REG(port_num));
15044 + mtu = (mp->dev->mtu + 255) >> 8;
15045 + if (mtu > 63)
15046 + mtu = 63;
15047
15048 - mv643xx_eth_int_handler(netdev->irq, netdev);
15049 + bucket_size = (burst + 255) >> 8;
15050 + if (bucket_size > 65535)
15051 + bucket_size = 65535;
15052
15053 - wrl(mp, INTERRUPT_MASK_REG(port_num), ETH_INT_UNMASK_ALL);
15054 + if (mp->shared->tx_bw_control_moved) {
15055 + wrl(mp, TX_BW_RATE_MOVED(mp->port_num), token_rate);
15056 + wrl(mp, TX_BW_MTU_MOVED(mp->port_num), mtu);
15057 + wrl(mp, TX_BW_BURST_MOVED(mp->port_num), bucket_size);
15058 + } else {
15059 + wrl(mp, TX_BW_RATE(mp->port_num), token_rate);
15060 + wrl(mp, TX_BW_MTU(mp->port_num), mtu);
15061 + wrl(mp, TX_BW_BURST(mp->port_num), bucket_size);
15062 + }
15063 }
15064 -#endif
15065
15066 -static void mv643xx_init_ethtool_cmd(struct net_device *dev, int phy_address,
15067 - int speed, int duplex,
15068 - struct ethtool_cmd *cmd)
15069 +static void txq_set_rate(struct tx_queue *txq, int rate, int burst)
15070 {
15071 - struct mv643xx_private *mp = netdev_priv(dev);
15072 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
15073 + int token_rate;
15074 + int bucket_size;
15075
15076 - memset(cmd, 0, sizeof(*cmd));
15077 + token_rate = ((rate / 1000) * 64) / (mp->shared->t_clk / 1000);
15078 + if (token_rate > 1023)
15079 + token_rate = 1023;
15080
15081 - cmd->port = PORT_MII;
15082 - cmd->transceiver = XCVR_INTERNAL;
15083 - cmd->phy_address = phy_address;
15084 + bucket_size = (burst + 255) >> 8;
15085 + if (bucket_size > 65535)
15086 + bucket_size = 65535;
15087
15088 - if (speed == 0) {
15089 - cmd->autoneg = AUTONEG_ENABLE;
15090 - /* mii lib checks, but doesn't use speed on AUTONEG_ENABLE */
15091 - cmd->speed = SPEED_100;
15092 - cmd->advertising = ADVERTISED_10baseT_Half |
15093 - ADVERTISED_10baseT_Full |
15094 - ADVERTISED_100baseT_Half |
15095 - ADVERTISED_100baseT_Full;
15096 - if (mp->mii.supports_gmii)
15097 - cmd->advertising |= ADVERTISED_1000baseT_Full;
15098 - } else {
15099 - cmd->autoneg = AUTONEG_DISABLE;
15100 - cmd->speed = speed;
15101 - cmd->duplex = duplex;
15102 - }
15103 + wrl(mp, TXQ_BW_TOKENS(mp->port_num, txq->index), token_rate << 14);
15104 + wrl(mp, TXQ_BW_CONF(mp->port_num, txq->index),
15105 + (bucket_size << 10) | token_rate);
15106 }
15107
15108 -/*/
15109 - * mv643xx_eth_probe
15110 - *
15111 - * First function called after registering the network device.
15112 - * It's purpose is to initialize the device as an ethernet device,
15113 - * fill the ethernet device structure with pointers * to functions,
15114 - * and set the MAC address of the interface
15115 - *
15116 - * Input : struct device *
15117 - * Output : -ENOMEM if failed , 0 if success
15118 - */
15119 -static int mv643xx_eth_probe(struct platform_device *pdev)
15120 +static void txq_set_fixed_prio_mode(struct tx_queue *txq)
15121 {
15122 - struct mv643xx_eth_platform_data *pd;
15123 - int port_num;
15124 - struct mv643xx_private *mp;
15125 - struct net_device *dev;
15126 - u8 *p;
15127 - struct resource *res;
15128 - int err;
15129 - struct ethtool_cmd cmd;
15130 - int duplex = DUPLEX_HALF;
15131 - int speed = 0; /* default to auto-negotiation */
15132 - DECLARE_MAC_BUF(mac);
15133 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
15134 + int off;
15135 + u32 val;
15136
15137 - pd = pdev->dev.platform_data;
15138 - if (pd == NULL) {
15139 - printk(KERN_ERR "No mv643xx_eth_platform_data\n");
15140 - return -ENODEV;
15141 - }
15142 + /*
15143 + * Turn on fixed priority mode.
15144 + */
15145 + if (mp->shared->tx_bw_control_moved)
15146 + off = TXQ_FIX_PRIO_CONF_MOVED(mp->port_num);
15147 + else
15148 + off = TXQ_FIX_PRIO_CONF(mp->port_num);
15149
15150 - if (pd->shared == NULL) {
15151 - printk(KERN_ERR "No mv643xx_eth_platform_data->shared\n");
15152 - return -ENODEV;
15153 - }
15154 + val = rdl(mp, off);
15155 + val |= 1 << txq->index;
15156 + wrl(mp, off, val);
15157 +}
15158
15159 - dev = alloc_etherdev(sizeof(struct mv643xx_private));
15160 - if (!dev)
15161 - return -ENOMEM;
15162 +static void txq_set_wrr(struct tx_queue *txq, int weight)
15163 +{
15164 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
15165 + int off;
15166 + u32 val;
15167
15168 - platform_set_drvdata(pdev, dev);
15169 + /*
15170 + * Turn off fixed priority mode.
15171 + */
15172 + if (mp->shared->tx_bw_control_moved)
15173 + off = TXQ_FIX_PRIO_CONF_MOVED(mp->port_num);
15174 + else
15175 + off = TXQ_FIX_PRIO_CONF(mp->port_num);
15176
15177 - mp = netdev_priv(dev);
15178 - mp->dev = dev;
15179 -#ifdef MV643XX_NAPI
15180 - netif_napi_add(dev, &mp->napi, mv643xx_poll, 64);
15181 -#endif
15182 + val = rdl(mp, off);
15183 + val &= ~(1 << txq->index);
15184 + wrl(mp, off, val);
15185
15186 - res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
15187 - BUG_ON(!res);
15188 - dev->irq = res->start;
15189 + /*
15190 + * Configure WRR weight for this queue.
15191 + */
15192 + off = TXQ_BW_WRR_CONF(mp->port_num, txq->index);
15193
15194 - dev->open = mv643xx_eth_open;
15195 - dev->stop = mv643xx_eth_stop;
15196 - dev->hard_start_xmit = mv643xx_eth_start_xmit;
15197 - dev->set_mac_address = mv643xx_eth_set_mac_address;
15198 - dev->set_multicast_list = mv643xx_eth_set_rx_mode;
15199 + val = rdl(mp, off);
15200 + val = (val & ~0xff) | (weight & 0xff);
15201 + wrl(mp, off, val);
15202 +}
15203
15204 - /* No need to Tx Timeout */
15205 - dev->tx_timeout = mv643xx_eth_tx_timeout;
15206
15207 -#ifdef CONFIG_NET_POLL_CONTROLLER
15208 - dev->poll_controller = mv643xx_netpoll;
15209 -#endif
15210 +/* mii management interface *************************************************/
15211 +#define SMI_BUSY 0x10000000
15212 +#define SMI_READ_VALID 0x08000000
15213 +#define SMI_OPCODE_READ 0x04000000
15214 +#define SMI_OPCODE_WRITE 0x00000000
15215
15216 - dev->watchdog_timeo = 2 * HZ;
15217 - dev->base_addr = 0;
15218 - dev->change_mtu = mv643xx_eth_change_mtu;
15219 - dev->do_ioctl = mv643xx_eth_do_ioctl;
15220 - SET_ETHTOOL_OPS(dev, &mv643xx_ethtool_ops);
15221 +static void smi_reg_read(struct mv643xx_eth_private *mp, unsigned int addr,
15222 + unsigned int reg, unsigned int *value)
15223 +{
15224 + void __iomem *smi_reg = mp->shared_smi->base + SMI_REG;
15225 + unsigned long flags;
15226 + int i;
15227 +
15228 + /* the SMI register is a shared resource */
15229 + spin_lock_irqsave(&mp->shared_smi->phy_lock, flags);
15230 +
15231 + /* wait for the SMI register to become available */
15232 + for (i = 0; readl(smi_reg) & SMI_BUSY; i++) {
15233 + if (i == 1000) {
15234 + printk("%s: PHY busy timeout\n", mp->dev->name);
15235 + goto out;
15236 + }
15237 + udelay(10);
15238 + }
15239 +
15240 + writel(SMI_OPCODE_READ | (reg << 21) | (addr << 16), smi_reg);
15241 +
15242 + /* now wait for the data to be valid */
15243 + for (i = 0; !(readl(smi_reg) & SMI_READ_VALID); i++) {
15244 + if (i == 1000) {
15245 + printk("%s: PHY read timeout\n", mp->dev->name);
15246 + goto out;
15247 + }
15248 + udelay(10);
15249 + }
15250 +
15251 + *value = readl(smi_reg) & 0xffff;
15252 +out:
15253 + spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags);
15254 +}
15255 +
15256 +static void smi_reg_write(struct mv643xx_eth_private *mp,
15257 + unsigned int addr,
15258 + unsigned int reg, unsigned int value)
15259 +{
15260 + void __iomem *smi_reg = mp->shared_smi->base + SMI_REG;
15261 + unsigned long flags;
15262 + int i;
15263 +
15264 + /* the SMI register is a shared resource */
15265 + spin_lock_irqsave(&mp->shared_smi->phy_lock, flags);
15266 +
15267 + /* wait for the SMI register to become available */
15268 + for (i = 0; readl(smi_reg) & SMI_BUSY; i++) {
15269 + if (i == 1000) {
15270 + printk("%s: PHY busy timeout\n", mp->dev->name);
15271 + goto out;
15272 + }
15273 + udelay(10);
15274 + }
15275 +
15276 + writel(SMI_OPCODE_WRITE | (reg << 21) |
15277 + (addr << 16) | (value & 0xffff), smi_reg);
15278 +out:
15279 + spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags);
15280 +}
15281 +
15282 +
15283 +/* mib counters *************************************************************/
15284 +static inline u32 mib_read(struct mv643xx_eth_private *mp, int offset)
15285 +{
15286 + return rdl(mp, MIB_COUNTERS(mp->port_num) + offset);
15287 +}
15288 +
15289 +static void mib_counters_clear(struct mv643xx_eth_private *mp)
15290 +{
15291 + int i;
15292 +
15293 + for (i = 0; i < 0x80; i += 4)
15294 + mib_read(mp, i);
15295 +}
15296 +
15297 +static void mib_counters_update(struct mv643xx_eth_private *mp)
15298 +{
15299 + struct mib_counters *p = &mp->mib_counters;
15300 +
15301 + p->good_octets_received += mib_read(mp, 0x00);
15302 + p->good_octets_received += (u64)mib_read(mp, 0x04) << 32;
15303 + p->bad_octets_received += mib_read(mp, 0x08);
15304 + p->internal_mac_transmit_err += mib_read(mp, 0x0c);
15305 + p->good_frames_received += mib_read(mp, 0x10);
15306 + p->bad_frames_received += mib_read(mp, 0x14);
15307 + p->broadcast_frames_received += mib_read(mp, 0x18);
15308 + p->multicast_frames_received += mib_read(mp, 0x1c);
15309 + p->frames_64_octets += mib_read(mp, 0x20);
15310 + p->frames_65_to_127_octets += mib_read(mp, 0x24);
15311 + p->frames_128_to_255_octets += mib_read(mp, 0x28);
15312 + p->frames_256_to_511_octets += mib_read(mp, 0x2c);
15313 + p->frames_512_to_1023_octets += mib_read(mp, 0x30);
15314 + p->frames_1024_to_max_octets += mib_read(mp, 0x34);
15315 + p->good_octets_sent += mib_read(mp, 0x38);
15316 + p->good_octets_sent += (u64)mib_read(mp, 0x3c) << 32;
15317 + p->good_frames_sent += mib_read(mp, 0x40);
15318 + p->excessive_collision += mib_read(mp, 0x44);
15319 + p->multicast_frames_sent += mib_read(mp, 0x48);
15320 + p->broadcast_frames_sent += mib_read(mp, 0x4c);
15321 + p->unrec_mac_control_received += mib_read(mp, 0x50);
15322 + p->fc_sent += mib_read(mp, 0x54);
15323 + p->good_fc_received += mib_read(mp, 0x58);
15324 + p->bad_fc_received += mib_read(mp, 0x5c);
15325 + p->undersize_received += mib_read(mp, 0x60);
15326 + p->fragments_received += mib_read(mp, 0x64);
15327 + p->oversize_received += mib_read(mp, 0x68);
15328 + p->jabber_received += mib_read(mp, 0x6c);
15329 + p->mac_receive_error += mib_read(mp, 0x70);
15330 + p->bad_crc_event += mib_read(mp, 0x74);
15331 + p->collision += mib_read(mp, 0x78);
15332 + p->late_collision += mib_read(mp, 0x7c);
15333 +}
15334 +
15335 +
15336 +/* ethtool ******************************************************************/
15337 +struct mv643xx_eth_stats {
15338 + char stat_string[ETH_GSTRING_LEN];
15339 + int sizeof_stat;
15340 + int netdev_off;
15341 + int mp_off;
15342 +};
15343 +
15344 +#define SSTAT(m) \
15345 + { #m, FIELD_SIZEOF(struct net_device_stats, m), \
15346 + offsetof(struct net_device, stats.m), -1 }
15347 +
15348 +#define MIBSTAT(m) \
15349 + { #m, FIELD_SIZEOF(struct mib_counters, m), \
15350 + -1, offsetof(struct mv643xx_eth_private, mib_counters.m) }
15351 +
15352 +static const struct mv643xx_eth_stats mv643xx_eth_stats[] = {
15353 + SSTAT(rx_packets),
15354 + SSTAT(tx_packets),
15355 + SSTAT(rx_bytes),
15356 + SSTAT(tx_bytes),
15357 + SSTAT(rx_errors),
15358 + SSTAT(tx_errors),
15359 + SSTAT(rx_dropped),
15360 + SSTAT(tx_dropped),
15361 + MIBSTAT(good_octets_received),
15362 + MIBSTAT(bad_octets_received),
15363 + MIBSTAT(internal_mac_transmit_err),
15364 + MIBSTAT(good_frames_received),
15365 + MIBSTAT(bad_frames_received),
15366 + MIBSTAT(broadcast_frames_received),
15367 + MIBSTAT(multicast_frames_received),
15368 + MIBSTAT(frames_64_octets),
15369 + MIBSTAT(frames_65_to_127_octets),
15370 + MIBSTAT(frames_128_to_255_octets),
15371 + MIBSTAT(frames_256_to_511_octets),
15372 + MIBSTAT(frames_512_to_1023_octets),
15373 + MIBSTAT(frames_1024_to_max_octets),
15374 + MIBSTAT(good_octets_sent),
15375 + MIBSTAT(good_frames_sent),
15376 + MIBSTAT(excessive_collision),
15377 + MIBSTAT(multicast_frames_sent),
15378 + MIBSTAT(broadcast_frames_sent),
15379 + MIBSTAT(unrec_mac_control_received),
15380 + MIBSTAT(fc_sent),
15381 + MIBSTAT(good_fc_received),
15382 + MIBSTAT(bad_fc_received),
15383 + MIBSTAT(undersize_received),
15384 + MIBSTAT(fragments_received),
15385 + MIBSTAT(oversize_received),
15386 + MIBSTAT(jabber_received),
15387 + MIBSTAT(mac_receive_error),
15388 + MIBSTAT(bad_crc_event),
15389 + MIBSTAT(collision),
15390 + MIBSTAT(late_collision),
15391 +};
15392 +
15393 +static int mv643xx_eth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
15394 +{
15395 + struct mv643xx_eth_private *mp = netdev_priv(dev);
15396 + int err;
15397 +
15398 + spin_lock_irq(&mp->lock);
15399 + err = mii_ethtool_gset(&mp->mii, cmd);
15400 + spin_unlock_irq(&mp->lock);
15401
15402 -#ifdef MV643XX_CHECKSUM_OFFLOAD_TX
15403 -#ifdef MAX_SKB_FRAGS
15404 /*
15405 - * Zero copy can only work if we use Discovery II memory. Else, we will
15406 - * have to map the buffers to ISA memory which is only 16 MB
15407 + * The MAC does not support 1000baseT_Half.
15408 */
15409 - dev->features = NETIF_F_SG | NETIF_F_IP_CSUM;
15410 -#endif
15411 -#endif
15412 + cmd->supported &= ~SUPPORTED_1000baseT_Half;
15413 + cmd->advertising &= ~ADVERTISED_1000baseT_Half;
15414
15415 - /* Configure the timeout task */
15416 - INIT_WORK(&mp->tx_timeout_task, mv643xx_eth_tx_timeout_task);
15417 + return err;
15418 +}
15419
15420 - spin_lock_init(&mp->lock);
15421 +static int mv643xx_eth_get_settings_phyless(struct net_device *dev, struct ethtool_cmd *cmd)
15422 +{
15423 + cmd->supported = SUPPORTED_MII;
15424 + cmd->advertising = ADVERTISED_MII;
15425 + cmd->speed = SPEED_1000;
15426 + cmd->duplex = DUPLEX_FULL;
15427 + cmd->port = PORT_MII;
15428 + cmd->phy_address = 0;
15429 + cmd->transceiver = XCVR_INTERNAL;
15430 + cmd->autoneg = AUTONEG_DISABLE;
15431 + cmd->maxtxpkt = 1;
15432 + cmd->maxrxpkt = 1;
15433
15434 - mp->shared = platform_get_drvdata(pd->shared);
15435 - port_num = mp->port_num = pd->port_number;
15436 + return 0;
15437 +}
15438
15439 - if (mp->shared->win_protect)
15440 - wrl(mp, WINDOW_PROTECT(port_num), mp->shared->win_protect);
15441 +static int mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
15442 +{
15443 + struct mv643xx_eth_private *mp = netdev_priv(dev);
15444 + int err;
15445
15446 - mp->shared_smi = mp->shared;
15447 - if (pd->shared_smi != NULL)
15448 - mp->shared_smi = platform_get_drvdata(pd->shared_smi);
15449 -
15450 - /* set default config values */
15451 - eth_port_uc_addr_get(mp, dev->dev_addr);
15452 - mp->rx_ring_size = PORT_DEFAULT_RECEIVE_QUEUE_SIZE;
15453 - mp->tx_ring_size = PORT_DEFAULT_TRANSMIT_QUEUE_SIZE;
15454 + /*
15455 + * The MAC does not support 1000baseT_Half.
15456 + */
15457 + cmd->advertising &= ~ADVERTISED_1000baseT_Half;
15458
15459 - if (is_valid_ether_addr(pd->mac_addr))
15460 - memcpy(dev->dev_addr, pd->mac_addr, 6);
15461 + spin_lock_irq(&mp->lock);
15462 + err = mii_ethtool_sset(&mp->mii, cmd);
15463 + spin_unlock_irq(&mp->lock);
15464
15465 - if (pd->phy_addr || pd->force_phy_addr)
15466 - ethernet_phy_set(mp, pd->phy_addr);
15467 + return err;
15468 +}
15469
15470 - if (pd->rx_queue_size)
15471 - mp->rx_ring_size = pd->rx_queue_size;
15472 +static int mv643xx_eth_set_settings_phyless(struct net_device *dev, struct ethtool_cmd *cmd)
15473 +{
15474 + return -EINVAL;
15475 +}
15476
15477 - if (pd->tx_queue_size)
15478 - mp->tx_ring_size = pd->tx_queue_size;
15479 +static void mv643xx_eth_get_drvinfo(struct net_device *dev,
15480 + struct ethtool_drvinfo *drvinfo)
15481 +{
15482 + strncpy(drvinfo->driver, mv643xx_eth_driver_name, 32);
15483 + strncpy(drvinfo->version, mv643xx_eth_driver_version, 32);
15484 + strncpy(drvinfo->fw_version, "N/A", 32);
15485 + strncpy(drvinfo->bus_info, "platform", 32);
15486 + drvinfo->n_stats = ARRAY_SIZE(mv643xx_eth_stats);
15487 +}
15488 +
15489 +static int mv643xx_eth_nway_reset(struct net_device *dev)
15490 +{
15491 + struct mv643xx_eth_private *mp = netdev_priv(dev);
15492
15493 - if (pd->tx_sram_size) {
15494 - mp->tx_sram_size = pd->tx_sram_size;
15495 - mp->tx_sram_addr = pd->tx_sram_addr;
15496 + return mii_nway_restart(&mp->mii);
15497 +}
15498 +
15499 +static int mv643xx_eth_nway_reset_phyless(struct net_device *dev)
15500 +{
15501 + return -EINVAL;
15502 +}
15503 +
15504 +static u32 mv643xx_eth_get_link(struct net_device *dev)
15505 +{
15506 + struct mv643xx_eth_private *mp = netdev_priv(dev);
15507 +
15508 + return mii_link_ok(&mp->mii);
15509 +}
15510 +
15511 +static u32 mv643xx_eth_get_link_phyless(struct net_device *dev)
15512 +{
15513 + return 1;
15514 +}
15515 +
15516 +static void mv643xx_eth_get_strings(struct net_device *dev,
15517 + uint32_t stringset, uint8_t *data)
15518 +{
15519 + int i;
15520 +
15521 + if (stringset == ETH_SS_STATS) {
15522 + for (i = 0; i < ARRAY_SIZE(mv643xx_eth_stats); i++) {
15523 + memcpy(data + i * ETH_GSTRING_LEN,
15524 + mv643xx_eth_stats[i].stat_string,
15525 + ETH_GSTRING_LEN);
15526 + }
15527 }
15528 +}
15529 +
15530 +static void mv643xx_eth_get_ethtool_stats(struct net_device *dev,
15531 + struct ethtool_stats *stats,
15532 + uint64_t *data)
15533 +{
15534 + struct mv643xx_eth_private *mp = dev->priv;
15535 + int i;
15536 +
15537 + mib_counters_update(mp);
15538 +
15539 + for (i = 0; i < ARRAY_SIZE(mv643xx_eth_stats); i++) {
15540 + const struct mv643xx_eth_stats *stat;
15541 + void *p;
15542 +
15543 + stat = mv643xx_eth_stats + i;
15544 +
15545 + if (stat->netdev_off >= 0)
15546 + p = ((void *)mp->dev) + stat->netdev_off;
15547 + else
15548 + p = ((void *)mp) + stat->mp_off;
15549
15550 - if (pd->rx_sram_size) {
15551 - mp->rx_sram_size = pd->rx_sram_size;
15552 - mp->rx_sram_addr = pd->rx_sram_addr;
15553 + data[i] = (stat->sizeof_stat == 8) ?
15554 + *(uint64_t *)p : *(uint32_t *)p;
15555 }
15556 +}
15557
15558 - duplex = pd->duplex;
15559 - speed = pd->speed;
15560 +static int mv643xx_eth_get_sset_count(struct net_device *dev, int sset)
15561 +{
15562 + if (sset == ETH_SS_STATS)
15563 + return ARRAY_SIZE(mv643xx_eth_stats);
15564
15565 - /* Hook up MII support for ethtool */
15566 - mp->mii.dev = dev;
15567 - mp->mii.mdio_read = mv643xx_mdio_read;
15568 - mp->mii.mdio_write = mv643xx_mdio_write;
15569 - mp->mii.phy_id = ethernet_phy_get(mp);
15570 - mp->mii.phy_id_mask = 0x3f;
15571 - mp->mii.reg_num_mask = 0x1f;
15572 + return -EOPNOTSUPP;
15573 +}
15574
15575 - err = ethernet_phy_detect(mp);
15576 - if (err) {
15577 - pr_debug("%s: No PHY detected at addr %d\n",
15578 - dev->name, ethernet_phy_get(mp));
15579 +static const struct ethtool_ops mv643xx_eth_ethtool_ops = {
15580 + .get_settings = mv643xx_eth_get_settings,
15581 + .set_settings = mv643xx_eth_set_settings,
15582 + .get_drvinfo = mv643xx_eth_get_drvinfo,
15583 + .nway_reset = mv643xx_eth_nway_reset,
15584 + .get_link = mv643xx_eth_get_link,
15585 + .set_sg = ethtool_op_set_sg,
15586 + .get_strings = mv643xx_eth_get_strings,
15587 + .get_ethtool_stats = mv643xx_eth_get_ethtool_stats,
15588 + .get_sset_count = mv643xx_eth_get_sset_count,
15589 +};
15590 +
15591 +static const struct ethtool_ops mv643xx_eth_ethtool_ops_phyless = {
15592 + .get_settings = mv643xx_eth_get_settings_phyless,
15593 + .set_settings = mv643xx_eth_set_settings_phyless,
15594 + .get_drvinfo = mv643xx_eth_get_drvinfo,
15595 + .nway_reset = mv643xx_eth_nway_reset_phyless,
15596 + .get_link = mv643xx_eth_get_link_phyless,
15597 + .set_sg = ethtool_op_set_sg,
15598 + .get_strings = mv643xx_eth_get_strings,
15599 + .get_ethtool_stats = mv643xx_eth_get_ethtool_stats,
15600 + .get_sset_count = mv643xx_eth_get_sset_count,
15601 +};
15602 +
15603 +
15604 +/* address handling *********************************************************/
15605 +static void uc_addr_get(struct mv643xx_eth_private *mp, unsigned char *addr)
15606 +{
15607 + unsigned int mac_h;
15608 + unsigned int mac_l;
15609 +
15610 + mac_h = rdl(mp, MAC_ADDR_HIGH(mp->port_num));
15611 + mac_l = rdl(mp, MAC_ADDR_LOW(mp->port_num));
15612 +
15613 + addr[0] = (mac_h >> 24) & 0xff;
15614 + addr[1] = (mac_h >> 16) & 0xff;
15615 + addr[2] = (mac_h >> 8) & 0xff;
15616 + addr[3] = mac_h & 0xff;
15617 + addr[4] = (mac_l >> 8) & 0xff;
15618 + addr[5] = mac_l & 0xff;
15619 +}
15620 +
15621 +static void init_mac_tables(struct mv643xx_eth_private *mp)
15622 +{
15623 + int i;
15624 +
15625 + for (i = 0; i < 0x100; i += 4) {
15626 + wrl(mp, SPECIAL_MCAST_TABLE(mp->port_num) + i, 0);
15627 + wrl(mp, OTHER_MCAST_TABLE(mp->port_num) + i, 0);
15628 + }
15629 +
15630 + for (i = 0; i < 0x10; i += 4)
15631 + wrl(mp, UNICAST_TABLE(mp->port_num) + i, 0);
15632 +}
15633 +
15634 +static void set_filter_table_entry(struct mv643xx_eth_private *mp,
15635 + int table, unsigned char entry)
15636 +{
15637 + unsigned int table_reg;
15638 +
15639 + /* Set "accepts frame bit" at specified table entry */
15640 + table_reg = rdl(mp, table + (entry & 0xfc));
15641 + table_reg |= 0x01 << (8 * (entry & 3));
15642 + wrl(mp, table + (entry & 0xfc), table_reg);
15643 +}
15644 +
15645 +static void uc_addr_set(struct mv643xx_eth_private *mp, unsigned char *addr)
15646 +{
15647 + unsigned int mac_h;
15648 + unsigned int mac_l;
15649 + int table;
15650 +
15651 + mac_l = (addr[4] << 8) | addr[5];
15652 + mac_h = (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3];
15653 +
15654 + wrl(mp, MAC_ADDR_LOW(mp->port_num), mac_l);
15655 + wrl(mp, MAC_ADDR_HIGH(mp->port_num), mac_h);
15656 +
15657 + table = UNICAST_TABLE(mp->port_num);
15658 + set_filter_table_entry(mp, table, addr[5] & 0x0f);
15659 +}
15660 +
15661 +static int mv643xx_eth_set_mac_address(struct net_device *dev, void *addr)
15662 +{
15663 + struct mv643xx_eth_private *mp = netdev_priv(dev);
15664 +
15665 + /* +2 is for the offset of the HW addr type */
15666 + memcpy(dev->dev_addr, addr + 2, 6);
15667 +
15668 + init_mac_tables(mp);
15669 + uc_addr_set(mp, dev->dev_addr);
15670 +
15671 + return 0;
15672 +}
15673 +
15674 +static int addr_crc(unsigned char *addr)
15675 +{
15676 + int crc = 0;
15677 + int i;
15678 +
15679 + for (i = 0; i < 6; i++) {
15680 + int j;
15681 +
15682 + crc = (crc ^ addr[i]) << 8;
15683 + for (j = 7; j >= 0; j--) {
15684 + if (crc & (0x100 << j))
15685 + crc ^= 0x107 << j;
15686 + }
15687 + }
15688 +
15689 + return crc;
15690 +}
15691 +
15692 +static void mv643xx_eth_set_rx_mode(struct net_device *dev)
15693 +{
15694 + struct mv643xx_eth_private *mp = netdev_priv(dev);
15695 + u32 port_config;
15696 + struct dev_addr_list *addr;
15697 + int i;
15698 +
15699 + port_config = rdl(mp, PORT_CONFIG(mp->port_num));
15700 + if (dev->flags & IFF_PROMISC)
15701 + port_config |= UNICAST_PROMISCUOUS_MODE;
15702 + else
15703 + port_config &= ~UNICAST_PROMISCUOUS_MODE;
15704 + wrl(mp, PORT_CONFIG(mp->port_num), port_config);
15705 +
15706 + if (dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) {
15707 + int port_num = mp->port_num;
15708 + u32 accept = 0x01010101;
15709 +
15710 + for (i = 0; i < 0x100; i += 4) {
15711 + wrl(mp, SPECIAL_MCAST_TABLE(port_num) + i, accept);
15712 + wrl(mp, OTHER_MCAST_TABLE(port_num) + i, accept);
15713 + }
15714 + return;
15715 + }
15716 +
15717 + for (i = 0; i < 0x100; i += 4) {
15718 + wrl(mp, SPECIAL_MCAST_TABLE(mp->port_num) + i, 0);
15719 + wrl(mp, OTHER_MCAST_TABLE(mp->port_num) + i, 0);
15720 + }
15721 +
15722 + for (addr = dev->mc_list; addr != NULL; addr = addr->next) {
15723 + u8 *a = addr->da_addr;
15724 + int table;
15725 +
15726 + if (addr->da_addrlen != 6)
15727 + continue;
15728 +
15729 + if (memcmp(a, "\x01\x00\x5e\x00\x00", 5) == 0) {
15730 + table = SPECIAL_MCAST_TABLE(mp->port_num);
15731 + set_filter_table_entry(mp, table, a[5]);
15732 + } else {
15733 + int crc = addr_crc(a);
15734 +
15735 + table = OTHER_MCAST_TABLE(mp->port_num);
15736 + set_filter_table_entry(mp, table, crc);
15737 + }
15738 + }
15739 +}
15740 +
15741 +
15742 +/* rx/tx queue initialisation ***********************************************/
15743 +static int rxq_init(struct mv643xx_eth_private *mp, int index)
15744 +{
15745 + struct rx_queue *rxq = mp->rxq + index;
15746 + struct rx_desc *rx_desc;
15747 + int size;
15748 + int i;
15749 +
15750 + rxq->index = index;
15751 +
15752 + rxq->rx_ring_size = mp->default_rx_ring_size;
15753 +
15754 + rxq->rx_desc_count = 0;
15755 + rxq->rx_curr_desc = 0;
15756 + rxq->rx_used_desc = 0;
15757 +
15758 + size = rxq->rx_ring_size * sizeof(struct rx_desc);
15759 +
15760 + if (index == mp->rxq_primary && size <= mp->rx_desc_sram_size) {
15761 + rxq->rx_desc_area = ioremap(mp->rx_desc_sram_addr,
15762 + mp->rx_desc_sram_size);
15763 + rxq->rx_desc_dma = mp->rx_desc_sram_addr;
15764 + } else {
15765 + rxq->rx_desc_area = dma_alloc_coherent(NULL, size,
15766 + &rxq->rx_desc_dma,
15767 + GFP_KERNEL);
15768 + }
15769 +
15770 + if (rxq->rx_desc_area == NULL) {
15771 + dev_printk(KERN_ERR, &mp->dev->dev,
15772 + "can't allocate rx ring (%d bytes)\n", size);
15773 goto out;
15774 }
15775 + memset(rxq->rx_desc_area, 0, size);
15776
15777 - ethernet_phy_reset(mp);
15778 - mp->mii.supports_gmii = mii_check_gmii_support(&mp->mii);
15779 - mv643xx_init_ethtool_cmd(dev, mp->mii.phy_id, speed, duplex, &cmd);
15780 - mv643xx_eth_update_pscr(dev, &cmd);
15781 - mv643xx_set_settings(dev, &cmd);
15782 + rxq->rx_desc_area_size = size;
15783 + rxq->rx_skb = kmalloc(rxq->rx_ring_size * sizeof(*rxq->rx_skb),
15784 + GFP_KERNEL);
15785 + if (rxq->rx_skb == NULL) {
15786 + dev_printk(KERN_ERR, &mp->dev->dev,
15787 + "can't allocate rx skb ring\n");
15788 + goto out_free;
15789 + }
15790
15791 - SET_NETDEV_DEV(dev, &pdev->dev);
15792 - err = register_netdev(dev);
15793 - if (err)
15794 + rx_desc = (struct rx_desc *)rxq->rx_desc_area;
15795 + for (i = 0; i < rxq->rx_ring_size; i++) {
15796 + int nexti = (i + 1) % rxq->rx_ring_size;
15797 + rx_desc[i].next_desc_ptr = rxq->rx_desc_dma +
15798 + nexti * sizeof(struct rx_desc);
15799 + }
15800 +
15801 + init_timer(&rxq->rx_oom);
15802 + rxq->rx_oom.data = (unsigned long)rxq;
15803 + rxq->rx_oom.function = rxq_refill_timer_wrapper;
15804 +
15805 + return 0;
15806 +
15807 +
15808 +out_free:
15809 + if (index == mp->rxq_primary && size <= mp->rx_desc_sram_size)
15810 + iounmap(rxq->rx_desc_area);
15811 + else
15812 + dma_free_coherent(NULL, size,
15813 + rxq->rx_desc_area,
15814 + rxq->rx_desc_dma);
15815 +
15816 +out:
15817 + return -ENOMEM;
15818 +}
15819 +
15820 +static void rxq_deinit(struct rx_queue *rxq)
15821 +{
15822 + struct mv643xx_eth_private *mp = rxq_to_mp(rxq);
15823 + int i;
15824 +
15825 + rxq_disable(rxq);
15826 +
15827 + del_timer_sync(&rxq->rx_oom);
15828 +
15829 + for (i = 0; i < rxq->rx_ring_size; i++) {
15830 + if (rxq->rx_skb[i]) {
15831 + dev_kfree_skb(rxq->rx_skb[i]);
15832 + rxq->rx_desc_count--;
15833 + }
15834 + }
15835 +
15836 + if (rxq->rx_desc_count) {
15837 + dev_printk(KERN_ERR, &mp->dev->dev,
15838 + "error freeing rx ring -- %d skbs stuck\n",
15839 + rxq->rx_desc_count);
15840 + }
15841 +
15842 + if (rxq->index == mp->rxq_primary &&
15843 + rxq->rx_desc_area_size <= mp->rx_desc_sram_size)
15844 + iounmap(rxq->rx_desc_area);
15845 + else
15846 + dma_free_coherent(NULL, rxq->rx_desc_area_size,
15847 + rxq->rx_desc_area, rxq->rx_desc_dma);
15848 +
15849 + kfree(rxq->rx_skb);
15850 +}
15851 +
15852 +static int txq_init(struct mv643xx_eth_private *mp, int index)
15853 +{
15854 + struct tx_queue *txq = mp->txq + index;
15855 + struct tx_desc *tx_desc;
15856 + int size;
15857 + int i;
15858 +
15859 + txq->index = index;
15860 +
15861 + txq->tx_ring_size = mp->default_tx_ring_size;
15862 +
15863 + txq->tx_desc_count = 0;
15864 + txq->tx_curr_desc = 0;
15865 + txq->tx_used_desc = 0;
15866 +
15867 + size = txq->tx_ring_size * sizeof(struct tx_desc);
15868 +
15869 + if (index == mp->txq_primary && size <= mp->tx_desc_sram_size) {
15870 + txq->tx_desc_area = ioremap(mp->tx_desc_sram_addr,
15871 + mp->tx_desc_sram_size);
15872 + txq->tx_desc_dma = mp->tx_desc_sram_addr;
15873 + } else {
15874 + txq->tx_desc_area = dma_alloc_coherent(NULL, size,
15875 + &txq->tx_desc_dma,
15876 + GFP_KERNEL);
15877 + }
15878 +
15879 + if (txq->tx_desc_area == NULL) {
15880 + dev_printk(KERN_ERR, &mp->dev->dev,
15881 + "can't allocate tx ring (%d bytes)\n", size);
15882 goto out;
15883 + }
15884 + memset(txq->tx_desc_area, 0, size);
15885
15886 - p = dev->dev_addr;
15887 - printk(KERN_NOTICE
15888 - "%s: port %d with MAC address %s\n",
15889 - dev->name, port_num, print_mac(mac, p));
15890 + txq->tx_desc_area_size = size;
15891 + txq->tx_skb = kmalloc(txq->tx_ring_size * sizeof(*txq->tx_skb),
15892 + GFP_KERNEL);
15893 + if (txq->tx_skb == NULL) {
15894 + dev_printk(KERN_ERR, &mp->dev->dev,
15895 + "can't allocate tx skb ring\n");
15896 + goto out_free;
15897 + }
15898
15899 - if (dev->features & NETIF_F_SG)
15900 - printk(KERN_NOTICE "%s: Scatter Gather Enabled\n", dev->name);
15901 + tx_desc = (struct tx_desc *)txq->tx_desc_area;
15902 + for (i = 0; i < txq->tx_ring_size; i++) {
15903 + int nexti = (i + 1) % txq->tx_ring_size;
15904 + tx_desc[i].next_desc_ptr = txq->tx_desc_dma +
15905 + nexti * sizeof(struct tx_desc);
15906 + }
15907
15908 - if (dev->features & NETIF_F_IP_CSUM)
15909 - printk(KERN_NOTICE "%s: TX TCP/IP Checksumming Supported\n",
15910 - dev->name);
15911 + return 0;
15912 +
15913 +
15914 +out_free:
15915 + if (index == mp->txq_primary && size <= mp->tx_desc_sram_size)
15916 + iounmap(txq->tx_desc_area);
15917 + else
15918 + dma_free_coherent(NULL, size,
15919 + txq->tx_desc_area,
15920 + txq->tx_desc_dma);
15921 +
15922 +out:
15923 + return -ENOMEM;
15924 +}
15925 +
15926 +static void txq_reclaim(struct tx_queue *txq, int force)
15927 +{
15928 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
15929 + unsigned long flags;
15930 +
15931 + spin_lock_irqsave(&mp->lock, flags);
15932 + while (txq->tx_desc_count > 0) {
15933 + int tx_index;
15934 + struct tx_desc *desc;
15935 + u32 cmd_sts;
15936 + struct sk_buff *skb;
15937 + dma_addr_t addr;
15938 + int count;
15939 +
15940 + tx_index = txq->tx_used_desc;
15941 + desc = &txq->tx_desc_area[tx_index];
15942 + cmd_sts = desc->cmd_sts;
15943 +
15944 + if (!force && (cmd_sts & BUFFER_OWNED_BY_DMA))
15945 + break;
15946 +
15947 + txq->tx_used_desc = (tx_index + 1) % txq->tx_ring_size;
15948 + txq->tx_desc_count--;
15949 +
15950 + addr = desc->buf_ptr;
15951 + count = desc->byte_cnt;
15952 + skb = txq->tx_skb[tx_index];
15953 + txq->tx_skb[tx_index] = NULL;
15954 +
15955 + if (cmd_sts & ERROR_SUMMARY) {
15956 + dev_printk(KERN_INFO, &mp->dev->dev, "tx error\n");
15957 + mp->dev->stats.tx_errors++;
15958 + }
15959 +
15960 + /*
15961 + * Drop mp->lock while we free the skb.
15962 + */
15963 + spin_unlock_irqrestore(&mp->lock, flags);
15964
15965 -#ifdef MV643XX_CHECKSUM_OFFLOAD_TX
15966 - printk(KERN_NOTICE "%s: RX TCP/UDP Checksum Offload ON \n", dev->name);
15967 + if (cmd_sts & TX_FIRST_DESC)
15968 + dma_unmap_single(NULL, addr, count, DMA_TO_DEVICE);
15969 + else
15970 + dma_unmap_page(NULL, addr, count, DMA_TO_DEVICE);
15971 +
15972 + if (skb)
15973 + dev_kfree_skb_irq(skb);
15974 +
15975 + spin_lock_irqsave(&mp->lock, flags);
15976 + }
15977 + spin_unlock_irqrestore(&mp->lock, flags);
15978 +}
15979 +
15980 +static void txq_deinit(struct tx_queue *txq)
15981 +{
15982 + struct mv643xx_eth_private *mp = txq_to_mp(txq);
15983 +
15984 + txq_disable(txq);
15985 + txq_reclaim(txq, 1);
15986 +
15987 + BUG_ON(txq->tx_used_desc != txq->tx_curr_desc);
15988 +
15989 + if (txq->index == mp->txq_primary &&
15990 + txq->tx_desc_area_size <= mp->tx_desc_sram_size)
15991 + iounmap(txq->tx_desc_area);
15992 + else
15993 + dma_free_coherent(NULL, txq->tx_desc_area_size,
15994 + txq->tx_desc_area, txq->tx_desc_dma);
15995 +
15996 + kfree(txq->tx_skb);
15997 +}
15998 +
15999 +
16000 +/* netdev ops and related ***************************************************/
16001 +static void update_pscr(struct mv643xx_eth_private *mp, int speed, int duplex)
16002 +{
16003 + u32 pscr_o;
16004 + u32 pscr_n;
16005 +
16006 + pscr_o = rdl(mp, PORT_SERIAL_CONTROL(mp->port_num));
16007 +
16008 + /* clear speed, duplex and rx buffer size fields */
16009 + pscr_n = pscr_o & ~(SET_MII_SPEED_TO_100 |
16010 + SET_GMII_SPEED_TO_1000 |
16011 + SET_FULL_DUPLEX_MODE |
16012 + MAX_RX_PACKET_MASK);
16013 +
16014 + if (speed == SPEED_1000) {
16015 + pscr_n |= SET_GMII_SPEED_TO_1000 | MAX_RX_PACKET_9700BYTE;
16016 + } else {
16017 + if (speed == SPEED_100)
16018 + pscr_n |= SET_MII_SPEED_TO_100;
16019 + pscr_n |= MAX_RX_PACKET_1522BYTE;
16020 + }
16021 +
16022 + if (duplex == DUPLEX_FULL)
16023 + pscr_n |= SET_FULL_DUPLEX_MODE;
16024 +
16025 + if (pscr_n != pscr_o) {
16026 + if ((pscr_o & SERIAL_PORT_ENABLE) == 0)
16027 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), pscr_n);
16028 + else {
16029 + int i;
16030 +
16031 + for (i = 0; i < 8; i++)
16032 + if (mp->txq_mask & (1 << i))
16033 + txq_disable(mp->txq + i);
16034 +
16035 + pscr_o &= ~SERIAL_PORT_ENABLE;
16036 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), pscr_o);
16037 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), pscr_n);
16038 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), pscr_n);
16039 +
16040 + for (i = 0; i < 8; i++)
16041 + if (mp->txq_mask & (1 << i))
16042 + txq_enable(mp->txq + i);
16043 + }
16044 + }
16045 +}
16046 +
16047 +static irqreturn_t mv643xx_eth_irq(int irq, void *dev_id)
16048 +{
16049 + struct net_device *dev = (struct net_device *)dev_id;
16050 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16051 + u32 int_cause;
16052 + u32 int_cause_ext;
16053 + u32 txq_active;
16054 +
16055 + int_cause = rdl(mp, INT_CAUSE(mp->port_num)) &
16056 + (INT_TX_END | INT_RX | INT_EXT);
16057 + if (int_cause == 0)
16058 + return IRQ_NONE;
16059 +
16060 + int_cause_ext = 0;
16061 + if (int_cause & INT_EXT) {
16062 + int_cause_ext = rdl(mp, INT_CAUSE_EXT(mp->port_num))
16063 + & (INT_EXT_LINK | INT_EXT_PHY | INT_EXT_TX);
16064 + wrl(mp, INT_CAUSE_EXT(mp->port_num), ~int_cause_ext);
16065 + }
16066 +
16067 + if (int_cause_ext & (INT_EXT_PHY | INT_EXT_LINK)) {
16068 + if (mp->phy_addr == -1 || mii_link_ok(&mp->mii)) {
16069 + int i;
16070 +
16071 + if (mp->phy_addr != -1) {
16072 + struct ethtool_cmd cmd;
16073 +
16074 + mii_ethtool_gset(&mp->mii, &cmd);
16075 + update_pscr(mp, cmd.speed, cmd.duplex);
16076 + }
16077 +
16078 + for (i = 0; i < 8; i++)
16079 + if (mp->txq_mask & (1 << i))
16080 + txq_enable(mp->txq + i);
16081 +
16082 + if (!netif_carrier_ok(dev)) {
16083 + netif_carrier_on(dev);
16084 + __txq_maybe_wake(mp->txq + mp->txq_primary);
16085 + }
16086 + } else if (netif_carrier_ok(dev)) {
16087 + netif_stop_queue(dev);
16088 + netif_carrier_off(dev);
16089 + }
16090 + }
16091 +
16092 + /*
16093 + * RxBuffer or RxError set for any of the 8 queues?
16094 + */
16095 +#ifdef MV643XX_ETH_NAPI
16096 + if (int_cause & INT_RX) {
16097 + wrl(mp, INT_MASK(mp->port_num), 0x00000000);
16098 + rdl(mp, INT_MASK(mp->port_num));
16099 +
16100 + netif_rx_schedule(dev, &mp->napi);
16101 + }
16102 +#else
16103 + if (int_cause & INT_RX) {
16104 + int i;
16105 +
16106 + for (i = 7; i >= 0; i--)
16107 + if (mp->rxq_mask & (1 << i))
16108 + rxq_process(mp->rxq + i, INT_MAX);
16109 + }
16110 #endif
16111
16112 -#ifdef MV643XX_COAL
16113 - printk(KERN_NOTICE "%s: TX and RX Interrupt Coalescing ON \n",
16114 - dev->name);
16115 -#endif
16116 + txq_active = rdl(mp, TXQ_COMMAND(mp->port_num));
16117 +
16118 + /*
16119 + * TxBuffer or TxError set for any of the 8 queues?
16120 + */
16121 + if (int_cause_ext & INT_EXT_TX) {
16122 + int i;
16123 +
16124 + for (i = 0; i < 8; i++)
16125 + if (mp->txq_mask & (1 << i))
16126 + txq_reclaim(mp->txq + i, 0);
16127 + }
16128 +
16129 + /*
16130 + * Any TxEnd interrupts?
16131 + */
16132 + if (int_cause & INT_TX_END) {
16133 + int i;
16134 +
16135 + wrl(mp, INT_CAUSE(mp->port_num), ~(int_cause & INT_TX_END));
16136 + for (i = 0; i < 8; i++) {
16137 + struct tx_queue *txq = mp->txq + i;
16138 + if (txq->tx_desc_count && !((txq_active >> i) & 1))
16139 + txq_enable(txq);
16140 + }
16141 + }
16142 +
16143 + /*
16144 + * Enough space again in the primary TX queue for a full packet?
16145 + */
16146 + if (int_cause_ext & INT_EXT_TX) {
16147 + struct tx_queue *txq = mp->txq + mp->txq_primary;
16148 + __txq_maybe_wake(txq);
16149 + }
16150 +
16151 + return IRQ_HANDLED;
16152 +}
16153 +
16154 +static void phy_reset(struct mv643xx_eth_private *mp)
16155 +{
16156 + unsigned int data;
16157 +
16158 + smi_reg_read(mp, mp->phy_addr, 0, &data);
16159 + data |= 0x8000;
16160 + smi_reg_write(mp, mp->phy_addr, 0, data);
16161 +
16162 + do {
16163 + udelay(1);
16164 + smi_reg_read(mp, mp->phy_addr, 0, &data);
16165 + } while (data & 0x8000);
16166 +}
16167 +
16168 +static void port_start(struct mv643xx_eth_private *mp)
16169 +{
16170 + u32 pscr;
16171 + int i;
16172 +
16173 + /*
16174 + * Configure basic link parameters.
16175 + */
16176 + pscr = rdl(mp, PORT_SERIAL_CONTROL(mp->port_num));
16177 + pscr &= ~(SERIAL_PORT_ENABLE | FORCE_LINK_PASS);
16178 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), pscr);
16179 + pscr |= DISABLE_AUTO_NEG_FOR_FLOW_CTRL |
16180 + DISABLE_AUTO_NEG_SPEED_GMII |
16181 + DISABLE_AUTO_NEG_FOR_DUPLEX |
16182 + DO_NOT_FORCE_LINK_FAIL |
16183 + SERIAL_PORT_CONTROL_RESERVED;
16184 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), pscr);
16185 + pscr |= SERIAL_PORT_ENABLE;
16186 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), pscr);
16187 +
16188 + wrl(mp, SDMA_CONFIG(mp->port_num), PORT_SDMA_CONFIG_DEFAULT_VALUE);
16189 +
16190 + /*
16191 + * Perform PHY reset, if there is a PHY.
16192 + */
16193 + if (mp->phy_addr != -1) {
16194 + struct ethtool_cmd cmd;
16195 +
16196 + mv643xx_eth_get_settings(mp->dev, &cmd);
16197 + phy_reset(mp);
16198 + mv643xx_eth_set_settings(mp->dev, &cmd);
16199 + }
16200 +
16201 + /*
16202 + * Configure TX path and queues.
16203 + */
16204 + tx_set_rate(mp, 1000000000, 16777216);
16205 + for (i = 0; i < 8; i++) {
16206 + struct tx_queue *txq = mp->txq + i;
16207 + int off = TXQ_CURRENT_DESC_PTR(mp->port_num, i);
16208 + u32 addr;
16209 +
16210 + if ((mp->txq_mask & (1 << i)) == 0)
16211 + continue;
16212 +
16213 + addr = (u32)txq->tx_desc_dma;
16214 + addr += txq->tx_curr_desc * sizeof(struct tx_desc);
16215 + wrl(mp, off, addr);
16216 +
16217 + txq_set_rate(txq, 1000000000, 16777216);
16218 + txq_set_fixed_prio_mode(txq);
16219 + }
16220 +
16221 + /*
16222 + * Add configured unicast address to address filter table.
16223 + */
16224 + uc_addr_set(mp, mp->dev->dev_addr);
16225 +
16226 + /*
16227 + * Receive all unmatched unicast, TCP, UDP, BPDU and broadcast
16228 + * frames to RX queue #0.
16229 + */
16230 + wrl(mp, PORT_CONFIG(mp->port_num), 0x00000000);
16231
16232 -#ifdef MV643XX_NAPI
16233 - printk(KERN_NOTICE "%s: RX NAPI Enabled \n", dev->name);
16234 -#endif
16235 + /*
16236 + * Treat BPDUs as normal multicasts, and disable partition mode.
16237 + */
16238 + wrl(mp, PORT_CONFIG_EXT(mp->port_num), 0x00000000);
16239
16240 - if (mp->tx_sram_size > 0)
16241 - printk(KERN_NOTICE "%s: Using SRAM\n", dev->name);
16242 + /*
16243 + * Enable the receive queues.
16244 + */
16245 + for (i = 0; i < 8; i++) {
16246 + struct rx_queue *rxq = mp->rxq + i;
16247 + int off = RXQ_CURRENT_DESC_PTR(mp->port_num, i);
16248 + u32 addr;
16249
16250 - return 0;
16251 + if ((mp->rxq_mask & (1 << i)) == 0)
16252 + continue;
16253
16254 -out:
16255 - free_netdev(dev);
16256 + addr = (u32)rxq->rx_desc_dma;
16257 + addr += rxq->rx_curr_desc * sizeof(struct rx_desc);
16258 + wrl(mp, off, addr);
16259
16260 - return err;
16261 + rxq_enable(rxq);
16262 + }
16263 }
16264
16265 -static int mv643xx_eth_remove(struct platform_device *pdev)
16266 +static void set_rx_coal(struct mv643xx_eth_private *mp, unsigned int delay)
16267 {
16268 - struct net_device *dev = platform_get_drvdata(pdev);
16269 + unsigned int coal = ((mp->shared->t_clk / 1000000) * delay) / 64;
16270 + u32 val;
16271
16272 - unregister_netdev(dev);
16273 - flush_scheduled_work();
16274 + val = rdl(mp, SDMA_CONFIG(mp->port_num));
16275 + if (mp->shared->extended_rx_coal_limit) {
16276 + if (coal > 0xffff)
16277 + coal = 0xffff;
16278 + val &= ~0x023fff80;
16279 + val |= (coal & 0x8000) << 10;
16280 + val |= (coal & 0x7fff) << 7;
16281 + } else {
16282 + if (coal > 0x3fff)
16283 + coal = 0x3fff;
16284 + val &= ~0x003fff00;
16285 + val |= (coal & 0x3fff) << 8;
16286 + }
16287 + wrl(mp, SDMA_CONFIG(mp->port_num), val);
16288 +}
16289
16290 - free_netdev(dev);
16291 - platform_set_drvdata(pdev, NULL);
16292 - return 0;
16293 +static void set_tx_coal(struct mv643xx_eth_private *mp, unsigned int delay)
16294 +{
16295 + unsigned int coal = ((mp->shared->t_clk / 1000000) * delay) / 64;
16296 +
16297 + if (coal > 0x3fff)
16298 + coal = 0x3fff;
16299 + wrl(mp, TX_FIFO_URGENT_THRESHOLD(mp->port_num), (coal & 0x3fff) << 4);
16300 }
16301
16302 -static void mv643xx_eth_conf_mbus_windows(struct mv643xx_shared_private *msp,
16303 - struct mbus_dram_target_info *dram)
16304 +static int mv643xx_eth_open(struct net_device *dev)
16305 {
16306 - void __iomem *base = msp->eth_base;
16307 - u32 win_enable;
16308 - u32 win_protect;
16309 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16310 + int err;
16311 int i;
16312
16313 - for (i = 0; i < 6; i++) {
16314 - writel(0, base + WINDOW_BASE(i));
16315 - writel(0, base + WINDOW_SIZE(i));
16316 - if (i < 4)
16317 - writel(0, base + WINDOW_REMAP_HIGH(i));
16318 + wrl(mp, INT_CAUSE(mp->port_num), 0);
16319 + wrl(mp, INT_CAUSE_EXT(mp->port_num), 0);
16320 + rdl(mp, INT_CAUSE_EXT(mp->port_num));
16321 +
16322 + err = request_irq(dev->irq, mv643xx_eth_irq,
16323 + IRQF_SHARED | IRQF_SAMPLE_RANDOM,
16324 + dev->name, dev);
16325 + if (err) {
16326 + dev_printk(KERN_ERR, &dev->dev, "can't assign irq\n");
16327 + return -EAGAIN;
16328 }
16329
16330 - win_enable = 0x3f;
16331 - win_protect = 0;
16332 -
16333 - for (i = 0; i < dram->num_cs; i++) {
16334 - struct mbus_dram_window *cs = dram->cs + i;
16335 + init_mac_tables(mp);
16336
16337 - writel((cs->base & 0xffff0000) |
16338 - (cs->mbus_attr << 8) |
16339 - dram->mbus_dram_target_id, base + WINDOW_BASE(i));
16340 - writel((cs->size - 1) & 0xffff0000, base + WINDOW_SIZE(i));
16341 + for (i = 0; i < 8; i++) {
16342 + if ((mp->rxq_mask & (1 << i)) == 0)
16343 + continue;
16344 +
16345 + err = rxq_init(mp, i);
16346 + if (err) {
16347 + while (--i >= 0)
16348 + if (mp->rxq_mask & (1 << i))
16349 + rxq_deinit(mp->rxq + i);
16350 + goto out;
16351 + }
16352
16353 - win_enable &= ~(1 << i);
16354 - win_protect |= 3 << (2 * i);
16355 + rxq_refill(mp->rxq + i);
16356 }
16357
16358 - writel(win_enable, base + WINDOW_BAR_ENABLE);
16359 - msp->win_protect = win_protect;
16360 -}
16361 -
16362 -static int mv643xx_eth_shared_probe(struct platform_device *pdev)
16363 -{
16364 - static int mv643xx_version_printed = 0;
16365 - struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data;
16366 - struct mv643xx_shared_private *msp;
16367 - struct resource *res;
16368 - int ret;
16369 -
16370 - if (!mv643xx_version_printed++)
16371 - printk(KERN_NOTICE "MV-643xx 10/100/1000 Ethernet Driver\n");
16372 -
16373 - ret = -EINVAL;
16374 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
16375 - if (res == NULL)
16376 - goto out;
16377 + for (i = 0; i < 8; i++) {
16378 + if ((mp->txq_mask & (1 << i)) == 0)
16379 + continue;
16380 +
16381 + err = txq_init(mp, i);
16382 + if (err) {
16383 + while (--i >= 0)
16384 + if (mp->txq_mask & (1 << i))
16385 + txq_deinit(mp->txq + i);
16386 + goto out_free;
16387 + }
16388 + }
16389
16390 - ret = -ENOMEM;
16391 - msp = kmalloc(sizeof(*msp), GFP_KERNEL);
16392 - if (msp == NULL)
16393 - goto out;
16394 - memset(msp, 0, sizeof(*msp));
16395 +#ifdef MV643XX_ETH_NAPI
16396 + napi_enable(&mp->napi);
16397 +#endif
16398
16399 - msp->eth_base = ioremap(res->start, res->end - res->start + 1);
16400 - if (msp->eth_base == NULL)
16401 - goto out_free;
16402 + port_start(mp);
16403
16404 - spin_lock_init(&msp->phy_lock);
16405 - msp->t_clk = (pd != NULL && pd->t_clk != 0) ? pd->t_clk : 133000000;
16406 + set_rx_coal(mp, 0);
16407 + set_tx_coal(mp, 0);
16408
16409 - platform_set_drvdata(pdev, msp);
16410 + wrl(mp, INT_MASK_EXT(mp->port_num),
16411 + INT_EXT_LINK | INT_EXT_PHY | INT_EXT_TX);
16412
16413 - /*
16414 - * (Re-)program MBUS remapping windows if we are asked to.
16415 - */
16416 - if (pd != NULL && pd->dram != NULL)
16417 - mv643xx_eth_conf_mbus_windows(msp, pd->dram);
16418 + wrl(mp, INT_MASK(mp->port_num), INT_TX_END | INT_RX | INT_EXT);
16419
16420 return 0;
16421
16422 +
16423 out_free:
16424 - kfree(msp);
16425 + for (i = 0; i < 8; i++)
16426 + if (mp->rxq_mask & (1 << i))
16427 + rxq_deinit(mp->rxq + i);
16428 out:
16429 - return ret;
16430 + free_irq(dev->irq, dev);
16431 +
16432 + return err;
16433 }
16434
16435 -static int mv643xx_eth_shared_remove(struct platform_device *pdev)
16436 +static void port_reset(struct mv643xx_eth_private *mp)
16437 {
16438 - struct mv643xx_shared_private *msp = platform_get_drvdata(pdev);
16439 + unsigned int data;
16440 + int i;
16441
16442 - iounmap(msp->eth_base);
16443 - kfree(msp);
16444 + for (i = 0; i < 8; i++) {
16445 + if (mp->rxq_mask & (1 << i))
16446 + rxq_disable(mp->rxq + i);
16447 + if (mp->txq_mask & (1 << i))
16448 + txq_disable(mp->txq + i);
16449 + }
16450 + while (!(rdl(mp, PORT_STATUS(mp->port_num)) & TX_FIFO_EMPTY))
16451 + udelay(10);
16452
16453 - return 0;
16454 + /* Reset the Enable bit in the Configuration Register */
16455 + data = rdl(mp, PORT_SERIAL_CONTROL(mp->port_num));
16456 + data &= ~(SERIAL_PORT_ENABLE |
16457 + DO_NOT_FORCE_LINK_FAIL |
16458 + FORCE_LINK_PASS);
16459 + wrl(mp, PORT_SERIAL_CONTROL(mp->port_num), data);
16460 }
16461
16462 -static void mv643xx_eth_shutdown(struct platform_device *pdev)
16463 +static int mv643xx_eth_stop(struct net_device *dev)
16464 {
16465 - struct net_device *dev = platform_get_drvdata(pdev);
16466 - struct mv643xx_private *mp = netdev_priv(dev);
16467 - unsigned int port_num = mp->port_num;
16468 -
16469 - /* Mask all interrupts on ethernet port */
16470 - wrl(mp, INTERRUPT_MASK_REG(port_num), 0);
16471 - rdl(mp, INTERRUPT_MASK_REG(port_num));
16472 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16473 + int i;
16474
16475 - eth_port_reset(mp);
16476 -}
16477 + wrl(mp, INT_MASK(mp->port_num), 0x00000000);
16478 + rdl(mp, INT_MASK(mp->port_num));
16479
16480 -static struct platform_driver mv643xx_eth_driver = {
16481 - .probe = mv643xx_eth_probe,
16482 - .remove = mv643xx_eth_remove,
16483 - .shutdown = mv643xx_eth_shutdown,
16484 - .driver = {
16485 - .name = MV643XX_ETH_NAME,
16486 - .owner = THIS_MODULE,
16487 - },
16488 -};
16489 +#ifdef MV643XX_ETH_NAPI
16490 + napi_disable(&mp->napi);
16491 +#endif
16492 + netif_carrier_off(dev);
16493 + netif_stop_queue(dev);
16494
16495 -static struct platform_driver mv643xx_eth_shared_driver = {
16496 - .probe = mv643xx_eth_shared_probe,
16497 - .remove = mv643xx_eth_shared_remove,
16498 - .driver = {
16499 - .name = MV643XX_ETH_SHARED_NAME,
16500 - .owner = THIS_MODULE,
16501 - },
16502 -};
16503 + free_irq(dev->irq, dev);
16504
16505 -/*
16506 - * mv643xx_init_module
16507 - *
16508 - * Registers the network drivers into the Linux kernel
16509 - *
16510 - * Input : N/A
16511 - *
16512 - * Output : N/A
16513 - */
16514 -static int __init mv643xx_init_module(void)
16515 -{
16516 - int rc;
16517 + port_reset(mp);
16518 + mib_counters_update(mp);
16519
16520 - rc = platform_driver_register(&mv643xx_eth_shared_driver);
16521 - if (!rc) {
16522 - rc = platform_driver_register(&mv643xx_eth_driver);
16523 - if (rc)
16524 - platform_driver_unregister(&mv643xx_eth_shared_driver);
16525 + for (i = 0; i < 8; i++) {
16526 + if (mp->rxq_mask & (1 << i))
16527 + rxq_deinit(mp->rxq + i);
16528 + if (mp->txq_mask & (1 << i))
16529 + txq_deinit(mp->txq + i);
16530 }
16531 - return rc;
16532 -}
16533
16534 -/*
16535 - * mv643xx_cleanup_module
16536 - *
16537 - * Registers the network drivers into the Linux kernel
16538 - *
16539 - * Input : N/A
16540 - *
16541 - * Output : N/A
16542 - */
16543 -static void __exit mv643xx_cleanup_module(void)
16544 -{
16545 - platform_driver_unregister(&mv643xx_eth_driver);
16546 - platform_driver_unregister(&mv643xx_eth_shared_driver);
16547 + return 0;
16548 }
16549
16550 -module_init(mv643xx_init_module);
16551 -module_exit(mv643xx_cleanup_module);
16552 -
16553 -MODULE_LICENSE("GPL");
16554 -MODULE_AUTHOR( "Rabeeh Khoury, Assaf Hoffman, Matthew Dharm, Manish Lachwani"
16555 - " and Dale Farnsworth");
16556 -MODULE_DESCRIPTION("Ethernet driver for Marvell MV643XX");
16557 -MODULE_ALIAS("platform:" MV643XX_ETH_NAME);
16558 -MODULE_ALIAS("platform:" MV643XX_ETH_SHARED_NAME);
16559 -
16560 -/*
16561 - * The second part is the low level driver of the gigE ethernet ports.
16562 - */
16563 -
16564 -/*
16565 - * Marvell's Gigabit Ethernet controller low level driver
16566 - *
16567 - * DESCRIPTION:
16568 - * This file introduce low level API to Marvell's Gigabit Ethernet
16569 - * controller. This Gigabit Ethernet Controller driver API controls
16570 - * 1) Operations (i.e. port init, start, reset etc').
16571 - * 2) Data flow (i.e. port send, receive etc').
16572 - * Each Gigabit Ethernet port is controlled via
16573 - * struct mv643xx_private.
16574 - * This struct includes user configuration information as well as
16575 - * driver internal data needed for its operations.
16576 - *
16577 - * Supported Features:
16578 - * - This low level driver is OS independent. Allocating memory for
16579 - * the descriptor rings and buffers are not within the scope of
16580 - * this driver.
16581 - * - The user is free from Rx/Tx queue managing.
16582 - * - This low level driver introduce functionality API that enable
16583 - * the to operate Marvell's Gigabit Ethernet Controller in a
16584 - * convenient way.
16585 - * - Simple Gigabit Ethernet port operation API.
16586 - * - Simple Gigabit Ethernet port data flow API.
16587 - * - Data flow and operation API support per queue functionality.
16588 - * - Support cached descriptors for better performance.
16589 - * - Enable access to all four DRAM banks and internal SRAM memory
16590 - * spaces.
16591 - * - PHY access and control API.
16592 - * - Port control register configuration API.
16593 - * - Full control over Unicast and Multicast MAC configurations.
16594 - *
16595 - * Operation flow:
16596 - *
16597 - * Initialization phase
16598 - * This phase complete the initialization of the the
16599 - * mv643xx_private struct.
16600 - * User information regarding port configuration has to be set
16601 - * prior to calling the port initialization routine.
16602 - *
16603 - * In this phase any port Tx/Rx activity is halted, MIB counters
16604 - * are cleared, PHY address is set according to user parameter and
16605 - * access to DRAM and internal SRAM memory spaces.
16606 - *
16607 - * Driver ring initialization
16608 - * Allocating memory for the descriptor rings and buffers is not
16609 - * within the scope of this driver. Thus, the user is required to
16610 - * allocate memory for the descriptors ring and buffers. Those
16611 - * memory parameters are used by the Rx and Tx ring initialization
16612 - * routines in order to curve the descriptor linked list in a form
16613 - * of a ring.
16614 - * Note: Pay special attention to alignment issues when using
16615 - * cached descriptors/buffers. In this phase the driver store
16616 - * information in the mv643xx_private struct regarding each queue
16617 - * ring.
16618 - *
16619 - * Driver start
16620 - * This phase prepares the Ethernet port for Rx and Tx activity.
16621 - * It uses the information stored in the mv643xx_private struct to
16622 - * initialize the various port registers.
16623 - *
16624 - * Data flow:
16625 - * All packet references to/from the driver are done using
16626 - * struct pkt_info.
16627 - * This struct is a unified struct used with Rx and Tx operations.
16628 - * This way the user is not required to be familiar with neither
16629 - * Tx nor Rx descriptors structures.
16630 - * The driver's descriptors rings are management by indexes.
16631 - * Those indexes controls the ring resources and used to indicate
16632 - * a SW resource error:
16633 - * 'current'
16634 - * This index points to the current available resource for use. For
16635 - * example in Rx process this index will point to the descriptor
16636 - * that will be passed to the user upon calling the receive
16637 - * routine. In Tx process, this index will point to the descriptor
16638 - * that will be assigned with the user packet info and transmitted.
16639 - * 'used'
16640 - * This index points to the descriptor that need to restore its
16641 - * resources. For example in Rx process, using the Rx buffer return
16642 - * API will attach the buffer returned in packet info to the
16643 - * descriptor pointed by 'used'. In Tx process, using the Tx
16644 - * descriptor return will merely return the user packet info with
16645 - * the command status of the transmitted buffer pointed by the
16646 - * 'used' index. Nevertheless, it is essential to use this routine
16647 - * to update the 'used' index.
16648 - * 'first'
16649 - * This index supports Tx Scatter-Gather. It points to the first
16650 - * descriptor of a packet assembled of multiple buffers. For
16651 - * example when in middle of Such packet we have a Tx resource
16652 - * error the 'curr' index get the value of 'first' to indicate
16653 - * that the ring returned to its state before trying to transmit
16654 - * this packet.
16655 - *
16656 - * Receive operation:
16657 - * The eth_port_receive API set the packet information struct,
16658 - * passed by the caller, with received information from the
16659 - * 'current' SDMA descriptor.
16660 - * It is the user responsibility to return this resource back
16661 - * to the Rx descriptor ring to enable the reuse of this source.
16662 - * Return Rx resource is done using the eth_rx_return_buff API.
16663 - *
16664 - * Prior to calling the initialization routine eth_port_init() the user
16665 - * must set the following fields under mv643xx_private struct:
16666 - * port_num User Ethernet port number.
16667 - * port_config User port configuration value.
16668 - * port_config_extend User port config extend value.
16669 - * port_sdma_config User port SDMA config value.
16670 - * port_serial_control User port serial control value.
16671 - *
16672 - * This driver data flow is done using the struct pkt_info which
16673 - * is a unified struct for Rx and Tx operations:
16674 - *
16675 - * byte_cnt Tx/Rx descriptor buffer byte count.
16676 - * l4i_chk CPU provided TCP Checksum. For Tx operation
16677 - * only.
16678 - * cmd_sts Tx/Rx descriptor command status.
16679 - * buf_ptr Tx/Rx descriptor buffer pointer.
16680 - * return_info Tx/Rx user resource return information.
16681 - */
16682 -
16683 -/* Ethernet Port routines */
16684 -static void eth_port_set_filter_table_entry(struct mv643xx_private *mp,
16685 - int table, unsigned char entry);
16686 -
16687 -/*
16688 - * eth_port_init - Initialize the Ethernet port driver
16689 - *
16690 - * DESCRIPTION:
16691 - * This function prepares the ethernet port to start its activity:
16692 - * 1) Completes the ethernet port driver struct initialization toward port
16693 - * start routine.
16694 - * 2) Resets the device to a quiescent state in case of warm reboot.
16695 - * 3) Enable SDMA access to all four DRAM banks as well as internal SRAM.
16696 - * 4) Clean MAC tables. The reset status of those tables is unknown.
16697 - * 5) Set PHY address.
16698 - * Note: Call this routine prior to eth_port_start routine and after
16699 - * setting user values in the user fields of Ethernet port control
16700 - * struct.
16701 - *
16702 - * INPUT:
16703 - * struct mv643xx_private *mp Ethernet port control struct
16704 - *
16705 - * OUTPUT:
16706 - * See description.
16707 - *
16708 - * RETURN:
16709 - * None.
16710 - */
16711 -static void eth_port_init(struct mv643xx_private *mp)
16712 +static int mv643xx_eth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
16713 {
16714 - mp->rx_resource_err = 0;
16715 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16716
16717 - eth_port_reset(mp);
16718 + if (mp->phy_addr != -1)
16719 + return generic_mii_ioctl(&mp->mii, if_mii(ifr), cmd, NULL);
16720
16721 - eth_port_init_mac_tables(mp);
16722 + return -EOPNOTSUPP;
16723 }
16724
16725 -/*
16726 - * eth_port_start - Start the Ethernet port activity.
16727 - *
16728 - * DESCRIPTION:
16729 - * This routine prepares the Ethernet port for Rx and Tx activity:
16730 - * 1. Initialize Tx and Rx Current Descriptor Pointer for each queue that
16731 - * has been initialized a descriptor's ring (using
16732 - * ether_init_tx_desc_ring for Tx and ether_init_rx_desc_ring for Rx)
16733 - * 2. Initialize and enable the Ethernet configuration port by writing to
16734 - * the port's configuration and command registers.
16735 - * 3. Initialize and enable the SDMA by writing to the SDMA's
16736 - * configuration and command registers. After completing these steps,
16737 - * the ethernet port SDMA can starts to perform Rx and Tx activities.
16738 - *
16739 - * Note: Each Rx and Tx queue descriptor's list must be initialized prior
16740 - * to calling this function (use ether_init_tx_desc_ring for Tx queues
16741 - * and ether_init_rx_desc_ring for Rx queues).
16742 - *
16743 - * INPUT:
16744 - * dev - a pointer to the required interface
16745 - *
16746 - * OUTPUT:
16747 - * Ethernet port is ready to receive and transmit.
16748 - *
16749 - * RETURN:
16750 - * None.
16751 - */
16752 -static void eth_port_start(struct net_device *dev)
16753 +static int mv643xx_eth_change_mtu(struct net_device *dev, int new_mtu)
16754 {
16755 - struct mv643xx_private *mp = netdev_priv(dev);
16756 - unsigned int port_num = mp->port_num;
16757 - int tx_curr_desc, rx_curr_desc;
16758 - u32 pscr;
16759 - struct ethtool_cmd ethtool_cmd;
16760 -
16761 - /* Assignment of Tx CTRP of given queue */
16762 - tx_curr_desc = mp->tx_curr_desc_q;
16763 - wrl(mp, TX_CURRENT_QUEUE_DESC_PTR_0(port_num),
16764 - (u32)((struct eth_tx_desc *)mp->tx_desc_dma + tx_curr_desc));
16765 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16766
16767 - /* Assignment of Rx CRDP of given queue */
16768 - rx_curr_desc = mp->rx_curr_desc_q;
16769 - wrl(mp, RX_CURRENT_QUEUE_DESC_PTR_0(port_num),
16770 - (u32)((struct eth_rx_desc *)mp->rx_desc_dma + rx_curr_desc));
16771 -
16772 - /* Add the assigned Ethernet address to the port's address table */
16773 - eth_port_uc_addr_set(mp, dev->dev_addr);
16774 + if (new_mtu < 64 || new_mtu > 9500)
16775 + return -EINVAL;
16776
16777 - /* Assign port configuration and command. */
16778 - wrl(mp, PORT_CONFIG_REG(port_num),
16779 - PORT_CONFIG_DEFAULT_VALUE);
16780 + dev->mtu = new_mtu;
16781 + tx_set_rate(mp, 1000000000, 16777216);
16782
16783 - wrl(mp, PORT_CONFIG_EXTEND_REG(port_num),
16784 - PORT_CONFIG_EXTEND_DEFAULT_VALUE);
16785 + if (!netif_running(dev))
16786 + return 0;
16787
16788 - pscr = rdl(mp, PORT_SERIAL_CONTROL_REG(port_num));
16789 + /*
16790 + * Stop and then re-open the interface. This will allocate RX
16791 + * skbs of the new MTU.
16792 + * There is a possible danger that the open will not succeed,
16793 + * due to memory being full.
16794 + */
16795 + mv643xx_eth_stop(dev);
16796 + if (mv643xx_eth_open(dev)) {
16797 + dev_printk(KERN_ERR, &dev->dev,
16798 + "fatal error on re-opening device after "
16799 + "MTU change\n");
16800 + }
16801
16802 - pscr &= ~(SERIAL_PORT_ENABLE | FORCE_LINK_PASS);
16803 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), pscr);
16804 + return 0;
16805 +}
16806
16807 - pscr |= DISABLE_AUTO_NEG_FOR_FLOW_CTRL |
16808 - DISABLE_AUTO_NEG_SPEED_GMII |
16809 - DISABLE_AUTO_NEG_FOR_DUPLX |
16810 - DO_NOT_FORCE_LINK_FAIL |
16811 - SERIAL_PORT_CONTROL_RESERVED;
16812 +static void tx_timeout_task(struct work_struct *ugly)
16813 +{
16814 + struct mv643xx_eth_private *mp;
16815
16816 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), pscr);
16817 + mp = container_of(ugly, struct mv643xx_eth_private, tx_timeout_task);
16818 + if (netif_running(mp->dev)) {
16819 + netif_stop_queue(mp->dev);
16820
16821 - pscr |= SERIAL_PORT_ENABLE;
16822 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), pscr);
16823 + port_reset(mp);
16824 + port_start(mp);
16825
16826 - /* Assign port SDMA configuration */
16827 - wrl(mp, SDMA_CONFIG_REG(port_num),
16828 - PORT_SDMA_CONFIG_DEFAULT_VALUE);
16829 -
16830 - /* Enable port Rx. */
16831 - mv643xx_eth_port_enable_rx(mp, ETH_RX_QUEUES_ENABLED);
16832 -
16833 - /* Disable port bandwidth limits by clearing MTU register */
16834 - wrl(mp, MAXIMUM_TRANSMIT_UNIT(port_num), 0);
16835 -
16836 - /* save phy settings across reset */
16837 - mv643xx_get_settings(dev, &ethtool_cmd);
16838 - ethernet_phy_reset(mp);
16839 - mv643xx_set_settings(dev, &ethtool_cmd);
16840 + __txq_maybe_wake(mp->txq + mp->txq_primary);
16841 + }
16842 }
16843
16844 -/*
16845 - * eth_port_uc_addr_set - Write a MAC address into the port's hw registers
16846 - */
16847 -static void eth_port_uc_addr_set(struct mv643xx_private *mp,
16848 - unsigned char *p_addr)
16849 +static void mv643xx_eth_tx_timeout(struct net_device *dev)
16850 {
16851 - unsigned int port_num = mp->port_num;
16852 - unsigned int mac_h;
16853 - unsigned int mac_l;
16854 - int table;
16855 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16856
16857 - mac_l = (p_addr[4] << 8) | (p_addr[5]);
16858 - mac_h = (p_addr[0] << 24) | (p_addr[1] << 16) | (p_addr[2] << 8) |
16859 - (p_addr[3] << 0);
16860 -
16861 - wrl(mp, MAC_ADDR_LOW(port_num), mac_l);
16862 - wrl(mp, MAC_ADDR_HIGH(port_num), mac_h);
16863 -
16864 - /* Accept frames with this address */
16865 - table = DA_FILTER_UNICAST_TABLE_BASE(port_num);
16866 - eth_port_set_filter_table_entry(mp, table, p_addr[5] & 0x0f);
16867 + dev_printk(KERN_INFO, &dev->dev, "tx timeout\n");
16868 +
16869 + schedule_work(&mp->tx_timeout_task);
16870 }
16871
16872 -/*
16873 - * eth_port_uc_addr_get - Read the MAC address from the port's hw registers
16874 - */
16875 -static void eth_port_uc_addr_get(struct mv643xx_private *mp,
16876 - unsigned char *p_addr)
16877 +#ifdef CONFIG_NET_POLL_CONTROLLER
16878 +static void mv643xx_eth_netpoll(struct net_device *dev)
16879 {
16880 - unsigned int port_num = mp->port_num;
16881 - unsigned int mac_h;
16882 - unsigned int mac_l;
16883 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16884 +
16885 + wrl(mp, INT_MASK(mp->port_num), 0x00000000);
16886 + rdl(mp, INT_MASK(mp->port_num));
16887
16888 - mac_h = rdl(mp, MAC_ADDR_HIGH(port_num));
16889 - mac_l = rdl(mp, MAC_ADDR_LOW(port_num));
16890 + mv643xx_eth_irq(dev->irq, dev);
16891
16892 - p_addr[0] = (mac_h >> 24) & 0xff;
16893 - p_addr[1] = (mac_h >> 16) & 0xff;
16894 - p_addr[2] = (mac_h >> 8) & 0xff;
16895 - p_addr[3] = mac_h & 0xff;
16896 - p_addr[4] = (mac_l >> 8) & 0xff;
16897 - p_addr[5] = mac_l & 0xff;
16898 + wrl(mp, INT_MASK(mp->port_num), INT_TX_END | INT_RX | INT_CAUSE_EXT);
16899 }
16900 +#endif
16901
16902 -/*
16903 - * The entries in each table are indexed by a hash of a packet's MAC
16904 - * address. One bit in each entry determines whether the packet is
16905 - * accepted. There are 4 entries (each 8 bits wide) in each register
16906 - * of the table. The bits in each entry are defined as follows:
16907 - * 0 Accept=1, Drop=0
16908 - * 3-1 Queue (ETH_Q0=0)
16909 - * 7-4 Reserved = 0;
16910 - */
16911 -static void eth_port_set_filter_table_entry(struct mv643xx_private *mp,
16912 - int table, unsigned char entry)
16913 +static int mv643xx_eth_mdio_read(struct net_device *dev, int addr, int reg)
16914 {
16915 - unsigned int table_reg;
16916 - unsigned int tbl_offset;
16917 - unsigned int reg_offset;
16918 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16919 + int val;
16920
16921 - tbl_offset = (entry / 4) * 4; /* Register offset of DA table entry */
16922 - reg_offset = entry % 4; /* Entry offset within the register */
16923 + smi_reg_read(mp, addr, reg, &val);
16924
16925 - /* Set "accepts frame bit" at specified table entry */
16926 - table_reg = rdl(mp, table + tbl_offset);
16927 - table_reg |= 0x01 << (8 * reg_offset);
16928 - wrl(mp, table + tbl_offset, table_reg);
16929 + return val;
16930 }
16931
16932 -/*
16933 - * eth_port_mc_addr - Multicast address settings.
16934 - *
16935 - * The MV device supports multicast using two tables:
16936 - * 1) Special Multicast Table for MAC addresses of the form
16937 - * 0x01-00-5E-00-00-XX (where XX is between 0x00 and 0x_FF).
16938 - * The MAC DA[7:0] bits are used as a pointer to the Special Multicast
16939 - * Table entries in the DA-Filter table.
16940 - * 2) Other Multicast Table for multicast of another type. A CRC-8bit
16941 - * is used as an index to the Other Multicast Table entries in the
16942 - * DA-Filter table. This function calculates the CRC-8bit value.
16943 - * In either case, eth_port_set_filter_table_entry() is then called
16944 - * to set to set the actual table entry.
16945 - */
16946 -static void eth_port_mc_addr(struct mv643xx_private *mp, unsigned char *p_addr)
16947 +static void mv643xx_eth_mdio_write(struct net_device *dev, int addr, int reg, int val)
16948 {
16949 - unsigned int port_num = mp->port_num;
16950 - unsigned int mac_h;
16951 - unsigned int mac_l;
16952 - unsigned char crc_result = 0;
16953 - int table;
16954 - int mac_array[48];
16955 - int crc[8];
16956 - int i;
16957 + struct mv643xx_eth_private *mp = netdev_priv(dev);
16958 + smi_reg_write(mp, addr, reg, val);
16959 +}
16960
16961 - if ((p_addr[0] == 0x01) && (p_addr[1] == 0x00) &&
16962 - (p_addr[2] == 0x5E) && (p_addr[3] == 0x00) && (p_addr[4] == 0x00)) {
16963 - table = DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(port_num);
16964 - eth_port_set_filter_table_entry(mp, table, p_addr[5]);
16965 - return;
16966 - }
16967
16968 - /* Calculate CRC-8 out of the given address */
16969 - mac_h = (p_addr[0] << 8) | (p_addr[1]);
16970 - mac_l = (p_addr[2] << 24) | (p_addr[3] << 16) |
16971 - (p_addr[4] << 8) | (p_addr[5] << 0);
16972 -
16973 - for (i = 0; i < 32; i++)
16974 - mac_array[i] = (mac_l >> i) & 0x1;
16975 - for (i = 32; i < 48; i++)
16976 - mac_array[i] = (mac_h >> (i - 32)) & 0x1;
16977 -
16978 - crc[0] = mac_array[45] ^ mac_array[43] ^ mac_array[40] ^ mac_array[39] ^
16979 - mac_array[35] ^ mac_array[34] ^ mac_array[31] ^ mac_array[30] ^
16980 - mac_array[28] ^ mac_array[23] ^ mac_array[21] ^ mac_array[19] ^
16981 - mac_array[18] ^ mac_array[16] ^ mac_array[14] ^ mac_array[12] ^
16982 - mac_array[8] ^ mac_array[7] ^ mac_array[6] ^ mac_array[0];
16983 -
16984 - crc[1] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^ mac_array[43] ^
16985 - mac_array[41] ^ mac_array[39] ^ mac_array[36] ^ mac_array[34] ^
16986 - mac_array[32] ^ mac_array[30] ^ mac_array[29] ^ mac_array[28] ^
16987 - mac_array[24] ^ mac_array[23] ^ mac_array[22] ^ mac_array[21] ^
16988 - mac_array[20] ^ mac_array[18] ^ mac_array[17] ^ mac_array[16] ^
16989 - mac_array[15] ^ mac_array[14] ^ mac_array[13] ^ mac_array[12] ^
16990 - mac_array[9] ^ mac_array[6] ^ mac_array[1] ^ mac_array[0];
16991 -
16992 - crc[2] = mac_array[47] ^ mac_array[46] ^ mac_array[44] ^ mac_array[43] ^
16993 - mac_array[42] ^ mac_array[39] ^ mac_array[37] ^ mac_array[34] ^
16994 - mac_array[33] ^ mac_array[29] ^ mac_array[28] ^ mac_array[25] ^
16995 - mac_array[24] ^ mac_array[22] ^ mac_array[17] ^ mac_array[15] ^
16996 - mac_array[13] ^ mac_array[12] ^ mac_array[10] ^ mac_array[8] ^
16997 - mac_array[6] ^ mac_array[2] ^ mac_array[1] ^ mac_array[0];
16998 -
16999 - crc[3] = mac_array[47] ^ mac_array[45] ^ mac_array[44] ^ mac_array[43] ^
17000 - mac_array[40] ^ mac_array[38] ^ mac_array[35] ^ mac_array[34] ^
17001 - mac_array[30] ^ mac_array[29] ^ mac_array[26] ^ mac_array[25] ^
17002 - mac_array[23] ^ mac_array[18] ^ mac_array[16] ^ mac_array[14] ^
17003 - mac_array[13] ^ mac_array[11] ^ mac_array[9] ^ mac_array[7] ^
17004 - mac_array[3] ^ mac_array[2] ^ mac_array[1];
17005 -
17006 - crc[4] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^ mac_array[41] ^
17007 - mac_array[39] ^ mac_array[36] ^ mac_array[35] ^ mac_array[31] ^
17008 - mac_array[30] ^ mac_array[27] ^ mac_array[26] ^ mac_array[24] ^
17009 - mac_array[19] ^ mac_array[17] ^ mac_array[15] ^ mac_array[14] ^
17010 - mac_array[12] ^ mac_array[10] ^ mac_array[8] ^ mac_array[4] ^
17011 - mac_array[3] ^ mac_array[2];
17012 -
17013 - crc[5] = mac_array[47] ^ mac_array[46] ^ mac_array[45] ^ mac_array[42] ^
17014 - mac_array[40] ^ mac_array[37] ^ mac_array[36] ^ mac_array[32] ^
17015 - mac_array[31] ^ mac_array[28] ^ mac_array[27] ^ mac_array[25] ^
17016 - mac_array[20] ^ mac_array[18] ^ mac_array[16] ^ mac_array[15] ^
17017 - mac_array[13] ^ mac_array[11] ^ mac_array[9] ^ mac_array[5] ^
17018 - mac_array[4] ^ mac_array[3];
17019 -
17020 - crc[6] = mac_array[47] ^ mac_array[46] ^ mac_array[43] ^ mac_array[41] ^
17021 - mac_array[38] ^ mac_array[37] ^ mac_array[33] ^ mac_array[32] ^
17022 - mac_array[29] ^ mac_array[28] ^ mac_array[26] ^ mac_array[21] ^
17023 - mac_array[19] ^ mac_array[17] ^ mac_array[16] ^ mac_array[14] ^
17024 - mac_array[12] ^ mac_array[10] ^ mac_array[6] ^ mac_array[5] ^
17025 - mac_array[4];
17026 -
17027 - crc[7] = mac_array[47] ^ mac_array[44] ^ mac_array[42] ^ mac_array[39] ^
17028 - mac_array[38] ^ mac_array[34] ^ mac_array[33] ^ mac_array[30] ^
17029 - mac_array[29] ^ mac_array[27] ^ mac_array[22] ^ mac_array[20] ^
17030 - mac_array[18] ^ mac_array[17] ^ mac_array[15] ^ mac_array[13] ^
17031 - mac_array[11] ^ mac_array[7] ^ mac_array[6] ^ mac_array[5];
17032 +/* platform glue ************************************************************/
17033 +static void
17034 +mv643xx_eth_conf_mbus_windows(struct mv643xx_eth_shared_private *msp,
17035 + struct mbus_dram_target_info *dram)
17036 +{
17037 + void __iomem *base = msp->base;
17038 + u32 win_enable;
17039 + u32 win_protect;
17040 + int i;
17041
17042 - for (i = 0; i < 8; i++)
17043 - crc_result = crc_result | (crc[i] << i);
17044 + for (i = 0; i < 6; i++) {
17045 + writel(0, base + WINDOW_BASE(i));
17046 + writel(0, base + WINDOW_SIZE(i));
17047 + if (i < 4)
17048 + writel(0, base + WINDOW_REMAP_HIGH(i));
17049 + }
17050
17051 - table = DA_FILTER_OTHER_MULTICAST_TABLE_BASE(port_num);
17052 - eth_port_set_filter_table_entry(mp, table, crc_result);
17053 -}
17054 + win_enable = 0x3f;
17055 + win_protect = 0;
17056
17057 -/*
17058 - * Set the entire multicast list based on dev->mc_list.
17059 - */
17060 -static void eth_port_set_multicast_list(struct net_device *dev)
17061 -{
17062 + for (i = 0; i < dram->num_cs; i++) {
17063 + struct mbus_dram_window *cs = dram->cs + i;
17064
17065 - struct dev_mc_list *mc_list;
17066 - int i;
17067 - int table_index;
17068 - struct mv643xx_private *mp = netdev_priv(dev);
17069 - unsigned int eth_port_num = mp->port_num;
17070 -
17071 - /* If the device is in promiscuous mode or in all multicast mode,
17072 - * we will fully populate both multicast tables with accept.
17073 - * This is guaranteed to yield a match on all multicast addresses...
17074 - */
17075 - if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI)) {
17076 - for (table_index = 0; table_index <= 0xFC; table_index += 4) {
17077 - /* Set all entries in DA filter special multicast
17078 - * table (Ex_dFSMT)
17079 - * Set for ETH_Q0 for now
17080 - * Bits
17081 - * 0 Accept=1, Drop=0
17082 - * 3-1 Queue ETH_Q0=0
17083 - * 7-4 Reserved = 0;
17084 - */
17085 - wrl(mp, DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101);
17086 + writel((cs->base & 0xffff0000) |
17087 + (cs->mbus_attr << 8) |
17088 + dram->mbus_dram_target_id, base + WINDOW_BASE(i));
17089 + writel((cs->size - 1) & 0xffff0000, base + WINDOW_SIZE(i));
17090
17091 - /* Set all entries in DA filter other multicast
17092 - * table (Ex_dFOMT)
17093 - * Set for ETH_Q0 for now
17094 - * Bits
17095 - * 0 Accept=1, Drop=0
17096 - * 3-1 Queue ETH_Q0=0
17097 - * 7-4 Reserved = 0;
17098 - */
17099 - wrl(mp, DA_FILTER_OTHER_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101);
17100 - }
17101 - return;
17102 + win_enable &= ~(1 << i);
17103 + win_protect |= 3 << (2 * i);
17104 }
17105
17106 - /* We will clear out multicast tables every time we get the list.
17107 - * Then add the entire new list...
17108 - */
17109 - for (table_index = 0; table_index <= 0xFC; table_index += 4) {
17110 - /* Clear DA filter special multicast table (Ex_dFSMT) */
17111 - wrl(mp, DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE
17112 - (eth_port_num) + table_index, 0);
17113 -
17114 - /* Clear DA filter other multicast table (Ex_dFOMT) */
17115 - wrl(mp, DA_FILTER_OTHER_MULTICAST_TABLE_BASE
17116 - (eth_port_num) + table_index, 0);
17117 - }
17118 -
17119 - /* Get pointer to net_device multicast list and add each one... */
17120 - for (i = 0, mc_list = dev->mc_list;
17121 - (i < 256) && (mc_list != NULL) && (i < dev->mc_count);
17122 - i++, mc_list = mc_list->next)
17123 - if (mc_list->dmi_addrlen == 6)
17124 - eth_port_mc_addr(mp, mc_list->dmi_addr);
17125 + writel(win_enable, base + WINDOW_BAR_ENABLE);
17126 + msp->win_protect = win_protect;
17127 }
17128
17129 -/*
17130 - * eth_port_init_mac_tables - Clear all entrance in the UC, SMC and OMC tables
17131 - *
17132 - * DESCRIPTION:
17133 - * Go through all the DA filter tables (Unicast, Special Multicast &
17134 - * Other Multicast) and set each entry to 0.
17135 - *
17136 - * INPUT:
17137 - * struct mv643xx_private *mp Ethernet Port.
17138 - *
17139 - * OUTPUT:
17140 - * Multicast and Unicast packets are rejected.
17141 - *
17142 - * RETURN:
17143 - * None.
17144 - */
17145 -static void eth_port_init_mac_tables(struct mv643xx_private *mp)
17146 +static void infer_hw_params(struct mv643xx_eth_shared_private *msp)
17147 {
17148 - unsigned int port_num = mp->port_num;
17149 - int table_index;
17150 + /*
17151 + * Check whether we have a 14-bit coal limit field in bits
17152 + * [21:8], or a 16-bit coal limit in bits [25,21:7] of the
17153 + * SDMA config register.
17154 + */
17155 + writel(0x02000000, msp->base + SDMA_CONFIG(0));
17156 + if (readl(msp->base + SDMA_CONFIG(0)) & 0x02000000)
17157 + msp->extended_rx_coal_limit = 1;
17158 + else
17159 + msp->extended_rx_coal_limit = 0;
17160
17161 - /* Clear DA filter unicast table (Ex_dFUT) */
17162 - for (table_index = 0; table_index <= 0xC; table_index += 4)
17163 - wrl(mp, DA_FILTER_UNICAST_TABLE_BASE(port_num) +
17164 - table_index, 0);
17165 -
17166 - for (table_index = 0; table_index <= 0xFC; table_index += 4) {
17167 - /* Clear DA filter special multicast table (Ex_dFSMT) */
17168 - wrl(mp, DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(port_num) +
17169 - table_index, 0);
17170 - /* Clear DA filter other multicast table (Ex_dFOMT) */
17171 - wrl(mp, DA_FILTER_OTHER_MULTICAST_TABLE_BASE(port_num) +
17172 - table_index, 0);
17173 - }
17174 + /*
17175 + * Check whether the TX rate control registers are in the
17176 + * old or the new place.
17177 + */
17178 + writel(1, msp->base + TX_BW_MTU_MOVED(0));
17179 + if (readl(msp->base + TX_BW_MTU_MOVED(0)) & 1)
17180 + msp->tx_bw_control_moved = 1;
17181 + else
17182 + msp->tx_bw_control_moved = 0;
17183 }
17184
17185 -/*
17186 - * eth_clear_mib_counters - Clear all MIB counters
17187 - *
17188 - * DESCRIPTION:
17189 - * This function clears all MIB counters of a specific ethernet port.
17190 - * A read from the MIB counter will reset the counter.
17191 - *
17192 - * INPUT:
17193 - * struct mv643xx_private *mp Ethernet Port.
17194 - *
17195 - * OUTPUT:
17196 - * After reading all MIB counters, the counters resets.
17197 - *
17198 - * RETURN:
17199 - * MIB counter value.
17200 - *
17201 - */
17202 -static void eth_clear_mib_counters(struct mv643xx_private *mp)
17203 +static int mv643xx_eth_shared_probe(struct platform_device *pdev)
17204 {
17205 - unsigned int port_num = mp->port_num;
17206 - int i;
17207 -
17208 - /* Perform dummy reads from MIB counters */
17209 - for (i = ETH_MIB_GOOD_OCTETS_RECEIVED_LOW; i < ETH_MIB_LATE_COLLISION;
17210 - i += 4)
17211 - rdl(mp, MIB_COUNTERS_BASE(port_num) + i);
17212 -}
17213 + static int mv643xx_eth_version_printed = 0;
17214 + struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data;
17215 + struct mv643xx_eth_shared_private *msp;
17216 + struct resource *res;
17217 + int ret;
17218
17219 -static inline u32 read_mib(struct mv643xx_private *mp, int offset)
17220 -{
17221 - return rdl(mp, MIB_COUNTERS_BASE(mp->port_num) + offset);
17222 -}
17223 + if (!mv643xx_eth_version_printed++)
17224 + printk(KERN_NOTICE "MV-643xx 10/100/1000 Ethernet Driver\n");
17225
17226 -static void eth_update_mib_counters(struct mv643xx_private *mp)
17227 -{
17228 - struct mv643xx_mib_counters *p = &mp->mib_counters;
17229 - int offset;
17230 + ret = -EINVAL;
17231 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
17232 + if (res == NULL)
17233 + goto out;
17234
17235 - p->good_octets_received +=
17236 - read_mib(mp, ETH_MIB_GOOD_OCTETS_RECEIVED_LOW);
17237 - p->good_octets_received +=
17238 - (u64)read_mib(mp, ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH) << 32;
17239 + ret = -ENOMEM;
17240 + msp = kmalloc(sizeof(*msp), GFP_KERNEL);
17241 + if (msp == NULL)
17242 + goto out;
17243 + memset(msp, 0, sizeof(*msp));
17244
17245 - for (offset = ETH_MIB_BAD_OCTETS_RECEIVED;
17246 - offset <= ETH_MIB_FRAMES_1024_TO_MAX_OCTETS;
17247 - offset += 4)
17248 - *(u32 *)((char *)p + offset) += read_mib(mp, offset);
17249 + msp->base = ioremap(res->start, res->end - res->start + 1);
17250 + if (msp->base == NULL)
17251 + goto out_free;
17252
17253 - p->good_octets_sent += read_mib(mp, ETH_MIB_GOOD_OCTETS_SENT_LOW);
17254 - p->good_octets_sent +=
17255 - (u64)read_mib(mp, ETH_MIB_GOOD_OCTETS_SENT_HIGH) << 32;
17256 + spin_lock_init(&msp->phy_lock);
17257
17258 - for (offset = ETH_MIB_GOOD_FRAMES_SENT;
17259 - offset <= ETH_MIB_LATE_COLLISION;
17260 - offset += 4)
17261 - *(u32 *)((char *)p + offset) += read_mib(mp, offset);
17262 -}
17263 + /*
17264 + * (Re-)program MBUS remapping windows if we are asked to.
17265 + */
17266 + if (pd != NULL && pd->dram != NULL)
17267 + mv643xx_eth_conf_mbus_windows(msp, pd->dram);
17268
17269 -/*
17270 - * ethernet_phy_detect - Detect whether a phy is present
17271 - *
17272 - * DESCRIPTION:
17273 - * This function tests whether there is a PHY present on
17274 - * the specified port.
17275 - *
17276 - * INPUT:
17277 - * struct mv643xx_private *mp Ethernet Port.
17278 - *
17279 - * OUTPUT:
17280 - * None
17281 - *
17282 - * RETURN:
17283 - * 0 on success
17284 - * -ENODEV on failure
17285 - *
17286 - */
17287 -static int ethernet_phy_detect(struct mv643xx_private *mp)
17288 -{
17289 - unsigned int phy_reg_data0;
17290 - int auto_neg;
17291 + /*
17292 + * Detect hardware parameters.
17293 + */
17294 + msp->t_clk = (pd != NULL && pd->t_clk != 0) ? pd->t_clk : 133000000;
17295 + infer_hw_params(msp);
17296
17297 - eth_port_read_smi_reg(mp, 0, &phy_reg_data0);
17298 - auto_neg = phy_reg_data0 & 0x1000;
17299 - phy_reg_data0 ^= 0x1000; /* invert auto_neg */
17300 - eth_port_write_smi_reg(mp, 0, phy_reg_data0);
17301 -
17302 - eth_port_read_smi_reg(mp, 0, &phy_reg_data0);
17303 - if ((phy_reg_data0 & 0x1000) == auto_neg)
17304 - return -ENODEV; /* change didn't take */
17305 + platform_set_drvdata(pdev, msp);
17306
17307 - phy_reg_data0 ^= 0x1000;
17308 - eth_port_write_smi_reg(mp, 0, phy_reg_data0);
17309 return 0;
17310 +
17311 +out_free:
17312 + kfree(msp);
17313 +out:
17314 + return ret;
17315 }
17316
17317 -/*
17318 - * ethernet_phy_get - Get the ethernet port PHY address.
17319 - *
17320 - * DESCRIPTION:
17321 - * This routine returns the given ethernet port PHY address.
17322 - *
17323 - * INPUT:
17324 - * struct mv643xx_private *mp Ethernet Port.
17325 - *
17326 - * OUTPUT:
17327 - * None.
17328 - *
17329 - * RETURN:
17330 - * PHY address.
17331 - *
17332 - */
17333 -static int ethernet_phy_get(struct mv643xx_private *mp)
17334 +static int mv643xx_eth_shared_remove(struct platform_device *pdev)
17335 {
17336 - unsigned int reg_data;
17337 + struct mv643xx_eth_shared_private *msp = platform_get_drvdata(pdev);
17338
17339 - reg_data = rdl(mp, PHY_ADDR_REG);
17340 + iounmap(msp->base);
17341 + kfree(msp);
17342
17343 - return ((reg_data >> (5 * mp->port_num)) & 0x1f);
17344 + return 0;
17345 }
17346
17347 -/*
17348 - * ethernet_phy_set - Set the ethernet port PHY address.
17349 - *
17350 - * DESCRIPTION:
17351 - * This routine sets the given ethernet port PHY address.
17352 - *
17353 - * INPUT:
17354 - * struct mv643xx_private *mp Ethernet Port.
17355 - * int phy_addr PHY address.
17356 - *
17357 - * OUTPUT:
17358 - * None.
17359 - *
17360 - * RETURN:
17361 - * None.
17362 - *
17363 - */
17364 -static void ethernet_phy_set(struct mv643xx_private *mp, int phy_addr)
17365 +static struct platform_driver mv643xx_eth_shared_driver = {
17366 + .probe = mv643xx_eth_shared_probe,
17367 + .remove = mv643xx_eth_shared_remove,
17368 + .driver = {
17369 + .name = MV643XX_ETH_SHARED_NAME,
17370 + .owner = THIS_MODULE,
17371 + },
17372 +};
17373 +
17374 +static void phy_addr_set(struct mv643xx_eth_private *mp, int phy_addr)
17375 {
17376 - u32 reg_data;
17377 int addr_shift = 5 * mp->port_num;
17378 + u32 data;
17379
17380 - reg_data = rdl(mp, PHY_ADDR_REG);
17381 - reg_data &= ~(0x1f << addr_shift);
17382 - reg_data |= (phy_addr & 0x1f) << addr_shift;
17383 - wrl(mp, PHY_ADDR_REG, reg_data);
17384 + data = rdl(mp, PHY_ADDR);
17385 + data &= ~(0x1f << addr_shift);
17386 + data |= (phy_addr & 0x1f) << addr_shift;
17387 + wrl(mp, PHY_ADDR, data);
17388 }
17389
17390 -/*
17391 - * ethernet_phy_reset - Reset Ethernet port PHY.
17392 - *
17393 - * DESCRIPTION:
17394 - * This routine utilizes the SMI interface to reset the ethernet port PHY.
17395 - *
17396 - * INPUT:
17397 - * struct mv643xx_private *mp Ethernet Port.
17398 - *
17399 - * OUTPUT:
17400 - * The PHY is reset.
17401 - *
17402 - * RETURN:
17403 - * None.
17404 - *
17405 - */
17406 -static void ethernet_phy_reset(struct mv643xx_private *mp)
17407 +static int phy_addr_get(struct mv643xx_eth_private *mp)
17408 {
17409 - unsigned int phy_reg_data;
17410 + unsigned int data;
17411
17412 - /* Reset the PHY */
17413 - eth_port_read_smi_reg(mp, 0, &phy_reg_data);
17414 - phy_reg_data |= 0x8000; /* Set bit 15 to reset the PHY */
17415 - eth_port_write_smi_reg(mp, 0, phy_reg_data);
17416 + data = rdl(mp, PHY_ADDR);
17417
17418 - /* wait for PHY to come out of reset */
17419 - do {
17420 - udelay(1);
17421 - eth_port_read_smi_reg(mp, 0, &phy_reg_data);
17422 - } while (phy_reg_data & 0x8000);
17423 + return (data >> (5 * mp->port_num)) & 0x1f;
17424 }
17425
17426 -static void mv643xx_eth_port_enable_tx(struct mv643xx_private *mp,
17427 - unsigned int queues)
17428 +static void set_params(struct mv643xx_eth_private *mp,
17429 + struct mv643xx_eth_platform_data *pd)
17430 {
17431 - wrl(mp, TRANSMIT_QUEUE_COMMAND_REG(mp->port_num), queues);
17432 -}
17433 + struct net_device *dev = mp->dev;
17434
17435 -static void mv643xx_eth_port_enable_rx(struct mv643xx_private *mp,
17436 - unsigned int queues)
17437 -{
17438 - wrl(mp, RECEIVE_QUEUE_COMMAND_REG(mp->port_num), queues);
17439 -}
17440 + if (is_valid_ether_addr(pd->mac_addr))
17441 + memcpy(dev->dev_addr, pd->mac_addr, 6);
17442 + else
17443 + uc_addr_get(mp, dev->dev_addr);
17444
17445 -static unsigned int mv643xx_eth_port_disable_tx(struct mv643xx_private *mp)
17446 -{
17447 - unsigned int port_num = mp->port_num;
17448 - u32 queues;
17449 + if (pd->phy_addr == -1) {
17450 + mp->shared_smi = NULL;
17451 + mp->phy_addr = -1;
17452 + } else {
17453 + mp->shared_smi = mp->shared;
17454 + if (pd->shared_smi != NULL)
17455 + mp->shared_smi = platform_get_drvdata(pd->shared_smi);
17456 +
17457 + if (pd->force_phy_addr || pd->phy_addr) {
17458 + mp->phy_addr = pd->phy_addr & 0x3f;
17459 + phy_addr_set(mp, mp->phy_addr);
17460 + } else {
17461 + mp->phy_addr = phy_addr_get(mp);
17462 + }
17463 + }
17464
17465 - /* Stop Tx port activity. Check port Tx activity. */
17466 - queues = rdl(mp, TRANSMIT_QUEUE_COMMAND_REG(port_num)) & 0xFF;
17467 - if (queues) {
17468 - /* Issue stop command for active queues only */
17469 - wrl(mp, TRANSMIT_QUEUE_COMMAND_REG(port_num), (queues << 8));
17470 + mp->default_rx_ring_size = DEFAULT_RX_QUEUE_SIZE;
17471 + if (pd->rx_queue_size)
17472 + mp->default_rx_ring_size = pd->rx_queue_size;
17473 + mp->rx_desc_sram_addr = pd->rx_sram_addr;
17474 + mp->rx_desc_sram_size = pd->rx_sram_size;
17475
17476 - /* Wait for all Tx activity to terminate. */
17477 - /* Check port cause register that all Tx queues are stopped */
17478 - while (rdl(mp, TRANSMIT_QUEUE_COMMAND_REG(port_num)) & 0xFF)
17479 - udelay(PHY_WAIT_MICRO_SECONDS);
17480 + if (pd->rx_queue_mask)
17481 + mp->rxq_mask = pd->rx_queue_mask;
17482 + else
17483 + mp->rxq_mask = 0x01;
17484 + mp->rxq_primary = fls(mp->rxq_mask) - 1;
17485
17486 - /* Wait for Tx FIFO to empty */
17487 - while (rdl(mp, PORT_STATUS_REG(port_num)) &
17488 - ETH_PORT_TX_FIFO_EMPTY)
17489 - udelay(PHY_WAIT_MICRO_SECONDS);
17490 - }
17491 + mp->default_tx_ring_size = DEFAULT_TX_QUEUE_SIZE;
17492 + if (pd->tx_queue_size)
17493 + mp->default_tx_ring_size = pd->tx_queue_size;
17494 + mp->tx_desc_sram_addr = pd->tx_sram_addr;
17495 + mp->tx_desc_sram_size = pd->tx_sram_size;
17496
17497 - return queues;
17498 + if (pd->tx_queue_mask)
17499 + mp->txq_mask = pd->tx_queue_mask;
17500 + else
17501 + mp->txq_mask = 0x01;
17502 + mp->txq_primary = fls(mp->txq_mask) - 1;
17503 }
17504
17505 -static unsigned int mv643xx_eth_port_disable_rx(struct mv643xx_private *mp)
17506 +static int phy_detect(struct mv643xx_eth_private *mp)
17507 {
17508 - unsigned int port_num = mp->port_num;
17509 - u32 queues;
17510 + unsigned int data;
17511 + unsigned int data2;
17512
17513 - /* Stop Rx port activity. Check port Rx activity. */
17514 - queues = rdl(mp, RECEIVE_QUEUE_COMMAND_REG(port_num)) & 0xFF;
17515 - if (queues) {
17516 - /* Issue stop command for active queues only */
17517 - wrl(mp, RECEIVE_QUEUE_COMMAND_REG(port_num), (queues << 8));
17518 + smi_reg_read(mp, mp->phy_addr, 0, &data);
17519 + smi_reg_write(mp, mp->phy_addr, 0, data ^ 0x1000);
17520
17521 - /* Wait for all Rx activity to terminate. */
17522 - /* Check port cause register that all Rx queues are stopped */
17523 - while (rdl(mp, RECEIVE_QUEUE_COMMAND_REG(port_num)) & 0xFF)
17524 - udelay(PHY_WAIT_MICRO_SECONDS);
17525 - }
17526 + smi_reg_read(mp, mp->phy_addr, 0, &data2);
17527 + if (((data ^ data2) & 0x1000) == 0)
17528 + return -ENODEV;
17529 +
17530 + smi_reg_write(mp, mp->phy_addr, 0, data);
17531
17532 - return queues;
17533 + return 0;
17534 }
17535
17536 -/*
17537 - * eth_port_reset - Reset Ethernet port
17538 - *
17539 - * DESCRIPTION:
17540 - * This routine resets the chip by aborting any SDMA engine activity and
17541 - * clearing the MIB counters. The Receiver and the Transmit unit are in
17542 - * idle state after this command is performed and the port is disabled.
17543 - *
17544 - * INPUT:
17545 - * struct mv643xx_private *mp Ethernet Port.
17546 - *
17547 - * OUTPUT:
17548 - * Channel activity is halted.
17549 - *
17550 - * RETURN:
17551 - * None.
17552 - *
17553 - */
17554 -static void eth_port_reset(struct mv643xx_private *mp)
17555 +static int phy_init(struct mv643xx_eth_private *mp,
17556 + struct mv643xx_eth_platform_data *pd)
17557 {
17558 - unsigned int port_num = mp->port_num;
17559 - unsigned int reg_data;
17560 -
17561 - mv643xx_eth_port_disable_tx(mp);
17562 - mv643xx_eth_port_disable_rx(mp);
17563 -
17564 - /* Clear all MIB counters */
17565 - eth_clear_mib_counters(mp);
17566 + struct ethtool_cmd cmd;
17567 + int err;
17568
17569 - /* Reset the Enable bit in the Configuration Register */
17570 - reg_data = rdl(mp, PORT_SERIAL_CONTROL_REG(port_num));
17571 - reg_data &= ~(SERIAL_PORT_ENABLE |
17572 - DO_NOT_FORCE_LINK_FAIL |
17573 - FORCE_LINK_PASS);
17574 - wrl(mp, PORT_SERIAL_CONTROL_REG(port_num), reg_data);
17575 -}
17576 + err = phy_detect(mp);
17577 + if (err) {
17578 + dev_printk(KERN_INFO, &mp->dev->dev,
17579 + "no PHY detected at addr %d\n", mp->phy_addr);
17580 + return err;
17581 + }
17582 + phy_reset(mp);
17583
17584 + mp->mii.phy_id = mp->phy_addr;
17585 + mp->mii.phy_id_mask = 0x3f;
17586 + mp->mii.reg_num_mask = 0x1f;
17587 + mp->mii.dev = mp->dev;
17588 + mp->mii.mdio_read = mv643xx_eth_mdio_read;
17589 + mp->mii.mdio_write = mv643xx_eth_mdio_write;
17590
17591 -/*
17592 - * eth_port_read_smi_reg - Read PHY registers
17593 - *
17594 - * DESCRIPTION:
17595 - * This routine utilize the SMI interface to interact with the PHY in
17596 - * order to perform PHY register read.
17597 - *
17598 - * INPUT:
17599 - * struct mv643xx_private *mp Ethernet Port.
17600 - * unsigned int phy_reg PHY register address offset.
17601 - * unsigned int *value Register value buffer.
17602 - *
17603 - * OUTPUT:
17604 - * Write the value of a specified PHY register into given buffer.
17605 - *
17606 - * RETURN:
17607 - * false if the PHY is busy or read data is not in valid state.
17608 - * true otherwise.
17609 - *
17610 - */
17611 -static void eth_port_read_smi_reg(struct mv643xx_private *mp,
17612 - unsigned int phy_reg, unsigned int *value)
17613 -{
17614 - void __iomem *smi_reg = mp->shared_smi->eth_base + SMI_REG;
17615 - int phy_addr = ethernet_phy_get(mp);
17616 - unsigned long flags;
17617 - int i;
17618 + mp->mii.supports_gmii = mii_check_gmii_support(&mp->mii);
17619
17620 - /* the SMI register is a shared resource */
17621 - spin_lock_irqsave(&mp->shared_smi->phy_lock, flags);
17622 + memset(&cmd, 0, sizeof(cmd));
17623
17624 - /* wait for the SMI register to become available */
17625 - for (i = 0; readl(smi_reg) & ETH_SMI_BUSY; i++) {
17626 - if (i == PHY_WAIT_ITERATIONS) {
17627 - printk("%s: PHY busy timeout\n", mp->dev->name);
17628 - goto out;
17629 - }
17630 - udelay(PHY_WAIT_MICRO_SECONDS);
17631 + cmd.port = PORT_MII;
17632 + cmd.transceiver = XCVR_INTERNAL;
17633 + cmd.phy_address = mp->phy_addr;
17634 + if (pd->speed == 0) {
17635 + cmd.autoneg = AUTONEG_ENABLE;
17636 + cmd.speed = SPEED_100;
17637 + cmd.advertising = ADVERTISED_10baseT_Half |
17638 + ADVERTISED_10baseT_Full |
17639 + ADVERTISED_100baseT_Half |
17640 + ADVERTISED_100baseT_Full;
17641 + if (mp->mii.supports_gmii)
17642 + cmd.advertising |= ADVERTISED_1000baseT_Full;
17643 + } else {
17644 + cmd.autoneg = AUTONEG_DISABLE;
17645 + cmd.speed = pd->speed;
17646 + cmd.duplex = pd->duplex;
17647 }
17648
17649 - writel((phy_addr << 16) | (phy_reg << 21) | ETH_SMI_OPCODE_READ,
17650 - smi_reg);
17651 -
17652 - /* now wait for the data to be valid */
17653 - for (i = 0; !(readl(smi_reg) & ETH_SMI_READ_VALID); i++) {
17654 - if (i == PHY_WAIT_ITERATIONS) {
17655 - printk("%s: PHY read timeout\n", mp->dev->name);
17656 - goto out;
17657 - }
17658 - udelay(PHY_WAIT_MICRO_SECONDS);
17659 - }
17660 + update_pscr(mp, cmd.speed, cmd.duplex);
17661 + mv643xx_eth_set_settings(mp->dev, &cmd);
17662
17663 - *value = readl(smi_reg) & 0xffff;
17664 -out:
17665 - spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags);
17666 + return 0;
17667 }
17668
17669 -/*
17670 - * eth_port_write_smi_reg - Write to PHY registers
17671 - *
17672 - * DESCRIPTION:
17673 - * This routine utilize the SMI interface to interact with the PHY in
17674 - * order to perform writes to PHY registers.
17675 - *
17676 - * INPUT:
17677 - * struct mv643xx_private *mp Ethernet Port.
17678 - * unsigned int phy_reg PHY register address offset.
17679 - * unsigned int value Register value.
17680 - *
17681 - * OUTPUT:
17682 - * Write the given value to the specified PHY register.
17683 - *
17684 - * RETURN:
17685 - * false if the PHY is busy.
17686 - * true otherwise.
17687 - *
17688 - */
17689 -static void eth_port_write_smi_reg(struct mv643xx_private *mp,
17690 - unsigned int phy_reg, unsigned int value)
17691 +static int mv643xx_eth_probe(struct platform_device *pdev)
17692 {
17693 - void __iomem *smi_reg = mp->shared_smi->eth_base + SMI_REG;
17694 - int phy_addr = ethernet_phy_get(mp);
17695 - unsigned long flags;
17696 - int i;
17697 + struct mv643xx_eth_platform_data *pd;
17698 + struct mv643xx_eth_private *mp;
17699 + struct net_device *dev;
17700 + struct resource *res;
17701 + DECLARE_MAC_BUF(mac);
17702 + int err;
17703
17704 - /* the SMI register is a shared resource */
17705 - spin_lock_irqsave(&mp->shared_smi->phy_lock, flags);
17706 + pd = pdev->dev.platform_data;
17707 + if (pd == NULL) {
17708 + dev_printk(KERN_ERR, &pdev->dev,
17709 + "no mv643xx_eth_platform_data\n");
17710 + return -ENODEV;
17711 + }
17712
17713 - /* wait for the SMI register to become available */
17714 - for (i = 0; readl(smi_reg) & ETH_SMI_BUSY; i++) {
17715 - if (i == PHY_WAIT_ITERATIONS) {
17716 - printk("%s: PHY busy timeout\n", mp->dev->name);
17717 - goto out;
17718 - }
17719 - udelay(PHY_WAIT_MICRO_SECONDS);
17720 + if (pd->shared == NULL) {
17721 + dev_printk(KERN_ERR, &pdev->dev,
17722 + "no mv643xx_eth_platform_data->shared\n");
17723 + return -ENODEV;
17724 }
17725
17726 - writel((phy_addr << 16) | (phy_reg << 21) |
17727 - ETH_SMI_OPCODE_WRITE | (value & 0xffff), smi_reg);
17728 -out:
17729 - spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags);
17730 -}
17731 + dev = alloc_etherdev(sizeof(struct mv643xx_eth_private));
17732 + if (!dev)
17733 + return -ENOMEM;
17734
17735 -/*
17736 - * Wrappers for MII support library.
17737 - */
17738 -static int mv643xx_mdio_read(struct net_device *dev, int phy_id, int location)
17739 -{
17740 - struct mv643xx_private *mp = netdev_priv(dev);
17741 - int val;
17742 + mp = netdev_priv(dev);
17743 + platform_set_drvdata(pdev, mp);
17744
17745 - eth_port_read_smi_reg(mp, location, &val);
17746 - return val;
17747 -}
17748 + mp->shared = platform_get_drvdata(pd->shared);
17749 + mp->port_num = pd->port_number;
17750
17751 -static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val)
17752 -{
17753 - struct mv643xx_private *mp = netdev_priv(dev);
17754 - eth_port_write_smi_reg(mp, location, val);
17755 -}
17756 + mp->dev = dev;
17757 +#ifdef MV643XX_ETH_NAPI
17758 + netif_napi_add(dev, &mp->napi, mv643xx_eth_poll, 64);
17759 +#endif
17760
17761 -/*
17762 - * eth_port_receive - Get received information from Rx ring.
17763 - *
17764 - * DESCRIPTION:
17765 - * This routine returns the received data to the caller. There is no
17766 - * data copying during routine operation. All information is returned
17767 - * using pointer to packet information struct passed from the caller.
17768 - * If the routine exhausts Rx ring resources then the resource error flag
17769 - * is set.
17770 - *
17771 - * INPUT:
17772 - * struct mv643xx_private *mp Ethernet Port Control srtuct.
17773 - * struct pkt_info *p_pkt_info User packet buffer.
17774 - *
17775 - * OUTPUT:
17776 - * Rx ring current and used indexes are updated.
17777 - *
17778 - * RETURN:
17779 - * ETH_ERROR in case the routine can not access Rx desc ring.
17780 - * ETH_QUEUE_FULL if Rx ring resources are exhausted.
17781 - * ETH_END_OF_JOB if there is no received data.
17782 - * ETH_OK otherwise.
17783 - */
17784 -static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp,
17785 - struct pkt_info *p_pkt_info)
17786 -{
17787 - int rx_next_curr_desc, rx_curr_desc, rx_used_desc;
17788 - volatile struct eth_rx_desc *p_rx_desc;
17789 - unsigned int command_status;
17790 - unsigned long flags;
17791 + set_params(mp, pd);
17792
17793 - /* Do not process Rx ring in case of Rx ring resource error */
17794 - if (mp->rx_resource_err)
17795 - return ETH_QUEUE_FULL;
17796 + spin_lock_init(&mp->lock);
17797
17798 - spin_lock_irqsave(&mp->lock, flags);
17799 + mib_counters_clear(mp);
17800 + INIT_WORK(&mp->tx_timeout_task, tx_timeout_task);
17801
17802 - /* Get the Rx Desc ring 'curr and 'used' indexes */
17803 - rx_curr_desc = mp->rx_curr_desc_q;
17804 - rx_used_desc = mp->rx_used_desc_q;
17805 -
17806 - p_rx_desc = &mp->p_rx_desc_area[rx_curr_desc];
17807 -
17808 - /* The following parameters are used to save readings from memory */
17809 - command_status = p_rx_desc->cmd_sts;
17810 - rmb();
17811 + if (mp->phy_addr != -1) {
17812 + err = phy_init(mp, pd);
17813 + if (err)
17814 + goto out;
17815
17816 - /* Nothing to receive... */
17817 - if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) {
17818 - spin_unlock_irqrestore(&mp->lock, flags);
17819 - return ETH_END_OF_JOB;
17820 + SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops);
17821 + } else {
17822 + SET_ETHTOOL_OPS(dev, &mv643xx_eth_ethtool_ops_phyless);
17823 }
17824
17825 - p_pkt_info->byte_cnt = (p_rx_desc->byte_cnt) - RX_BUF_OFFSET;
17826 - p_pkt_info->cmd_sts = command_status;
17827 - p_pkt_info->buf_ptr = (p_rx_desc->buf_ptr) + RX_BUF_OFFSET;
17828 - p_pkt_info->return_info = mp->rx_skb[rx_curr_desc];
17829 - p_pkt_info->l4i_chk = p_rx_desc->buf_size;
17830 -
17831 - /*
17832 - * Clean the return info field to indicate that the
17833 - * packet has been moved to the upper layers
17834 - */
17835 - mp->rx_skb[rx_curr_desc] = NULL;
17836
17837 - /* Update current index in data structure */
17838 - rx_next_curr_desc = (rx_curr_desc + 1) % mp->rx_ring_size;
17839 - mp->rx_curr_desc_q = rx_next_curr_desc;
17840 + res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
17841 + BUG_ON(!res);
17842 + dev->irq = res->start;
17843
17844 - /* Rx descriptors exhausted. Set the Rx ring resource error flag */
17845 - if (rx_next_curr_desc == rx_used_desc)
17846 - mp->rx_resource_err = 1;
17847 + dev->hard_start_xmit = mv643xx_eth_xmit;
17848 + dev->open = mv643xx_eth_open;
17849 + dev->stop = mv643xx_eth_stop;
17850 + dev->set_multicast_list = mv643xx_eth_set_rx_mode;
17851 + dev->set_mac_address = mv643xx_eth_set_mac_address;
17852 + dev->do_ioctl = mv643xx_eth_ioctl;
17853 + dev->change_mtu = mv643xx_eth_change_mtu;
17854 + dev->tx_timeout = mv643xx_eth_tx_timeout;
17855 +#ifdef CONFIG_NET_POLL_CONTROLLER
17856 + dev->poll_controller = mv643xx_eth_netpoll;
17857 +#endif
17858 + dev->watchdog_timeo = 2 * HZ;
17859 + dev->base_addr = 0;
17860
17861 - spin_unlock_irqrestore(&mp->lock, flags);
17862 +#ifdef MV643XX_ETH_CHECKSUM_OFFLOAD_TX
17863 + /*
17864 + * Zero copy can only work if we use Discovery II memory. Else, we will
17865 + * have to map the buffers to ISA memory which is only 16 MB
17866 + */
17867 + dev->features = NETIF_F_SG | NETIF_F_IP_CSUM;
17868 +#endif
17869
17870 - return ETH_OK;
17871 -}
17872 + SET_NETDEV_DEV(dev, &pdev->dev);
17873
17874 -/*
17875 - * eth_rx_return_buff - Returns a Rx buffer back to the Rx ring.
17876 - *
17877 - * DESCRIPTION:
17878 - * This routine returns a Rx buffer back to the Rx ring. It retrieves the
17879 - * next 'used' descriptor and attached the returned buffer to it.
17880 - * In case the Rx ring was in "resource error" condition, where there are
17881 - * no available Rx resources, the function resets the resource error flag.
17882 - *
17883 - * INPUT:
17884 - * struct mv643xx_private *mp Ethernet Port Control srtuct.
17885 - * struct pkt_info *p_pkt_info Information on returned buffer.
17886 - *
17887 - * OUTPUT:
17888 - * New available Rx resource in Rx descriptor ring.
17889 - *
17890 - * RETURN:
17891 - * ETH_ERROR in case the routine can not access Rx desc ring.
17892 - * ETH_OK otherwise.
17893 - */
17894 -static ETH_FUNC_RET_STATUS eth_rx_return_buff(struct mv643xx_private *mp,
17895 - struct pkt_info *p_pkt_info)
17896 -{
17897 - int used_rx_desc; /* Where to return Rx resource */
17898 - volatile struct eth_rx_desc *p_used_rx_desc;
17899 - unsigned long flags;
17900 + if (mp->shared->win_protect)
17901 + wrl(mp, WINDOW_PROTECT(mp->port_num), mp->shared->win_protect);
17902
17903 - spin_lock_irqsave(&mp->lock, flags);
17904 + err = register_netdev(dev);
17905 + if (err)
17906 + goto out;
17907
17908 - /* Get 'used' Rx descriptor */
17909 - used_rx_desc = mp->rx_used_desc_q;
17910 - p_used_rx_desc = &mp->p_rx_desc_area[used_rx_desc];
17911 + dev_printk(KERN_NOTICE, &dev->dev, "port %d with MAC address %s\n",
17912 + mp->port_num, print_mac(mac, dev->dev_addr));
17913
17914 - p_used_rx_desc->buf_ptr = p_pkt_info->buf_ptr;
17915 - p_used_rx_desc->buf_size = p_pkt_info->byte_cnt;
17916 - mp->rx_skb[used_rx_desc] = p_pkt_info->return_info;
17917 + if (dev->features & NETIF_F_SG)
17918 + dev_printk(KERN_NOTICE, &dev->dev, "scatter/gather enabled\n");
17919
17920 - /* Flush the write pipe */
17921 + if (dev->features & NETIF_F_IP_CSUM)
17922 + dev_printk(KERN_NOTICE, &dev->dev, "tx checksum offload\n");
17923
17924 - /* Return the descriptor to DMA ownership */
17925 - wmb();
17926 - p_used_rx_desc->cmd_sts =
17927 - ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT;
17928 - wmb();
17929 +#ifdef MV643XX_ETH_NAPI
17930 + dev_printk(KERN_NOTICE, &dev->dev, "napi enabled\n");
17931 +#endif
17932
17933 - /* Move the used descriptor pointer to the next descriptor */
17934 - mp->rx_used_desc_q = (used_rx_desc + 1) % mp->rx_ring_size;
17935 + if (mp->tx_desc_sram_size > 0)
17936 + dev_printk(KERN_NOTICE, &dev->dev, "configured with sram\n");
17937
17938 - /* Any Rx return cancels the Rx resource error status */
17939 - mp->rx_resource_err = 0;
17940 + return 0;
17941
17942 - spin_unlock_irqrestore(&mp->lock, flags);
17943 +out:
17944 + free_netdev(dev);
17945
17946 - return ETH_OK;
17947 + return err;
17948 }
17949
17950 -/************* Begin ethtool support *************************/
17951 -
17952 -struct mv643xx_stats {
17953 - char stat_string[ETH_GSTRING_LEN];
17954 - int sizeof_stat;
17955 - int stat_offset;
17956 -};
17957 -
17958 -#define MV643XX_STAT(m) FIELD_SIZEOF(struct mv643xx_private, m), \
17959 - offsetof(struct mv643xx_private, m)
17960 -
17961 -static const struct mv643xx_stats mv643xx_gstrings_stats[] = {
17962 - { "rx_packets", MV643XX_STAT(stats.rx_packets) },
17963 - { "tx_packets", MV643XX_STAT(stats.tx_packets) },
17964 - { "rx_bytes", MV643XX_STAT(stats.rx_bytes) },
17965 - { "tx_bytes", MV643XX_STAT(stats.tx_bytes) },
17966 - { "rx_errors", MV643XX_STAT(stats.rx_errors) },
17967 - { "tx_errors", MV643XX_STAT(stats.tx_errors) },
17968 - { "rx_dropped", MV643XX_STAT(stats.rx_dropped) },
17969 - { "tx_dropped", MV643XX_STAT(stats.tx_dropped) },
17970 - { "good_octets_received", MV643XX_STAT(mib_counters.good_octets_received) },
17971 - { "bad_octets_received", MV643XX_STAT(mib_counters.bad_octets_received) },
17972 - { "internal_mac_transmit_err", MV643XX_STAT(mib_counters.internal_mac_transmit_err) },
17973 - { "good_frames_received", MV643XX_STAT(mib_counters.good_frames_received) },
17974 - { "bad_frames_received", MV643XX_STAT(mib_counters.bad_frames_received) },
17975 - { "broadcast_frames_received", MV643XX_STAT(mib_counters.broadcast_frames_received) },
17976 - { "multicast_frames_received", MV643XX_STAT(mib_counters.multicast_frames_received) },
17977 - { "frames_64_octets", MV643XX_STAT(mib_counters.frames_64_octets) },
17978 - { "frames_65_to_127_octets", MV643XX_STAT(mib_counters.frames_65_to_127_octets) },
17979 - { "frames_128_to_255_octets", MV643XX_STAT(mib_counters.frames_128_to_255_octets) },
17980 - { "frames_256_to_511_octets", MV643XX_STAT(mib_counters.frames_256_to_511_octets) },
17981 - { "frames_512_to_1023_octets", MV643XX_STAT(mib_counters.frames_512_to_1023_octets) },
17982 - { "frames_1024_to_max_octets", MV643XX_STAT(mib_counters.frames_1024_to_max_octets) },
17983 - { "good_octets_sent", MV643XX_STAT(mib_counters.good_octets_sent) },
17984 - { "good_frames_sent", MV643XX_STAT(mib_counters.good_frames_sent) },
17985 - { "excessive_collision", MV643XX_STAT(mib_counters.excessive_collision) },
17986 - { "multicast_frames_sent", MV643XX_STAT(mib_counters.multicast_frames_sent) },
17987 - { "broadcast_frames_sent", MV643XX_STAT(mib_counters.broadcast_frames_sent) },
17988 - { "unrec_mac_control_received", MV643XX_STAT(mib_counters.unrec_mac_control_received) },
17989 - { "fc_sent", MV643XX_STAT(mib_counters.fc_sent) },
17990 - { "good_fc_received", MV643XX_STAT(mib_counters.good_fc_received) },
17991 - { "bad_fc_received", MV643XX_STAT(mib_counters.bad_fc_received) },
17992 - { "undersize_received", MV643XX_STAT(mib_counters.undersize_received) },
17993 - { "fragments_received", MV643XX_STAT(mib_counters.fragments_received) },
17994 - { "oversize_received", MV643XX_STAT(mib_counters.oversize_received) },
17995 - { "jabber_received", MV643XX_STAT(mib_counters.jabber_received) },
17996 - { "mac_receive_error", MV643XX_STAT(mib_counters.mac_receive_error) },
17997 - { "bad_crc_event", MV643XX_STAT(mib_counters.bad_crc_event) },
17998 - { "collision", MV643XX_STAT(mib_counters.collision) },
17999 - { "late_collision", MV643XX_STAT(mib_counters.late_collision) },
18000 -};
18001 +static int mv643xx_eth_remove(struct platform_device *pdev)
18002 +{
18003 + struct mv643xx_eth_private *mp = platform_get_drvdata(pdev);
18004
18005 -#define MV643XX_STATS_LEN ARRAY_SIZE(mv643xx_gstrings_stats)
18006 + unregister_netdev(mp->dev);
18007 + flush_scheduled_work();
18008 + free_netdev(mp->dev);
18009
18010 -static void mv643xx_get_drvinfo(struct net_device *netdev,
18011 - struct ethtool_drvinfo *drvinfo)
18012 -{
18013 - strncpy(drvinfo->driver, mv643xx_driver_name, 32);
18014 - strncpy(drvinfo->version, mv643xx_driver_version, 32);
18015 - strncpy(drvinfo->fw_version, "N/A", 32);
18016 - strncpy(drvinfo->bus_info, "mv643xx", 32);
18017 - drvinfo->n_stats = MV643XX_STATS_LEN;
18018 -}
18019 + platform_set_drvdata(pdev, NULL);
18020
18021 -static int mv643xx_get_sset_count(struct net_device *netdev, int sset)
18022 -{
18023 - switch (sset) {
18024 - case ETH_SS_STATS:
18025 - return MV643XX_STATS_LEN;
18026 - default:
18027 - return -EOPNOTSUPP;
18028 - }
18029 + return 0;
18030 }
18031
18032 -static void mv643xx_get_ethtool_stats(struct net_device *netdev,
18033 - struct ethtool_stats *stats, uint64_t *data)
18034 +static void mv643xx_eth_shutdown(struct platform_device *pdev)
18035 {
18036 - struct mv643xx_private *mp = netdev->priv;
18037 - int i;
18038 + struct mv643xx_eth_private *mp = platform_get_drvdata(pdev);
18039
18040 - eth_update_mib_counters(mp);
18041 + /* Mask all interrupts on ethernet port */
18042 + wrl(mp, INT_MASK(mp->port_num), 0);
18043 + rdl(mp, INT_MASK(mp->port_num));
18044
18045 - for (i = 0; i < MV643XX_STATS_LEN; i++) {
18046 - char *p = (char *)mp+mv643xx_gstrings_stats[i].stat_offset;
18047 - data[i] = (mv643xx_gstrings_stats[i].sizeof_stat ==
18048 - sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p;
18049 - }
18050 + if (netif_running(mp->dev))
18051 + port_reset(mp);
18052 }
18053
18054 -static void mv643xx_get_strings(struct net_device *netdev, uint32_t stringset,
18055 - uint8_t *data)
18056 -{
18057 - int i;
18058 -
18059 - switch(stringset) {
18060 - case ETH_SS_STATS:
18061 - for (i=0; i < MV643XX_STATS_LEN; i++) {
18062 - memcpy(data + i * ETH_GSTRING_LEN,
18063 - mv643xx_gstrings_stats[i].stat_string,
18064 - ETH_GSTRING_LEN);
18065 - }
18066 - break;
18067 - }
18068 -}
18069 +static struct platform_driver mv643xx_eth_driver = {
18070 + .probe = mv643xx_eth_probe,
18071 + .remove = mv643xx_eth_remove,
18072 + .shutdown = mv643xx_eth_shutdown,
18073 + .driver = {
18074 + .name = MV643XX_ETH_NAME,
18075 + .owner = THIS_MODULE,
18076 + },
18077 +};
18078
18079 -static u32 mv643xx_eth_get_link(struct net_device *dev)
18080 +static int __init mv643xx_eth_init_module(void)
18081 {
18082 - struct mv643xx_private *mp = netdev_priv(dev);
18083 -
18084 - return mii_link_ok(&mp->mii);
18085 -}
18086 + int rc;
18087
18088 -static int mv643xx_eth_nway_restart(struct net_device *dev)
18089 -{
18090 - struct mv643xx_private *mp = netdev_priv(dev);
18091 + rc = platform_driver_register(&mv643xx_eth_shared_driver);
18092 + if (!rc) {
18093 + rc = platform_driver_register(&mv643xx_eth_driver);
18094 + if (rc)
18095 + platform_driver_unregister(&mv643xx_eth_shared_driver);
18096 + }
18097
18098 - return mii_nway_restart(&mp->mii);
18099 + return rc;
18100 }
18101 +module_init(mv643xx_eth_init_module);
18102
18103 -static int mv643xx_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
18104 +static void __exit mv643xx_eth_cleanup_module(void)
18105 {
18106 - struct mv643xx_private *mp = netdev_priv(dev);
18107 -
18108 - return generic_mii_ioctl(&mp->mii, if_mii(ifr), cmd, NULL);
18109 + platform_driver_unregister(&mv643xx_eth_driver);
18110 + platform_driver_unregister(&mv643xx_eth_shared_driver);
18111 }
18112 +module_exit(mv643xx_eth_cleanup_module);
18113
18114 -static const struct ethtool_ops mv643xx_ethtool_ops = {
18115 - .get_settings = mv643xx_get_settings,
18116 - .set_settings = mv643xx_set_settings,
18117 - .get_drvinfo = mv643xx_get_drvinfo,
18118 - .get_link = mv643xx_eth_get_link,
18119 - .set_sg = ethtool_op_set_sg,
18120 - .get_sset_count = mv643xx_get_sset_count,
18121 - .get_ethtool_stats = mv643xx_get_ethtool_stats,
18122 - .get_strings = mv643xx_get_strings,
18123 - .nway_reset = mv643xx_eth_nway_restart,
18124 -};
18125 -
18126 -/************* End ethtool support *************************/
18127 +MODULE_AUTHOR("Rabeeh Khoury, Assaf Hoffman, Matthew Dharm, "
18128 + "Manish Lachwani, Dale Farnsworth and Lennert Buytenhek");
18129 +MODULE_DESCRIPTION("Ethernet driver for Marvell MV643XX");
18130 +MODULE_LICENSE("GPL");
18131 +MODULE_ALIAS("platform:" MV643XX_ETH_SHARED_NAME);
18132 +MODULE_ALIAS("platform:" MV643XX_ETH_NAME);
18133 --- /dev/null
18134 +++ b/include/asm-arm/arch-kirkwood/debug-macro.S
18135 @@ -0,0 +1,20 @@
18136 +/*
18137 + * include/asm-arm/arch-kirkwood/debug-macro.S
18138 + *
18139 + * This program is free software; you can redistribute it and/or modify
18140 + * it under the terms of the GNU General Public License version 2 as
18141 + * published by the Free Software Foundation.
18142 +*/
18143 +
18144 +#include <asm/arch/kirkwood.h>
18145 +
18146 + .macro addruart,rx
18147 + mrc p15, 0, \rx, c1, c0
18148 + tst \rx, #1 @ MMU enabled?
18149 + ldreq \rx, =KIRKWOOD_REGS_PHYS_BASE
18150 + ldrne \rx, =KIRKWOOD_REGS_VIRT_BASE
18151 + orr \rx, \rx, #0x00012000
18152 + .endm
18153 +
18154 +#define UART_SHIFT 2
18155 +#include <asm/hardware/debug-8250.S>
18156 --- /dev/null
18157 +++ b/include/asm-arm/arch-kirkwood/dma.h
18158 @@ -0,0 +1 @@
18159 +/* empty */
18160 --- /dev/null
18161 +++ b/include/asm-arm/arch-kirkwood/entry-macro.S
18162 @@ -0,0 +1,40 @@
18163 +/*
18164 + * include/asm-arm/arch-kirkwood/entry-macro.S
18165 + *
18166 + * Low-level IRQ helper macros for Marvell Kirkwood platforms
18167 + *
18168 + * This file is licensed under the terms of the GNU General Public
18169 + * License version 2. This program is licensed "as is" without any
18170 + * warranty of any kind, whether express or implied.
18171 + */
18172 +
18173 +#include <asm/arch/kirkwood.h>
18174 +
18175 + .macro disable_fiq
18176 + .endm
18177 +
18178 + .macro arch_ret_to_user, tmp1, tmp2
18179 + .endm
18180 +
18181 + .macro get_irqnr_preamble, base, tmp
18182 + ldr \base, =IRQ_VIRT_BASE
18183 + .endm
18184 +
18185 + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
18186 + @ check low interrupts
18187 + ldr \irqstat, [\base, #IRQ_CAUSE_LOW_OFF]
18188 + ldr \tmp, [\base, #IRQ_MASK_LOW_OFF]
18189 + mov \irqnr, #31
18190 + ands \irqstat, \irqstat, \tmp
18191 + bne 1001f
18192 +
18193 + @ if no low interrupts set, check high interrupts
18194 + ldr \irqstat, [\base, #IRQ_CAUSE_HIGH_OFF]
18195 + ldr \tmp, [\base, #IRQ_MASK_HIGH_OFF]
18196 + mov \irqnr, #63
18197 + ands \irqstat, \irqstat, \tmp
18198 +
18199 + @ find first active interrupt source
18200 +1001: clzne \irqstat, \irqstat
18201 + subne \irqnr, \irqnr, \irqstat
18202 + .endm
18203 --- /dev/null
18204 +++ b/include/asm-arm/arch-kirkwood/hardware.h
18205 @@ -0,0 +1,21 @@
18206 +/*
18207 + * include/asm-arm/arch-kirkwood/hardware.h
18208 + *
18209 + * This program is free software; you can redistribute it and/or modify
18210 + * it under the terms of the GNU General Public License version 2 as
18211 + * published by the Free Software Foundation.
18212 + */
18213 +
18214 +#ifndef __ASM_ARCH_HARDWARE_H
18215 +#define __ASM_ARCH_HARDWARE_H
18216 +
18217 +#include "kirkwood.h"
18218 +
18219 +#define pcibios_assign_all_busses() 1
18220 +
18221 +#define PCIBIOS_MIN_IO 0x00001000
18222 +#define PCIBIOS_MIN_MEM 0x01000000
18223 +#define PCIMEM_BASE KIRKWOOD_PCIE_MEM_PHYS_BASE /* mem base for VGA */
18224 +
18225 +
18226 +#endif
18227 --- /dev/null
18228 +++ b/include/asm-arm/arch-kirkwood/io.h
18229 @@ -0,0 +1,26 @@
18230 +/*
18231 + * include/asm-arm/arch-kirkwood/io.h
18232 + *
18233 + * This file is licensed under the terms of the GNU General Public
18234 + * License version 2. This program is licensed "as is" without any
18235 + * warranty of any kind, whether express or implied.
18236 + */
18237 +
18238 +#ifndef __ASM_ARCH_IO_H
18239 +#define __ASM_ARCH_IO_H
18240 +
18241 +#include "kirkwood.h"
18242 +
18243 +#define IO_SPACE_LIMIT 0xffffffff
18244 +
18245 +static inline void __iomem *__io(unsigned long addr)
18246 +{
18247 + return (void __iomem *)((addr - KIRKWOOD_PCIE_IO_PHYS_BASE)
18248 + + KIRKWOOD_PCIE_IO_VIRT_BASE);
18249 +}
18250 +
18251 +#define __io(a) __io(a)
18252 +#define __mem_pci(a) (a)
18253 +
18254 +
18255 +#endif
18256 --- /dev/null
18257 +++ b/include/asm-arm/arch-kirkwood/irqs.h
18258 @@ -0,0 +1,63 @@
18259 +/*
18260 + * include/asm-arm/arch-kirkwood/irqs.h
18261 + *
18262 + * IRQ definitions for Marvell Kirkwood SoCs
18263 + *
18264 + * This file is licensed under the terms of the GNU General Public
18265 + * License version 2. This program is licensed "as is" without any
18266 + * warranty of any kind, whether express or implied.
18267 + */
18268 +
18269 +#ifndef __ASM_ARCH_IRQS_H
18270 +#define __ASM_ARCH_IRQS_H
18271 +
18272 +#include "kirkwood.h" /* need GPIO_MAX */
18273 +
18274 +/*
18275 + * Low Interrupt Controller
18276 + */
18277 +#define IRQ_KIRKWOOD_HIGH_SUM 0
18278 +#define IRQ_KIRKWOOD_BRIDGE 1
18279 +#define IRQ_KIRKWOOD_HOST2CPU 2
18280 +#define IRQ_KIRKWOOD_CPU2HOST 3
18281 +#define IRQ_KIRKWOOD_XOR_00 5
18282 +#define IRQ_KIRKWOOD_XOR_01 6
18283 +#define IRQ_KIRKWOOD_XOR_10 7
18284 +#define IRQ_KIRKWOOD_XOR_11 8
18285 +#define IRQ_KIRKWOOD_PCIE 9
18286 +#define IRQ_KIRKWOOD_GE00_SUM 11
18287 +#define IRQ_KIRKWOOD_GE01_SUM 15
18288 +#define IRQ_KIRKWOOD_USB 19
18289 +#define IRQ_KIRKWOOD_SATA 21
18290 +#define IRQ_KIRKWOOD_CRYPTO 22
18291 +#define IRQ_KIRKWOOD_SPI 23
18292 +#define IRQ_KIRKWOOD_I2S 24
18293 +#define IRQ_KIRKWOOD_TS_0 26
18294 +#define IRQ_KIRKWOOD_SDIO 28
18295 +#define IRQ_KIRKWOOD_TWSI 29
18296 +#define IRQ_KIRKWOOD_AVB 30
18297 +#define IRQ_KIRKWOOD_TDMI 31
18298 +
18299 +/*
18300 + * High Interrupt Controller
18301 + */
18302 +#define IRQ_KIRKWOOD_UART_0 33
18303 +#define IRQ_KIRKWOOD_UART_1 34
18304 +#define IRQ_KIRKWOOD_GPIO_LOW_0_7 35
18305 +#define IRQ_KIRKWOOD_GPIO_LOW_8_15 36
18306 +#define IRQ_KIRKWOOD_GPIO_LOW_16_23 37
18307 +#define IRQ_KIRKWOOD_GPIO_LOW_24_31 38
18308 +#define IRQ_KIRKWOOD_GPIO_HIGH_0_7 39
18309 +#define IRQ_KIRKWOOD_GPIO_HIGH_8_15 40
18310 +#define IRQ_KIRKWOOD_GPIO_HIGH_16_23 41
18311 +
18312 +/*
18313 + * KIRKWOOD General Purpose Pins
18314 + */
18315 +#define IRQ_KIRKWOOD_GPIO_START 64
18316 +#define NR_GPIO_IRQS GPIO_MAX
18317 +
18318 +#define NR_IRQS (IRQ_KIRKWOOD_GPIO_START + NR_GPIO_IRQS)
18319 +
18320 +
18321 +#endif
18322 --- /dev/null
18323 +++ b/include/asm-arm/arch-kirkwood/kirkwood.h
18324 @@ -0,0 +1,99 @@
18325 +/*
18326 + * include/asm-arm/arch-kirkwood/kirkwood.h
18327 + *
18328 + * Generic definitions for Marvell Kirkwood SoC flavors:
18329 + * 88F6180, 88F6192 and 88F6281.
18330 + *
18331 + * This file is licensed under the terms of the GNU General Public
18332 + * License version 2. This program is licensed "as is" without any
18333 + * warranty of any kind, whether express or implied.
18334 + */
18335 +
18336 +#ifndef __ASM_ARCH_KIRKWOOD_H
18337 +#define __ASM_ARCH_KIRKWOOD_H
18338 +
18339 +/*
18340 + * Marvell Kirkwood address maps.
18341 + *
18342 + * phys
18343 + * e0000000 PCIe Memory space
18344 + * f1000000 on-chip peripheral registers
18345 + * f2000000 PCIe I/O space
18346 + * f3000000 NAND controller address window
18347 + *
18348 + * virt phys size
18349 + * fee00000 f1000000 1M on-chip peripheral registers
18350 + * fef00000 f2000000 1M PCIe I/O space
18351 + */
18352 +
18353 +#define KIRKWOOD_NAND_MEM_PHYS_BASE 0xf3000000
18354 +#define KIRKWOOD_NAND_MEM_SIZE SZ_64K /* 1K is sufficient, but 64K
18355 + * is the minimal window size
18356 + */
18357 +
18358 +#define KIRKWOOD_PCIE_IO_PHYS_BASE 0xf2000000
18359 +#define KIRKWOOD_PCIE_IO_VIRT_BASE 0xfef00000
18360 +#define KIRKWOOD_PCIE_IO_BUS_BASE 0x00000000
18361 +#define KIRKWOOD_PCIE_IO_SIZE SZ_1M
18362 +
18363 +#define KIRKWOOD_REGS_PHYS_BASE 0xf1000000
18364 +#define KIRKWOOD_REGS_VIRT_BASE 0xfee00000
18365 +#define KIRKWOOD_REGS_SIZE SZ_1M
18366 +
18367 +#define KIRKWOOD_PCIE_MEM_PHYS_BASE 0xe0000000
18368 +#define KIRKWOOD_PCIE_MEM_SIZE SZ_128M
18369 +
18370 +/*
18371 + * MBUS bridge registers.
18372 + */
18373 +#define BRIDGE_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x20000)
18374 +#define CPU_CONTROL (BRIDGE_VIRT_BASE | 0x0104)
18375 +#define CPU_RESET 0x00000002
18376 +//#define L2_WRITETHROUGH 0x00020000
18377 +#define RSTOUTn_MASK (BRIDGE_VIRT_BASE | 0x0108)
18378 +#define SOFT_RESET_OUT_EN 0x00000004
18379 +#define SYSTEM_SOFT_RESET (BRIDGE_VIRT_BASE | 0x010c)
18380 +#define SOFT_RESET 0x00000001
18381 +#define BRIDGE_CAUSE (BRIDGE_VIRT_BASE | 0x0110)
18382 +#define BRIDGE_MASK (BRIDGE_VIRT_BASE | 0x0114)
18383 +#define BRIDGE_INT_TIMER0 0x0002
18384 +#define BRIDGE_INT_TIMER1 0x0004
18385 +#define BRIDGE_INT_TIMER1_CLR (~0x0004)
18386 +#define IRQ_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0200)
18387 +#define IRQ_CAUSE_LOW_OFF 0x0000
18388 +#define IRQ_MASK_LOW_OFF 0x0004
18389 +#define IRQ_CAUSE_HIGH_OFF 0x0010
18390 +#define IRQ_MASK_HIGH_OFF 0x0014
18391 +#define TIMER_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0300)
18392 +
18393 +/*
18394 + * Register Map
18395 + */
18396 +#define DDR_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x00000)
18397 +#define DDR_WINDOW_CPU_BASE (DDR_VIRT_BASE | 0x1500)
18398 +
18399 +#define DEV_BUS_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x10000)
18400 +#define DEV_BUS_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x10000)
18401 +#define SAMPLE_AT_RESET (DEV_BUS_VIRT_BASE | 0x0030)
18402 +#define DEVICE_ID (DEV_BUS_VIRT_BASE | 0x0034)
18403 +#define RTC_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x0300)
18404 +#define SPI_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x0600)
18405 +#define UART0_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2000)
18406 +#define UART0_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2000)
18407 +#define UART1_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2100)
18408 +#define UART1_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2100)
18409 +
18410 +#define PCIE_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x40000)
18411 +
18412 +#define USB_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x50000)
18413 +
18414 +#define GE00_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x70000)
18415 +#define GE01_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x74000)
18416 +
18417 +#define SATA_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x80000)
18418 +
18419 +
18420 +#define GPIO_MAX 50
18421 +
18422 +
18423 +#endif
18424 --- /dev/null
18425 +++ b/include/asm-arm/arch-kirkwood/memory.h
18426 @@ -0,0 +1,14 @@
18427 +/*
18428 + * include/asm-arm/arch-kirkwood/memory.h
18429 + */
18430 +
18431 +#ifndef __ASM_ARCH_MEMORY_H
18432 +#define __ASM_ARCH_MEMORY_H
18433 +
18434 +#define PHYS_OFFSET UL(0x00000000)
18435 +
18436 +#define __virt_to_bus(x) __virt_to_phys(x)
18437 +#define __bus_to_virt(x) __phys_to_virt(x)
18438 +
18439 +
18440 +#endif
18441 --- /dev/null
18442 +++ b/include/asm-arm/arch-kirkwood/system.h
18443 @@ -0,0 +1,37 @@
18444 +/*
18445 + * include/asm-arm/arch-kirkwood/system.h
18446 + *
18447 + * This file is licensed under the terms of the GNU General Public
18448 + * License version 2. This program is licensed "as is" without any
18449 + * warranty of any kind, whether express or implied.
18450 + */
18451 +
18452 +#ifndef __ASM_ARCH_SYSTEM_H
18453 +#define __ASM_ARCH_SYSTEM_H
18454 +
18455 +#include <asm/arch/hardware.h>
18456 +#include <asm/arch/kirkwood.h>
18457 +
18458 +static inline void arch_idle(void)
18459 +{
18460 + cpu_do_idle();
18461 +}
18462 +
18463 +static inline void arch_reset(char mode)
18464 +{
18465 + /*
18466 + * Enable soft reset to assert RSTOUTn.
18467 + */
18468 + writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK);
18469 +
18470 + /*
18471 + * Assert soft reset.
18472 + */
18473 + writel(SOFT_RESET, SYSTEM_SOFT_RESET);
18474 +
18475 + while (1)
18476 + ;
18477 +}
18478 +
18479 +
18480 +#endif
18481 --- /dev/null
18482 +++ b/include/asm-arm/arch-kirkwood/timex.h
18483 @@ -0,0 +1,11 @@
18484 +/*
18485 + * include/asm-arm/arch-kirkwood/timex.h
18486 + *
18487 + * This file is licensed under the terms of the GNU General Public
18488 + * License version 2. This program is licensed "as is" without any
18489 + * warranty of any kind, whether express or implied.
18490 + */
18491 +
18492 +#define CLOCK_TICK_RATE (100 * HZ)
18493 +
18494 +#define KIRKWOOD_TCLK 166666667
18495 --- /dev/null
18496 +++ b/include/asm-arm/arch-kirkwood/uncompress.h
18497 @@ -0,0 +1,47 @@
18498 +/*
18499 + * include/asm-arm/arch-kirkwood/uncompress.h
18500 + *
18501 + * This file is licensed under the terms of the GNU General Public
18502 + * License version 2. This program is licensed "as is" without any
18503 + * warranty of any kind, whether express or implied.
18504 + */
18505 +
18506 +#include <linux/serial_reg.h>
18507 +#include <asm/arch/kirkwood.h>
18508 +
18509 +#define SERIAL_BASE ((unsigned char *)UART0_PHYS_BASE)
18510 +
18511 +static void putc(const char c)
18512 +{
18513 + unsigned char *base = SERIAL_BASE;
18514 + int i;
18515 +
18516 + for (i = 0; i < 0x1000; i++) {
18517 + if (base[UART_LSR << 2] & UART_LSR_THRE)
18518 + break;
18519 + barrier();
18520 + }
18521 +
18522 + base[UART_TX << 2] = c;
18523 +}
18524 +
18525 +static void flush(void)
18526 +{
18527 + unsigned char *base = SERIAL_BASE;
18528 + unsigned char mask;
18529 + int i;
18530 +
18531 + mask = UART_LSR_TEMT | UART_LSR_THRE;
18532 +
18533 + for (i = 0; i < 0x1000; i++) {
18534 + if ((base[UART_LSR << 2] & mask) == mask)
18535 + break;
18536 + barrier();
18537 + }
18538 +}
18539 +
18540 +/*
18541 + * nothing to do
18542 + */
18543 +#define arch_decomp_setup()
18544 +#define arch_decomp_wdog()
18545 --- /dev/null
18546 +++ b/include/asm-arm/arch-kirkwood/vmalloc.h
18547 @@ -0,0 +1,5 @@
18548 +/*
18549 + * include/asm-arm/arch-kirkwood/vmalloc.h
18550 + */
18551 +
18552 +#define VMALLOC_END 0xfe800000
18553 --- /dev/null
18554 +++ b/include/asm-arm/arch-loki/debug-macro.S
18555 @@ -0,0 +1,20 @@
18556 +/*
18557 + * include/asm-arm/arch-loki/debug-macro.S
18558 + *
18559 + * This program is free software; you can redistribute it and/or modify
18560 + * it under the terms of the GNU General Public License version 2 as
18561 + * published by the Free Software Foundation.
18562 +*/
18563 +
18564 +#include <asm/arch/loki.h>
18565 +
18566 + .macro addruart,rx
18567 + mrc p15, 0, \rx, c1, c0
18568 + tst \rx, #1 @ MMU enabled?
18569 + ldreq \rx, =LOKI_REGS_PHYS_BASE
18570 + ldrne \rx, =LOKI_REGS_VIRT_BASE
18571 + orr \rx, \rx, #0x00012000
18572 + .endm
18573 +
18574 +#define UART_SHIFT 2
18575 +#include <asm/hardware/debug-8250.S>
18576 --- /dev/null
18577 +++ b/include/asm-arm/arch-loki/dma.h
18578 @@ -0,0 +1 @@
18579 +/* empty */
18580 --- /dev/null
18581 +++ b/include/asm-arm/arch-loki/entry-macro.S
18582 @@ -0,0 +1,30 @@
18583 +/*
18584 + * include/asm-arm/arch-loki/entry-macro.S
18585 + *
18586 + * Low-level IRQ helper macros for Marvell Loki (88RC8480) platforms
18587 + *
18588 + * This file is licensed under the terms of the GNU General Public
18589 + * License version 2. This program is licensed "as is" without any
18590 + * warranty of any kind, whether express or implied.
18591 + */
18592 +
18593 +#include <asm/arch/loki.h>
18594 +
18595 + .macro disable_fiq
18596 + .endm
18597 +
18598 + .macro arch_ret_to_user, tmp1, tmp2
18599 + .endm
18600 +
18601 + .macro get_irqnr_preamble, base, tmp
18602 + ldr \base, =IRQ_VIRT_BASE
18603 + .endm
18604 +
18605 + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
18606 + ldr \irqstat, [\base, #IRQ_CAUSE_OFF]
18607 + ldr \tmp, [\base, #IRQ_MASK_OFF]
18608 + mov \irqnr, #0
18609 + ands \irqstat, \irqstat, \tmp
18610 + clzne \irqnr, \irqstat
18611 + rsbne \irqnr, \irqnr, #31
18612 + .endm
18613 --- /dev/null
18614 +++ b/include/asm-arm/arch-loki/hardware.h
18615 @@ -0,0 +1,15 @@
18616 +/*
18617 + * include/asm-arm/arch-loki/hardware.h
18618 + *
18619 + * This program is free software; you can redistribute it and/or modify
18620 + * it under the terms of the GNU General Public License version 2 as
18621 + * published by the Free Software Foundation.
18622 + */
18623 +
18624 +#ifndef __ASM_ARCH_HARDWARE_H
18625 +#define __ASM_ARCH_HARDWARE_H
18626 +
18627 +#include "loki.h"
18628 +
18629 +
18630 +#endif
18631 --- /dev/null
18632 +++ b/include/asm-arm/arch-loki/io.h
18633 @@ -0,0 +1,26 @@
18634 +/*
18635 + * include/asm-arm/arch-loki/io.h
18636 + *
18637 + * This file is licensed under the terms of the GNU General Public
18638 + * License version 2. This program is licensed "as is" without any
18639 + * warranty of any kind, whether express or implied.
18640 + */
18641 +
18642 +#ifndef __ASM_ARCH_IO_H
18643 +#define __ASM_ARCH_IO_H
18644 +
18645 +#include "loki.h"
18646 +
18647 +#define IO_SPACE_LIMIT 0xffffffff
18648 +
18649 +static inline void __iomem *__io(unsigned long addr)
18650 +{
18651 + return (void __iomem *)((addr - LOKI_PCIE0_IO_PHYS_BASE)
18652 + + LOKI_PCIE0_IO_VIRT_BASE);
18653 +}
18654 +
18655 +#define __io(a) __io(a)
18656 +#define __mem_pci(a) (a)
18657 +
18658 +
18659 +#endif
18660 --- /dev/null
18661 +++ b/include/asm-arm/arch-loki/irqs.h
18662 @@ -0,0 +1,58 @@
18663 +/*
18664 + * include/asm-arm/arch-loki/irqs.h
18665 + *
18666 + * IRQ definitions for Marvell Loki (88RC8480) SoCs
18667 + *
18668 + * This file is licensed under the terms of the GNU General Public
18669 + * License version 2. This program is licensed "as is" without any
18670 + * warranty of any kind, whether express or implied.
18671 + */
18672 +
18673 +#ifndef __ASM_ARCH_IRQS_H
18674 +#define __ASM_ARCH_IRQS_H
18675 +
18676 +#include "loki.h" /* need GPIO_MAX */
18677 +
18678 +/*
18679 + * Interrupt Controller
18680 + */
18681 +#define IRQ_LOKI_PCIE_A_CPU_DRBL 0
18682 +#define IRQ_LOKI_CPU_PCIE_A_DRBL 1
18683 +#define IRQ_LOKI_PCIE_B_CPU_DRBL 2
18684 +#define IRQ_LOKI_CPU_PCIE_B_DRBL 3
18685 +#define IRQ_LOKI_COM_A_ERR 6
18686 +#define IRQ_LOKI_COM_A_IN 7
18687 +#define IRQ_LOKI_COM_A_OUT 8
18688 +#define IRQ_LOKI_COM_B_ERR 9
18689 +#define IRQ_LOKI_COM_B_IN 10
18690 +#define IRQ_LOKI_COM_B_OUT 11
18691 +#define IRQ_LOKI_DMA_A 12
18692 +#define IRQ_LOKI_DMA_B 13
18693 +#define IRQ_LOKI_SAS_A 14
18694 +#define IRQ_LOKI_SAS_B 15
18695 +#define IRQ_LOKI_DDR 16
18696 +#define IRQ_LOKI_XOR 17
18697 +#define IRQ_LOKI_BRIDGE 18
18698 +#define IRQ_LOKI_PCIE_A_ERR 20
18699 +#define IRQ_LOKI_PCIE_A_INT 21
18700 +#define IRQ_LOKI_PCIE_B_ERR 22
18701 +#define IRQ_LOKI_PCIE_B_INT 23
18702 +#define IRQ_LOKI_GBE_A_INT 24
18703 +#define IRQ_LOKI_GBE_B_INT 25
18704 +#define IRQ_LOKI_DEV_ERR 26
18705 +#define IRQ_LOKI_UART0 27
18706 +#define IRQ_LOKI_UART1 28
18707 +#define IRQ_LOKI_TWSI 29
18708 +#define IRQ_LOKI_GPIO_23_0 30
18709 +#define IRQ_LOKI_GPIO_25_24 31
18710 +
18711 +/*
18712 + * Loki General Purpose Pins
18713 + */
18714 +#define IRQ_LOKI_GPIO_START 32
18715 +#define NR_GPIO_IRQS GPIO_MAX
18716 +
18717 +#define NR_IRQS (IRQ_LOKI_GPIO_START + NR_GPIO_IRQS)
18718 +
18719 +
18720 +#endif
18721 --- /dev/null
18722 +++ b/include/asm-arm/arch-loki/loki.h
18723 @@ -0,0 +1,97 @@
18724 +/*
18725 + * include/asm-arm/arch-loki/loki.h
18726 + *
18727 + * Generic definitions for Marvell Loki (88RC8480) SoC flavors
18728 + *
18729 + * This file is licensed under the terms of the GNU General Public
18730 + * License version 2. This program is licensed "as is" without any
18731 + * warranty of any kind, whether express or implied.
18732 + */
18733 +
18734 +#ifndef __ASM_ARCH_LOKI_H
18735 +#define __ASM_ARCH_LOKI_H
18736 +
18737 +/*
18738 + * Marvell Loki (88RC8480) address maps.
18739 + *
18740 + * phys
18741 + * d0000000 on-chip peripheral registers
18742 + * e0000000 PCIe 0 Memory space
18743 + * e8000000 PCIe 1 Memory space
18744 + * f0000000 PCIe 0 I/O space
18745 + * f0100000 PCIe 1 I/O space
18746 + *
18747 + * virt phys size
18748 + * fed00000 d0000000 1M on-chip peripheral registers
18749 + * fee00000 f0000000 64K PCIe 0 I/O space
18750 + * fef00000 f0100000 64K PCIe 1 I/O space
18751 + */
18752 +
18753 +#define LOKI_REGS_PHYS_BASE 0xd0000000
18754 +#define LOKI_REGS_VIRT_BASE 0xfed00000
18755 +#define LOKI_REGS_SIZE SZ_1M
18756 +
18757 +#define LOKI_PCIE0_IO_PHYS_BASE 0xf0000000
18758 +#define LOKI_PCIE0_IO_VIRT_BASE 0xfee00000
18759 +#define LOKI_PCIE0_IO_BUS_BASE 0x00000000
18760 +#define LOKI_PCIE0_IO_SIZE SZ_64K
18761 +
18762 +#define LOKI_PCIE1_IO_PHYS_BASE 0xf0100000
18763 +#define LOKI_PCIE1_IO_VIRT_BASE 0xfef00000
18764 +#define LOKI_PCIE1_IO_BUS_BASE 0x00000000
18765 +#define LOKI_PCIE1_IO_SIZE SZ_64K
18766 +
18767 +#define LOKI_PCIE0_MEM_PHYS_BASE 0xe0000000
18768 +#define LOKI_PCIE0_MEM_SIZE SZ_128M
18769 +
18770 +#define LOKI_PCIE1_MEM_PHYS_BASE 0xe8000000
18771 +#define LOKI_PCIE1_MEM_SIZE SZ_128M
18772 +
18773 +/*
18774 + * Register Map
18775 + */
18776 +#define DEV_BUS_PHYS_BASE (LOKI_REGS_PHYS_BASE | 0x10000)
18777 +#define DEV_BUS_VIRT_BASE (LOKI_REGS_VIRT_BASE | 0x10000)
18778 +#define UART0_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2000)
18779 +#define UART0_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2000)
18780 +#define UART1_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2100)
18781 +#define UART1_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2100)
18782 +
18783 +#define BRIDGE_VIRT_BASE (LOKI_REGS_VIRT_BASE | 0x20000)
18784 +#define BRIDGE_REG(x) (BRIDGE_VIRT_BASE | (x))
18785 +#define RSTOUTn_MASK (BRIDGE_VIRT_BASE | 0x0108)
18786 +#define SOFT_RESET_OUT_EN 0x00000004
18787 +#define SYSTEM_SOFT_RESET (BRIDGE_VIRT_BASE | 0x010c)
18788 +#define SOFT_RESET 0x00000001
18789 +#define BRIDGE_CAUSE (BRIDGE_VIRT_BASE | 0x0110)
18790 +#define BRIDGE_MASK (BRIDGE_VIRT_BASE | 0x0114)
18791 +#define BRIDGE_INT_TIMER0 0x0002
18792 +#define BRIDGE_INT_TIMER1 0x0004
18793 +#define BRIDGE_INT_TIMER1_CLR 0x0004
18794 +#define IRQ_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0200)
18795 +#define IRQ_CAUSE_OFF 0x0000
18796 +#define IRQ_MASK_OFF 0x0004
18797 +#define TIMER_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0300)
18798 +
18799 +#define PCIE0_VIRT_BASE (LOKI_REGS_VIRT_BASE | 0x30000)
18800 +
18801 +#define PCIE1_VIRT_BASE (LOKI_REGS_VIRT_BASE | 0x40000)
18802 +
18803 +#define SAS0_PHYS_BASE (LOKI_REGS_PHYS_BASE | 0x80000)
18804 +
18805 +#define SAS1_PHYS_BASE (LOKI_REGS_PHYS_BASE | 0x90000)
18806 +
18807 +#define GE0_PHYS_BASE (LOKI_REGS_PHYS_BASE | 0xa0000)
18808 +#define GE0_VIRT_BASE (LOKI_REGS_VIRT_BASE | 0xa0000)
18809 +
18810 +#define GE1_PHYS_BASE (LOKI_REGS_PHYS_BASE | 0xb0000)
18811 +#define GE1_VIRT_BASE (LOKI_REGS_VIRT_BASE | 0xb0000)
18812 +
18813 +#define DDR_VIRT_BASE (LOKI_REGS_VIRT_BASE | 0xf0000)
18814 +#define DDR_REG(x) (DDR_VIRT_BASE | (x))
18815 +
18816 +
18817 +#define GPIO_MAX 8
18818 +
18819 +
18820 +#endif
18821 --- /dev/null
18822 +++ b/include/asm-arm/arch-loki/memory.h
18823 @@ -0,0 +1,14 @@
18824 +/*
18825 + * include/asm-arm/arch-loki/memory.h
18826 + */
18827 +
18828 +#ifndef __ASM_ARCH_MEMORY_H
18829 +#define __ASM_ARCH_MEMORY_H
18830 +
18831 +#define PHYS_OFFSET UL(0x00000000)
18832 +
18833 +#define __virt_to_bus(x) __virt_to_phys(x)
18834 +#define __bus_to_virt(x) __phys_to_virt(x)
18835 +
18836 +
18837 +#endif
18838 --- /dev/null
18839 +++ b/include/asm-arm/arch-loki/system.h
18840 @@ -0,0 +1,37 @@
18841 +/*
18842 + * include/asm-arm/arch-loki/system.h
18843 + *
18844 + * This file is licensed under the terms of the GNU General Public
18845 + * License version 2. This program is licensed "as is" without any
18846 + * warranty of any kind, whether express or implied.
18847 + */
18848 +
18849 +#ifndef __ASM_ARCH_SYSTEM_H
18850 +#define __ASM_ARCH_SYSTEM_H
18851 +
18852 +#include <asm/arch/hardware.h>
18853 +#include <asm/arch/loki.h>
18854 +
18855 +static inline void arch_idle(void)
18856 +{
18857 + cpu_do_idle();
18858 +}
18859 +
18860 +static inline void arch_reset(char mode)
18861 +{
18862 + /*
18863 + * Enable soft reset to assert RSTOUTn.
18864 + */
18865 + writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK);
18866 +
18867 + /*
18868 + * Assert soft reset.
18869 + */
18870 + writel(SOFT_RESET, SYSTEM_SOFT_RESET);
18871 +
18872 + while (1)
18873 + ;
18874 +}
18875 +
18876 +
18877 +#endif
18878 --- /dev/null
18879 +++ b/include/asm-arm/arch-loki/timex.h
18880 @@ -0,0 +1,11 @@
18881 +/*
18882 + * include/asm-arm/arch-loki/timex.h
18883 + *
18884 + * This file is licensed under the terms of the GNU General Public
18885 + * License version 2. This program is licensed "as is" without any
18886 + * warranty of any kind, whether express or implied.
18887 + */
18888 +
18889 +#define CLOCK_TICK_RATE (100 * HZ)
18890 +
18891 +#define LOKI_TCLK 180000000
18892 --- /dev/null
18893 +++ b/include/asm-arm/arch-loki/uncompress.h
18894 @@ -0,0 +1,47 @@
18895 +/*
18896 + * include/asm-arm/arch-loki/uncompress.h
18897 + *
18898 + * This file is licensed under the terms of the GNU General Public
18899 + * License version 2. This program is licensed "as is" without any
18900 + * warranty of any kind, whether express or implied.
18901 + */
18902 +
18903 +#include <linux/serial_reg.h>
18904 +#include <asm/arch/loki.h>
18905 +
18906 +#define SERIAL_BASE ((unsigned char *)UART0_PHYS_BASE)
18907 +
18908 +static void putc(const char c)
18909 +{
18910 + unsigned char *base = SERIAL_BASE;
18911 + int i;
18912 +
18913 + for (i = 0; i < 0x1000; i++) {
18914 + if (base[UART_LSR << 2] & UART_LSR_THRE)
18915 + break;
18916 + barrier();
18917 + }
18918 +
18919 + base[UART_TX << 2] = c;
18920 +}
18921 +
18922 +static void flush(void)
18923 +{
18924 + unsigned char *base = SERIAL_BASE;
18925 + unsigned char mask;
18926 + int i;
18927 +
18928 + mask = UART_LSR_TEMT | UART_LSR_THRE;
18929 +
18930 + for (i = 0; i < 0x1000; i++) {
18931 + if ((base[UART_LSR << 2] & mask) == mask)
18932 + break;
18933 + barrier();
18934 + }
18935 +}
18936 +
18937 +/*
18938 + * nothing to do
18939 + */
18940 +#define arch_decomp_setup()
18941 +#define arch_decomp_wdog()
18942 --- /dev/null
18943 +++ b/include/asm-arm/arch-loki/vmalloc.h
18944 @@ -0,0 +1,5 @@
18945 +/*
18946 + * include/asm-arm/arch-loki/vmalloc.h
18947 + */
18948 +
18949 +#define VMALLOC_END 0xfe800000
18950 --- /dev/null
18951 +++ b/include/asm-arm/arch-mv78xx0/debug-macro.S
18952 @@ -0,0 +1,20 @@
18953 +/*
18954 + * include/asm-arm/arch-mv78xx0/debug-macro.S
18955 + *
18956 + * This program is free software; you can redistribute it and/or modify
18957 + * it under the terms of the GNU General Public License version 2 as
18958 + * published by the Free Software Foundation.
18959 +*/
18960 +
18961 +#include <asm/arch/mv78xx0.h>
18962 +
18963 + .macro addruart,rx
18964 + mrc p15, 0, \rx, c1, c0
18965 + tst \rx, #1 @ MMU enabled?
18966 + ldreq \rx, =MV78XX0_REGS_PHYS_BASE
18967 + ldrne \rx, =MV78XX0_REGS_VIRT_BASE
18968 + orr \rx, \rx, #0x00012000
18969 + .endm
18970 +
18971 +#define UART_SHIFT 2
18972 +#include <asm/hardware/debug-8250.S>
18973 --- /dev/null
18974 +++ b/include/asm-arm/arch-mv78xx0/dma.h
18975 @@ -0,0 +1 @@
18976 +/* empty */
18977 --- /dev/null
18978 +++ b/include/asm-arm/arch-mv78xx0/entry-macro.S
18979 @@ -0,0 +1,39 @@
18980 +/*
18981 + * include/asm-arm/arch-mv78xx0/entry-macro.S
18982 + *
18983 + * Low-level IRQ helper macros for Marvell MV78xx0 platforms
18984 + *
18985 + * This file is licensed under the terms of the GNU General Public
18986 + * License version 2. This program is licensed "as is" without any
18987 + * warranty of any kind, whether express or implied.
18988 + */
18989 +
18990 +#include <asm/arch/mv78xx0.h>
18991 +
18992 + .macro disable_fiq
18993 + .endm
18994 +
18995 + .macro arch_ret_to_user, tmp1, tmp2
18996 + .endm
18997 +
18998 + .macro get_irqnr_preamble, base, tmp
18999 + ldr \base, =IRQ_VIRT_BASE
19000 + .endm
19001 +
19002 + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
19003 + @ check low interrupts
19004 + ldr \irqstat, [\base, #IRQ_CAUSE_LOW_OFF]
19005 + ldr \tmp, [\base, #IRQ_MASK_LOW_OFF]
19006 + mov \irqnr, #31
19007 + ands \irqstat, \irqstat, \tmp
19008 +
19009 + @ if no low interrupts set, check high interrupts
19010 + ldreq \irqstat, [\base, #IRQ_CAUSE_HIGH_OFF]
19011 + ldreq \tmp, [\base, #IRQ_MASK_HIGH_OFF]
19012 + moveq \irqnr, #63
19013 + andeqs \irqstat, \irqstat, \tmp
19014 +
19015 + @ find first active interrupt source
19016 + clzne \irqstat, \irqstat
19017 + subne \irqnr, \irqnr, \irqstat
19018 + .endm
19019 --- /dev/null
19020 +++ b/include/asm-arm/arch-mv78xx0/hardware.h
19021 @@ -0,0 +1,21 @@
19022 +/*
19023 + * include/asm-arm/arch-mv78xx0/hardware.h
19024 + *
19025 + * This file is licensed under the terms of the GNU General Public
19026 + * License version 2. This program is licensed "as is" without any
19027 + * warranty of any kind, whether express or implied.
19028 + */
19029 +
19030 +#ifndef __ASM_ARCH_HARDWARE_H
19031 +#define __ASM_ARCH_HARDWARE_H
19032 +
19033 +#include "mv78xx0.h"
19034 +
19035 +#define pcibios_assign_all_busses() 1
19036 +
19037 +#define PCIBIOS_MIN_IO 0x00001000
19038 +#define PCIBIOS_MIN_MEM 0x01000000
19039 +#define PCIMEM_BASE MV78XX0_PCIE_MEM_PHYS_BASE /* mem base for VGA */
19040 +
19041 +
19042 +#endif
19043 --- /dev/null
19044 +++ b/include/asm-arm/arch-mv78xx0/io.h
19045 @@ -0,0 +1,26 @@
19046 +/*
19047 + * include/asm-arm/arch-mv78xx0/io.h
19048 + *
19049 + * This file is licensed under the terms of the GNU General Public
19050 + * License version 2. This program is licensed "as is" without any
19051 + * warranty of any kind, whether express or implied.
19052 + */
19053 +
19054 +#ifndef __ASM_ARCH_IO_H
19055 +#define __ASM_ARCH_IO_H
19056 +
19057 +#include "mv78xx0.h"
19058 +
19059 +#define IO_SPACE_LIMIT 0xffffffff
19060 +
19061 +static inline void __iomem *__io(unsigned long addr)
19062 +{
19063 + return (void __iomem *)((addr - MV78XX0_PCIE_IO_PHYS_BASE(0))
19064 + + MV78XX0_PCIE_IO_VIRT_BASE(0));
19065 +}
19066 +
19067 +#define __io(a) __io(a)
19068 +#define __mem_pci(a) (a)
19069 +
19070 +
19071 +#endif
19072 --- /dev/null
19073 +++ b/include/asm-arm/arch-mv78xx0/irqs.h
19074 @@ -0,0 +1,91 @@
19075 +/*
19076 + * include/asm-arm/arch-mv78xx0/irqs.h
19077 + *
19078 + * IRQ definitions for Marvell MV78xx0 SoCs
19079 + *
19080 + * This file is licensed under the terms of the GNU General Public
19081 + * License version 2. This program is licensed "as is" without any
19082 + * warranty of any kind, whether express or implied.
19083 + */
19084 +
19085 +#ifndef __ASM_ARCH_IRQS_H
19086 +#define __ASM_ARCH_IRQS_H
19087 +
19088 +#include "mv78xx0.h" /* need GPIO_MAX */
19089 +
19090 +/*
19091 + * MV78xx0 Low Interrupt Controller
19092 + */
19093 +#define IRQ_MV78XX0_ERR 0
19094 +#define IRQ_MV78XX0_SPI 1
19095 +#define IRQ_MV78XX0_I2C_0 2
19096 +#define IRQ_MV78XX0_I2C_1 3
19097 +#define IRQ_MV78XX0_IDMA_0 4
19098 +#define IRQ_MV78XX0_IDMA_1 5
19099 +#define IRQ_MV78XX0_IDMA_2 6
19100 +#define IRQ_MV78XX0_IDMA_3 7
19101 +#define IRQ_MV78XX0_TIMER_0 8
19102 +#define IRQ_MV78XX0_TIMER_1 9
19103 +#define IRQ_MV78XX0_TIMER_2 10
19104 +#define IRQ_MV78XX0_TIMER_3 11
19105 +#define IRQ_MV78XX0_UART_0 12
19106 +#define IRQ_MV78XX0_UART_1 13
19107 +#define IRQ_MV78XX0_UART_2 14
19108 +#define IRQ_MV78XX0_UART_3 15
19109 +#define IRQ_MV78XX0_USB_0 16
19110 +#define IRQ_MV78XX0_USB_1 17
19111 +#define IRQ_MV78XX0_USB_2 18
19112 +#define IRQ_MV78XX0_CRYPTO 19
19113 +#define IRQ_MV78XX0_SDIO_0 20
19114 +#define IRQ_MV78XX0_SDIO_1 21
19115 +#define IRQ_MV78XX0_XOR_0 22
19116 +#define IRQ_MV78XX0_XOR_1 23
19117 +#define IRQ_MV78XX0_I2S_0 24
19118 +#define IRQ_MV78XX0_I2S_1 25
19119 +#define IRQ_MV78XX0_SATA 26
19120 +#define IRQ_MV78XX0_TDMI 27
19121 +
19122 +/*
19123 + * MV78xx0 High Interrupt Controller
19124 + */
19125 +#define IRQ_MV78XX0_PCIE_00 32
19126 +#define IRQ_MV78XX0_PCIE_01 33
19127 +#define IRQ_MV78XX0_PCIE_02 34
19128 +#define IRQ_MV78XX0_PCIE_03 35
19129 +#define IRQ_MV78XX0_PCIE_10 36
19130 +#define IRQ_MV78XX0_PCIE_11 37
19131 +#define IRQ_MV78XX0_PCIE_12 38
19132 +#define IRQ_MV78XX0_PCIE_13 39
19133 +#define IRQ_MV78XX0_GE00_SUM 40
19134 +#define IRQ_MV78XX0_GE00_RX 41
19135 +#define IRQ_MV78XX0_GE00_TX 42
19136 +#define IRQ_MV78XX0_GE00_MISC 43
19137 +#define IRQ_MV78XX0_GE01_SUM 44
19138 +#define IRQ_MV78XX0_GE01_RX 45
19139 +#define IRQ_MV78XX0_GE01_TX 46
19140 +#define IRQ_MV78XX0_GE01_MISC 47
19141 +#define IRQ_MV78XX0_GE10_SUM 48
19142 +#define IRQ_MV78XX0_GE10_RX 49
19143 +#define IRQ_MV78XX0_GE10_TX 50
19144 +#define IRQ_MV78XX0_GE10_MISC 51
19145 +#define IRQ_MV78XX0_GE11_SUM 52
19146 +#define IRQ_MV78XX0_GE11_RX 53
19147 +#define IRQ_MV78XX0_GE11_TX 54
19148 +#define IRQ_MV78XX0_GE11_MISC 55
19149 +#define IRQ_MV78XX0_GPIO_0_7 56
19150 +#define IRQ_MV78XX0_GPIO_8_15 57
19151 +#define IRQ_MV78XX0_GPIO_16_23 58
19152 +#define IRQ_MV78XX0_GPIO_24_31 59
19153 +#define IRQ_MV78XX0_DB_IN 60
19154 +#define IRQ_MV78XX0_DB_OUT 61
19155 +
19156 +/*
19157 + * MV78XX0 General Purpose Pins
19158 + */
19159 +#define IRQ_MV78XX0_GPIO_START 64
19160 +#define NR_GPIO_IRQS GPIO_MAX
19161 +
19162 +#define NR_IRQS (IRQ_MV78XX0_GPIO_START + NR_GPIO_IRQS)
19163 +
19164 +
19165 +#endif
19166 --- /dev/null
19167 +++ b/include/asm-arm/arch-mv78xx0/memory.h
19168 @@ -0,0 +1,14 @@
19169 +/*
19170 + * include/asm-arm/arch-mv78xx0/memory.h
19171 + */
19172 +
19173 +#ifndef __ASM_ARCH_MEMORY_H
19174 +#define __ASM_ARCH_MEMORY_H
19175 +
19176 +#define PHYS_OFFSET UL(0x00000000)
19177 +
19178 +#define __virt_to_bus(x) __virt_to_phys(x)
19179 +#define __bus_to_virt(x) __phys_to_virt(x)
19180 +
19181 +
19182 +#endif
19183 --- /dev/null
19184 +++ b/include/asm-arm/arch-mv78xx0/mv78xx0.h
19185 @@ -0,0 +1,126 @@
19186 +/*
19187 + * include/asm-arm/arch-mv78xx0/mv78xx0.h
19188 + *
19189 + * Generic definitions for Marvell MV78xx0 SoC flavors:
19190 + * MV781x0 and MV782x0.
19191 + *
19192 + * This file is licensed under the terms of the GNU General Public
19193 + * License version 2. This program is licensed "as is" without any
19194 + * warranty of any kind, whether express or implied.
19195 + */
19196 +
19197 +#ifndef __ASM_ARCH_MV78XX0_H
19198 +#define __ASM_ARCH_MV78XX0_H
19199 +
19200 +/*
19201 + * Marvell MV78xx0 address maps.
19202 + *
19203 + * phys
19204 + * c0000000 PCIe Memory space
19205 + * f0800000 PCIe #0 I/O space
19206 + * f0900000 PCIe #1 I/O space
19207 + * f0a00000 PCIe #2 I/O space
19208 + * f0b00000 PCIe #3 I/O space
19209 + * f0c00000 PCIe #4 I/O space
19210 + * f0d00000 PCIe #5 I/O space
19211 + * f0e00000 PCIe #6 I/O space
19212 + * f0f00000 PCIe #7 I/O space
19213 + * f1000000 on-chip peripheral registers
19214 + *
19215 + * virt phys size
19216 + * fe400000 f102x000 16K core-specific peripheral registers
19217 + * fe700000 f0800000 1M PCIe #0 I/O space
19218 + * fe800000 f0900000 1M PCIe #1 I/O space
19219 + * fe900000 f0a00000 1M PCIe #2 I/O space
19220 + * fea00000 f0b00000 1M PCIe #3 I/O space
19221 + * feb00000 f0c00000 1M PCIe #4 I/O space
19222 + * fec00000 f0d00000 1M PCIe #5 I/O space
19223 + * fed00000 f0e00000 1M PCIe #6 I/O space
19224 + * fee00000 f0f00000 1M PCIe #7 I/O space
19225 + * fef00000 f1000000 1M on-chip peripheral registers
19226 + */
19227 +#define MV78XX0_CORE0_REGS_PHYS_BASE 0xf1020000
19228 +#define MV78XX0_CORE1_REGS_PHYS_BASE 0xf1024000
19229 +#define MV78XX0_CORE_REGS_VIRT_BASE 0xfe400000
19230 +#define MV78XX0_CORE_REGS_SIZE SZ_16K
19231 +
19232 +#define MV78XX0_PCIE_IO_PHYS_BASE(i) (0xf0800000 + ((i) << 20))
19233 +#define MV78XX0_PCIE_IO_VIRT_BASE(i) (0xfe700000 + ((i) << 20))
19234 +#define MV78XX0_PCIE_IO_SIZE SZ_1M
19235 +
19236 +#define MV78XX0_REGS_PHYS_BASE 0xf1000000
19237 +#define MV78XX0_REGS_VIRT_BASE 0xfef00000
19238 +#define MV78XX0_REGS_SIZE SZ_1M
19239 +
19240 +#define MV78XX0_PCIE_MEM_PHYS_BASE 0xc0000000
19241 +#define MV78XX0_PCIE_MEM_SIZE 0x30000000
19242 +
19243 +/*
19244 + * Core-specific peripheral registers.
19245 + */
19246 +#define BRIDGE_VIRT_BASE (MV78XX0_CORE_REGS_VIRT_BASE)
19247 +#define CPU_CONTROL (BRIDGE_VIRT_BASE | 0x0104)
19248 +#define L2_WRITETHROUGH 0x00020000
19249 +#define RSTOUTn_MASK (BRIDGE_VIRT_BASE | 0x0108)
19250 +#define SOFT_RESET_OUT_EN 0x00000004
19251 +#define SYSTEM_SOFT_RESET (BRIDGE_VIRT_BASE | 0x010c)
19252 +#define SOFT_RESET 0x00000001
19253 +#define BRIDGE_CAUSE (BRIDGE_VIRT_BASE | 0x0110)
19254 +#define BRIDGE_MASK (BRIDGE_VIRT_BASE | 0x0114)
19255 +#define BRIDGE_INT_TIMER0 0x0002
19256 +#define BRIDGE_INT_TIMER1 0x0004
19257 +#define BRIDGE_INT_TIMER1_CLR (~0x0004)
19258 +#define IRQ_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0200)
19259 +#define IRQ_CAUSE_LOW_OFF 0x0004
19260 +#define IRQ_CAUSE_HIGH_OFF 0x0008
19261 +#define IRQ_MASK_LOW_OFF 0x0010
19262 +#define IRQ_MASK_HIGH_OFF 0x0014
19263 +#define TIMER_VIRT_BASE (BRIDGE_VIRT_BASE | 0x0300)
19264 +
19265 +/*
19266 + * Register Map
19267 + */
19268 +#define DDR_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x00000)
19269 +#define DDR_WINDOW_CPU0_BASE (DDR_VIRT_BASE | 0x1500)
19270 +#define DDR_WINDOW_CPU1_BASE (DDR_VIRT_BASE | 0x1700)
19271 +
19272 +#define DEV_BUS_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x10000)
19273 +#define DEV_BUS_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x10000)
19274 +#define SAMPLE_AT_RESET_LOW (DEV_BUS_VIRT_BASE | 0x0030)
19275 +#define SAMPLE_AT_RESET_HIGH (DEV_BUS_VIRT_BASE | 0x0034)
19276 +#define UART0_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2000)
19277 +#define UART0_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2000)
19278 +#define UART1_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2100)
19279 +#define UART1_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2100)
19280 +#define UART2_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2200)
19281 +#define UART2_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2200)
19282 +#define UART3_PHYS_BASE (DEV_BUS_PHYS_BASE | 0x2300)
19283 +#define UART3_VIRT_BASE (DEV_BUS_VIRT_BASE | 0x2300)
19284 +
19285 +#define GE10_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x30000)
19286 +#define GE11_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x34000)
19287 +
19288 +#define PCIE00_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x40000)
19289 +#define PCIE01_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x44000)
19290 +#define PCIE02_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x48000)
19291 +#define PCIE03_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x4c000)
19292 +
19293 +#define USB0_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x50000)
19294 +#define USB1_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x51000)
19295 +#define USB2_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x52000)
19296 +
19297 +#define GE00_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x70000)
19298 +#define GE01_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0x74000)
19299 +
19300 +#define PCIE10_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x80000)
19301 +#define PCIE11_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x84000)
19302 +#define PCIE12_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x88000)
19303 +#define PCIE13_VIRT_BASE (MV78XX0_REGS_VIRT_BASE | 0x8c000)
19304 +
19305 +#define SATA_PHYS_BASE (MV78XX0_REGS_PHYS_BASE | 0xa0000)
19306 +
19307 +
19308 +#define GPIO_MAX 32
19309 +
19310 +
19311 +#endif
19312 --- /dev/null
19313 +++ b/include/asm-arm/arch-mv78xx0/system.h
19314 @@ -0,0 +1,37 @@
19315 +/*
19316 + * include/asm-arm/arch-mv78xx0/system.h
19317 + *
19318 + * This file is licensed under the terms of the GNU General Public
19319 + * License version 2. This program is licensed "as is" without any
19320 + * warranty of any kind, whether express or implied.
19321 + */
19322 +
19323 +#ifndef __ASM_ARCH_SYSTEM_H
19324 +#define __ASM_ARCH_SYSTEM_H
19325 +
19326 +#include <asm/arch/hardware.h>
19327 +#include <asm/arch/mv78xx0.h>
19328 +
19329 +static inline void arch_idle(void)
19330 +{
19331 + cpu_do_idle();
19332 +}
19333 +
19334 +static inline void arch_reset(char mode)
19335 +{
19336 + /*
19337 + * Enable soft reset to assert RSTOUTn.
19338 + */
19339 + writel(SOFT_RESET_OUT_EN, RSTOUTn_MASK);
19340 +
19341 + /*
19342 + * Assert soft reset.
19343 + */
19344 + writel(SOFT_RESET, SYSTEM_SOFT_RESET);
19345 +
19346 + while (1)
19347 + ;
19348 +}
19349 +
19350 +
19351 +#endif
19352 --- /dev/null
19353 +++ b/include/asm-arm/arch-mv78xx0/timex.h
19354 @@ -0,0 +1,9 @@
19355 +/*
19356 + * include/asm-arm/arch-mv78xx0/timex.h
19357 + *
19358 + * This file is licensed under the terms of the GNU General Public
19359 + * License version 2. This program is licensed "as is" without any
19360 + * warranty of any kind, whether express or implied.
19361 + */
19362 +
19363 +#define CLOCK_TICK_RATE (100 * HZ)
19364 --- /dev/null
19365 +++ b/include/asm-arm/arch-mv78xx0/uncompress.h
19366 @@ -0,0 +1,47 @@
19367 +/*
19368 + * include/asm-arm/arch-mv78xx0/uncompress.h
19369 + *
19370 + * This file is licensed under the terms of the GNU General Public
19371 + * License version 2. This program is licensed "as is" without any
19372 + * warranty of any kind, whether express or implied.
19373 + */
19374 +
19375 +#include <linux/serial_reg.h>
19376 +#include <asm/arch/mv78xx0.h>
19377 +
19378 +#define SERIAL_BASE ((unsigned char *)UART0_PHYS_BASE)
19379 +
19380 +static void putc(const char c)
19381 +{
19382 + unsigned char *base = SERIAL_BASE;
19383 + int i;
19384 +
19385 + for (i = 0; i < 0x1000; i++) {
19386 + if (base[UART_LSR << 2] & UART_LSR_THRE)
19387 + break;
19388 + barrier();
19389 + }
19390 +
19391 + base[UART_TX << 2] = c;
19392 +}
19393 +
19394 +static void flush(void)
19395 +{
19396 + unsigned char *base = SERIAL_BASE;
19397 + unsigned char mask;
19398 + int i;
19399 +
19400 + mask = UART_LSR_TEMT | UART_LSR_THRE;
19401 +
19402 + for (i = 0; i < 0x1000; i++) {
19403 + if ((base[UART_LSR << 2] & mask) == mask)
19404 + break;
19405 + barrier();
19406 + }
19407 +}
19408 +
19409 +/*
19410 + * nothing to do
19411 + */
19412 +#define arch_decomp_setup()
19413 +#define arch_decomp_wdog()
19414 --- /dev/null
19415 +++ b/include/asm-arm/arch-mv78xx0/vmalloc.h
19416 @@ -0,0 +1,5 @@
19417 +/*
19418 + * include/asm-arm/arch-mv78xx0/vmalloc.h
19419 + */
19420 +
19421 +#define VMALLOC_END 0xfe000000
19422 --- a/include/asm-arm/arch-orion5x/io.h
19423 +++ b/include/asm-arm/arch-orion5x/io.h
19424 @@ -14,7 +14,6 @@
19425 #include "orion5x.h"
19426
19427 #define IO_SPACE_LIMIT 0xffffffff
19428 -#define IO_SPACE_REMAP ORION5X_PCI_SYS_IO_BASE
19429
19430 static inline void __iomem *
19431 __arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype)
19432 @@ -53,15 +52,12 @@
19433 /*****************************************************************************
19434 * Helpers to access Orion registers
19435 ****************************************************************************/
19436 -#define orion5x_read(r) __raw_readl(r)
19437 -#define orion5x_write(r, val) __raw_writel(val, r)
19438 -
19439 /*
19440 * These are not preempt-safe. Locks, if needed, must be taken
19441 * care of by the caller.
19442 */
19443 -#define orion5x_setbits(r, mask) orion5x_write((r), orion5x_read(r) | (mask))
19444 -#define orion5x_clrbits(r, mask) orion5x_write((r), orion5x_read(r) & ~(mask))
19445 +#define orion5x_setbits(r, mask) writel(readl(r) | (mask), (r))
19446 +#define orion5x_clrbits(r, mask) writel(readl(r) & ~(mask), (r))
19447
19448
19449 #endif
19450 --- a/include/asm-arm/arch-orion5x/orion5x.h
19451 +++ b/include/asm-arm/arch-orion5x/orion5x.h
19452 @@ -2,7 +2,7 @@
19453 * include/asm-arm/arch-orion5x/orion5x.h
19454 *
19455 * Generic definitions of Orion SoC flavors:
19456 - * Orion-1, Orion-NAS, Orion-VoIP, and Orion-2.
19457 + * Orion-1, Orion-VoIP, Orion-NAS, and Orion-2.
19458 *
19459 * Maintainer: Tzachi Perelstein <tzachi@marvell.com>
19460 *
19461 @@ -63,9 +63,11 @@
19462 /*******************************************************************************
19463 * Supported Devices & Revisions
19464 ******************************************************************************/
19465 -/* Orion-1 (88F5181) */
19466 +/* Orion-1 (88F5181) and Orion-VoIP (88F5181L) */
19467 #define MV88F5181_DEV_ID 0x5181
19468 #define MV88F5181_REV_B1 3
19469 +#define MV88F5181L_REV_A0 8
19470 +#define MV88F5181L_REV_A1 9
19471 /* Orion-NAS (88F5182) */
19472 #define MV88F5182_DEV_ID 0x5182
19473 #define MV88F5182_REV_A2 2
19474 @@ -152,6 +154,7 @@
19475 #define BRIDGE_MASK ORION5X_BRIDGE_REG(0x114)
19476 #define BRIDGE_INT_TIMER0 0x0002
19477 #define BRIDGE_INT_TIMER1 0x0004
19478 +#define BRIDGE_INT_TIMER1_CLR (~0x0004)
19479 #define MAIN_IRQ_CAUSE ORION5X_BRIDGE_REG(0x200)
19480 #define MAIN_IRQ_MASK ORION5X_BRIDGE_REG(0x204)
19481
19482 --- a/include/asm-arm/arch-orion5x/uncompress.h
19483 +++ b/include/asm-arm/arch-orion5x/uncompress.h
19484 @@ -8,23 +8,38 @@
19485 * warranty of any kind, whether express or implied.
19486 */
19487
19488 +#include <linux/serial_reg.h>
19489 #include <asm/arch/orion5x.h>
19490
19491 -#define MV_UART_THR ((volatile unsigned char *)(UART0_PHYS_BASE + 0x0))
19492 -#define MV_UART_LSR ((volatile unsigned char *)(UART0_PHYS_BASE + 0x14))
19493 -
19494 -#define LSR_THRE 0x20
19495 +#define SERIAL_BASE ((unsigned char *)UART0_PHYS_BASE)
19496
19497 static void putc(const char c)
19498 {
19499 - int j = 0x1000;
19500 - while (--j && !(*MV_UART_LSR & LSR_THRE))
19501 + unsigned char *base = SERIAL_BASE;
19502 + int i;
19503 +
19504 + for (i = 0; i < 0x1000; i++) {
19505 + if (base[UART_LSR << 2] & UART_LSR_THRE)
19506 + break;
19507 barrier();
19508 - *MV_UART_THR = c;
19509 + }
19510 +
19511 + base[UART_TX << 2] = c;
19512 }
19513
19514 static void flush(void)
19515 {
19516 + unsigned char *base = SERIAL_BASE;
19517 + unsigned char mask;
19518 + int i;
19519 +
19520 + mask = UART_LSR_TEMT | UART_LSR_THRE;
19521 +
19522 + for (i = 0; i < 0x1000; i++) {
19523 + if ((base[UART_LSR << 2] & mask) == mask)
19524 + break;
19525 + barrier();
19526 + }
19527 }
19528
19529 /*
19530 --- a/include/asm-arm/assembler.h
19531 +++ b/include/asm-arm/assembler.h
19532 @@ -56,6 +56,21 @@
19533 #endif
19534
19535 /*
19536 + * This can be used to enable code to cacheline align the destination
19537 + * pointer when bulk writing to memory. Experiments on StrongARM and
19538 + * XScale didn't show this a worthwhile thing to do when the cache is not
19539 + * set to write-allocate (this would need further testing on XScale when WA
19540 + * is used).
19541 + *
19542 + * On Feroceon there is much to gain however, regardless of cache mode.
19543 + */
19544 +#ifdef CONFIG_CPU_FEROCEON
19545 +#define CALGN(code...) code
19546 +#else
19547 +#define CALGN(code...)
19548 +#endif
19549 +
19550 +/*
19551 * Enable and disable interrupts
19552 */
19553 #if __LINUX_ARM_ARCH__ >= 6
19554 --- a/include/asm-arm/cacheflush.h
19555 +++ b/include/asm-arm/cacheflush.h
19556 @@ -95,11 +95,7 @@
19557 #endif
19558
19559 #if defined(CONFIG_CPU_FEROCEON)
19560 -# ifdef _CACHE
19561 -# define MULTI_CACHE 1
19562 -# else
19563 -# define _CACHE feroceon
19564 -# endif
19565 +# define MULTI_CACHE 1
19566 #endif
19567
19568 #if defined(CONFIG_CPU_V6)
19569 --- /dev/null
19570 +++ b/include/asm-arm/plat-orion/cache-feroceon-l2.h
19571 @@ -0,0 +1,11 @@
19572 +/*
19573 + * include/asm-arm/plat-orion/cache-feroceon-l2.h
19574 + *
19575 + * Copyright (C) 2008 Marvell Semiconductor
19576 + *
19577 + * This file is licensed under the terms of the GNU General Public
19578 + * License version 2. This program is licensed "as is" without any
19579 + * warranty of any kind, whether express or implied.
19580 + */
19581 +
19582 +extern void __init feroceon_l2_init(int l2_wt_override);
19583 --- a/include/asm-arm/plat-orion/pcie.h
19584 +++ b/include/asm-arm/plat-orion/pcie.h
19585 @@ -14,6 +14,7 @@
19586 u32 orion_pcie_dev_id(void __iomem *base);
19587 u32 orion_pcie_rev(void __iomem *base);
19588 int orion_pcie_link_up(void __iomem *base);
19589 +int orion_pcie_x4_mode(void __iomem *base);
19590 int orion_pcie_get_local_bus_nr(void __iomem *base);
19591 void orion_pcie_set_local_bus_nr(void __iomem *base, int nr);
19592 void orion_pcie_setup(void __iomem *base,
19593 --- a/include/asm-arm/tlbflush.h
19594 +++ b/include/asm-arm/tlbflush.h
19595 @@ -39,6 +39,7 @@
19596 #define TLB_V6_D_ASID (1 << 17)
19597 #define TLB_V6_I_ASID (1 << 18)
19598
19599 +#define TLB_L2CLEAN_FR (1 << 29) /* Feroceon */
19600 #define TLB_DCLEAN (1 << 30)
19601 #define TLB_WB (1 << 31)
19602
19603 @@ -51,6 +52,7 @@
19604 * v4 - ARMv4 without write buffer
19605 * v4wb - ARMv4 with write buffer without I TLB flush entry instruction
19606 * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction
19607 + * fr - Feroceon (v4wbi with non-outer-cacheable page table walks)
19608 * v6wbi - ARMv6 with write buffer with I TLB flush entry instruction
19609 */
19610 #undef _TLB
19611 @@ -103,6 +105,23 @@
19612 # define v4wbi_always_flags (-1UL)
19613 #endif
19614
19615 +#define fr_tlb_flags (TLB_WB | TLB_DCLEAN | TLB_L2CLEAN_FR | \
19616 + TLB_V4_I_FULL | TLB_V4_D_FULL | \
19617 + TLB_V4_I_PAGE | TLB_V4_D_PAGE)
19618 +
19619 +#ifdef CONFIG_CPU_TLB_FEROCEON
19620 +# define fr_possible_flags fr_tlb_flags
19621 +# define fr_always_flags fr_tlb_flags
19622 +# ifdef _TLB
19623 +# define MULTI_TLB 1
19624 +# else
19625 +# define _TLB v4wbi
19626 +# endif
19627 +#else
19628 +# define fr_possible_flags 0
19629 +# define fr_always_flags (-1UL)
19630 +#endif
19631 +
19632 #define v4wb_tlb_flags (TLB_WB | TLB_DCLEAN | \
19633 TLB_V4_I_FULL | TLB_V4_D_FULL | \
19634 TLB_V4_D_PAGE)
19635 @@ -245,12 +264,14 @@
19636 #define possible_tlb_flags (v3_possible_flags | \
19637 v4_possible_flags | \
19638 v4wbi_possible_flags | \
19639 + fr_possible_flags | \
19640 v4wb_possible_flags | \
19641 v6wbi_possible_flags)
19642
19643 #define always_tlb_flags (v3_always_flags & \
19644 v4_always_flags & \
19645 v4wbi_always_flags & \
19646 + fr_always_flags & \
19647 v4wb_always_flags & \
19648 v6wbi_always_flags)
19649
19650 @@ -417,6 +438,11 @@
19651 if (tlb_flag(TLB_DCLEAN))
19652 asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pmd"
19653 : : "r" (pmd) : "cc");
19654 +
19655 + if (tlb_flag(TLB_L2CLEAN_FR))
19656 + asm("mcr p15, 1, %0, c15, c9, 1 @ L2 flush_pmd"
19657 + : : "r" (pmd) : "cc");
19658 +
19659 if (tlb_flag(TLB_WB))
19660 dsb();
19661 }
19662 @@ -428,6 +454,10 @@
19663 if (tlb_flag(TLB_DCLEAN))
19664 asm("mcr p15, 0, %0, c7, c10, 1 @ flush_pmd"
19665 : : "r" (pmd) : "cc");
19666 +
19667 + if (tlb_flag(TLB_L2CLEAN_FR))
19668 + asm("mcr p15, 1, %0, c15, c9, 1 @ L2 flush_pmd"
19669 + : : "r" (pmd) : "cc");
19670 }
19671
19672 #undef tlb_flag
19673 --- a/include/linux/mv643xx_eth.h
19674 +++ b/include/linux/mv643xx_eth.h
19675 @@ -17,30 +17,59 @@
19676
19677 struct mv643xx_eth_shared_platform_data {
19678 struct mbus_dram_target_info *dram;
19679 - unsigned int t_clk;
19680 + unsigned int t_clk;
19681 };
19682
19683 struct mv643xx_eth_platform_data {
19684 + /*
19685 + * Pointer back to our parent instance, and our port number.
19686 + */
19687 struct platform_device *shared;
19688 - int port_number;
19689 + int port_number;
19690
19691 + /*
19692 + * Whether a PHY is present, and if yes, at which address.
19693 + */
19694 struct platform_device *shared_smi;
19695 + int force_phy_addr;
19696 + int phy_addr;
19697
19698 - u16 force_phy_addr; /* force override if phy_addr == 0 */
19699 - u16 phy_addr;
19700 -
19701 - /* If speed is 0, then speed and duplex are autonegotiated. */
19702 - int speed; /* 0, SPEED_10, SPEED_100, SPEED_1000 */
19703 - int duplex; /* DUPLEX_HALF or DUPLEX_FULL */
19704 -
19705 - /* non-zero values of the following fields override defaults */
19706 - u32 tx_queue_size;
19707 - u32 rx_queue_size;
19708 - u32 tx_sram_addr;
19709 - u32 tx_sram_size;
19710 - u32 rx_sram_addr;
19711 - u32 rx_sram_size;
19712 - u8 mac_addr[6]; /* mac address if non-zero*/
19713 + /*
19714 + * Use this MAC address if it is valid, overriding the
19715 + * address that is already in the hardware.
19716 + */
19717 + u8 mac_addr[6];
19718 +
19719 + /*
19720 + * If speed is 0, autonegotiation is enabled.
19721 + * Valid values for speed: 0, SPEED_10, SPEED_100, SPEED_1000.
19722 + * Valid values for duplex: DUPLEX_HALF, DUPLEX_FULL.
19723 + */
19724 + int speed;
19725 + int duplex;
19726 +
19727 + /*
19728 + * Which RX/TX queues to use.
19729 + */
19730 + int rx_queue_mask;
19731 + int tx_queue_mask;
19732 +
19733 + /*
19734 + * Override default RX/TX queue sizes if nonzero.
19735 + */
19736 + int rx_queue_size;
19737 + int tx_queue_size;
19738 +
19739 + /*
19740 + * Use on-chip SRAM for RX/TX descriptors if size is nonzero
19741 + * and sufficient to contain all descriptors for the requested
19742 + * ring sizes.
19743 + */
19744 + unsigned long rx_sram_addr;
19745 + int rx_sram_size;
19746 + unsigned long tx_sram_addr;
19747 + int tx_sram_size;
19748 };
19749
19750 -#endif /* __LINUX_MV643XX_ETH_H */
19751 +
19752 +#endif
This page took 0.866766 seconds and 5 git commands to generate.