Module Name:    src
Committed By:   hkenken
Date:           Fri Jul 25 11:22:50 UTC 2014

Modified Files:
        src/etc/etc.evbarm: Makefile.inc
        src/sys/arch/evbarm/conf: README.evbarm
Added Files:
        src/sys/arch/evbarm/conf: KOBO KOBO_INSTALL files.kobo mk.kobo std.kobo
        src/sys/arch/evbarm/kobo: kobo.h kobo_machdep.c kobo_reg.h kobo_start.S
            kobo_usb.c

Log Message:
Initial commit of support for Kobo touch. (i.MX507 or i.MX508)
(http://www.kobo.com)


To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.63 src/etc/etc.evbarm/Makefile.inc
cvs rdiff -u -r0 -r1.1 src/sys/arch/evbarm/conf/KOBO \
    src/sys/arch/evbarm/conf/KOBO_INSTALL src/sys/arch/evbarm/conf/files.kobo \
    src/sys/arch/evbarm/conf/mk.kobo src/sys/arch/evbarm/conf/std.kobo
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/evbarm/conf/README.evbarm
cvs rdiff -u -r0 -r1.1 src/sys/arch/evbarm/kobo/kobo.h \
    src/sys/arch/evbarm/kobo/kobo_machdep.c \
    src/sys/arch/evbarm/kobo/kobo_reg.h src/sys/arch/evbarm/kobo/kobo_start.S \
    src/sys/arch/evbarm/kobo/kobo_usb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/etc/etc.evbarm/Makefile.inc
diff -u src/etc/etc.evbarm/Makefile.inc:1.62 src/etc/etc.evbarm/Makefile.inc:1.63
--- src/etc/etc.evbarm/Makefile.inc:1.62	Sun Mar 30 16:00:48 2014
+++ src/etc/etc.evbarm/Makefile.inc	Fri Jul 25 11:22:50 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.inc,v 1.62 2014/03/30 16:00:48 matt Exp $
+#	$NetBSD: Makefile.inc,v 1.63 2014/07/25 11:22:50 hkenken Exp $
 #
 #	etc.evbarm/Makefile.inc -- evbarm-specific etc Makefile targets
 #
@@ -91,6 +91,8 @@ EVBARM_BOARDS.armv7hf+=		OMAP5EVM
 #EVBARM_BOARDS.armv7+=		OVERO
 EVBARM_BOARDS.armv7+=		PANDABOARD
 EVBARM_BOARDS.armv7hf+= 	PANDABOARD
+EVBARM_BOARDS.armv7+=		KOBO
+EVBARM_BOARDS.armv7hf+= 	KOBO
 .endif
 
 IMAGE.rel=	${RELEASEDIR}/${RELEASEMACHINEDIR}

Index: src/sys/arch/evbarm/conf/README.evbarm
diff -u src/sys/arch/evbarm/conf/README.evbarm:1.7 src/sys/arch/evbarm/conf/README.evbarm:1.8
--- src/sys/arch/evbarm/conf/README.evbarm:1.7	Mon Sep 30 13:38:16 2013
+++ src/sys/arch/evbarm/conf/README.evbarm	Fri Jul 25 11:22:50 2014
@@ -1,4 +1,4 @@
-$NetBSD: README.evbarm,v 1.7 2013/09/30 13:38:16 kiyohara Exp $
+$NetBSD: README.evbarm,v 1.8 2014/07/25 11:22:50 hkenken Exp $
 
 config		date		boards
 -------------------------------------------------------------------------------
@@ -24,6 +24,7 @@ IQ80310		2001/09/05	Intel IQ80310 eval b
 IQ80321		2002/03/27	Intel IQ321 eval board
 IXDP425		2003/04/08	Intel IXDP425/IXCDP1100 development platform
 IXM1200		2002/07/15	Intel IMX1200 eval board
+KOBO		2014/07/25	Kobo touch (eReaders)
 KUROBOX_PRO	2010/10/02	Kuroutoshikou KURO-BOX/PRO
 LUBBOCK		2003/06/18	Intel Lubbock DBPXA250 board
 MARVELL_NAS	2010/10/02	Generic Marvell SoC based NAS

Added files:

Index: src/sys/arch/evbarm/conf/KOBO
diff -u /dev/null src/sys/arch/evbarm/conf/KOBO:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/conf/KOBO	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,289 @@
+#	$NetBSD: KOBO,v 1.1 2014/07/25 11:22:50 hkenken Exp $
+#
+#	KOBO -- http://kobo.com
+#
+
+include	"arch/evbarm/conf/std.kobo"
+
+#options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
+
+# estimated number of users
+
+maxusers	32
+
+# Standard system options
+
+options 	RTC_OFFSET=0	# hardware clock is this many mins. west of GMT
+#options 	NTP		# NTP phase/frequency locked loop
+
+# CPU options
+options 	CPU_CORTEXA8	# Support the ARM-v7a core
+options 	IMX50
+options 	IMX508
+options		IMX51
+options 	PMAPCOUNTERS
+
+# Architecture options
+
+options 	MEMSTART=0x70000000
+options 	MEMSIZE=256
+options 	IMX51_IPGCLK_FREQ=50000000   # XXX This value is not correct.
+
+# File systems
+
+file-system	FFS		# UFS
+#file-system	LFS		# log-structured file system
+file-system	MFS		# memory file system
+file-system	NFS		# Network file system
+#file-system 	ADOSFS		# AmigaDOS-compatible file system
+file-system 	EXT2FS		# second extended file system (linux)
+#file-system	CD9660		# ISO 9660 + Rock Ridge file system
+file-system	MSDOSFS		# MS-DOS file system
+file-system	FDESC		# /dev/fd
+file-system	KERNFS		# /kern
+file-system	NULLFS		# loopback file system
+file-system	PROCFS		# /proc
+#file-system	PUFFS		# Userspace file systems (e.g. ntfs-3g & sshfs)
+file-system	TMPFS		# memory file system
+#file-system	UMAPFS		# NULLFS + uid and gid remapping
+#file-system	UNION		# union file system
+file-system	PTYFS		# /dev/pts/N support
+
+# File system options
+#options 	QUOTA		# legacy UFS quotas
+#options 	QUOTA2		# new, in-filesystem UFS quotas
+#options 	FFS_EI		# FFS Endian Independent support
+#options 	NFSSERVER
+options 	WAPBL		# File system journaling support
+#options 	FFS_NO_SNAPSHOT	# No FFS snapshot support
+
+# Networking options
+
+#options 	GATEWAY		# packet forwarding
+options 	INET		# IP + ICMP + TCP + UDP
+options 	INET6		# IPV6
+#options 	IPSEC		# IP security
+#options 	IPSEC_DEBUG	# debug for IP security
+#options 	MROUTING	# IP multicast routing
+#options 	PIM		# Protocol Independent Multicast
+#options 	NETATALK	# AppleTalk networking
+#options 	PPP_BSDCOMP	# BSD-Compress compression support for PPP
+#options 	PPP_DEFLATE	# Deflate compression support for PPP
+#options 	PPP_FILTER	# Active filter support for PPP (requires bpf)
+#options 	TCP_DEBUG	# Record last TCP_NDEBUG packets with SO_DEBUG
+
+#options 	NFS_BOOT_BOOTP
+#options 	NFS_BOOT_DHCP
+#options 	NFS_BOOT_BOOTPARAM
+#options	DEBUG_NFS_BOOT_DHCP
+
+# Compatibility options
+
+#options 	COMPAT_43	# 4.3BSD compatibility.
+options 	COMPAT_60	# NetBSD 6.0 compatibility.
+#options 	COMPAT_50	# NetBSD 5.0 compatibility.
+#options 	COMPAT_40	# NetBSD 4.0 compatibility.
+#options 	COMPAT_30	# NetBSD 3.0 compatibility.
+#options 	COMPAT_20	# NetBSD 2.0 compatibility.
+#options 	COMPAT_16	# NetBSD 1.6 compatibility.
+#options 	COMPAT_15	# NetBSD 1.5 compatibility.
+#options 	COMPAT_14	# NetBSD 1.4 compatibility.
+#options 	COMPAT_13	# NetBSD 1.3 compatibility.
+#options 	COMPAT_12	# NetBSD 1.2 compatibility.
+#options 	COMPAT_11	# NetBSD 1.1 compatibility.
+#options 	COMPAT_10	# NetBSD 1.0 compatibility.
+#options 	COMPAT_09	# NetBSD 0.9 compatibility.
+#options 	TCP_COMPAT_42	# 4.2BSD TCP/IP bug compat. Not recommended.
+
+options 	COMPAT_OSSAUDIO	# OSS (Voxware) audio driver compatibility
+#options 	COMPAT_LINUX	# binary compatibility with Linux
+options		COMPAT_BSDPTY	# /dev/[pt]ty?? ptys.
+
+# Shared memory options
+
+options 	SYSVMSG		# System V-like message queues
+options 	SYSVSEM		# System V-like semaphores
+#options 	SEMMNI=10	# number of semaphore identifiers
+#options 	SEMMNS=60	# number of semaphores in system
+#options 	SEMUME=10	# max number of undo entries per process
+#options 	SEMMNU=30	# number of undo structures in system
+options 	SYSVSHM		# System V-like memory sharing
+
+# Device options
+
+# Console options.    also need IMXUARTCONSOLE
+options 	CONSDEVNAME="\"imxuart\"",CONADDR=0x53fc0000
+options 	CONSPEED=115200	# Console speed
+
+# kgdb
+#options	KGDB
+#options 	KGDB_DEVNAME="\"imxuart\""
+#options 	KGDB_DEVADDR=0x73fbc000
+#options 	KGDB_DEVRATE=115200
+
+# Miscellaneous kernel options
+options 	KTRACE		# system call tracing, a la ktrace(1)
+options 	IRQSTATS	# manage IRQ statistics
+#options 	KMEMSTATS	# kernel memory statistics
+options 	PCMCIAVERBOSE	# verbose PCMCIA configuration messages
+options 	USBVERBOSE	# verbose USB device autoconfig messages
+#options 	SCSIVERBOSE	# Verbose SCSI errors
+options 	MIIVERBOSE	# Verbose MII autoconfuration messages
+#options 	PCI_CONFIG_DUMP	# verbosely dump PCI config space
+#options 	DDB_KEYCODE=0x40
+options 	USERCONF	# userconf(4) support
+#options	PIPE_SOCKETPAIR	# smaller, but slower pipe(2)
+#options 	SYSCTL_INCLUDE_DESCR	# Include sysctl descriptions in kernel
+options 	NO_POWERSAVE	# uncomment this to run under ICE
+
+# Development and Debugging options
+#options 	PERFCTRS	# performance counters
+#options 	DIAGNOSTIC	# internally consistency checks
+#options 	DEBUG
+#options 	KMEMSTATS	# kernel memory statistics (vmstat -m)
+options 	DDB		# in-kernel debugger
+options 	DDB_ONPANIC=1	# see also sysctl(8): `ddb.onpanic'
+options 	DDB_HISTORY_SIZE=100	# Enable history editing in DDB
+options 	DDB_VERBOSE_HELP
+#options 	LOCKDEBUG
+#ptions 	PMAP_DEBUG	# Enable pmap_debug_level code
+#options 	IPKDB		# remote kernel debugging
+options 	VERBOSE_INIT_ARM # verbose bootstraping messages
+makeoptions	DEBUG="-g"	# compile full symbol table
+#makeoptions	COPTS="-O2"
+#options 	SYSCALL_STATS	# per syscall counts
+#options 	SYSCALL_TIMES 	# per syscall times
+#options 	SYSCALL_TIMES_HASCOUNTER	# use 'broken' rdtsc (soekris)
+#options 	SCSIPI_DEBUG
+#options	SCSIPI_DEBUG_TYPE=SCSIPI_BUSTYPE_SCSI
+#options	SCSIPI_DEBUG_TARGET=0
+#options	SCSIPI_DEBUG_LUN=0
+#options	DEBUG_STARTUP
+
+## USB Debugging options
+#options	USB_DEBUG
+#options	EHCI_DEBUG
+#options	OHCI_DEBUG
+#options	UHUB_DEBUG
+
+# Valid options for BOOT_ARGS:
+#  single		Boot to single user only
+#  kndb			Give control to kernel debugger
+#  ask			Ask for file name to reboot from
+#  pmapdebug=<n>	If PMAP_DEBUG, set pmap_debug_level to <n>
+#  memorydisk=<n>	Set memorydisk size to <n> KB
+#  quiet		Show aprint_naive output
+#  verbose		Show aprint_normal and aprint_verbose output
+options		BOOT_ARGS="\"verbose\""
+
+# Kernel root file system and dump configuration.
+config		netbsd		root on ? type ?
+config		netbsd-ld0	root on ld0 type ffs
+
+# The main bus device
+mainbus0	at root
+
+# The boot cpu
+cpu*		at mainbus?
+
+# Devices
+# On-chip
+# On-chip bus
+axi0		at mainbus?
+
+# Interrupt Cotroller
+tzic0		at axi? addr 0x0fffc000 size 0x4000 irqbase 0
+
+# Serial
+#imxuart0	at axi? addr 0x53fbc000 irq 31		# UART1
+imxuart1	at axi? addr 0x53fc0000 irq 32
+#imxuart2	at axi? addr 0x5000c000 irq 33
+options		IMXUARTCONSOLE
+
+# Clock Control
+imxccm0		at axi? addr 0x53fd4000
+options		IMX51_CKIL_FREQ=32768
+
+# Enhanced Periodic Interrupt Timer
+imxclock0	at axi? addr 0x53fac000 size 0x4000 irq 40
+
+# IOMUX
+imxiomux0	at axi? addr 0x53fa8000
+
+# WatchDog
+imxwdog0	at axi? addr 0x53f98000 irq 58 flags 0
+
+# GPIO
+imxgpio0	at axi? addr 0x53f84000 irqbase 128 irq 50
+imxgpio1	at axi? addr 0x53f88000 irqbase 160 irq 52
+imxgpio2	at axi? addr 0x53f8c000 irqbase 192 irq 54
+imxgpio3	at axi? addr 0x53f90000 irqbase 224 irq 56
+imxgpio4	at axi? addr 0x53fdc000 irqbase 256 irq 103
+imxgpio5	at axi? addr 0x53fe0000 irqbase 288 irq 105
+
+# EPDC E-Ink Controller
+#epdc0		at axi? addr 0x41010000 size 0x2000 irq 27
+#wsdisplay0	at wsemuldisplaydev? console ?
+#wsdisplay*	at wsemuldisplaydev?
+#options		EPDC_DEBUG=10
+#options		EINK_DEBUG
+#options		IMXEPDCCONSOLE
+
+# I2C
+imxi2c0		at axi? addr 0x63fc8000 irq 62
+imxi2c1		at axi? addr 0x63fc4000 irq 63
+#imxi2c2	at axi? addr 0x53fec000 irq 64
+
+# IIC
+iic*		at imxi2c?
+
+lmtemp*		at iic1 addr 0x48		# LM75 temperature sensor
+
+# SD/MMC
+sdhc0		at axi? addr 0x50004000 irq 1	# eSDHC1
+sdhc1		at axi? addr 0x50008000 irq 2	# eSDHC2
+sdhc2		at axi? addr 0x50020000 irq 3	# eSDHC3
+#sdhc3		at axi? addr 0x50024000 irq 4	# eSDHC4
+sdmmc*		at sdhc?
+ld*		at sdmmc?		# MMC/SD card
+#options 	SDHC_DEBUG
+#options 	SDMMC_DEBUG
+
+# USB
+imxusbc0	at axi? addr 0x53f80000
+ehci0		at imxusbc0	unit 0	irq 18 # OTG
+#ehci1		at imxusbc0	unit 1	irq 14 # Host1
+
+usb*		at ehci?
+
+# USB device drivers, just as soon as we have something to attach them to
+include "dev/usb/usbdevices.config"
+
+ukphy*		at mii? phy ?
+
+# Pseudo-Devices
+
+pseudo-device	crypto			# /dev/crypto device
+pseudo-device	swcrypto		# software crypto implementation
+
+# disk/mass storage pseudo-devices
+#pseudo-device	md			# memory disk device (ramdisk)
+#pseudo-device	vnd			# disk-like interface to files
+
+# network pseudo-devices
+pseudo-device	bpfilter		# Berkeley packet filter
+#pseudo-device	ipfilter		# IP filter (firewall) and NAT
+pseudo-device	loop			# network loopback
+pseudo-device	ppp			# Point-to-Point Protocol
+
+# miscellaneous pseudo-devices
+pseudo-device	pty			# pseudo-terminals
+pseudo-device	ksyms			# /dev/ksyms
+pseudo-device	clockctl		# NTP clockctl
+
+# wscons pseudo-devices
+pseudo-device	wsmux			# mouse & keyboard multiplexor
+pseudo-device	wsfont
+
+# local configuration
+cinclude "arch/evbarm/conf/KOBO.local"
Index: src/sys/arch/evbarm/conf/KOBO_INSTALL
diff -u /dev/null src/sys/arch/evbarm/conf/KOBO_INSTALL:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/conf/KOBO_INSTALL	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,13 @@
+#	$NetBSD: KOBO_INSTALL,v 1.1 2014/07/25 11:22:50 hkenken Exp $
+#
+#	KOBO_INSTALL -- KOBO kernel with installation-sized
+#	ramdisk
+#
+
+include "arch/evbarm/conf/KOBO"
+include "arch/evbarm/conf/INSTALL"
+
+options BOOTHOWTO=RB_SINGLE
+
+no makeoptions	DEBUG
+no config netbsd-ld0
Index: src/sys/arch/evbarm/conf/files.kobo
diff -u /dev/null src/sys/arch/evbarm/conf/files.kobo:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/conf/files.kobo	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,26 @@
+#	$NetBSD: files.kobo,v 1.1 2014/07/25 11:22:50 hkenken Exp $
+#
+# KOBO evaluation board configuration info
+#
+
+file	arch/arm/arm32/arm32_boot.c
+file	arch/arm/arm32/arm32_kvminit.c
+file	arch/arm/arm32/arm32_reboot.c
+
+file	arch/evbarm/kobo/kobo_machdep.c
+
+# Kernel boot arguments
+defparam opt_machdep.h				BOOT_ARGS
+
+# CPU support and integrated peripherals
+include	"arch/arm/imx/files.imx51"
+
+# USB Host controller
+device	imxusbc_axi
+attach	imxusbc at axi with imxusbc_axi
+file	arch/evbarm/kobo/kobo_usb.c		imxusbc_axi
+
+# E-Ink controller
+# attach	epdc at axi with eink_kobo
+# file	arch/evbarm/kobo/kobo_eink.c		eink_kobo
+# defflag	opt_kobo_eink.h				EINK_DEBUG
Index: src/sys/arch/evbarm/conf/mk.kobo
diff -u /dev/null src/sys/arch/evbarm/conf/mk.kobo:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/conf/mk.kobo	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,31 @@
+#	$NetBSD: mk.kobo,v 1.1 2014/07/25 11:22:50 hkenken Exp $
+
+CPPFLAGS+= -mcpu=cortex-a8 -mfpu=neon
+
+SYSTEM_FIRST_OBJ=	kobo_start.o
+SYSTEM_FIRST_SFILE=	${THISARM}/kobo/kobo_start.S
+
+MKUBOOTIMAGEARGS=	-A arm -T kernel
+MKUBOOTIMAGEARGS+=	-a $(LOADADDRESS) -e $(LOADADDRESS)
+MKUBOOTIMAGEARGS+=	-n "NetBSD/$(BOARDTYPE) ${_OSRELEASE}"
+MKUBOOTIMAGEARGS_NONE=	${MKUBOOTIMAGEARGS} -C none
+MKUBOOTIMAGEARGS_GZ=	${MKUBOOTIMAGEARGS} -C gz
+
+KERNEL_BASE_PHYS=$(LOADADDRESS)
+KERNEL_BASE_VIRT=$(LOADADDRESS_VIRT)
+
+SYSTEM_LD_TAIL_EXTRA+=; \
+	echo ${OBJCOPY} -S -O binary $@ $@.bin; \
+	${OBJCOPY} -S -O binary $@ $@.bin; \
+	echo ${TOOL_GZIP} -9c $@.bin > $@.bin.gz; \
+	${TOOL_GZIP} -9c $@.bin > $@.bin.gz; \
+	echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} $@.bin.gz $@.gz.ub; \
+	${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_GZ} $@.bin.gz $@.gz.ub; \
+	echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} $@.bin $@.ub; \
+	${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS_NONE} $@.bin $@.ub; \
+	echo
+
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.bin@}
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.ub@}
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.bin.gz@}
+EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.gz.ub@}
Index: src/sys/arch/evbarm/conf/std.kobo
diff -u /dev/null src/sys/arch/evbarm/conf/std.kobo:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/conf/std.kobo	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,29 @@
+#	$NetBSD: std.kobo,v 1.1 2014/07/25 11:22:50 hkenken Exp $
+#
+# standard NetBSD/evbarm options for Kobo
+
+machine	evbarm arm
+include 	"arch/evbarm/conf/std.evbarm"
+
+# Pull in i.mx51 config definitions.
+include	  	"arch/evbarm/conf/files.kobo"
+
+options 	MODULAR
+options 	__HAVE_FAST_SOFTINTS		# should be in types.h
+options 	__HAVE_CPU_COUNTER
+options         __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+options 	__HAVE_CPU_UAREA_ALLOC_IDLELWP
+options 	ARM_HAS_VBAR
+options 	TPIDRPRW_IS_CURCPU
+options 	CORTEX_PMC
+options 	CORTEX_PMC_CCNT_HZ=800000000
+options 	KERNEL_BASE_EXT=0x80000000
+options 	EVBARM_BOARDTYPE="kobo"
+options 	FPU_VFP
+
+makeoptions	LOADADDRESS_VIRT="0x80100000"
+makeoptions	LOADADDRESS="0x70100000"
+makeoptions	BOARDMKFRAG="${THISARM}/conf/mk.kobo"
+
+options 	ARM_INTR_IMPL="<arch/arm/imx/imx51_intr.h>"
+options		ARM_GENERIC_TODR

Index: src/sys/arch/evbarm/kobo/kobo.h
diff -u /dev/null src/sys/arch/evbarm/kobo/kobo.h:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/kobo/kobo.h	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,45 @@
+/*	$NetBSD: kobo.h,v 1.1 2014/07/25 11:22:50 hkenken Exp $	*/
+
+/*
+ * Copyright (c) 2014  Genetec Corporation.  All rights reserved.
+ * Written by Hashimoto Kenichi for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _EVBARM_KOBO_KOBO_H
+#define _EVBARM_KOBO_KOBO_H
+
+/*
+ * Kernel VM space: 256MB at KERNEL_VM_BASE
+ */
+#define KERNEL_VM_BASE		0xc0000000
+#define KERNEL_VM_SIZE		0x10000000
+
+#define GPIO0_IRQBASE		128
+#define GPIO1_IRQBASE		160
+#define GPIO2_IRQBASE		192
+#define GPIO3_IRQBASE		224
+#define GPIO4_IRQBASE		256
+#define GPIO5_IRQBASE		288
+
+#endif /* _EVBARM_KOBO_KOBO_H */
Index: src/sys/arch/evbarm/kobo/kobo_machdep.c
diff -u /dev/null src/sys/arch/evbarm/kobo/kobo_machdep.c:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/kobo/kobo_machdep.c	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,570 @@
+/*	$NetBSD: kobo_machdep.c,v 1.1 2014/07/25 11:22:50 hkenken Exp $	*/
+
+/*
+ * Copyright (c) 2002, 2003, 2005, 2010  Genetec Corporation.
+ * All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Machine dependent functions for kernel setup for RAKUTEN Kobo.
+ * Based on iq80310_machhdep.c
+ */
+/*
+ * Copyright (c) 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed for the NetBSD Project by
+ *	Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1997,1998 Mark Brinicombe.
+ * Copyright (c) 1997,1998 Causality Limited.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by Mark Brinicombe
+ *	for the NetBSD Project.
+ * 4. The name of the company nor the name of the author may be used to
+ *    endorse or promote products derived from this software without specific
+ *    prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Machine dependent functions for kernel setup for Intel IQ80310 evaluation
+ * boards using RedBoot firmware.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: kobo_machdep.c,v 1.1 2014/07/25 11:22:50 hkenken Exp $");
+
+#include "opt_evbarm_boardtype.h"
+#include "opt_arm_debug.h"
+#include "opt_cputypes.h"
+#include "opt_ddb.h"
+#include "opt_kgdb.h"
+#include "opt_md.h"
+#include "opt_com.h"
+#include "imxuart.h"
+#include "opt_imxuart.h"
+#include "opt_imx.h"
+#include "opt_machdep.h"
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/termios.h>
+#include <sys/bus.h>
+
+#include <machine/db_machdep.h>
+#ifdef KGDB
+#include <sys/kgdb.h>
+#endif
+
+#include <machine/bootconfig.h>
+
+#include <arm/arm32/machdep.h>
+
+#include <arm/imx/imx51reg.h>
+#include <arm/imx/imx51var.h>
+#include <arm/imx/imxuartreg.h>
+#include <arm/imx/imxuartvar.h>
+#include <arm/imx/imx50_iomuxreg.h>
+#include <arm/imx/imxgpiovar.h>
+
+#include <evbarm/kobo/kobo.h>
+#include <evbarm/kobo/kobo_reg.h>
+
+/* Kernel text starts 1MB in from the bottom of the kernel address space. */
+#define	KERNEL_TEXT_BASE	(KERNEL_BASE + 0x00100000)
+
+BootConfig bootconfig;		/* Boot config storage */
+static char bootargs[MAX_BOOT_STRING];
+char *boot_args = NULL;
+
+extern char KERNEL_BASE_phys[];
+
+/*
+ * Macros to translate between physical and virtual for a subset of the
+ * kernel address space.  *Not* for general use.
+ */
+#define KERNEL_BASE_PHYS ((paddr_t)KERNEL_BASE_phys)
+
+void consinit(void);
+
+#ifdef KGDB
+void	kgdb_port_init(void);
+#endif
+
+static void init_clocks(void);
+static void setup_ioports(void);
+
+#ifndef CONSPEED
+#define CONSPEED B115200	/* What RedBoot uses */
+#endif
+#ifndef CONMODE
+#define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
+#endif
+
+int comcnspeed = CONSPEED;
+int comcnmode = CONMODE;
+
+/*
+ * Static device mappings. These peripheral registers are mapped at
+ * fixed virtual addresses very early in initarm() so that we can use
+ * them while booting the kernel, and stay at the same address
+ * throughout whole kernel's life time.
+ *
+ * We use this table twice; once with bootstrap page table, and once
+ * with kernel's page table which we build up in initarm().
+ *
+ * Since we map these registers into the bootstrap page table using
+ * pmap_devmap_bootstrap() which calls pmap_map_chunk(), we map
+ * registers segment-aligned and segment-rounded in order to avoid
+ * using the 2nd page tables.
+ */
+
+#define _A(a)   ((a) & ~L1_S_OFFSET)
+#define _S(s)   (((s) + L1_S_SIZE - 1) & ~(L1_S_SIZE-1))
+
+const struct pmap_devmap kobo_devmap[] = {
+	{
+		/* for UART2, IOMUXC */
+		.pd_va = _A(KOBO_IO_VBASE0),
+		.pd_pa = _A(KOBO_IO_PBASE0),
+		.pd_size = _S(L1_S_SIZE * 4),
+		.pd_prot = VM_PROT_READ|VM_PROT_WRITE,
+		.pd_cache = PTE_NOCACHE
+	},
+	{0}
+};
+
+#undef	_A
+#undef	_S
+
+#ifndef MEMSTART
+#define MEMSTART	0x70000000
+#endif
+#ifndef MEMSIZE
+#define MEMSIZE		256
+#endif
+
+static void
+init_clocks(void)
+{
+	cortex_pmc_ccnt_init();
+}
+
+struct iomux_setup {
+	/* iomux registers are 32-bit wide, but upper 16 bits are not
+	 * used. */
+	uint16_t	reg;
+	uint16_t	val;
+};
+
+#define	IOMUX_M(padname, mux)		\
+	IOMUX_DATA(__CONCAT(IOMUXC_SW_MUX_CTL_PAD_,padname), mux)
+
+#define	IOMUX_P(padname, pad)		\
+	IOMUX_DATA(__CONCAT(IOMUXC_SW_PAD_CTL_PAD_,padname), pad)
+
+#define	IOMUX_MP(padname, mux, pad)	\
+	IOMUX_M(padname, mux), \
+	IOMUX_P(padname, pad)
+
+#define	IOMUX_DATA(offset, value)	\
+	{				\
+		.reg = (offset),	\
+		.val = (value),		\
+	}
+
+const struct iomux_setup iomux_setup_data[] = {
+#define	HYS	PAD_CTL_HYS
+#define	ODE	PAD_CTL_ODE
+#define	DSEHIGH	PAD_CTL_DSE_HIGH
+#define	DSEMID	PAD_CTL_DSE_MID
+#define	DSELOW	PAD_CTL_DSE_LOW
+#define	DSEMAX	PAD_CTL_DSE_MAX
+#define	SRE	PAD_CTL_SRE
+#define	KEEPER	PAD_CTL_KEEPER
+#define	PULL	PAD_CTL_PULL
+#define	PU_22K	PAD_CTL_PUS_22K_PU
+#define	PU_47K	PAD_CTL_PUS_47K_PU
+#define	PU_100K	PAD_CTL_PUS_100K_PU
+#define	PD_100K	PAD_CTL_PUS_100K_PD
+#define	HVE	PAD_CTL_HVE	/* Low output voltage */
+
+#define	ALT0	IOMUX_CONFIG_ALT0
+#define	ALT1	IOMUX_CONFIG_ALT1
+#define	ALT2	IOMUX_CONFIG_ALT2
+#define	ALT3	IOMUX_CONFIG_ALT3
+#define	ALT4	IOMUX_CONFIG_ALT4
+#define	ALT5	IOMUX_CONFIG_ALT5
+#define	ALT6	IOMUX_CONFIG_ALT6
+#define	ALT7	IOMUX_CONFIG_ALT7
+#define	SION	IOMUX_CONFIG_SION
+
+	/* I2C1 */
+	IOMUX_MP(I2C1_SCL, ALT0 | SION, PULL | PU_100K | HYS | ODE | DSEHIGH),
+	IOMUX_MP(I2C1_SDA, ALT0 | SION, PULL | PU_100K | HYS | ODE | DSEHIGH),
+
+	/* I2C2 */
+	IOMUX_MP(I2C2_SCL, ALT0 | SION, PULL | PU_100K | HYS | ODE | DSEHIGH),
+	IOMUX_MP(I2C2_SDA, ALT0 | SION, PULL | PU_100K | HYS | ODE | DSEHIGH),
+
+	/* I2C3 */
+	IOMUX_MP(I2C3_SCL, ALT0 | SION, PULL | PU_100K | HYS | ODE | DSEHIGH),
+	IOMUX_MP(I2C3_SDA, ALT0 | SION, PULL | PU_100K | HYS | ODE | DSEHIGH),
+
+	/* UART2 */
+	IOMUX_MP(UART2_RXD, ALT0, HYS | PULL | DSEHIGH | SRE),
+	IOMUX_MP(UART2_TXD, ALT0, HYS | PULL | DSEHIGH | SRE),
+
+	/* SD1 */
+	IOMUX_MP(SD1_CMD, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD1_CLK, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD1_D0, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD1_D1, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD1_D2, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD1_D3, ALT0, HVE | PU_22K | DSEMAX | SRE),
+//	IOMUX_MP(SD1_CD, ALT0, HVE | PU_22K | DSEMAX | SRE),
+
+	/* SD2 */
+	IOMUX_MP(SD2_CMD, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD2_CLK, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD2_D0, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD2_D1, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD2_D2, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD2_D3, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD2_CD, ALT0, HVE | PU_22K | DSEMAX | SRE),
+
+	IOMUX_DATA(IOMUXC_ESDHC2_IPP_CARD_DET_SELECT_INPUT, INPUT_DAISY_1),
+
+	/* SD3 */
+	IOMUX_MP(SD3_CMD, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD3_CLK, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD3_D0, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD3_D1, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD3_D2, ALT0, HVE | PU_22K | DSEMAX | SRE),
+	IOMUX_MP(SD3_D3, ALT0, HVE | PU_22K | DSEMAX | SRE),
+//	IOMUX_MP(SD3_CD, ALT0, HVE | PU_22K | DSEMAX | SRE),
+
+	/* OTG */
+	IOMUX_M(PWM2, ALT2),
+//	IOMUX_MP(PWM1, ALT2, HYS | KEEPER | DSEHIGH),
+
+	/* EPDC */
+	IOMUX_M(EPDC_D0, ALT0),
+	IOMUX_M(EPDC_D1, ALT0),
+	IOMUX_M(EPDC_D2, ALT0),
+	IOMUX_M(EPDC_D3, ALT0),
+	IOMUX_M(EPDC_D4, ALT0),
+	IOMUX_M(EPDC_D5, ALT0),
+	IOMUX_M(EPDC_D6, ALT0),
+	IOMUX_M(EPDC_D7, ALT0),
+	IOMUX_M(EPDC_GDCLK, ALT0),
+	IOMUX_M(EPDC_GDSP, ALT0),
+	IOMUX_M(EPDC_GDOE, ALT0),
+	IOMUX_M(EPDC_GDRL, ALT0),
+	IOMUX_M(EPDC_SDCLK, ALT0),
+	IOMUX_M(EPDC_SDOE, ALT0),
+	IOMUX_M(EPDC_SDLE, ALT0),
+	IOMUX_M(EPDC_BDR0, ALT0),
+	IOMUX_M(EPDC_BDR1, ALT0),
+	IOMUX_M(EPDC_SDCE0, ALT0),
+
+	IOMUX_M(EPDC_PWRSTAT, ALT1),	/* GPIO3[28] */
+	IOMUX_M(EPDC_PWRCTRL0, ALT1),	/* GPIO3[29] */
+	IOMUX_M(EPDC_VCOM0, ALT1),	/* GPIO4[21] */
+	IOMUX_M(UART4_TXD, ALT1),	/* GPIO6[16] */
+	IOMUX_M(UART4_RXD, ALT1),	/* GPIO6[17] */
+
+//	IOMUX_M(PWM2, ALT1),		/* GPIO6[25] */
+
+#undef	ODE
+#undef	HYS
+#undef	SRE
+#undef	PULL
+#undef	KEEPER
+#undef	PU_22K
+#undef	PU_47K
+#undef	PU_100K
+#undef	PD_100K
+#undef	HVE
+#undef	DSEMAX
+#undef	DSEHIGH
+#undef	DSEMID
+#undef	DSELOW
+
+#undef	ALT0
+#undef	ALT1
+#undef	ALT2
+#undef	ALT3
+#undef	ALT4
+#undef	ALT5
+#undef	ALT6
+#undef	ALT7
+#undef	SION
+};
+
+static void
+setup_ioports(void)
+{
+	int i;
+	const struct iomux_setup *p;
+
+	for (i=0; i < __arraycount(iomux_setup_data); ++i) {
+		p = iomux_setup_data + i;
+
+		ioreg_write(KOBO_IOMUXC_VBASE + p->reg,
+			    p->val);
+	}
+}
+
+#ifdef	CONSDEVNAME
+const char consdevname[] = CONSDEVNAME;
+
+#ifndef	CONMODE
+#define	CONMODE	((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
+#endif
+#ifndef	CONSPEED
+#define	CONSPEED	115200
+#endif
+
+int consmode = CONMODE;
+int consrate = CONSPEED;
+
+#endif	/* CONSDEVNAME */
+
+#ifndef	IMXUART_FREQ
+#define	IMXUART_FREQ	24000000
+#endif
+
+/*
+ * u_int initarm(...)
+ *
+ * Initial entry point on startup. This gets called before main() is
+ * entered.
+ * It should be responsible for setting up everything that must be
+ * in place when main is called.
+ * This includes
+ *   Taking a copy of the boot configuration structure.
+ *   Initialising the physical console so characters can be printed.
+ *   Setting up page tables for the kernel
+ */
+u_int
+initarm(void *arg)
+{
+	/*
+	 * Heads up ... Setup the CPU / MMU / TLB functions
+	 */
+	if (set_cpufuncs())		// starts PMC counter
+		panic("cpu not recognized!");
+
+	/* map some peripheral registers */
+	pmap_devmap_bootstrap((vaddr_t)armreg_ttbr_read() & -L1_TABLE_SIZE,
+	    kobo_devmap);
+
+	cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
+
+	/* Register devmap for devices we mapped in start */
+	pmap_devmap_register(kobo_devmap);
+	setup_ioports();
+
+	consinit();
+
+	init_clocks();
+
+#ifdef KGDB
+	kgdb_port_init();
+#endif
+
+	/* Talk to the user */
+	printf("\nNetBSD/evbarm (" ___STRING(EVBARM_BOARDTYPE) ") booting ...\n");
+
+#ifdef BOOT_ARGS
+	char mi_bootargs[] = BOOT_ARGS;
+	parse_mi_bootargs(mi_bootargs);
+#endif
+	bootargs[0] = '\0';
+
+#ifdef VERBOSE_INIT_ARM
+	printf("initarm: Configuring system");
+	printf(", CLIDR=%010o CTR=%#x",
+	    armreg_clidr_read(), armreg_ctr_read());
+	printf("\n");
+#endif
+
+#ifdef VERBOSE_INIT_ARM
+	printf("initarm: Configuring system ...\n");
+#endif
+	/*
+	 * Set up the variables that define the availability of physical
+	 * memory.
+	 */
+
+	/* Fake bootconfig structure for the benefit of pmap.c. */
+	bootconfig.dramblocks = 1;
+	bootconfig.dram[0].address = MEMSTART;
+	bootconfig.dram[0].pages = (MEMSIZE * 1024 * 1024) / PAGE_SIZE;
+
+	psize_t ram_size = bootconfig.dram[0].pages * PAGE_SIZE;
+
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+	const bool mapallmem_p = true;
+	if (ram_size > (KERNEL_VM_BASE - KERNEL_BASE)) {
+		printf("%s: dropping RAM size from %luMB to %uMB\n",
+		    __func__, (unsigned long) (ram_size >> 20),
+		    (KERNEL_VM_BASE - KERNEL_BASE) >> 20);
+		ram_size = KERNEL_VM_BASE - KERNEL_BASE;
+	}
+	KASSERT(ram_size <= KERNEL_VM_BASE - KERNEL_BASE);
+#else
+	const bool mapallmem_p = false;
+#endif
+
+	arm32_bootmem_init(bootconfig.dram[0].address, ram_size,
+	    KERNEL_BASE_PHYS);
+	arm32_kernel_vm_init(KERNEL_VM_BASE, ARM_VECTORS_HIGH, 0,
+	    kobo_devmap, mapallmem_p);
+
+#ifdef BOOTHOWTO
+	boothowto |= BOOTHOWTO;
+#endif
+
+	return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
+}
+
+void
+consinit(void)
+{
+	static int consinit_called = 0;
+
+	if (consinit_called)
+		return;
+
+	consinit_called = 1;
+
+#ifdef	CONSDEVNAME
+
+#if NIMXUART > 0
+	imxuart_set_frequency(IMXUART_FREQ, 2);
+#endif
+
+#if (NIMXUART > 0) && defined(IMXUARTCONSOLE)
+	if (strcmp(consdevname, "imxuart") == 0) {
+		paddr_t consaddr;
+#ifdef	CONADDR
+		consaddr = CONADDR;
+#else
+		consaddr = IMX51_UART2_BASE;
+#endif
+		imxuart_cons_attach(&imx_bs_tag, consaddr, consrate, consmode);
+		return;
+	}
+#endif
+
+#endif
+
+#if (NWSDISPLAY > 0) && defined(IMXEPDCCONSOLE)
+#if NUKBD > 0
+	ukbd_cnattach();
+#endif
+	{
+		extern void kobo_cnattach(void);
+		kobo_cnattach();
+	}
+#endif
+}
+
+#ifdef KGDB
+#ifndef KGDB_DEVNAME
+#define KGDB_DEVNAME "imxuart"
+#endif
+#ifndef KGDB_DEVMODE
+#define KGDB_DEVMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
+#endif
+
+const char kgdb_devname[20] = KGDB_DEVNAME;
+int kgdb_mode = KGDB_DEVMODE;
+int kgdb_addr = KGDB_DEVADDR;
+extern int kgdb_rate;	/* defined in kgdb_stub.c */
+
+void
+kgdb_port_init(void)
+{
+#if (NIMXUART > 0)
+	if (strcmp(kgdb_devname, "imxuart") == 0) {
+		imxuart_kgdb_attach(&imx_bs_tag, kgdb_addr,
+		kgdb_rate, kgdb_mode);
+	    return;
+	}
+
+#endif
+}
+#endif
Index: src/sys/arch/evbarm/kobo/kobo_reg.h
diff -u /dev/null src/sys/arch/evbarm/kobo/kobo_reg.h:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/kobo/kobo_reg.h	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,69 @@
+/*	$NetBSD: kobo_reg.h,v 1.1 2014/07/25 11:22:50 hkenken Exp $	*/
+
+/*
+ * Copyright (c) 2012  Genetec Corporation.  All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef _EVBARM_KOBO_REG_H
+#define _EVBARM_KOBO_REG_H
+
+#include "opt_imx.h"
+
+#include <arm/imx/imx51reg.h>
+
+#define DDRSDRAM_BASE	CSD0DDR_BASE
+
+/* map UART2 and IOMUXC for bootstrap */
+#define	KOBO_PRIVATE_VBASE	0xf0000000
+#define	KOBO_IO_VBASE0		0xfd000000
+#define	KOBO_IO_PBASE0		0x53f00000	/* GPIO, IOMUXC, UART */
+
+#define	KOBO_UART2_VBASE	\
+	(IMX51_UART2_BASE-KOBO_IO_PBASE0+KOBO_IO_VBASE0)
+#define	KOBO_IOMUXC_VBASE	\
+	(IOMUXC_BASE-KOBO_IO_PBASE0+KOBO_IO_VBASE0)
+
+/* GPIO[1..4] */
+#define	KOBO_GPIO1_VBASE	\
+	(GPIO1_BASE-KOBO_IO_PBASE0+KOBO_IO_VBASE0)
+#define	KOBO_GPIO_VBASE(n)	\
+	(KOBO_GPIO1_VBASE+((n)-1)*0x4000)
+#define	KOBO_WDOG_VBASE	\
+	(WDOG1_BASE-KOBO_IO_PBASE0+KOBO_IO_VBASE0)
+
+#define ioreg_read(a)		(*(volatile uint32_t *)(a))
+#define ioreg_write(a,v)	(*(volatile uint32_t *)(a)=(v))
+
+#define	ioreg32_read	ioreg_read
+#define	ioreg32_write	ioreg_write
+
+#define	ioreg16_read(a) 	(*(volatile uint16_t *)(a))
+#define	ioreg16_write(a,v)	(*(volatile uint16_t *)(a) = (v))
+
+#define	ioreg8_read(a)  	(*(volatile uint8_t *)(a))
+#define	ioreg8_write(a,v)	(*(volatile uint8_t *)(a) = (v))
+
+#endif /* _EVBARM_KOBO_REG_H */
Index: src/sys/arch/evbarm/kobo/kobo_start.S
diff -u /dev/null src/sys/arch/evbarm/kobo/kobo_start.S:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/kobo/kobo_start.S	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,332 @@
+/*	$NetBSD: kobo_start.S,v 1.1 2014/07/25 11:22:50 hkenken Exp $	*/
+
+/*-
+ * Copyright (c) 2009 SHIMIZU Ryo <r...@nerv.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 2002, 2003, 2010  Genetec Corporation.  All rights reserved.
+ * Written by Kenichi Hashimoto and Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opt_imx.h"
+#include "opt_com.h"
+#include "opt_cpuoptions.h"
+#include "opt_cputypes.h"
+#include "opt_arm_debug.h"
+
+#include <arm/asm.h>
+#include <arm/armreg.h>
+#include "assym.h"
+
+#include <arm/imx/imx51reg.h>
+#include <arm/imx/imxuartreg.h>
+#include <evbarm/kobo/kobo_reg.h>
+
+RCSID("$NetBSD: kobo_start.S,v 1.1 2014/07/25 11:22:50 hkenken Exp $")
+
+#if defined(VERBOSE_INIT_ARM)
+#define DEBUG_STARTUP
+#define	XPUTC(n) 	mov r0, n; bl _C_LABEL(debugputc)
+#else
+#define	XPUTC(n)
+#endif
+
+#ifndef SDRAM_START
+#define SDRAM_START CSD0DDR_BASE
+#endif
+#define KERNEL_TEXT_ADDR	(SDRAM_START+0x00100000)
+
+#define INIT_MEMSIZE	128
+#define TEMP_L1_TABLE	(SDRAM_START + INIT_MEMSIZE * 0x100000 - L1_TABLE_SIZE)
+
+#ifdef	DEBUG_STARTUP
+#define	CHECKPOINT(n)	CHECKPOINT2(n,r0,r1)
+#define	CHECKPOINT2(n,ra,rb)		\
+	mov	ra, #0x30+(n); 		\
+	ldr	rb, =UART2_BASE;	\
+	str	ra, [rb, #IMX_UTXD];
+#else
+#define	CHECKPOINT(n)		/* nothing to do */
+#define	CHECKPOINT2(n,ra,rb)	/* nothing to do */
+#endif
+
+	.section .start,"ax",%progbits
+
+	.text
+
+	.global _C_LABEL(kobo_start)
+_C_LABEL(kobo_start):
+	CHECKPOINT(0)
+
+#ifdef	DEBUG_STARTUP
+	ldr	sp,=SDRAM_START+0x4000
+
+	bl	newline
+	ldr	r0, =0xdeadb01f
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+
+	mov	r0, pc
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+
+	mrc	p15, 0, r0, c0, c0, 3	/* read TLB type register */
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+
+	mrc	p15, 0, r0, c1, c0, 0	/* read control register */
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+
+	mrc	p15, 0, r0, c2, c0, 0	/* read TTB0 */
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+
+	mrc	p15, 0, r0, c2, c0, 1	/* read TTB1 */
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+
+	ldr	r0, =0xbabeface
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+
+	/* dump some of UART2 registers to know clock frequency */
+	ldr	r4,=UART2_BASE
+	ldr	r0,[r4,#IMX_UBMR]
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+	ldr	r0,[r4,#IMX_UBIR]
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+	ldr	r0,[r4,#IMX_UFCR]
+	bl	_C_LABEL(debugprintx)
+	bl	newline
+#endif	/* DEBUG_STARTUP */
+
+	/* Are we running on right place ? */
+	ldr	r2, =KERNEL_TEXT_ADDR
+	adr	r0, _C_LABEL(kobo_start)
+	cmp	r0, r2
+	beq	relocated
+
+	/*
+	 * move me to RAM
+	 */
+	ldr	r1, .Lcopy_size
+	add	r1, r1, #3
+	mov	r1, r1, LSR #2
+	mov	r4, r2
+
+	bhs	5f
+
+	/* src < dest. copy from top */
+	add r0,r0,r1,LSL #2
+	add r2,r2,r1,LSL #2
+
+3:	ldr r3,[r0,#-4]!
+	str r3,[r2,#-4]!
+	subs r1,r1,#1
+	bhi 3b
+	b 7f
+
+	/* src >= dest. copy from bottom */
+5:	ldr r3,[r0],#4
+	str r3,[r2],#4
+	subs r1,r1,#1
+	bhi 5b
+7:
+	/*
+	 * Okay, we are finished relocating the text segment.  Now
+	 * we need to leap to the next instruction.
+	 */
+	ldr	r0, .Lrelocate_address
+	ldr	r1, .Lrelocate_offset
+	add	pc, r0, r1
+
+.Lrelocate_offset:	.word relocated-_C_LABEL(kobo_start)
+
+relocated:
+	CHECKPOINT(1)
+
+	/* Move into supervisor mode and disable IRQs/FIQs. */
+	cpsid   if, #PSR_SVC32_MODE
+
+	bl	cortex_init
+
+	movw	r0, #:lower16:TEMP_L1_TABLE
+	movt	r0, #:upper16:TEMP_L1_TABLE
+	adr	r1, .Lmmu_init_table
+	bl	arm_boot_l1pt_init
+
+	CHECKPOINT(2)
+
+	/*
+	 * Turn on the MMU, Caches, etc.
+	 */
+	movw	r0, #:lower16:TEMP_L1_TABLE
+	movt	r0, #:upper16:TEMP_L1_TABLE
+	movw	lr, #:lower16:1f
+	movt	lr, #:upper16:1f
+	bl	arm_cpuinit
+
+	CHECKPOINT(3)
+
+	movw	ip, #:lower16:start
+	movt	ip, #:upper16:start
+	bx	ip		/* Jump to start (flushes pipeline). */
+
+	/* NOTREACHED */
+
+/*
+ * Calculate size of kernel to copy.  Don't bother to copy bss,
+ * although I guess the CPU could use the warmup exercise ...
+ */
+.Lcopy_size:
+        .word	_edata - _C_LABEL(kobo_start)
+
+.Lrelocate_address:
+	.word	KERNEL_BASE_phys
+
+#include <arm/cortex/a9_mpsubr.S>
+
+.Lmmu_init_table:
+	/* fill all table VA==PA */
+	MMU_INIT(0x00000000, 0x00000000, 1 << (32 - L1_S_SHIFT),
+		L1_S_PROTO_armv7 | L1_S_APv7_KRW)
+
+	/* Map memory 1:1 VA to PA, write-back cacheable, shareable */
+	MMU_INIT(SDRAM_START, SDRAM_START, MEMSIZE,
+		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+
+	/* Map KERNEL_BASE VA to SDRAM PA, write-back cacheable, shareable */
+	MMU_INIT(KERNEL_BASE, SDRAM_START, INIT_MEMSIZE,
+		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+
+	/* Map KERNEL_BASE VA to SDRAM PA, write-back cacheable, shareable */
+	MMU_INIT(KERNEL_BASE, DDRSDRAM_BASE, INIT_MEMSIZE,
+		L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+
+	/* Map all 256KB of L4 WAKEUP (so console will work) */
+	MMU_INIT(KOBO_IO_VBASE0, KOBO_IO_PBASE0, 4,
+		L1_S_PROTO | L1_S_APv7_KRW | L1_S_V6_XN)
+
+	/* end of table */
+	MMU_INIT(0, 0, 0, 0)
+
+#ifdef	DEBUG_STARTUP
+.Luart0adr:
+	.word	UART2_BASE
+
+	.global _C_LABEL(debugprintx)
+_C_LABEL(debugprintx):
+	stmfd	sp!, {r0, r3, lr}
+
+	mov	r3, r0
+
+	mov	r0, #'0'
+	bl	debugputc
+	mov	r0, #'x'
+	bl	debugputc
+
+	bl	print_r3
+
+	ldmfd	sp!, {r0, r3, pc}
+
+	.global	_C_LABEL(debugprint)
+_C_LABEL(debugprint):
+	stmfd	sp!, {r0, r1, lr}
+	mov	r1, r0
+1:
+	ldrb	r0, [r1], #1
+	cmp	r0, #0
+	beq	9f
+	bl	debugputc
+	b	1b
+9:
+	ldmfd	sp!, {r0, r1, pc}
+
+print_r3:
+	stmfd	sp!, {r0, r3-r6, lr}
+	mov	r4, #28
+	mov	r5, #0xf
+1:
+	and	r6, r5, r3, ROR r4
+	cmp	r6, #10
+	addlt	r0, r6, #'0'
+	addge	r0, r6, #('a' - 0x0a)
+	bl	debugputc
+	subs	r4, r4, #4
+	bge	1b
+	ldmfd	sp!, {r0, r3-r6, pc}
+
+	.global	_C_LABEL(debugputc)
+_C_LABEL(debugputc):
+	stmfd	sp!, {r0, r1, r2, lr}
+
+	ldr	r1, .Luart0adr
+
+1:	/* wait */
+	ldr	r2, [r1, #0x98]
+	tst	r2, #0x4000
+	beq	1b
+
+	/* output */
+	strb	r0, [r1, #0x40]
+
+	ldmfd	sp!, {r0, r1, r2, pc}
+
+newline:
+	mov	r1, lr
+	mov	r0, #0x0d
+	bl	_C_LABEL(debugputc)
+	mov	lr, r1
+	mov	r0, #0x0a
+	b	_C_LABEL(debugputc)
+
+#endif	/* DEBUG_STARTUP */
+
+END(_C_LABEL(kobo_start))
Index: src/sys/arch/evbarm/kobo/kobo_usb.c
diff -u /dev/null src/sys/arch/evbarm/kobo/kobo_usb.c:1.1
--- /dev/null	Fri Jul 25 11:22:50 2014
+++ src/sys/arch/evbarm/kobo/kobo_usb.c	Fri Jul 25 11:22:50 2014
@@ -0,0 +1,189 @@
+/*	$NetBSD: kobo_usb.c,v 1.1 2014/07/25 11:22:50 hkenken Exp $	*/
+
+/*
+ * Copyright (c) 2012  Genetec Corporation.  All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: kobo_usb.c,v 1.1 2014/07/25 11:22:50 hkenken Exp $");
+
+#include "opt_imx.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/kthread.h>
+#include <sys/device.h>
+#include <sys/intr.h>
+#include <sys/bus.h>
+#include <sys/gpio.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdivar.h>
+#include <dev/usb/usb_mem.h>
+
+#include <dev/usb/ehcireg.h>
+#include <dev/usb/ehcivar.h>
+
+#include <arm/imx/imx51reg.h>
+#include <arm/imx/imx51var.h>
+#include <arm/imx/imxusbreg.h>
+#include <arm/imx/imxusbvar.h>
+#include <arm/imx/imx50_iomuxreg.h>
+#include <arm/imx/imxgpiovar.h>
+#include <arm/imx/imx51_ccmreg.h>
+#include <arm/imx/imx51_ccmvar.h>
+
+#include "locators.h"
+
+struct kobo_usbc_softc {
+	struct imxusbc_softc sc_imxusbc;
+};
+
+static int	imxusbc_match(device_t, cfdata_t, void *);
+static void	imxusbc_attach(device_t, device_t, void *);
+static void	kobo_usb_init(struct imxehci_softc *);
+
+static void	init_otg(struct imxehci_softc *);
+static void	init_h1(struct imxehci_softc *);
+
+extern const struct iomux_conf iomux_usb1_config[];
+
+/* attach structures */
+CFATTACH_DECL_NEW(imxusbc_axi, sizeof(struct kobo_usbc_softc),
+    imxusbc_match, imxusbc_attach, NULL, NULL);
+
+static int
+imxusbc_match(device_t parent, cfdata_t cf, void *aux)
+{
+	struct axi_attach_args *aa = aux;
+
+	if (aa->aa_addr == USBOH3_BASE)
+		return 1;
+	return 0;
+}
+
+static void
+imxusbc_attach(device_t parent, device_t self, void *aux)
+{
+	struct axi_attach_args *aa = aux;
+	struct kobo_usbc_softc *sc = device_private(self);
+
+	aprint_normal("\n");
+	aprint_naive("\n");
+
+	sc->sc_imxusbc.sc_init_md_hook = kobo_usb_init;
+	sc->sc_imxusbc.sc_setup_md_hook = NULL;
+
+	imxusbc_attach_common(parent, self, aa->aa_iot);
+}
+
+static void
+kobo_usb_init(struct imxehci_softc *sc)
+{
+	switch (sc->sc_unit) {
+	case 0:	/* OTG controller */
+		init_otg(sc);
+		break;
+	case 1:	/* EHCI Host 1 */
+		init_h1(sc);
+		break;
+	default:
+		aprint_error_dev(sc->sc_hsc.sc_dev, "unit %d not supprted\n",
+		    sc->sc_unit);
+	}
+}
+
+static void
+init_otg(struct imxehci_softc *sc)
+{
+	struct imxusbc_softc *usbc = sc->sc_usbc;
+	uint32_t reg;
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_USB_CLKONOFF_CTRL);
+	reg &= ~USB_CLKONOFF_CTRL_OTG_AHBCLK_OFF;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_USB_CLKONOFF_CTRL, reg);
+
+	sc->sc_iftype = IMXUSBC_IF_UTMI_WIDE;
+
+	imxehci_reset(sc);
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_PHYCTRL0);
+	reg |= PHYCTRL0_OTG_OVER_CUR_DIS | PHYCTRL0_SUSPENDM;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_PHYCTRL0, reg);
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_USBCTRL);
+	reg &= ~USBCTRL_OWIR;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_USBCTRL, reg);
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_PHYCTRL1);
+	reg = (reg & ~PHYCTRL1_PLLDIVVALUE_MASK) | PHYCTRL1_PLLDIVVALUE_24MHZ;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_PHYCTRL1, reg);
+}
+
+static void
+init_h1(struct imxehci_softc *sc)
+{
+	struct imxusbc_softc *usbc = sc->sc_usbc;
+	uint32_t reg;
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_USB_CLKONOFF_CTRL);
+	reg &= ~USB_CLKONOFF_CTRL_H1_AHBCLK_OFF;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_USB_CLKONOFF_CTRL, reg);
+
+	imxehci_reset(sc);
+
+	/* select INTERNAL PHY interface for Host 1 */
+	sc->sc_iftype = IMXUSBC_IF_UTMI;
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh,
+	    USBOH3_USBCTRL);
+	reg |= USBCTRL_H1PM;
+	reg &= ~(USBCTRL_H1WIE);
+	reg &= ~(USBCTRL_H1UIE);
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh,
+	    USBOH3_USBCTRL, reg);
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_PHYCTRL0);
+	reg &= ~PHYCTRL0_H1_OVER_CUR_DIS;
+	reg |= PHYCTRL0_H1_OVER_CUR_POL;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh,USBOH3_PHYCTRL0 , reg);
+
+	delay(1000);
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_UH1_PHY_CTRL_1);
+	reg &= ~PHYCTRL1_PLLDIVVALUE_MASK;
+	reg |= PHYCTRL1_PLLDIVVALUE_24MHZ;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_UH1_PHY_CTRL_1, reg);
+
+	reg = bus_space_read_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_UH1_PHY_CTRL_0);
+	reg &= ~PHYCTRL0_CHGRDETON;
+	reg &= ~PHYCTRL0_CHGRDETEN;
+	bus_space_write_4(usbc->sc_iot, usbc->sc_ioh, USBOH3_UH1_PHY_CTRL_0, reg);
+}
+
+

Reply via email to