diff options
author | Florian Boor <florian.boor@kernelconcepts.de> | 2007-11-08 11:07:58 +0000 |
---|---|---|
committer | Florian Boor <florian.boor@kernelconcepts.de> | 2007-11-08 11:07:58 +0000 |
commit | 1f7343079a1b56e623aba7fdf63946f3dae979e3 (patch) | |
tree | 062776d2316111ee5c72fa1b9de7deb01cdca153 /packages | |
parent | 47007ab845cf3ff4c9038412df673853e5bde900 (diff) | |
parent | a44ab8fc112a3ded9e4bf4d379243b399e2505a9 (diff) |
merge of '689e57bae9a2678694a0233e81f710e4878928f4'
and 'c2e1d9a66fe20e02ea4226aaff7de2ccde79ffba'
Diffstat (limited to 'packages')
219 files changed, 57454 insertions, 1902 deletions
diff --git a/packages/agg/agg_2.5.bb b/packages/agg/agg_2.5.bb index 84bbb4d4bb..f91d0112be 100644 --- a/packages/agg/agg_2.5.bb +++ b/packages/agg/agg_2.5.bb @@ -13,7 +13,7 @@ S = "${WORKDIR}/${P}" inherit autotools pkgconfig -EXTRA_OECONF = "--with-sdl-exec-prefix=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF = "--with-sdl-exec-prefix=${STAGING_DIR_NATIVE}${layout_exec_prefix}" CFLAGS += " -I{$STAGING_INCDIR} " PACKAGES =+ "${PN}-sdl ${PN}-x11" diff --git a/packages/alsa/alsa-lib_1.0.15.bb b/packages/alsa/alsa-lib_1.0.15.bb new file mode 100644 index 0000000000..60b44dbc8e --- /dev/null +++ b/packages/alsa/alsa-lib_1.0.15.bb @@ -0,0 +1,44 @@ +DESCRIPTION = "Alsa sound library" +HOMEPAGE = "http://www.alsa-project.org" +SECTION = "libs/multimedia" +LICENSE = "GPL" + +# configure.in sets -D__arm__ on the command line for any arm system +# (not just those with the ARM instruction set), this should be removed, +# (or replaced by a permitted #define). +#FIXME: remove the following +ARM_INSTRUCTION_SET = "arm" + +SRC_URI = "ftp://ftp.alsa-project.org/pub/lib/alsa-lib-${PV}.tar.bz2 \ + file://fix-tstamp-declaration.patch;patch=1" + +inherit autotools pkgconfig + +require alsa-fpu.inc +EXTRA_OECONF += "${@get_alsa_fpu_setting(bb, d)} " + +EXTRA_OECONF = "--with-cards=pdaudiocf --with-oss=yes --disable-python" + +do_stage () { + oe_libinstall -so -C src libasound ${STAGING_LIBDIR}/ + install -d ${STAGING_INCDIR}/alsa/sound + install -m 0644 include/*.h ${STAGING_INCDIR}/alsa/ + install -m 0644 include/sound/ainstr*.h ${STAGING_INCDIR}/alsa/sound/ + install -d ${STAGING_DATADIR}/aclocal + install -m 0644 utils/alsa.m4 ${STAGING_DATADIR}/aclocal/ +} + +PACKAGES =+ "alsa-server libasound alsa-conf-base alsa-conf alsa-doc alsa-dev" +FILES_${PN}-dbg += "${libdir}/alsa-lib/*/.debu*" +FILES_libasound = "${libdir}/libasound.so.*" +FILES_alsa-server = "${bindir}/*" +FILES_alsa-conf = "${datadir}/alsa/" +FILES_alsa-dev += "${libdir}/pkgconfig/ /usr/include/ ${datadir}/aclocal/*" +FILES_alsa-conf-base = "\ +${datadir}/alsa/alsa.conf \ +${datadir}/alsa/cards/aliases.conf \ +${datadir}/alsa/pcm/default.conf \ +${datadir}/alsa/pcm/dmix.conf \ +${datadir}/alsa/pcm/dsnoop.conf" + +RDEPENDS_libasound = "alsa-conf-base" diff --git a/packages/alsa/alsa-oss_1.0.15.bb b/packages/alsa/alsa-oss_1.0.15.bb new file mode 100644 index 0000000000..b11947e86a --- /dev/null +++ b/packages/alsa/alsa-oss_1.0.15.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "Alsa OSS Compatibility Package" +SECTION = "libs/multimedia" +LICENSE = "GPL" +DEPENDS = "alsa-lib" + +SRC_URI = "ftp://ftp.alsa-project.org/pub/oss-lib/alsa-oss-${PV}.tar.bz2" + +inherit autotools + +do_configure_prepend () { + touch NEWS README AUTHORS ChangeLog +} + +do_stage () { + oe_libinstall -C alsa -a -so libaoss ${STAGING_LIBDIR} + oe_libinstall -C alsa -a -so libalsatoss ${STAGING_LIBDIR} +} diff --git a/packages/alsa/alsa-utils_1.0.14.bb b/packages/alsa/alsa-utils_1.0.14.bb index 240b995e7b..25eeade7cd 100644 --- a/packages/alsa/alsa-utils_1.0.14.bb +++ b/packages/alsa/alsa-utils_1.0.14.bb @@ -3,16 +3,11 @@ HOMEPAGE = "http://www.alsa-project.org" SECTION = "console/utils" LICENSE = "GPL" DEPENDS = "alsa-lib ncurses" +PR = "r1" -SRC_URI = "ftp://ftp.alsa-project.org/pub/utils/alsa-utils-${PV}.tar.bz2" - -# lazy hack. needs proper fixing in gettext.m4, see -# http://bugs.openembedded.org/show_bug.cgi?id=2348 -# please close bug and remove this comment when properly fixed -# -EXTRA_OECONF_linux-uclibc = "--disable-nls" -EXTRA_OECONF_linux-uclibcgnueabi = "--disable-nls" - +SRC_URI = "ftp://ftp.alsa-project.org/pub/utils/alsa-utils-${PV}.tar.bz2 \ + file://alsa-utils-automake.patch;patch=1 \ + " inherit autotools # This are all packages that we need to make. Also, the now empty alsa-utils diff --git a/packages/alsa/alsa-utils_1.0.15.bb b/packages/alsa/alsa-utils_1.0.15.bb new file mode 100644 index 0000000000..b271e75439 --- /dev/null +++ b/packages/alsa/alsa-utils_1.0.15.bb @@ -0,0 +1,57 @@ +DESCRIPTION = "ALSA Utilities" +HOMEPAGE = "http://www.alsa-project.org" +SECTION = "console/utils" +LICENSE = "GPL" +DEPENDS = "alsa-lib ncurses" +PR = "r1" + +SRC_URI = "ftp://ftp.alsa-project.org/pub/utils/alsa-utils-${PV}.tar.bz2 \ + file://alsa-utils-automake.patch;patch=1 \ + " + +inherit autotools + +# This are all packages that we need to make. Also, the now empty alsa-utils +# ipk depend on them. + +PACKAGES += "\ + alsa-utils-alsamixer \ + alsa-utils-midi \ + alsa-utils-aplay \ + alsa-utils-amixer \ + alsa-utils-aconnect \ + alsa-utils-iecset \ + alsa-utils-speakertest \ + alsa-utils-aseqnet \ + alsa-utils-aseqdump \ + alsa-utils-alsaconf \ + alsa-utils-alsactl " + +# We omit alsaconf, because +# a) this is a bash script +# b) it creates config files not suitable for OE-based distros + +FILES_${PN} = "" +FILES_alsa-utils-aplay = "${bindir}/aplay ${bindir}/arecord" +FILES_alsa-utils-amixer = "${bindir}/amixer" +FILES_alsa-utils-alsamixer = "${bindir}/alsamixer" +FILES_alsa-utils-speakertest = "${bindir}/speaker-test ${datadir}/sounds/alsa/ ${datadir}/alsa/" +FILES_alsa-utils-midi = "${bindir}/aplaymidi ${bindir}/arecordmidi ${bindir}/amidi" +FILES_alsa-utils-aconnect = "${bindir}/aconnect" +FILES_alsa-utils-aseqnet = "${bindir}/aseqnet" +FILES_alsa-utils-iecset = "${bindir}/iecset" +FILES_alsa-utils-alsactl = "${sbindir}/alsactl" +FILES_alsa-utils-aseqdump = "${bindir}/aseqdump" +FILES_alsa-utils-alsaconf = "${sbindir}/alsaconf" + +DESCRIPTION_alsa-utils-aplay = "play (and record) sound files via ALSA" +DESCRIPTION_alsa-utils-amixer = "command-line based control for ALSA mixer and settings" +DESCRIPTION_alsa-utils-alsamixer = "ncurses based control for ALSA mixer and settings" +DESCRIPTION_alsa-utils-speakertest = "ALSA surround speaker test utility" +DESCRIPTION_alsa-utils-midi = "miscalleanous MIDI utilities for ALSA" +DESCRIPTION_alsa-utils-aconnect = "ALSA sequencer connection manager" +DESCRIPTION_alsa-utils-aseqnet = "network client/server on ALSA sequencer" +DESCRIPTION_alsa-utils-alsactl = "saves/restores ALSA-settings in /etc/asound.state" +DESCRIPTION_alsa-utils-alsaconf = "a bash script that creates ALSA configuration files" + +ALLOW_EMPTY_alsa-utils = "1" diff --git a/packages/alsa/files/alsa-utils-automake.patch b/packages/alsa/files/alsa-utils-automake.patch new file mode 100644 index 0000000000..de0eee94fd --- /dev/null +++ b/packages/alsa/files/alsa-utils-automake.patch @@ -0,0 +1,10 @@ +Index: alsa-utils-1.0.14/seq/aseqnet/Makefile.am +=================================================================== +--- alsa-utils-1.0.14.orig/seq/aseqnet/Makefile.am 2007-05-31 10:07:21.000000000 +0200 ++++ alsa-utils-1.0.14/seq/aseqnet/Makefile.am 2007-10-31 21:11:41.000000000 +0100 +@@ -3,4 +3,5 @@ + + bin_PROGRAMS = aseqnet + aseqnet_SOURCES = aseqnet.c ++aseqnet_LDADD = $(INTLLIBS) + man_MANS = aseqnet.1 diff --git a/packages/altboot/altboot_1.1.1+wip-SVNR66.bb b/packages/altboot/altboot_1.1.1+wip-SVNR66.bb index 912082c70f..0eda8ba44b 100644 --- a/packages/altboot/altboot_1.1.1+wip-SVNR66.bb +++ b/packages/altboot/altboot_1.1.1+wip-SVNR66.bb @@ -1,9 +1,10 @@ require altboot.inc -PR = "r0" +PR = "r1" SVN_REV = "66" -SRC_URI = "svn://hentges.net/public/altboot;module=trunk;rev=${SVN_REV}" +SRC_URI = "svn://hentges.net/public/altboot;module=trunk;rev=${SVN_REV} \ + file://sd-dynamic-fix.patch;patch=1" do_install() { install -d ${D}/sbin diff --git a/packages/busybox/busybox-1.7.2/angstrom/.mtn2git_empty b/packages/altboot/files/.mtn2git_empty index e69de29bb2..e69de29bb2 100644 --- a/packages/busybox/busybox-1.7.2/angstrom/.mtn2git_empty +++ b/packages/altboot/files/.mtn2git_empty diff --git a/packages/altboot/files/sd-dynamic-fix.patch b/packages/altboot/files/sd-dynamic-fix.patch new file mode 100644 index 0000000000..f31c6b8dc7 --- /dev/null +++ b/packages/altboot/files/sd-dynamic-fix.patch @@ -0,0 +1,44 @@ +Index: trunk/altboot.func +=================================================================== +--- trunk.orig/altboot.func 2007-10-30 15:48:16.000000000 +0000 ++++ trunk/altboot.func 2007-10-30 15:48:21.000000000 +0000 +@@ -499,17 +499,6 @@ + then + echo "Note: $SD_MOUNTPOINT is already mounted" + else +- # We can't trust that the SD device file is there when running kernel 2.6 w/ udev +- # and starting udev at this point may not be the best idea... +- if `uname -r | grep -q "2.6"` +- then +- #Let's just assume the device file name never changes... +- dev_no="`echo "$SD_DEVICE" | sed -n "s/\/dev\/mmcblk\(.*\)p\(.*\)/\1/p"`" +- part_no="`echo "$SD_DEVICE" | sed -n "s/\/dev\/mmcblk\(.*\)p\(.*\)/\2/p"`" +- ! test -e /dev/mmcblk${dev_no} && mknod /dev/mmcblk${dev_no} b 254 0 +- ! test -e /dev/mmcblk${dev_no}p${part_no} && mknod /dev/mmcblk${dev_no}p${part_no} b 254 $part_no +- fi +- + # Kernel 2.6 has the SD driver compiled into the kernel + if test -n "$SD_KERNEL_MODULE" + then +@@ -544,6 +533,21 @@ + fi + fi + ++ # We can't trust that the SD device file is there when running kernel 2.6 w/ udev ++ # and starting udev at this point may not be the best idea... ++ if `uname -r | grep -q "2.6"` ++ then ++ #Let's just assume the device file name never changes... ++ dev_no="`echo "$SD_DEVICE" | sed -n "s/\/dev\/mmcblk\(.*\)p\(.*\)/\1/p"`" ++ part_no="`echo "$SD_DEVICE" | sed -n "s/\/dev\/mmcblk\(.*\)p\(.*\)/\2/p"`" ++ if [ -f /sys/block/mmcblk${dev_no}/mmcblk${dev_no}p${part_no}/dev ] ++ then ++ rm -f /dev/mmcblk${dev_no}p${part_no} || true ++ mknod /dev/mmcblk${dev_no}p${part_no} b `cat /sys/block/mmcblk${dev_no}/mmcblk${dev_no}p${part_no}/dev|sed 's/:/ /' ` ++ fi ++ ++ fi ++ + sleep 3 + + check_fs "$SD_DEVICE" diff --git a/packages/avetanabt/avetanabt_20060413.bb b/packages/avetanabt/avetanabt_20060413.bb index be88139319..54e3d845bb 100644 --- a/packages/avetanabt/avetanabt_20060413.bb +++ b/packages/avetanabt/avetanabt_20060413.bb @@ -24,7 +24,7 @@ do_compile() { # generate classes # javac -> jikes ${STAGING_BINDIR_NATIVE}/find {de,javax,com} -iname *.java > file.list - ${STAGING_BINDIR_NATIVE}/jikes -verbose --bootclasspath ${STAGING_DIR}/${BUILD_SYS}/share/kaffeh/rt.jar -d build @file.list + ${STAGING_BINDIR_NATIVE}/jikes -verbose --bootclasspath ${STAGING_DATADIR_NATIVE}/kaffeh/rt.jar -d build @file.list # create own version.xml (add version information available at runtime) head -n 4 version.xml >> build/version.xml @@ -37,7 +37,7 @@ do_compile() { # JNI generated header file - de_avetana_bluetooth_stack_BlueZ.h # javah -> kaffeh - ${STAGING_BINDIR_NATIVE}/kaffeh -jni -classpath avetanaBT.jar:${STAGING_DIR}/${BUILD_SYS}/share/kaffeh/rt.jar -d c de.avetana.bluetooth.stack.BlueZ + ${STAGING_BINDIR_NATIVE}/kaffeh -jni -classpath avetanaBT.jar:${STAGING_DATADIR_NATIVE}/kaffeh/rt.jar -d c de.avetana.bluetooth.stack.BlueZ # Native language (C) library - libavetanaBT.so ${CXX} ${CXXFLAGS} -shared -lbluetooth -I${STAGING_INCDIR}/classpath c/BlueZ.cpp -o libavetanaBT.so ${LDFLAGS} @@ -46,8 +46,8 @@ do_compile() { do_stage() { - install -d ${STAGING_DIR}/${BUILD_SYS}/share/avetanabt - install avetanaBT.jar ${STAGING_DIR}/${BUILD_SYS}/share/avetanabt/ + install -d ${STAGING_DATADIR_NATIVE}/avetanabt + install avetanaBT.jar ${STAGING_DATADIR_NATIVE}/avetanabt/ } diff --git a/packages/avetanabt/avetanabt_cvs.bb b/packages/avetanabt/avetanabt_cvs.bb index a5c9ce0ac7..a8f795989b 100644 --- a/packages/avetanabt/avetanabt_cvs.bb +++ b/packages/avetanabt/avetanabt_cvs.bb @@ -27,7 +27,7 @@ do_compile() { # generate classes # javac -> jikes ${STAGING_BINDIR_NATIVE}/find {de,javax,com} -iname *.java > file.list - ${STAGING_BINDIR_NATIVE}/jikes -verbose --bootclasspath ${STAGING_DIR}/${BUILD_SYS}/share/kaffeh/rt.jar -d build @file.list + ${STAGING_BINDIR_NATIVE}/jikes -verbose --bootclasspath ${STAGING_DATADIR_NATIVE}/kaffeh/rt.jar -d build @file.list # create own version.xml (add version information available at runtime) head -n 4 version.xml >> build/version.xml @@ -40,7 +40,7 @@ do_compile() { # JNI generated header file - de_avetana_bluetooth_stack_BlueZ.h # javah -> kaffeh - ${STAGING_BINDIR_NATIVE}/kaffeh -jni -classpath avetanaBT.jar:${STAGING_DIR}/${BUILD_SYS}/share/kaffeh/rt.jar -d c de.avetana.bluetooth.stack.BlueZ + ${STAGING_BINDIR_NATIVE}/kaffeh -jni -classpath avetanaBT.jar:${STAGING_DATADIR_NATIVE}/kaffeh/rt.jar -d c de.avetana.bluetooth.stack.BlueZ # Native language (C) library - libavetanaBT.so ${CXX} ${CXXFLAGS} -shared -lbluetooth -I${STAGING_INCDIR}/classpath c/BlueZ.cpp -o libavetanaBT.so ${LDFLAGS} @@ -49,8 +49,8 @@ do_compile() { do_stage() { - install -d ${STAGING_DIR}/${BUILD_SYS}/share/avetanabt - install avetanaBT.jar ${STAGING_DIR}/${BUILD_SYS}/share/avetanabt/ + install -d ${STAGING_DATADIR_NATIVE}/avetanabt + install avetanaBT.jar ${STAGING_DATADIR_NATIVE}/avetanabt/ } diff --git a/packages/base-files/base-files/slugos/fstab b/packages/base-files/base-files/slugos/fstab index d30f958401..53008e49a5 100644 --- a/packages/base-files/base-files/slugos/fstab +++ b/packages/base-files/base-files/slugos/fstab @@ -1,6 +1,6 @@ rootfs / jffs2 defaults 1 1 -proc /proc proc defaults 0 0 +proc /proc proc defaults 0 0 tmpfs /var/volatile tmpfs mode=0755 0 0 -tmpfs /media/ram tmpfs defaults 0 0 -tmpfs /dev/shm tmpfs mode=0777 0 0 +#tmpfs /media/ram tmpfs defaults 0 0 +tmpfs /dev/shm tmpfs mode=0777 0 0 usbfs /proc/bus/usb usbfs defaults 0 0 diff --git a/packages/bluez/bluez-cups-backend_3.22.bb b/packages/bluez/bluez-cups-backend_3.22.bb new file mode 100644 index 0000000000..64884fa904 --- /dev/null +++ b/packages/bluez/bluez-cups-backend_3.22.bb @@ -0,0 +1,26 @@ +require bluez-utils3.inc + +DEPENDS += "cups" + +# see bluez-utils3.inc for the explanation of these option +EXTRA_OECONF = " \ + --enable-bccmd \ + --enable-hid2hci \ + --disable-alsa \ + --enable-cups \ + --enable-glib \ + --disable-sdpd \ + --enable-network \ + --enable-serial \ + --enable-input \ + --enable-audio \ + --enable-echo \ + --enable-configfile \ + --enable-initscripts \ + --enable-test \ + " + +PACKAGES = "${PN}" + +FILES_${PN} = "${libdir}/cups/backend/bluetooth" +RDEPENDS_${PN} = "cups"
\ No newline at end of file diff --git a/packages/bluez/bluez-gstreamer-plugin_3.22.bb b/packages/bluez/bluez-gstreamer-plugin_3.22.bb new file mode 100644 index 0000000000..c5a1a9acee --- /dev/null +++ b/packages/bluez/bluez-gstreamer-plugin_3.22.bb @@ -0,0 +1,26 @@ +require bluez-utils3.inc + +DEPENDS += "gstreamer gst-plugins-base " + +# see bluez-utils3.inc for the explanation of these option +EXTRA_OECONF = " \ + --enable-bccmd \ + --enable-hid2hci \ + --enable-alsa \ + --disable-cups \ + --enable-glib \ + --enable-gstreamer \ + --disable-sdpd \ + --enable-network \ + --enable-serial \ + --enable-input \ + --enable-audio \ + --enable-echo \ + --enable-configfile \ + --enable-initscripts \ + --enable-test \ + " + +PACKAGES = "${PN}" + +FILES_${PN} = "${libdir}/gstreamer-0.10/libgstbluetooth.so" diff --git a/packages/bluez/bluez-libs_3.22.bb b/packages/bluez/bluez-libs_3.22.bb new file mode 100644 index 0000000000..6ddf62a4fb --- /dev/null +++ b/packages/bluez/bluez-libs_3.22.bb @@ -0,0 +1 @@ +require bluez-libs.inc diff --git a/packages/bluez/bluez-utils-alsa_3.22.bb b/packages/bluez/bluez-utils-alsa_3.22.bb new file mode 100644 index 0000000000..e2f48fba49 --- /dev/null +++ b/packages/bluez/bluez-utils-alsa_3.22.bb @@ -0,0 +1,24 @@ +require bluez-utils3.inc + +DEPENDS += "alsa-lib" + +# see bluez-utils3.inc for the explanation of these option +EXTRA_OECONF = " \ + --enable-bccmd \ + --disable-hid2hci \ + --enable-alsa \ + --disable-cups \ + --enable-glib \ + --disable-sdpd \ + --enable-network \ + --enable-serial \ + --enable-input \ + --enable-audio \ + --enable-echo \ + --enable-configfile \ + --enable-initscripts \ + --enable-test \ + " + +PACKAGES = "${PN}" +FILES_${PN} = "${libdir}/alsa-lib/libasound*" diff --git a/packages/bluez/bluez-utils_3.22.bb b/packages/bluez/bluez-utils_3.22.bb new file mode 100644 index 0000000000..48f147aa69 --- /dev/null +++ b/packages/bluez/bluez-utils_3.22.bb @@ -0,0 +1,29 @@ +require bluez-utils3.inc + +# see bluez-utils3.inc for the explanation of these option +EXTRA_OECONF = " \ + --enable-bccmd \ + --enable-hid2hci \ + --disable-alsa \ + --disable-cups \ + --enable-glib \ + --disable-sdpd \ + --enable-network \ + --enable-serial \ + --enable-input \ + --enable-audio \ + --enable-echo \ + --enable-configfile \ + --enable-initscripts \ + --enable-test \ + " + +CONFFILES_${PN} = " \ + ${sysconfdir}/bluetooth/hcid.conf \ + ${sysconfdir}/default/bluetooth \ + " + +CONFFILES_${PN}-compat = " \ + ${sysconfdir}/bluetooth/rfcomm.conf \ + " + diff --git a/packages/busybox/busybox-1.7.2/angstrom/defconfig b/packages/busybox/busybox-1.7.2/angstrom/defconfig deleted file mode 100644 index 19cfafab2c..0000000000 --- a/packages/busybox/busybox-1.7.2/angstrom/defconfig +++ /dev/null @@ -1,753 +0,0 @@ -# -# Automatically generated make config: don't edit -# Busybox version: 1.7.2 -# Fri Oct 12 19:00:27 2007 -# -CONFIG_HAVE_DOT_CONFIG=y - -# -# Busybox Settings -# - -# -# General Configuration -# -# CONFIG_NITPICK is not set -# CONFIG_DESKTOP is not set -# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set -# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set -# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set -CONFIG_SHOW_USAGE=y -# CONFIG_FEATURE_VERBOSE_USAGE is not set -CONFIG_FEATURE_COMPRESS_USAGE=y -# CONFIG_FEATURE_INSTALLER is not set -CONFIG_LOCALE_SUPPORT=y -CONFIG_GETOPT_LONG=y -CONFIG_FEATURE_DEVPTS=y -# CONFIG_FEATURE_CLEAN_UP is not set -CONFIG_FEATURE_PIDFILE=y -CONFIG_FEATURE_SUID=y -CONFIG_FEATURE_SUID_CONFIG=y -CONFIG_FEATURE_SUID_CONFIG_QUIET=y -# CONFIG_SELINUX is not set -# CONFIG_FEATURE_PREFER_APPLETS is not set -CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" -CONFIG_FEATURE_SYSLOG=y -CONFIG_FEATURE_HAVE_RPC=y - -# -# Build Options -# -# CONFIG_STATIC is not set -# CONFIG_BUILD_LIBBUSYBOX is not set -# CONFIG_FEATURE_FULL_LIBBUSYBOX is not set -# CONFIG_FEATURE_SHARED_BUSYBOX is not set -CONFIG_LFS=y -CONFIG_BUILD_AT_ONCE=y - -# -# Debugging Options -# -# CONFIG_DEBUG is not set -# CONFIG_WERROR is not set -CONFIG_NO_DEBUG_LIB=y -# CONFIG_DMALLOC is not set -# CONFIG_EFENCE is not set -# CONFIG_INCLUDE_SUSv2 is not set - -# -# Installation Options -# -# CONFIG_INSTALL_NO_USR is not set -CONFIG_INSTALL_APPLET_SYMLINKS=y -# CONFIG_INSTALL_APPLET_HARDLINKS is not set -# CONFIG_INSTALL_APPLET_DONT is not set -CONFIG_PREFIX="./_install" - -# -# Busybox Library Tuning -# -CONFIG_PASSWORD_MINLEN=6 -CONFIG_MD5_SIZE_VS_SPEED=2 -CONFIG_FEATURE_FAST_TOP=y -# CONFIG_FEATURE_ETC_NETWORKS is not set -CONFIG_FEATURE_EDITING=y -CONFIG_FEATURE_EDITING_MAX_LEN=1024 -# CONFIG_FEATURE_EDITING_FANCY_KEYS is not set -# CONFIG_FEATURE_EDITING_VI is not set -CONFIG_FEATURE_EDITING_HISTORY=15 -CONFIG_FEATURE_EDITING_SAVEHISTORY=y -CONFIG_FEATURE_TAB_COMPLETION=y -CONFIG_FEATURE_USERNAME_COMPLETION=y -CONFIG_FEATURE_EDITING_FANCY_PROMPT=y -CONFIG_MONOTONIC_SYSCALL=y -CONFIG_IOCTL_HEX2STR_ERROR=y - -# -# Applets -# - -# -# Archival Utilities -# -CONFIG_AR=y -# CONFIG_FEATURE_AR_LONG_FILENAMES is not set -CONFIG_BUNZIP2=y -CONFIG_CPIO=y -# CONFIG_DPKG is not set -# CONFIG_DPKG_DEB is not set -# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set -CONFIG_GUNZIP=y -# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set -CONFIG_GZIP=y -# CONFIG_RPM2CPIO is not set -# CONFIG_RPM is not set -# CONFIG_FEATURE_RPM_BZ2 is not set -CONFIG_TAR=y -CONFIG_FEATURE_TAR_CREATE=y -CONFIG_FEATURE_TAR_BZIP2=y -# CONFIG_FEATURE_TAR_LZMA is not set -CONFIG_FEATURE_TAR_FROM=y -CONFIG_FEATURE_TAR_GZIP=y -# CONFIG_FEATURE_TAR_COMPRESS is not set -# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set -# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set -CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y -# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set -# CONFIG_UNCOMPRESS is not set -# CONFIG_UNLZMA is not set -# CONFIG_FEATURE_LZMA_FAST is not set -CONFIG_UNZIP=y - -# -# Common options for cpio and tar -# -# CONFIG_FEATURE_UNARCHIVE_TAPE is not set -# CONFIG_FEATURE_DEB_TAR_GZ is not set -# CONFIG_FEATURE_DEB_TAR_BZ2 is not set -# CONFIG_FEATURE_DEB_TAR_LZMA is not set - -# -# Coreutils -# -CONFIG_BASENAME=y -# CONFIG_CAL is not set -CONFIG_CAT=y -# CONFIG_CATV is not set -CONFIG_CHGRP=y -CONFIG_CHMOD=y -CONFIG_CHOWN=y -CONFIG_CHROOT=y -# CONFIG_CKSUM is not set -# CONFIG_COMM is not set -CONFIG_CP=y -CONFIG_CUT=y -CONFIG_DATE=y -# CONFIG_FEATURE_DATE_ISOFMT is not set -CONFIG_DD=y -CONFIG_FEATURE_DD_SIGNAL_HANDLING=y -# CONFIG_FEATURE_DD_IBS_OBS is not set -CONFIG_DF=y -CONFIG_DIRNAME=y -# CONFIG_DOS2UNIX is not set -# CONFIG_UNIX2DOS is not set -CONFIG_DU=y -CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y -CONFIG_ECHO=y -CONFIG_FEATURE_FANCY_ECHO=y -CONFIG_ENV=y -CONFIG_FEATURE_ENV_LONG_OPTIONS=y -# CONFIG_EXPAND is not set -# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set -CONFIG_EXPR=y -# CONFIG_EXPR_MATH_SUPPORT_64 is not set -CONFIG_FALSE=y -# CONFIG_FOLD is not set -CONFIG_HEAD=y -# CONFIG_FEATURE_FANCY_HEAD is not set -# CONFIG_HOSTID is not set -CONFIG_ID=y -# CONFIG_INSTALL is not set -# CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set -# CONFIG_LENGTH is not set -CONFIG_LN=y -CONFIG_LOGNAME=y -CONFIG_LS=y -CONFIG_FEATURE_LS_FILETYPES=y -CONFIG_FEATURE_LS_FOLLOWLINKS=y -CONFIG_FEATURE_LS_RECURSIVE=y -CONFIG_FEATURE_LS_SORTFILES=y -CONFIG_FEATURE_LS_TIMESTAMPS=y -CONFIG_FEATURE_LS_USERNAME=y -CONFIG_FEATURE_LS_COLOR=y -# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set -CONFIG_MD5SUM=y -CONFIG_MKDIR=y -CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y -CONFIG_MKFIFO=y -CONFIG_MKNOD=y -CONFIG_MV=y -# CONFIG_FEATURE_MV_LONG_OPTIONS is not set -# CONFIG_NICE is not set -CONFIG_NOHUP=y -CONFIG_OD=y -# CONFIG_PRINTENV is not set -CONFIG_PRINTF=y -CONFIG_PWD=y -CONFIG_READLINK=y -CONFIG_FEATURE_READLINK_FOLLOW=y -CONFIG_REALPATH=y -CONFIG_RM=y -CONFIG_RMDIR=y -CONFIG_SEQ=y -# CONFIG_SHA1SUM is not set -CONFIG_SLEEP=y -CONFIG_FEATURE_FANCY_SLEEP=y -CONFIG_SORT=y -CONFIG_FEATURE_SORT_BIG=y -# CONFIG_SPLIT is not set -# CONFIG_FEATURE_SPLIT_FANCY is not set -# CONFIG_STAT is not set -# CONFIG_FEATURE_STAT_FORMAT is not set -CONFIG_STTY=y -# CONFIG_SUM is not set -CONFIG_SYNC=y -CONFIG_TAIL=y -CONFIG_FEATURE_FANCY_TAIL=y -CONFIG_TEE=y -# CONFIG_FEATURE_TEE_USE_BLOCK_IO is not set -CONFIG_TEST=y -# CONFIG_FEATURE_TEST_64 is not set -CONFIG_TOUCH=y -CONFIG_TR=y -CONFIG_FEATURE_TR_CLASSES=y -# CONFIG_FEATURE_TR_EQUIV is not set -CONFIG_TRUE=y -CONFIG_TTY=y -CONFIG_UNAME=y -# CONFIG_UNEXPAND is not set -# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set -CONFIG_UNIQ=y -CONFIG_USLEEP=y -# CONFIG_UUDECODE is not set -# CONFIG_UUENCODE is not set -CONFIG_WC=y -# CONFIG_FEATURE_WC_LARGE is not set -CONFIG_WHO=y -CONFIG_WHOAMI=y -CONFIG_YES=y - -# -# Common options for cp and mv -# -# CONFIG_FEATURE_PRESERVE_HARDLINKS is not set - -# -# Common options for ls, more and telnet -# -CONFIG_FEATURE_AUTOWIDTH=y - -# -# Common options for df, du, ls -# -CONFIG_FEATURE_HUMAN_READABLE=y - -# -# Common options for md5sum, sha1sum -# -CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y - -# -# Console Utilities -# -CONFIG_CHVT=y -CONFIG_CLEAR=y -CONFIG_DEALLOCVT=y -CONFIG_DUMPKMAP=y -CONFIG_LOADFONT=y -CONFIG_LOADKMAP=y -CONFIG_OPENVT=y -CONFIG_RESET=y -# CONFIG_RESIZE is not set -# CONFIG_FEATURE_RESIZE_PRINT is not set -CONFIG_SETCONSOLE=y -# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set -# CONFIG_SETKEYCODES is not set -# CONFIG_SETLOGCONS is not set - -# -# Debian Utilities -# -CONFIG_MKTEMP=y -# CONFIG_PIPE_PROGRESS is not set -CONFIG_RUN_PARTS=y -# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set -# CONFIG_FEATURE_RUN_PARTS_FANCY is not set -CONFIG_START_STOP_DAEMON=y -CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y -CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y -CONFIG_WHICH=y - -# -# Editors -# -CONFIG_AWK=y -CONFIG_FEATURE_AWK_MATH=y -# CONFIG_CMP is not set -CONFIG_DIFF=y -CONFIG_FEATURE_DIFF_BINARY=y -CONFIG_FEATURE_DIFF_DIR=y -# CONFIG_FEATURE_DIFF_MINIMAL is not set -# CONFIG_ED is not set -CONFIG_PATCH=y -CONFIG_SED=y -CONFIG_VI=y -CONFIG_FEATURE_VI_MAX_LEN=1024 -CONFIG_FEATURE_VI_COLON=y -CONFIG_FEATURE_VI_YANKMARK=y -CONFIG_FEATURE_VI_SEARCH=y -CONFIG_FEATURE_VI_USE_SIGNALS=y -# CONFIG_FEATURE_VI_DOT_CMD is not set -# CONFIG_FEATURE_VI_READONLY is not set -# CONFIG_FEATURE_VI_SETOPTS is not set -# CONFIG_FEATURE_VI_SET is not set -CONFIG_FEATURE_VI_WIN_RESIZE=y -CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y -CONFIG_FEATURE_ALLOW_EXEC=y - -# -# Finding Utilities -# -CONFIG_FIND=y -CONFIG_FEATURE_FIND_PRINT0=y -CONFIG_FEATURE_FIND_MTIME=y -CONFIG_FEATURE_FIND_MMIN=y -CONFIG_FEATURE_FIND_PERM=y -CONFIG_FEATURE_FIND_TYPE=y -CONFIG_FEATURE_FIND_XDEV=y -CONFIG_FEATURE_FIND_MAXDEPTH=y -CONFIG_FEATURE_FIND_NEWER=y -# CONFIG_FEATURE_FIND_INUM is not set -CONFIG_FEATURE_FIND_EXEC=y -CONFIG_FEATURE_FIND_USER=y -CONFIG_FEATURE_FIND_GROUP=y -CONFIG_FEATURE_FIND_NOT=y -CONFIG_FEATURE_FIND_DEPTH=y -CONFIG_FEATURE_FIND_PAREN=y -CONFIG_FEATURE_FIND_SIZE=y -CONFIG_FEATURE_FIND_PRUNE=y -# CONFIG_FEATURE_FIND_DELETE is not set -CONFIG_FEATURE_FIND_PATH=y -CONFIG_FEATURE_FIND_REGEX=y -# CONFIG_FEATURE_FIND_CONTEXT is not set -CONFIG_GREP=y -CONFIG_FEATURE_GREP_EGREP_ALIAS=y -CONFIG_FEATURE_GREP_FGREP_ALIAS=y -CONFIG_FEATURE_GREP_CONTEXT=y -CONFIG_XARGS=y -# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set -# CONFIG_FEATURE_XARGS_SUPPORT_QUOTES is not set -# CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT is not set -# CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set - -# -# Init Utilities -# -# CONFIG_INIT is not set -# CONFIG_DEBUG_INIT is not set -# CONFIG_FEATURE_USE_INITTAB is not set -# CONFIG_FEATURE_INIT_SCTTY is not set -# CONFIG_FEATURE_INIT_SYSLOG is not set -# CONFIG_FEATURE_EXTRA_QUIET is not set -# CONFIG_FEATURE_INIT_COREDUMPS is not set -# CONFIG_FEATURE_INITRD is not set -# CONFIG_HALT is not set -# CONFIG_MESG is not set - -# -# Login/Password Management Utilities -# -# CONFIG_FEATURE_SHADOWPASSWDS is not set -# CONFIG_USE_BB_SHADOW is not set -# CONFIG_USE_BB_PWD_GRP is not set -# CONFIG_ADDGROUP is not set -# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set -# CONFIG_DELGROUP is not set -# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set -# CONFIG_ADDUSER is not set -# CONFIG_DELUSER is not set -# CONFIG_GETTY is not set -CONFIG_FEATURE_UTMP=y -# CONFIG_FEATURE_WTMP is not set -# CONFIG_LOGIN is not set -# CONFIG_PAM is not set -# CONFIG_LOGIN_SCRIPTS is not set -# CONFIG_FEATURE_NOLOGIN is not set -# CONFIG_FEATURE_SECURETTY is not set -# CONFIG_PASSWD is not set -# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set -# CONFIG_CRYPTPW is not set -# CONFIG_CHPASSWD is not set -# CONFIG_SU is not set -# CONFIG_FEATURE_SU_SYSLOG is not set -# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set -# CONFIG_SULOGIN is not set -# CONFIG_VLOCK is not set - -# -# Linux Ext2 FS Progs -# -CONFIG_CHATTR=y -CONFIG_FSCK=y -# CONFIG_LSATTR is not set - -# -# Linux Module Utilities -# -CONFIG_INSMOD=y -# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set -# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set -# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set -# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set -# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set -CONFIG_RMMOD=y -CONFIG_LSMOD=y -# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set -CONFIG_MODPROBE=y -CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS=y -CONFIG_FEATURE_MODPROBE_FANCY_ALIAS=y - -# -# Options common to multiple modutils -# -CONFIG_FEATURE_CHECK_TAINTED_MODULE=y -# CONFIG_FEATURE_2_4_MODULES is not set -CONFIG_FEATURE_2_6_MODULES=y -# CONFIG_FEATURE_QUERY_MODULE_INTERFACE is not set - -# -# Linux System Utilities -# -CONFIG_DMESG=y -CONFIG_FEATURE_DMESG_PRETTY=y -CONFIG_FBSET=y -CONFIG_FEATURE_FBSET_FANCY=y -CONFIG_FEATURE_FBSET_READMODE=y -# CONFIG_FDFLUSH is not set -# CONFIG_FDFORMAT is not set -CONFIG_FDISK=y -CONFIG_FDISK_SUPPORT_LARGE_DISKS=y -CONFIG_FEATURE_FDISK_WRITABLE=y -# CONFIG_FEATURE_AIX_LABEL is not set -# CONFIG_FEATURE_SGI_LABEL is not set -# CONFIG_FEATURE_SUN_LABEL is not set -# CONFIG_FEATURE_OSF_LABEL is not set -# CONFIG_FEATURE_FDISK_ADVANCED is not set -# CONFIG_FREERAMDISK is not set -CONFIG_FSCK_MINIX=y -CONFIG_MKFS_MINIX=y - -# -# Minix filesystem support -# -CONFIG_FEATURE_MINIX2=y -# CONFIG_GETOPT is not set -CONFIG_HEXDUMP=y -CONFIG_HWCLOCK=y -CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y -CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y -# CONFIG_IPCRM is not set -# CONFIG_IPCS is not set -CONFIG_LOSETUP=y -# CONFIG_MDEV is not set -# CONFIG_FEATURE_MDEV_CONF is not set -# CONFIG_FEATURE_MDEV_EXEC is not set -# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set -CONFIG_MKSWAP=y -# CONFIG_FEATURE_MKSWAP_V0 is not set -CONFIG_MORE=y -CONFIG_FEATURE_USE_TERMIOS=y -CONFIG_MOUNT=y -CONFIG_FEATURE_MOUNT_NFS=y -# CONFIG_FEATURE_MOUNT_CIFS is not set -CONFIG_FEATURE_MOUNT_FLAGS=y -CONFIG_FEATURE_MOUNT_FSTAB=y -CONFIG_PIVOT_ROOT=y -CONFIG_RDATE=y -# CONFIG_READPROFILE is not set -# CONFIG_SETARCH is not set -CONFIG_SWAPONOFF=y -CONFIG_SWITCH_ROOT=y -CONFIG_UMOUNT=y -# CONFIG_FEATURE_UMOUNT_ALL is not set - -# -# Common options for mount/umount -# -CONFIG_FEATURE_MOUNT_LOOP=y -# CONFIG_FEATURE_MTAB_SUPPORT is not set - -# -# Miscellaneous Utilities -# -# CONFIG_ADJTIMEX is not set -# CONFIG_BBCONFIG is not set -# CONFIG_CHRT is not set -# CONFIG_CROND is not set -# CONFIG_DEBUG_CROND_OPTION is not set -# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set -# CONFIG_CRONTAB is not set -CONFIG_DC=y -# CONFIG_DEVFSD is not set -# CONFIG_DEVFSD_MODLOAD is not set -# CONFIG_DEVFSD_FG_NP is not set -# CONFIG_DEVFSD_VERBOSE is not set -# CONFIG_FEATURE_DEVFS is not set -# CONFIG_EJECT is not set -# CONFIG_LAST is not set -CONFIG_LESS=y -CONFIG_FEATURE_LESS_MAXLINES=9999999 -CONFIG_FEATURE_LESS_BRACKETS=y -CONFIG_FEATURE_LESS_FLAGS=y -# CONFIG_FEATURE_LESS_FLAGCS is not set -# CONFIG_FEATURE_LESS_MARKS is not set -# CONFIG_FEATURE_LESS_REGEXP is not set -# CONFIG_HDPARM is not set -# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set -# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set -# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set -# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set -# CONFIG_MAKEDEVS is not set -# CONFIG_FEATURE_MAKEDEVS_LEAF is not set -# CONFIG_FEATURE_MAKEDEVS_TABLE is not set -# CONFIG_MOUNTPOINT is not set -# CONFIG_MT is not set -# CONFIG_RAIDAUTORUN is not set -# CONFIG_READAHEAD is not set -# CONFIG_RUNLEVEL is not set -# CONFIG_RX is not set -CONFIG_STRINGS=y -# CONFIG_SETSID is not set -# CONFIG_TASKSET is not set -# CONFIG_FEATURE_TASKSET_FANCY is not set -CONFIG_TIME=y -# CONFIG_TTYSIZE is not set -# CONFIG_WATCHDOG is not set - -# -# Networking Utilities -# -CONFIG_FEATURE_IPV6=y -# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set -# CONFIG_ARP is not set -# CONFIG_ARPING is not set -# CONFIG_DNSD is not set -# CONFIG_ETHER_WAKE is not set -# CONFIG_FAKEIDENTD is not set -# CONFIG_FTPGET is not set -# CONFIG_FTPPUT is not set -# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set -CONFIG_HOSTNAME=y -# CONFIG_HTTPD is not set -# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set -# CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP is not set -# CONFIG_FEATURE_HTTPD_SETUID is not set -# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set -# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set -# CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES is not set -# CONFIG_FEATURE_HTTPD_CGI is not set -# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set -# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set -# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set -# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set -CONFIG_IFCONFIG=y -CONFIG_FEATURE_IFCONFIG_STATUS=y -# CONFIG_FEATURE_IFCONFIG_SLIP is not set -# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set -CONFIG_FEATURE_IFCONFIG_HW=y -# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set -CONFIG_IFUPDOWN=y -CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" -# CONFIG_FEATURE_IFUPDOWN_IP is not set -# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set -CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN=y -CONFIG_FEATURE_IFUPDOWN_IPV4=y -CONFIG_FEATURE_IFUPDOWN_IPV6=y -CONFIG_FEATURE_IFUPDOWN_MAPPING=y -# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set -# CONFIG_INETD is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set -# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set -# CONFIG_FEATURE_INETD_RPC is not set -CONFIG_IP=y -CONFIG_FEATURE_IP_ADDRESS=y -CONFIG_FEATURE_IP_LINK=y -CONFIG_FEATURE_IP_ROUTE=y -CONFIG_FEATURE_IP_TUNNEL=y -# CONFIG_FEATURE_IP_RULE is not set -# CONFIG_FEATURE_IP_SHORT_FORMS is not set -# CONFIG_IPADDR is not set -# CONFIG_IPLINK is not set -# CONFIG_IPROUTE is not set -# CONFIG_IPTUNNEL is not set -# CONFIG_IPRULE is not set -# CONFIG_IPCALC is not set -# CONFIG_FEATURE_IPCALC_FANCY is not set -# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set -# CONFIG_NAMEIF is not set -CONFIG_NC=y -# CONFIG_NC_SERVER is not set -# CONFIG_NC_EXTRA is not set -CONFIG_NETSTAT=y -# CONFIG_FEATURE_NETSTAT_WIDE is not set -CONFIG_NSLOOKUP=y -CONFIG_PING=y -CONFIG_PING6=y -# CONFIG_PSCAN is not set -CONFIG_FEATURE_FANCY_PING=y -CONFIG_ROUTE=y -# CONFIG_SLATTACH is not set -CONFIG_TELNET=y -# CONFIG_FEATURE_TELNET_TTYPE is not set -CONFIG_FEATURE_TELNET_AUTOLOGIN=y -# CONFIG_TELNETD is not set -# CONFIG_FEATURE_TELNETD_STANDALONE is not set -CONFIG_TFTP=y -CONFIG_FEATURE_TFTP_GET=y -CONFIG_FEATURE_TFTP_PUT=y -# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set -# CONFIG_DEBUG_TFTP is not set -CONFIG_TRACEROUTE=y -# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set -# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set -# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set -CONFIG_APP_UDHCPD=y -# CONFIG_APP_DHCPRELAY is not set -CONFIG_APP_DUMPLEASES=y -# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set -CONFIG_APP_UDHCPC=y -# CONFIG_FEATURE_UDHCP_DEBUG is not set -# CONFIG_FEATURE_RFC3397 is not set -# CONFIG_VCONFIG is not set -CONFIG_WGET=y -CONFIG_FEATURE_WGET_STATUSBAR=y -CONFIG_FEATURE_WGET_AUTHENTICATION=y -CONFIG_FEATURE_WGET_LONG_OPTIONS=y -# CONFIG_ZCIP is not set - -# -# Process Utilities -# -CONFIG_FREE=y -CONFIG_FUSER=y -CONFIG_KILL=y -CONFIG_KILLALL=y -# CONFIG_KILLALL5 is not set -# CONFIG_NMETER is not set -CONFIG_PIDOF=y -# CONFIG_FEATURE_PIDOF_SINGLE is not set -# CONFIG_FEATURE_PIDOF_OMIT is not set -CONFIG_PS=y -CONFIG_FEATURE_PS_WIDE=y -CONFIG_RENICE=y -CONFIG_BB_SYSCTL=y -CONFIG_TOP=y -CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y -CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y -# CONFIG_FEATURE_TOP_DECIMALS is not set -CONFIG_UPTIME=y -CONFIG_WATCH=y - -# -# Shells -# -CONFIG_FEATURE_SH_IS_ASH=y -# CONFIG_FEATURE_SH_IS_HUSH is not set -# CONFIG_FEATURE_SH_IS_LASH is not set -# CONFIG_FEATURE_SH_IS_MSH is not set -# CONFIG_FEATURE_SH_IS_NONE is not set -CONFIG_ASH=y - -# -# Ash Shell Options -# -CONFIG_ASH_JOB_CONTROL=y -# CONFIG_ASH_READ_NCHARS is not set -# CONFIG_ASH_READ_TIMEOUT is not set -CONFIG_ASH_ALIAS=y -CONFIG_ASH_MATH_SUPPORT=y -# CONFIG_ASH_MATH_SUPPORT_64 is not set -CONFIG_ASH_GETOPTS=y -# CONFIG_ASH_BUILTIN_ECHO is not set -CONFIG_ASH_BUILTIN_TEST=y -# CONFIG_ASH_CMDCMD is not set -# CONFIG_ASH_MAIL is not set -CONFIG_ASH_OPTIMIZE_FOR_SIZE=y -# CONFIG_ASH_RANDOM_SUPPORT is not set -CONFIG_ASH_EXPAND_PRMT=y -# CONFIG_HUSH is not set -# CONFIG_HUSH_HELP is not set -# CONFIG_HUSH_INTERACTIVE is not set -# CONFIG_HUSH_JOB is not set -# CONFIG_HUSH_TICK is not set -# CONFIG_HUSH_IF is not set -# CONFIG_HUSH_LOOPS is not set -# CONFIG_LASH is not set -# CONFIG_MSH is not set - -# -# Bourne Shell Options -# -CONFIG_FEATURE_SH_EXTRA_QUIET=y -# CONFIG_FEATURE_SH_STANDALONE is not set -# CONFIG_CTTYHACK is not set - -# -# System Logging Utilities -# -CONFIG_SYSLOGD=y -CONFIG_FEATURE_ROTATE_LOGFILE=y -CONFIG_FEATURE_REMOTE_LOG=y -CONFIG_FEATURE_IPC_SYSLOG=y -CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 -CONFIG_LOGREAD=y -CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y -CONFIG_KLOGD=y -CONFIG_LOGGER=y - -# -# Runit Utilities -# -# CONFIG_RUNSV is not set -# CONFIG_RUNSVDIR is not set -# CONFIG_SV is not set -# CONFIG_SVLOGD is not set -# CONFIG_CHPST is not set -# CONFIG_SETUIDGID is not set -# CONFIG_ENVUIDGID is not set -# CONFIG_ENVDIR is not set -# CONFIG_SOFTLIMIT is not set -# CONFIG_CHCON is not set -# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set -# CONFIG_GETENFORCE is not set -# CONFIG_GETSEBOOL is not set -# CONFIG_LOAD_POLICY is not set -# CONFIG_MATCHPATHCON is not set -# CONFIG_RESTORECON is not set -# CONFIG_RUNCON is not set -# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set -# CONFIG_SELINUXENABLED is not set -# CONFIG_SETENFORCE is not set -# CONFIG_SETFILES is not set -# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set - -# -# ipsvd utilities -# -# CONFIG_TCPSVD is not set -# CONFIG_UDPSVD is not set diff --git a/packages/busybox/busybox-1.7.2/defconfig b/packages/busybox/busybox-1.7.2/defconfig index 7308eead76..19cfafab2c 100644 --- a/packages/busybox/busybox-1.7.2/defconfig +++ b/packages/busybox/busybox-1.7.2/defconfig @@ -1,7 +1,9 @@ # # Automatically generated make config: don't edit +# Busybox version: 1.7.2 +# Fri Oct 12 19:00:27 2007 # -HAVE_DOT_CONFIG=y +CONFIG_HAVE_DOT_CONFIG=y # # Busybox Settings @@ -11,22 +13,27 @@ HAVE_DOT_CONFIG=y # General Configuration # # CONFIG_NITPICK is not set +# CONFIG_DESKTOP is not set # CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set # CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set # CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set CONFIG_SHOW_USAGE=y # CONFIG_FEATURE_VERBOSE_USAGE is not set -# CONFIG_FEATURE_COMPRESS_USAGE is not set +CONFIG_FEATURE_COMPRESS_USAGE=y # CONFIG_FEATURE_INSTALLER is not set CONFIG_LOCALE_SUPPORT=y CONFIG_GETOPT_LONG=y CONFIG_FEATURE_DEVPTS=y # CONFIG_FEATURE_CLEAN_UP is not set -# CONFIG_FEATURE_SUID is not set -# CONFIG_FEATURE_SUID_CONFIG is not set -# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set +CONFIG_FEATURE_PIDFILE=y +CONFIG_FEATURE_SUID=y +CONFIG_FEATURE_SUID_CONFIG=y +CONFIG_FEATURE_SUID_CONFIG_QUIET=y # CONFIG_SELINUX is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +CONFIG_FEATURE_SYSLOG=y +CONFIG_FEATURE_HAVE_RPC=y # # Build Options @@ -36,19 +43,17 @@ CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" # CONFIG_FEATURE_FULL_LIBBUSYBOX is not set # CONFIG_FEATURE_SHARED_BUSYBOX is not set CONFIG_LFS=y -USING_CROSS_COMPILER=y -CROSS_COMPILER_PREFIX="arm-angstrom-linux-gnueabi-" CONFIG_BUILD_AT_ONCE=y # # Debugging Options # # CONFIG_DEBUG is not set -# CONFIG_DEBUG_PESSIMIZE is not set -# CONFIG_NO_DEBUG_LIB is not set +# CONFIG_WERROR is not set +CONFIG_NO_DEBUG_LIB=y # CONFIG_DMALLOC is not set # CONFIG_EFENCE is not set -CONFIG_DEBUG_YANK_SUSv2=y +# CONFIG_INCLUDE_SUSv2 is not set # # Installation Options @@ -57,12 +62,26 @@ CONFIG_DEBUG_YANK_SUSv2=y CONFIG_INSTALL_APPLET_SYMLINKS=y # CONFIG_INSTALL_APPLET_HARDLINKS is not set # CONFIG_INSTALL_APPLET_DONT is not set -PREFIX="./_install" +CONFIG_PREFIX="./_install" # # Busybox Library Tuning # +CONFIG_PASSWORD_MINLEN=6 CONFIG_MD5_SIZE_VS_SPEED=2 +CONFIG_FEATURE_FAST_TOP=y +# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_FEATURE_EDITING=y +CONFIG_FEATURE_EDITING_MAX_LEN=1024 +# CONFIG_FEATURE_EDITING_FANCY_KEYS is not set +# CONFIG_FEATURE_EDITING_VI is not set +CONFIG_FEATURE_EDITING_HISTORY=15 +CONFIG_FEATURE_EDITING_SAVEHISTORY=y +CONFIG_FEATURE_TAB_COMPLETION=y +CONFIG_FEATURE_USERNAME_COMPLETION=y +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +CONFIG_MONOTONIC_SYSCALL=y +CONFIG_IOCTL_HEX2STR_ERROR=y # # Applets @@ -83,6 +102,7 @@ CONFIG_GUNZIP=y CONFIG_GZIP=y # CONFIG_RPM2CPIO is not set # CONFIG_RPM is not set +# CONFIG_FEATURE_RPM_BZ2 is not set CONFIG_TAR=y CONFIG_FEATURE_TAR_CREATE=y CONFIG_FEATURE_TAR_BZIP2=y @@ -91,6 +111,7 @@ CONFIG_FEATURE_TAR_FROM=y CONFIG_FEATURE_TAR_GZIP=y # CONFIG_FEATURE_TAR_COMPRESS is not set # CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set +# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y # CONFIG_FEATURE_TAR_LONG_OPTIONS is not set # CONFIG_UNCOMPRESS is not set @@ -118,7 +139,6 @@ CONFIG_CHMOD=y CONFIG_CHOWN=y CONFIG_CHROOT=y # CONFIG_CKSUM is not set -# CONFIG_CMP is not set # CONFIG_COMM is not set CONFIG_CP=y CONFIG_CUT=y @@ -128,10 +148,6 @@ CONFIG_DD=y CONFIG_FEATURE_DD_SIGNAL_HANDLING=y # CONFIG_FEATURE_DD_IBS_OBS is not set CONFIG_DF=y -CONFIG_DIFF=y -CONFIG_FEATURE_DIFF_BINARY=y -CONFIG_FEATURE_DIFF_DIR=y -# CONFIG_FEATURE_DIFF_MINIMAL is not set CONFIG_DIRNAME=y # CONFIG_DOS2UNIX is not set # CONFIG_UNIX2DOS is not set @@ -141,6 +157,8 @@ CONFIG_ECHO=y CONFIG_FEATURE_FANCY_ECHO=y CONFIG_ENV=y CONFIG_FEATURE_ENV_LONG_OPTIONS=y +# CONFIG_EXPAND is not set +# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set CONFIG_EXPR=y # CONFIG_EXPR_MATH_SUPPORT_64 is not set CONFIG_FALSE=y @@ -176,6 +194,8 @@ CONFIG_OD=y # CONFIG_PRINTENV is not set CONFIG_PRINTF=y CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y CONFIG_REALPATH=y CONFIG_RM=y CONFIG_RMDIR=y @@ -185,6 +205,8 @@ CONFIG_SLEEP=y CONFIG_FEATURE_FANCY_SLEEP=y CONFIG_SORT=y CONFIG_FEATURE_SORT_BIG=y +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set # CONFIG_STAT is not set # CONFIG_FEATURE_STAT_FORMAT is not set CONFIG_STTY=y @@ -203,12 +225,14 @@ CONFIG_FEATURE_TR_CLASSES=y CONFIG_TRUE=y CONFIG_TTY=y CONFIG_UNAME=y +# CONFIG_UNEXPAND is not set +# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set CONFIG_UNIQ=y CONFIG_USLEEP=y # CONFIG_UUDECODE is not set # CONFIG_UUENCODE is not set -CONFIG_WATCH=y CONFIG_WC=y +# CONFIG_FEATURE_WC_LARGE is not set CONFIG_WHO=y CONFIG_WHOAMI=y CONFIG_YES=y @@ -244,6 +268,8 @@ CONFIG_LOADFONT=y CONFIG_LOADKMAP=y CONFIG_OPENVT=y CONFIG_RESET=y +# CONFIG_RESIZE is not set +# CONFIG_FEATURE_RESIZE_PRINT is not set CONFIG_SETCONSOLE=y # CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set # CONFIG_SETKEYCODES is not set @@ -254,10 +280,9 @@ CONFIG_SETCONSOLE=y # CONFIG_MKTEMP=y # CONFIG_PIPE_PROGRESS is not set -CONFIG_READLINK=y -CONFIG_FEATURE_READLINK_FOLLOW=y CONFIG_RUN_PARTS=y # CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set +# CONFIG_FEATURE_RUN_PARTS_FANCY is not set CONFIG_START_STOP_DAEMON=y CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y @@ -268,10 +293,16 @@ CONFIG_WHICH=y # CONFIG_AWK=y CONFIG_FEATURE_AWK_MATH=y +# CONFIG_CMP is not set +CONFIG_DIFF=y +CONFIG_FEATURE_DIFF_BINARY=y +CONFIG_FEATURE_DIFF_DIR=y +# CONFIG_FEATURE_DIFF_MINIMAL is not set # CONFIG_ED is not set CONFIG_PATCH=y CONFIG_SED=y CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=1024 CONFIG_FEATURE_VI_COLON=y CONFIG_FEATURE_VI_YANKMARK=y CONFIG_FEATURE_VI_SEARCH=y @@ -282,6 +313,7 @@ CONFIG_FEATURE_VI_USE_SIGNALS=y # CONFIG_FEATURE_VI_SET is not set CONFIG_FEATURE_VI_WIN_RESIZE=y CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y +CONFIG_FEATURE_ALLOW_EXEC=y # # Finding Utilities @@ -293,9 +325,21 @@ CONFIG_FEATURE_FIND_MMIN=y CONFIG_FEATURE_FIND_PERM=y CONFIG_FEATURE_FIND_TYPE=y CONFIG_FEATURE_FIND_XDEV=y +CONFIG_FEATURE_FIND_MAXDEPTH=y CONFIG_FEATURE_FIND_NEWER=y # CONFIG_FEATURE_FIND_INUM is not set CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_USER=y +CONFIG_FEATURE_FIND_GROUP=y +CONFIG_FEATURE_FIND_NOT=y +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_FEATURE_FIND_DELETE is not set +CONFIG_FEATURE_FIND_PATH=y +CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_FEATURE_FIND_CONTEXT is not set CONFIG_GREP=y CONFIG_FEATURE_GREP_EGREP_ALIAS=y CONFIG_FEATURE_GREP_FGREP_ALIAS=y @@ -313,6 +357,7 @@ CONFIG_XARGS=y # CONFIG_DEBUG_INIT is not set # CONFIG_FEATURE_USE_INITTAB is not set # CONFIG_FEATURE_INIT_SCTTY is not set +# CONFIG_FEATURE_INIT_SYSLOG is not set # CONFIG_FEATURE_EXTRA_QUIET is not set # CONFIG_FEATURE_INIT_COREDUMPS is not set # CONFIG_FEATURE_INITRD is not set @@ -326,16 +371,26 @@ CONFIG_XARGS=y # CONFIG_USE_BB_SHADOW is not set # CONFIG_USE_BB_PWD_GRP is not set # CONFIG_ADDGROUP is not set +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set # CONFIG_DELGROUP is not set +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set # CONFIG_ADDUSER is not set # CONFIG_DELUSER is not set # CONFIG_GETTY is not set CONFIG_FEATURE_UTMP=y # CONFIG_FEATURE_WTMP is not set # CONFIG_LOGIN is not set +# CONFIG_PAM is not set +# CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_FEATURE_NOLOGIN is not set # CONFIG_FEATURE_SECURETTY is not set # CONFIG_PASSWD is not set +# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set +# CONFIG_CRYPTPW is not set +# CONFIG_CHPASSWD is not set # CONFIG_SU is not set +# CONFIG_FEATURE_SU_SYSLOG is not set +# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set # CONFIG_SULOGIN is not set # CONFIG_VLOCK is not set @@ -343,13 +398,8 @@ CONFIG_FEATURE_UTMP=y # Linux Ext2 FS Progs # CONFIG_CHATTR=y -CONFIG_E2FSCK=y CONFIG_FSCK=y # CONFIG_LSATTR is not set -CONFIG_MKE2FS=y -# CONFIG_TUNE2FS is not set -# CONFIG_E2LABEL is not set -# CONFIG_FINDFS is not set # # Linux Module Utilities @@ -365,6 +415,7 @@ CONFIG_LSMOD=y # CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set CONFIG_MODPROBE=y CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS=y +CONFIG_FEATURE_MODPROBE_FANCY_ALIAS=y # # Options common to multiple modutils @@ -378,13 +429,14 @@ CONFIG_FEATURE_2_6_MODULES=y # Linux System Utilities # CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y CONFIG_FBSET=y CONFIG_FEATURE_FBSET_FANCY=y CONFIG_FEATURE_FBSET_READMODE=y # CONFIG_FDFLUSH is not set # CONFIG_FDFORMAT is not set CONFIG_FDISK=y -FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FDISK_SUPPORT_LARGE_DISKS=y CONFIG_FEATURE_FDISK_WRITABLE=y # CONFIG_FEATURE_AIX_LABEL is not set # CONFIG_FEATURE_SGI_LABEL is not set @@ -410,18 +462,22 @@ CONFIG_LOSETUP=y # CONFIG_MDEV is not set # CONFIG_FEATURE_MDEV_CONF is not set # CONFIG_FEATURE_MDEV_EXEC is not set +# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set CONFIG_MKSWAP=y # CONFIG_FEATURE_MKSWAP_V0 is not set CONFIG_MORE=y CONFIG_FEATURE_USE_TERMIOS=y CONFIG_MOUNT=y CONFIG_FEATURE_MOUNT_NFS=y +# CONFIG_FEATURE_MOUNT_CIFS is not set +CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_FEATURE_MOUNT_FSTAB=y CONFIG_PIVOT_ROOT=y CONFIG_RDATE=y # CONFIG_READPROFILE is not set # CONFIG_SETARCH is not set CONFIG_SWAPONOFF=y -# CONFIG_SWITCH_ROOT is not set +CONFIG_SWITCH_ROOT=y CONFIG_UMOUNT=y # CONFIG_FEATURE_UMOUNT_ALL is not set @@ -436,6 +492,7 @@ CONFIG_FEATURE_MOUNT_LOOP=y # # CONFIG_ADJTIMEX is not set # CONFIG_BBCONFIG is not set +# CONFIG_CHRT is not set # CONFIG_CROND is not set # CONFIG_DEBUG_CROND_OPTION is not set # CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set @@ -449,6 +506,7 @@ CONFIG_DC=y # CONFIG_EJECT is not set # CONFIG_LAST is not set CONFIG_LESS=y +CONFIG_FEATURE_LESS_MAXLINES=9999999 CONFIG_FEATURE_LESS_BRACKETS=y CONFIG_FEATURE_LESS_FLAGS=y # CONFIG_FEATURE_LESS_FLAGCS is not set @@ -466,18 +524,24 @@ CONFIG_FEATURE_LESS_FLAGS=y # CONFIG_FEATURE_MAKEDEVS_TABLE is not set # CONFIG_MOUNTPOINT is not set # CONFIG_MT is not set +# CONFIG_RAIDAUTORUN is not set +# CONFIG_READAHEAD is not set # CONFIG_RUNLEVEL is not set # CONFIG_RX is not set CONFIG_STRINGS=y # CONFIG_SETSID is not set # CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set CONFIG_TIME=y +# CONFIG_TTYSIZE is not set # CONFIG_WATCHDOG is not set # # Networking Utilities # CONFIG_FEATURE_IPV6=y +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_ARP is not set # CONFIG_ARPING is not set # CONFIG_DNSD is not set # CONFIG_ETHER_WAKE is not set @@ -487,7 +551,7 @@ CONFIG_FEATURE_IPV6=y # CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set CONFIG_HOSTNAME=y # CONFIG_HTTPD is not set -# CONFIG_FEATURE_HTTPD_WITHOUT_INETD is not set +# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set # CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP is not set # CONFIG_FEATURE_HTTPD_SETUID is not set # CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set @@ -497,6 +561,7 @@ CONFIG_HOSTNAME=y # CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set # CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set # CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set CONFIG_IFCONFIG=y CONFIG_FEATURE_IFCONFIG_STATUS=y # CONFIG_FEATURE_IFCONFIG_SLIP is not set @@ -504,12 +569,14 @@ CONFIG_FEATURE_IFCONFIG_STATUS=y CONFIG_FEATURE_IFCONFIG_HW=y # CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set CONFIG_IFUPDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" # CONFIG_FEATURE_IFUPDOWN_IP is not set -CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y +# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set +CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN=y CONFIG_FEATURE_IFUPDOWN_IPV4=y CONFIG_FEATURE_IFUPDOWN_IPV6=y -# CONFIG_FEATURE_IFUPDOWN_IPX is not set CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set # CONFIG_INETD is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set # CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set @@ -522,29 +589,34 @@ CONFIG_FEATURE_IP_ADDRESS=y CONFIG_FEATURE_IP_LINK=y CONFIG_FEATURE_IP_ROUTE=y CONFIG_FEATURE_IP_TUNNEL=y +# CONFIG_FEATURE_IP_RULE is not set # CONFIG_FEATURE_IP_SHORT_FORMS is not set # CONFIG_IPADDR is not set # CONFIG_IPLINK is not set # CONFIG_IPROUTE is not set # CONFIG_IPTUNNEL is not set +# CONFIG_IPRULE is not set # CONFIG_IPCALC is not set # CONFIG_FEATURE_IPCALC_FANCY is not set # CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set # CONFIG_NAMEIF is not set CONFIG_NC=y -# CONFIG_NC_GAPING_SECURITY_HOLE is not set +# CONFIG_NC_SERVER is not set +# CONFIG_NC_EXTRA is not set CONFIG_NETSTAT=y +# CONFIG_FEATURE_NETSTAT_WIDE is not set CONFIG_NSLOOKUP=y CONFIG_PING=y -CONFIG_FEATURE_FANCY_PING=y CONFIG_PING6=y -CONFIG_FEATURE_FANCY_PING6=y +# CONFIG_PSCAN is not set +CONFIG_FEATURE_FANCY_PING=y CONFIG_ROUTE=y +# CONFIG_SLATTACH is not set CONFIG_TELNET=y # CONFIG_FEATURE_TELNET_TTYPE is not set CONFIG_FEATURE_TELNET_AUTOLOGIN=y # CONFIG_TELNETD is not set -# CONFIG_FEATURE_TELNETD_INETD is not set +# CONFIG_FEATURE_TELNETD_STANDALONE is not set CONFIG_TFTP=y CONFIG_FEATURE_TFTP_GET=y CONFIG_FEATURE_TFTP_PUT=y @@ -554,20 +626,17 @@ CONFIG_TRACEROUTE=y # CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set # CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set # CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set - -# -# udhcp Server/Client -# CONFIG_APP_UDHCPD=y -CONFIG_APP_UDHCPC=y +# CONFIG_APP_DHCPRELAY is not set CONFIG_APP_DUMPLEASES=y -CONFIG_FEATURE_UDHCP_SYSLOG=y +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_APP_UDHCPC=y # CONFIG_FEATURE_UDHCP_DEBUG is not set +# CONFIG_FEATURE_RFC3397 is not set # CONFIG_VCONFIG is not set CONFIG_WGET=y CONFIG_FEATURE_WGET_STATUSBAR=y CONFIG_FEATURE_WGET_AUTHENTICATION=y -CONFIG_FEATURE_WGET_IP6_LITERAL=y CONFIG_FEATURE_WGET_LONG_OPTIONS=y # CONFIG_ZCIP is not set @@ -578,6 +647,8 @@ CONFIG_FREE=y CONFIG_FUSER=y CONFIG_KILL=y CONFIG_KILLALL=y +# CONFIG_KILLALL5 is not set +# CONFIG_NMETER is not set CONFIG_PIDOF=y # CONFIG_FEATURE_PIDOF_SINGLE is not set # CONFIG_FEATURE_PIDOF_OMIT is not set @@ -587,7 +658,10 @@ CONFIG_RENICE=y CONFIG_BB_SYSCTL=y CONFIG_TOP=y CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_FEATURE_TOP_DECIMALS is not set CONFIG_UPTIME=y +CONFIG_WATCH=y # # Shells @@ -617,6 +691,12 @@ CONFIG_ASH_OPTIMIZE_FOR_SIZE=y # CONFIG_ASH_RANDOM_SUPPORT is not set CONFIG_ASH_EXPAND_PRMT=y # CONFIG_HUSH is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set # CONFIG_LASH is not set # CONFIG_MSH is not set @@ -624,14 +704,8 @@ CONFIG_ASH_EXPAND_PRMT=y # Bourne Shell Options # CONFIG_FEATURE_SH_EXTRA_QUIET=y -# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set -CONFIG_FEATURE_COMMAND_EDITING=y -# CONFIG_FEATURE_COMMAND_EDITING_VI is not set -CONFIG_FEATURE_COMMAND_HISTORY=63 -# CONFIG_FEATURE_COMMAND_SAVEHISTORY is not set -CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y -# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set -CONFIG_FEATURE_SH_FANCY_PROMPT=y +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_CTTYHACK is not set # # System Logging Utilities @@ -645,3 +719,35 @@ CONFIG_LOGREAD=y CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y CONFIG_KLOGD=y CONFIG_LOGGER=y + +# +# Runit Utilities +# +# CONFIG_RUNSV is not set +# CONFIG_RUNSVDIR is not set +# CONFIG_SV is not set +# CONFIG_SVLOGD is not set +# CONFIG_CHPST is not set +# CONFIG_SETUIDGID is not set +# CONFIG_ENVUIDGID is not set +# CONFIG_ENVDIR is not set +# CONFIG_SOFTLIMIT is not set +# CONFIG_CHCON is not set +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RESTORECON is not set +# CONFIG_RUNCON is not set +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set + +# +# ipsvd utilities +# +# CONFIG_TCPSVD is not set +# CONFIG_UDPSVD is not set diff --git a/packages/busybox/busybox_1.7.2.bb b/packages/busybox/busybox_1.7.2.bb index 80a5aa2da6..924176ef5a 100644 --- a/packages/busybox/busybox_1.7.2.bb +++ b/packages/busybox/busybox_1.7.2.bb @@ -1,6 +1,6 @@ require busybox.inc -PR = "r2" +PR = "r3" DEFAULT_PREFERENCE = "-1" diff --git a/packages/cairo/cairo.inc b/packages/cairo/cairo.inc index e405257dfb..3123fe6632 100644 --- a/packages/cairo/cairo.inc +++ b/packages/cairo/cairo.inc @@ -1,6 +1,6 @@ SECTION = "libs" PRIORITY = "optional" -DEPENDS = "virtual/libx11 libsm libpng fontconfig libxrender" +DEPENDS = "virtual/libx11 pixman libsm libpng fontconfig libxrender" DESCRIPTION = "Cairo graphics library" LICENSE = "MPL LGPL" diff --git a/packages/cairo/cairo_1.5.2.bb b/packages/cairo/cairo_1.5.2.bb new file mode 100644 index 0000000000..263dd79ad7 --- /dev/null +++ b/packages/cairo/cairo_1.5.2.bb @@ -0,0 +1,8 @@ +require cairo.inc + +DEFAULT_PREFERENCE = "-1" + +SRC_URI = "http://cairographics.org/releases/cairo-${PV}.tar.gz" + +PR = "r0" + diff --git a/packages/cairo/cairo_git.bb b/packages/cairo/cairo_git.bb index 6c527988a9..44212103a6 100644 --- a/packages/cairo/cairo_git.bb +++ b/packages/cairo/cairo_git.bb @@ -7,7 +7,7 @@ DEPENDS = "pixman virtual/libx11 libsm libpng fontconfig libxrender" DESCRIPTION = "Cairo graphics library" LICENSE = "MPL LGPL" -PV = "1.5.1+git${SRCDATE}" +PV = "1.5.3+git${SRCDATE}" SRC_URI = "git://git.cairographics.org/git/cairo;protocol=git \ " diff --git a/packages/crimsonfields/crimsonfields_0.4.8.bb b/packages/crimsonfields/crimsonfields_0.4.8.bb index 6c36c1fca6..6e84c46570 100644 --- a/packages/crimsonfields/crimsonfields_0.4.8.bb +++ b/packages/crimsonfields/crimsonfields_0.4.8.bb @@ -17,9 +17,9 @@ do_configure() { oe_runconf for binary in ${HOST_TOOLS} do - install -m 0755 ${STAGING_DIR}/${BUILD_SYS}/bin/$binary tools/ + install -m 0755 ${STAGING_BINDIR_NATIVE}/$binary tools/ done - install -m 0644 ${STAGING_DIR}/${BUILD_SYS}/share/default.* tools/ + install -m 0644 ${STAGING_DATADIR_NATIVE}/default.* tools/ } do_install() { diff --git a/packages/dbus/dbus-c++-native_svn.bb b/packages/dbus/dbus-c++-native_svn.bb index 96eb2f3227..5599aeb1d2 100644 --- a/packages/dbus/dbus-c++-native_svn.bb +++ b/packages/dbus/dbus-c++-native_svn.bb @@ -4,3 +4,18 @@ inherit native FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/dbus-c++" # actually dbus-native and expat-native, but even the bearest build machine should have that nowadays... DEPENDS = "" + +do_compile() { + oe_runmake -C src libdbus-c++-1.la + oe_runmake -C tools dbusxx-xml2cpp + install -m 0755 tools/dbusxx-xml2cpp ${STAGING_BINDIR_NATIVE} +} + +do_stage() { + autotools_stage_all +} + +do_install() { + : +} + diff --git a/packages/dbus/dbus-c++_svn.bb b/packages/dbus/dbus-c++_svn.bb index ea6c0fa8ea..5be58741dc 100644 --- a/packages/dbus/dbus-c++_svn.bb +++ b/packages/dbus/dbus-c++_svn.bb @@ -3,8 +3,8 @@ LICENSE = "LGPL" SECTION = "libs" DEPENDS = "dbus dbus-c++-native expat" -SRC_URI = "svn://dev.openwengo.org/svn/openwengo/wengophone-ng/branches/wengophone-dbus-api/libs;module=dbus;proto=http \ - file://fix-linking.patch;patch=1" +SRC_URI = "svn://dev.openwengo.org/svn/openwengo/wengophone-ng/branches/wengophone-dbus-api/libs;module=dbus;proto=http" +# file://fix-linking.patch;patch=1" S = "${WORKDIR}/dbus" inherit autotools pkgconfig @@ -13,10 +13,6 @@ do_compile_prepend() { find . -name "Makefile.am" |xargs sed -i -e 's,$(top_builddir)/tools/dbusxx-xml2cpp,dbusxx-xml2cpp,' } -do_stage() { - autotools_stage_all -} - FILES_${PN}-dbg += "${bindir}/dbusxx-xml2cpp ${bindir}/dbusxx-introspect" FILES_${PN}-dev += "${bindir}/.dev" FILES_${PN} = "${libdir}/*.so.*" diff --git a/packages/dbus/dbus-glib_0.74.bb b/packages/dbus/dbus-glib_0.74.bb index 3754abb708..0a34c738c3 100644 --- a/packages/dbus/dbus-glib_0.74.bb +++ b/packages/dbus/dbus-glib_0.74.bb @@ -15,8 +15,8 @@ FILES_${PN} = "${libdir}/lib*.so.*" FILES_${PN}-dev += "${libdir}/dbus-1.0/include ${bindir}/dbus-glib-tool" do_configure_prepend() { - install -m 0644 ${STAGING_DIR}/${BUILD_SYS}/share/dbus/dbus-bus-introspect.xml ${S}/tools/ - install -m 0644 ${STAGING_DIR}/${BUILD_SYS}/share/dbus/dbus-glib-bindings.h ${S}/tools/ + install -m 0644 ${STAGING_DATADIR_NATIVE}/dbus/dbus-bus-introspect.xml ${S}/tools/ + install -m 0644 ${STAGING_DATADIR_NATIVE}/dbus/dbus-glib-bindings.h ${S}/tools/ } do_stage () { diff --git a/packages/eds/eds-dbus_svn.bb b/packages/eds/eds-dbus_svn.bb index 46d3a4c450..e076e44aee 100644 --- a/packages/eds/eds-dbus_svn.bb +++ b/packages/eds/eds-dbus_svn.bb @@ -3,7 +3,7 @@ HOMEPAGE = "http://projects.o-hand.com/eds" LICENSE = "LGPL" DEPENDS = "intltool-native libglade glib-2.0 gtk+ gconf dbus db gnome-common virtual/libiconv zlib intltool" -PV = "1.4.0+svn${SRCDATE}" +PV = "1.4.0+svnr${SRCREV}" PR = "r6" SRC_URI = "svn://svn.o-hand.com/repos/${PN};module=trunk;proto=http \ diff --git a/packages/eventlog/eventlog_0.2.5.bb b/packages/eventlog/eventlog_0.2.5.bb index 910e70164d..50d7d70e93 100644 --- a/packages/eventlog/eventlog_0.2.5.bb +++ b/packages/eventlog/eventlog_0.2.5.bb @@ -1,8 +1,11 @@ DESCRIPTION = "Replacement syslog API" LICENSE = "BSD" -PR = "r0" +PR = "r1" -SRC_URI = "http://www.balabit.com/downloads/syslog-ng/2.0/src/${P}.tar.gz" +SRC_URI = "http://www.balabit.com/downloads/files/eventlog/0.2/${P}.tar.gz" -inherit autotools +inherit autotools pkgconfig +do_stage () { + autotools_stage_all +} diff --git a/packages/ezx/ezxd_svn.bb b/packages/ezx/ezxd_svn.bb index 5493ad2fe8..ab1010c48e 100644 --- a/packages/ezx/ezxd_svn.bb +++ b/packages/ezx/ezxd_svn.bb @@ -4,7 +4,7 @@ SECTION = "devel" AUTHOR = "Daniel Ribeiro" PV = "0.0+svnr${SRCREV}" -PR = "r2" +PR = "r4" SRC_URI = "svn://svn.openezx.org/trunk/src/userspace/;module=ezxd;proto=http \ file://ezxd.init \ @@ -17,6 +17,8 @@ INITSCRIPT_PARAMS = "start 00 S ." S = "${WORKDIR}/${PN}" +CFLAGS_append = " -DDEBUG " + do_configure() { sed -i -e s:CROSS:CC:g Makefile } @@ -37,4 +39,5 @@ fakeroot do_install() { } FILES_${PN} += "/dev" +CONFFILES_${PN} += "${sysconfdir}/ezxd.conf" diff --git a/packages/fakeroot/fakeroot-1.8.3/.mtn2git_empty b/packages/fakeroot/fakeroot-1.8.3/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/fakeroot/fakeroot-1.8.3/.mtn2git_empty diff --git a/packages/fakeroot/fakeroot-1.8.3/configure-libtool.patch b/packages/fakeroot/fakeroot-1.8.3/configure-libtool.patch new file mode 100644 index 0000000000..8830328eb5 --- /dev/null +++ b/packages/fakeroot/fakeroot-1.8.3/configure-libtool.patch @@ -0,0 +1,18 @@ +--- fakeroot-1.8.3/configure.ac.orig 2007-10-31 00:17:27.000000000 -0500 ++++ fakeroot-1.8.3/configure.ac 2007-10-31 00:18:12.000000000 -0500 +@@ -1,14 +1,12 @@ + dnl Process this file with autoconf to produce a configure script. + AC_INIT([fakeroot],[FAKEROOT_VERSION],[schizo@debian.org],[fakeroot]) + AC_PREREQ(2.61) +-LT_PREREQ(2.1a) + AC_CANONICAL_TARGET + AM_INIT_AUTOMAKE + AM_MAINTAINER_MODE + AC_CONFIG_HEADERS([config.h]) + AC_PROG_MAKE_SET +-LT_INIT +-LT_LANG(C) ++AC_PROG_LIBTOOL + + AC_ARG_WITH([ipc], + AS_HELP_STRING([--with-ipc@<:@=IPCTYPE@:>@], diff --git a/packages/fakeroot/fakeroot-native-1.8.3/.mtn2git_empty b/packages/fakeroot/fakeroot-native-1.8.3/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/fakeroot/fakeroot-native-1.8.3/.mtn2git_empty diff --git a/packages/fakeroot/fakeroot-native-1.8.3/configure-libtool.patch b/packages/fakeroot/fakeroot-native-1.8.3/configure-libtool.patch new file mode 100644 index 0000000000..8830328eb5 --- /dev/null +++ b/packages/fakeroot/fakeroot-native-1.8.3/configure-libtool.patch @@ -0,0 +1,18 @@ +--- fakeroot-1.8.3/configure.ac.orig 2007-10-31 00:17:27.000000000 -0500 ++++ fakeroot-1.8.3/configure.ac 2007-10-31 00:18:12.000000000 -0500 +@@ -1,14 +1,12 @@ + dnl Process this file with autoconf to produce a configure script. + AC_INIT([fakeroot],[FAKEROOT_VERSION],[schizo@debian.org],[fakeroot]) + AC_PREREQ(2.61) +-LT_PREREQ(2.1a) + AC_CANONICAL_TARGET + AM_INIT_AUTOMAKE + AM_MAINTAINER_MODE + AC_CONFIG_HEADERS([config.h]) + AC_PROG_MAKE_SET +-LT_INIT +-LT_LANG(C) ++AC_PROG_LIBTOOL + + AC_ARG_WITH([ipc], + AS_HELP_STRING([--with-ipc@<:@=IPCTYPE@:>@], diff --git a/packages/fakeroot/fakeroot-native_1.8.3.bb b/packages/fakeroot/fakeroot-native_1.8.3.bb new file mode 100644 index 0000000000..8b3d2a1590 --- /dev/null +++ b/packages/fakeroot/fakeroot-native_1.8.3.bb @@ -0,0 +1,20 @@ +SECTION = "base" +require fakeroot_${PV}.bb +inherit native +RDEPENDS="util-linux-native" + +SRC_URI += "file://fix-prefix.patch;patch=1 " +S = "${WORKDIR}/fakeroot-${PV}" + +EXTRA_OECONF = " --program-prefix=" + +# Compatability for the rare systems not using or having SYSV +python () { + if bb.data.getVar('HOST_NONSYSV', d, True) and bb.data.getVar('HOST_NONSYSV', d, True) != '0': + bb.data.setVar('EXTRA_OECONF', ' --with-ipc=tcp --program-prefix= ', d) +} + +do_stage_append () { + oe_libinstall -so libfakeroot ${STAGING_LIBDIR}/libfakeroot/ +} + diff --git a/packages/fakeroot/fakeroot_1.8.3.bb b/packages/fakeroot/fakeroot_1.8.3.bb new file mode 100644 index 0000000000..ef4d1ba55c --- /dev/null +++ b/packages/fakeroot/fakeroot_1.8.3.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "Gives a fake root environment" +SECTION = "base" +LICENSE = "GPL" +# fakeroot needs getopt which is provided by the util-linux package +RDEPENDS = "util-linux" +PR = "r1" + +SRC_URI = "ftp://ftp.debian.org/debian/pool/main/f/fakeroot/fakeroot_${PV}.tar.gz \ + file://configure-libtool.patch;patch=1" + +inherit autotools + +do_stage() { + install -d ${STAGING_INCDIR}/fakeroot + install -m 644 *.h ${STAGING_INCDIR}/fakeroot + autotools_stage_all +} diff --git a/packages/fontconfig/fontconfig_2.4.1.bb b/packages/fontconfig/fontconfig_2.4.1.bb index cdfc28fb38..38eeb960f7 100644 --- a/packages/fontconfig/fontconfig_2.4.1.bb +++ b/packages/fontconfig/fontconfig_2.4.1.bb @@ -45,7 +45,7 @@ do_stage () { for i in ${S}/fontconfig/*.h; do install -m 0644 $i ${STAGING_INCDIR}/fontconfig/; done } -BUILD_CFLAGS += " -I${STAGING_DIR}/${BUILD_SYS}/include/freetype2" +BUILD_CFLAGS += " -I${STAGING_INCDIR_NATIVE}/freetype2" do_configure_append () { sed -i 's|LDFLAGS =.*|LDFLAGS =|' fc-case/Makefile diff --git a/packages/frodo/frodo_4.2.bb b/packages/frodo/frodo_4.2.bb index b3a4463451..6535b5e2bb 100644 --- a/packages/frodo/frodo_4.2.bb +++ b/packages/frodo/frodo_4.2.bb @@ -17,7 +17,7 @@ S = "${WORKDIR}/Frodo4/Src" inherit autotools -EXTRA_OECONF = "--disable-sdltest --enable-qtopia --with-sdl-exec-prefix=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF = "--disable-sdltest --enable-qtopia --with-sdl-exec-prefix=${STAGING_DIR_NATIVE}${layout_exec_prefix}" do_install() { install -d ${D}${palmtopdir}/bin \ diff --git a/packages/gcc/gcc-4.1.1/gcc-4.1.1-e300cx.patch b/packages/gcc/gcc-4.1.1/gcc-4.1.1-e300cx.patch new file mode 100644 index 0000000000..f94f7d5cb4 --- /dev/null +++ b/packages/gcc/gcc-4.1.1/gcc-4.1.1-e300cx.patch @@ -0,0 +1,301 @@ +diff -uNr gcc-4.1.1-orig/gcc/config/rs6000/e300c2c3.md gcc-4.1.1/gcc/config/rs6000/e300c2c3.md +--- gcc-4.1.1-orig/gcc/config/rs6000/e300c2c3.md 1970-01-01 02:00:00.000000000 +0200 ++++ gcc-4.1.1/gcc/config/rs6000/e300c2c3.md 2007-10-31 23:56:39.000000000 +0200 +@@ -0,0 +1,189 @@ ++;; Pipeline description for Motorola PowerPC e300c3 core. ++;; Copyright (C) 2003 Free Software Foundation, Inc. ++;; ++;; This file is part of GCC. ++ ++;; GCC is free software; you can redistribute it and/or modify it ++;; under the terms of the GNU General Public License as published ++;; by the Free Software Foundation; either version 2, or (at your ++;; option) any later version. ++ ++;; GCC is distributed in the hope that it will be useful, but WITHOUT ++;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ++;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public ++;; License for more details. ++ ++;; You should have received a copy of the GNU General Public License ++;; along with GCC; see the file COPYING. If not, write to the ++;; Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++;; MA 02111-1307, USA. ++ ++(define_automaton "ppce300c3_most,ppce300c3_long,ppce300c3_retire") ++(define_cpu_unit "ppce300c3_decode_0,ppce300c3_decode_1" "ppce300c3_most") ++ ++;; We don't simulate general issue queue (GIC). If we have SU insn ++;; and then SU1 insn, they can not be issued on the same cycle ++;; (although SU1 insn and then SU insn can be issued) because the SU ++;; insn will go to SU1 from GIC0 entry. Fortunately, the first cycle ++;; multipass insn scheduling will find the situation and issue the SU1 ++;; insn and then the SU insn. ++(define_cpu_unit "ppce300c3_issue_0,ppce300c3_issue_1" "ppce300c3_most") ++ ++;; We could describe completion buffers slots in combination with the ++;; retirement units and the order of completion but the result ++;; automaton would behave in the same way because we can not describe ++;; real latency time with taking in order completion into account. ++;; Actually we could define the real latency time by querying reserved ++;; automaton units but the current scheduler uses latency time before ++;; issuing insns and making any reservations. ++;; ++;; So our description is aimed to achieve a insn schedule in which the ++;; insns would not wait in the completion buffer. ++(define_cpu_unit "ppce300c3_retire_0,ppce300c3_retire_1" "ppce300c3_retire") ++ ++;; Branch unit: ++(define_cpu_unit "ppce300c3_bu" "ppce300c3_most") ++ ++;; IU: ++(define_cpu_unit "ppce300c3_iu0_stage0,ppce300c3_iu1_stage0" "ppce300c3_most") ++ ++;; IU: This used to describe non-pipelined division. ++(define_cpu_unit "ppce300c3_mu_div" "ppce300c3_long") ++ ++;; SRU: ++(define_cpu_unit "ppce300c3_sru_stage0" "ppce300c3_most") ++ ++;; Here we simplified LSU unit description not describing the stages. ++(define_cpu_unit "ppce300c3_lsu" "ppce300c3_most") ++ ++;; FPU: ++(define_cpu_unit "ppce300c3_fpu" "ppce300c3_most") ++ ++;; The following units are used to make automata deterministic ++(define_cpu_unit "present_ppce300c3_decode_0" "ppce300c3_most") ++(define_cpu_unit "present_ppce300c3_issue_0" "ppce300c3_most") ++(define_cpu_unit "present_ppce300c3_retire_0" "ppce300c3_retire") ++(define_cpu_unit "present_ppce300c3_iu0_stage0" "ppce300c3_most") ++ ++;; The following sets to make automata deterministic when option ndfa is used. ++(presence_set "present_ppce300c3_decode_0" "ppce300c3_decode_0") ++(presence_set "present_ppce300c3_issue_0" "ppce300c3_issue_0") ++(presence_set "present_ppce300c3_retire_0" "ppce300c3_retire_0") ++(presence_set "present_ppce300c3_iu0_stage0" "ppce300c3_iu0_stage0") ++ ++;; Some useful abbreviations. ++(define_reservation "ppce300c3_decode" ++ "ppce300c3_decode_0|ppce300c3_decode_1+present_ppce300c3_decode_0") ++(define_reservation "ppce300c3_issue" ++ "ppce300c3_issue_0|ppce300c3_issue_1+present_ppce300c3_issue_0") ++(define_reservation "ppce300c3_retire" ++ "ppce300c3_retire_0|ppce300c3_retire_1+present_ppce300c3_retire_0") ++(define_reservation "ppce300c3_iu_stage0" ++ "ppce300c3_iu0_stage0|ppce300c3_iu1_stage0+present_ppce300c3_iu0_stage0") ++ ++;; Compares can be executed either one of the IU or SRU ++(define_insn_reservation "ppce300c3_cmp" 1 ++ (and (eq_attr "type" "cmp,compare,delayed_compare,fast_compare") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+(ppce300c3_iu_stage0|ppce300c3_sru_stage0) \ ++ +ppce300c3_retire") ++ ++;; Other one cycle IU insns ++(define_insn_reservation "ppce300c3_iu" 1 ++ (and (eq_attr "type" "integer,insert_word") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_iu_stage0+ppce300c3_retire") ++ ++;; Branch. Actually this latency time is not used by the scheduler. ++(define_insn_reservation "ppce300c3_branch" 1 ++ (and (eq_attr "type" "jmpreg,branch") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_bu,ppce300c3_retire") ++ ++;; Multiply is non-pipelined but can be executed in any IU ++(define_insn_reservation "ppce300c3_multiply" 2 ++ (and (eq_attr "type" "imul,imul2,imul3,imul_compare") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_iu_stage0, \ ++ ppce300c3_iu_stage0+ppce300c3_retire") ++ ++;; Divide. We use the average latency time here. We omit reserving a ++;; retire unit because of the result automata will be huge. ++(define_insn_reservation "ppce300c3_divide" 20 ++ (and (eq_attr "type" "idiv") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_iu_stage0+ppce300c3_mu_div,\ ++ ppce300c3_mu_div*19") ++ ++;; CR logical ++(define_insn_reservation "ppce300c3_cr_logical" 1 ++ (and (eq_attr "type" "cr_logical,delayed_cr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Mfcr ++(define_insn_reservation "ppce300c3_mfcr" 1 ++ (and (eq_attr "type" "mfcr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Mtcrf ++(define_insn_reservation "ppce300c3_mtcrf" 1 ++ (and (eq_attr "type" "mtcr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Mtjmpr ++(define_insn_reservation "ppce300c3_mtjmpr" 1 ++ (and (eq_attr "type" "mtjmpr,mfjmpr") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_sru_stage0+ppce300c3_retire") ++ ++;; Float point instructions ++(define_insn_reservation "ppce300c3_fpcompare" 3 ++ (and (eq_attr "type" "fpcompare") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,nothing,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_fp" 3 ++ (and (eq_attr "type" "fp") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,nothing,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_dmul" 4 ++ (and (eq_attr "type" "dmul") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,ppce300c3_fpu,nothing,ppce300c3_retire") ++ ++; Divides are not pipelined ++(define_insn_reservation "ppce300c3_sdiv" 18 ++ (and (eq_attr "type" "sdiv") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,ppce300c3_fpu*17") ++ ++(define_insn_reservation "ppce300c3_ddiv" 33 ++ (and (eq_attr "type" "ddiv") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_fpu,ppce300c3_fpu*32") ++ ++;; Loads ++(define_insn_reservation "ppce300c3_load" 2 ++ (and (eq_attr "type" "load,load_ext,load_ext_u,load_ext_ux,load_ux,load_u") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_fpload" 2 ++ (and (eq_attr "type" "fpload,fpload_ux,fpload_u") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") ++ ++;; Stores. ++(define_insn_reservation "ppce300c3_store" 2 ++ (and (eq_attr "type" "store,store_ux,store_u") ++ (ior (eq_attr "cpu" "ppce300c2") (eq_attr "cpu" "ppce300c3"))) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") ++ ++(define_insn_reservation "ppce300c3_fpstore" 2 ++ (and (eq_attr "type" "fpstore,fpstore_ux,fpstore_u") ++ (eq_attr "cpu" "ppce300c3")) ++ "ppce300c3_decode,ppce300c3_issue+ppce300c3_lsu,ppce300c3_retire") +diff -uNr gcc-4.1.1-orig/gcc/config/rs6000/rs6000.c gcc-4.1.1/gcc/config/rs6000/rs6000.c +--- gcc-4.1.1-orig/gcc/config/rs6000/rs6000.c 2006-04-13 08:46:01.000000000 +0300 ++++ gcc-4.1.1/gcc/config/rs6000/rs6000.c 2007-10-31 23:58:24.000000000 +0200 +@@ -557,6 +557,21 @@ + COSTS_N_INSNS (29), /* ddiv */ + }; + ++/* Instruction costs on E300C2 and E300C3 cores. */ ++static const ++struct processor_costs ppce300c2c3_cost = { ++ COSTS_N_INSNS (4), /* mulsi */ ++ COSTS_N_INSNS (4), /* mulsi_const */ ++ COSTS_N_INSNS (4), /* mulsi_const9 */ ++ COSTS_N_INSNS (4), /* muldi */ ++ COSTS_N_INSNS (19), /* divsi */ ++ COSTS_N_INSNS (19), /* divdi */ ++ COSTS_N_INSNS (3), /* fp */ ++ COSTS_N_INSNS (4), /* dmul */ ++ COSTS_N_INSNS (18), /* sdiv */ ++ COSTS_N_INSNS (33), /* ddiv */ ++}; ++ + /* Instruction costs on POWER4 and POWER5 processors. */ + static const + struct processor_costs power4_cost = { +@@ -1138,6 +1153,8 @@ + {"8540", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, + /* 8548 has a dummy entry for now. */ + {"8548", PROCESSOR_PPC8540, POWERPC_BASE_MASK | MASK_PPC_GFXOPT}, ++ {"e300c2", PROCESSOR_PPCE300C2, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, ++ {"e300c3", PROCESSOR_PPCE300C3, POWERPC_BASE_MASK}, + {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, + {"970", PROCESSOR_POWER4, + POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64}, +@@ -1524,6 +1541,11 @@ + rs6000_cost = &ppc8540_cost; + break; + ++ case PROCESSOR_PPCE300C2: ++ case PROCESSOR_PPCE300C3: ++ rs6000_cost = &ppce300c2c3_cost; ++ break; ++ + case PROCESSOR_POWER4: + case PROCESSOR_POWER5: + rs6000_cost = &power4_cost; +@@ -16578,6 +16600,8 @@ + case CPU_PPC750: + case CPU_PPC7400: + case CPU_PPC8540: ++ case CPU_PPCE300C2: ++ case CPU_PPCE300C3: + return 2; + case CPU_RIOS2: + case CPU_PPC604: +diff -uNr gcc-4.1.1-orig/gcc/config/rs6000/rs6000.h gcc-4.1.1/gcc/config/rs6000/rs6000.h +--- gcc-4.1.1-orig/gcc/config/rs6000/rs6000.h 2006-04-13 23:33:51.000000000 +0300 ++++ gcc-4.1.1/gcc/config/rs6000/rs6000.h 2007-10-31 23:56:39.000000000 +0200 +@@ -110,6 +110,8 @@ + %{mcpu=970: -mpower4 -maltivec} \ + %{mcpu=G5: -mpower4 -maltivec} \ + %{mcpu=8540: -me500} \ ++%{mcpu=e300c2: -mppc} \ ++%{mcpu=e300c3: -mppc -mpmr} \ + %{maltivec: -maltivec} \ + -many" + +@@ -210,6 +212,8 @@ + PROCESSOR_PPC7400, + PROCESSOR_PPC7450, + PROCESSOR_PPC8540, ++ PROCESSOR_PPCE300C2, ++ PROCESSOR_PPCE300C3, + PROCESSOR_POWER4, + PROCESSOR_POWER5 + }; +diff -uNr gcc-4.1.1-orig/gcc/config/rs6000/rs6000.md gcc-4.1.1/gcc/config/rs6000/rs6000.md +--- gcc-4.1.1-orig/gcc/config/rs6000/rs6000.md 2006-05-04 23:43:57.000000000 +0300 ++++ gcc-4.1.1/gcc/config/rs6000/rs6000.md 2007-10-31 23:56:39.000000000 +0200 +@@ -103,7 +103,7 @@ + ;; Processor type -- this attribute must exactly match the processor_type + ;; enumeration in rs6000.h. + +-(define_attr "cpu" "rios1,rios2,rs64a,mpccore,ppc403,ppc405,ppc440,ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,ppc750,ppc7400,ppc7450,ppc8540,power4,power5" ++(define_attr "cpu" "rios1,rios2,rs64a,mpccore,ppc403,ppc405,ppc440,ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,ppc750,ppc7400,ppc7450,ppc8540,ppce300c2,ppce300c3,power4,power5" + (const (symbol_ref "rs6000_cpu_attr"))) + + (automata_option "ndfa") +@@ -119,6 +119,7 @@ + (include "7xx.md") + (include "7450.md") + (include "8540.md") ++(include "e300c2c3.md") + (include "power4.md") + (include "power5.md") + +diff -uNr gcc-4.1.1-orig/gcc/config.gcc gcc-4.1.1/gcc/config.gcc +--- gcc-4.1.1-orig/gcc/config.gcc 2006-05-09 23:02:29.000000000 +0300 ++++ gcc-4.1.1/gcc/config.gcc 2007-10-31 23:56:39.000000000 +0200 +@@ -2699,7 +2699,7 @@ + | rios | rios1 | rios2 | rsc | rsc1 | rs64a \ + | 401 | 403 | 405 | 405fp | 440 | 440fp | 505 \ + | 601 | 602 | 603 | 603e | ec603e | 604 \ +- | 604e | 620 | 630 | 740 | 750 | 7400 | 7450 \ ++ | 604e | 620 | 630 | 740 | 750 | 7400 | 7450 | e300c[23] \ + | 854[08] | 801 | 821 | 823 | 860 | 970 | G3 | G4 | G5) + # OK + ;; diff --git a/packages/gcc/gcc-cross-sdk_4.1.1.bb b/packages/gcc/gcc-cross-sdk_4.1.1.bb index 51470c7214..e2efde139f 100644 --- a/packages/gcc/gcc-cross-sdk_4.1.1.bb +++ b/packages/gcc/gcc-cross-sdk_4.1.1.bb @@ -2,7 +2,7 @@ DESCRIPTION = "The GNU cc and gcc C compilers." HOMEPAGE = "http://www.gnu.org/software/gcc/" SECTION = "devel" LICENSE = "GPL" -PR = "r1" +PR = "r2" inherit sdk diff --git a/packages/gcc/gcc-cross-sdk_4.1.2.bb b/packages/gcc/gcc-cross-sdk_4.1.2.bb index 238f5c2fd0..450dc82b08 100644 --- a/packages/gcc/gcc-cross-sdk_4.1.2.bb +++ b/packages/gcc/gcc-cross-sdk_4.1.2.bb @@ -10,4 +10,4 @@ require gcc_${PV}.bb require gcc4-build-sdk.inc require gcc-package-sdk.inc -EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" diff --git a/packages/gcc/gcc-cross_4.1.0.bb b/packages/gcc/gcc-cross_4.1.0.bb index 0328f45cfb..bfcfac2033 100644 --- a/packages/gcc/gcc-cross_4.1.0.bb +++ b/packages/gcc/gcc-cross_4.1.0.bb @@ -15,4 +15,4 @@ require gcc3-build-cross.inc # cross packaging require gcc-package-cross.inc -EXTRA_OECONF += "--with-mpfr=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF += "--with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" diff --git a/packages/gcc/gcc-cross_4.1.1.bb b/packages/gcc/gcc-cross_4.1.1.bb index 55d2cbde15..a817eb3a84 100644 --- a/packages/gcc/gcc-cross_4.1.1.bb +++ b/packages/gcc/gcc-cross_4.1.1.bb @@ -5,7 +5,7 @@ inherit cross FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" # NOTE: split PR. If the main .oe changes something that affects its *build* # remember to increment this one too. -PR = "r15" +PR = "r16" DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc gmp-native mpfr-native" PROVIDES = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++" @@ -17,4 +17,4 @@ require gcc-package-cross.inc SRC_URI_append_fail-fast = " file://zecke-no-host-includes.patch;patch=1 " -EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" diff --git a/packages/gcc/gcc-cross_4.1.2.bb b/packages/gcc/gcc-cross_4.1.2.bb index 629e87b653..8204e2c316 100644 --- a/packages/gcc/gcc-cross_4.1.2.bb +++ b/packages/gcc/gcc-cross_4.1.2.bb @@ -17,4 +17,4 @@ require gcc-package-cross.inc SRC_URI_append_fail-fast = " file://zecke-no-host-includes.patch;patch=1 " -EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" diff --git a/packages/gcc/gcc-cross_4.2.1.bb b/packages/gcc/gcc-cross_4.2.1.bb index 3272876326..da27c68d9a 100644 --- a/packages/gcc/gcc-cross_4.2.1.bb +++ b/packages/gcc/gcc-cross_4.2.1.bb @@ -17,4 +17,4 @@ require gcc-package-cross.inc SRC_URI_append_fail-fast = " file://zecke-no-host-includes.patch;patch=1 " -EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" diff --git a/packages/gcc/gcc-cross_4.2.2.bb b/packages/gcc/gcc-cross_4.2.2.bb index 9025a98f3c..1d5ebdcc61 100644 --- a/packages/gcc/gcc-cross_4.2.2.bb +++ b/packages/gcc/gcc-cross_4.2.2.bb @@ -17,4 +17,4 @@ require gcc-package-cross.inc SRC_URI_append_fail-fast = " file://zecke-no-host-includes.patch;patch=1 " -EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR}/${BUILD_SYS}" +EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" diff --git a/packages/gcc/gcc_4.1.1.bb b/packages/gcc/gcc_4.1.1.bb index 1a03ce617e..499075e0e9 100644 --- a/packages/gcc/gcc_4.1.1.bb +++ b/packages/gcc/gcc_4.1.1.bb @@ -1,4 +1,4 @@ -PR = "r14" +PR = "r15" DESCRIPTION = "The GNU cc and gcc C compilers." HOMEPAGE = "http://www.gnu.org/software/gcc/" SECTION = "devel" @@ -33,6 +33,7 @@ SRC_URI = "http://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.1/gcc-4.1.1.tar.bz2 \ file://fix-ICE-in-arm_unwind_emit_set.diff;patch=1 \ file://gcc-4.1.1-pr13685-1.patch;patch=1 \ file://gcc-ignore-cache.patch;patch=1 \ + file://gcc-4.1.1-e300cx.patch;patch=1 \ " SRC_URI_append_sh3 = " file://sh3-installfix-fixheaders.patch;patch=1 " diff --git a/packages/gcc/gcc_csl-arm-2005q3.bb b/packages/gcc/gcc_csl-arm-2005q3.bb index 4f41ca06af..fe9b364c88 100644 --- a/packages/gcc/gcc_csl-arm-2005q3.bb +++ b/packages/gcc/gcc_csl-arm-2005q3.bb @@ -12,13 +12,13 @@ inherit autotools gettext require gcc-package.inc -SRC_URI = "http://www.codesourcery.com/public/gnu_toolchain/arm/2005q3-2/arm-2005q3-2-arm-none-linux-gnueabi.src.tar.bz2 \ +SRC_URI = "http://www.codesourcery.com/public/gnu_toolchain/arm-none-eabi/arm-2005q3-2-arm-none-eabi.src.tar.bz2 \ file://gcc_optab_arm.patch;patch=1 \ file://gcc-3.4.4-eabi-bigendian.patch;patch=1" do_unpack2() { cd ${WORKDIR} - tar -xvjf ./arm-2005q3-2-arm-none-linux-gnueabi/gcc-2005q3-2.tar.bz2 + tar -xvjf ./arm-2005q3-2-arm-none-eabi/gcc-2005q3-2.tar.bz2 } addtask unpack2 after do_unpack before do_patch diff --git a/packages/glibc/eglibc_svn.bb b/packages/glibc/eglibc_svn.bb index 7abac644bc..da33cca3fa 100644 --- a/packages/glibc/eglibc_svn.bb +++ b/packages/glibc/eglibc_svn.bb @@ -14,8 +14,8 @@ PACKAGES_DYNAMIC = "libc6*" RPROVIDES_${PN}-dev = "libc6-dev" # the -isystem in bitbake.conf screws up glibc do_stage -BUILD_CPPFLAGS = "-I${STAGING_DIR}/${BUILD_SYS}/include" -TARGET_CPPFLAGS = "-I${STAGING_DIR}/${TARGET_SYS}/include" +BUILD_CPPFLAGS = "-I${STAGING_INCDIR_NATIVE}" +TARGET_CPPFLAGS = "-I${STAGING_DIR_TARGET}${layout_includedir}" GLIBC_ADDONS ?= "ports,nptl,libidn" diff --git a/packages/glibc/glibc-initial.inc b/packages/glibc/glibc-initial.inc index 9355320b3a..288cb082a5 100644 --- a/packages/glibc/glibc-initial.inc +++ b/packages/glibc/glibc-initial.inc @@ -30,14 +30,14 @@ do_compile () { } do_stage () { - oe_runmake cross-compiling=yes install_root=${STAGING_DIR}/${HOST_SYS} includedir=/include prefix="" install-headers + oe_runmake cross-compiling=yes install_root=${STAGING_DIR_HOST} includedir='${layout_includedir}' prefix='${layout_prefix}' install-headers # Two headers -- stubs.h and features.h -- aren't installed by install-headers, # so do them by hand. We can tolerate an empty stubs.h for the moment. # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html - mkdir -p ${STAGING_DIR}/${HOST_SYS}/include/gnu - touch ${STAGING_DIR}/${HOST_SYS}/include/gnu/stubs.h - cp ${S}/include/features.h ${STAGING_DIR}/${HOST_SYS}/include/features.h + mkdir -p ${STAGING_INCDIR}/gnu + touch ${STAGING_INCDIR}/gnu/stubs.h + cp ${S}/include/features.h ${STAGING_INCDIR}/features.h } do_install () { diff --git a/packages/glibc/glibc-stage.inc b/packages/glibc/glibc-stage.inc new file mode 100644 index 0000000000..a86cf7888e --- /dev/null +++ b/packages/glibc/glibc-stage.inc @@ -0,0 +1,23 @@ +do_stage() { + rm -f ${STAGING_DIR_HOST}${layout_base_libdir}/libc.so.6 + oe_runmake 'install_root=${STAGING_DIR_HOST}' \ + 'includedir=${layout_includedir}' 'libdir=${layout_libdir}' 'slibdir=${layout_base_libdir}' \ + '${STAGING_DIR_HOST}${layout_base_libdir}/libc.so.6' \ + install-headers install-lib + + install -d ${STAGING_INCDIR}/gnu \ + ${STAGING_INCDIR}/bits \ + ${STAGING_INCDIR}/rpcsvc + install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ + install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ + install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h + for r in ${rpcsvc}; do + h=`echo $r|sed -e's,\.x$,.h,'` + install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ + done + for i in libc.a libc_pic.a libc_nonshared.a; do + install -m 0644 ${B}/$i ${STAGING_DIR_HOST}/${layout_base_libdir}/ || die "failed to install $i" + done + echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_DIR_HOST}/${layout_base_libdir}/libpthread.so + echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_DIR_HOST}/${layout_base_libdir}/libc.so +} diff --git a/packages/glibc/glibc_2.2.5.bb b/packages/glibc/glibc_2.2.5.bb index fd79701e6b..7b5eca2432 100644 --- a/packages/glibc/glibc_2.2.5.bb +++ b/packages/glibc/glibc_2.2.5.bb @@ -158,10 +158,10 @@ do_compile () { } do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ + rm -f ${STAGING_DIR_HOST}${layout_base_libdir}/libc.so.6 + oe_runmake 'install_root=${STAGING_DIR_HOST}' \ + 'includedir=${layout_includedir}' 'libdir=${layout_libdir}' 'slibdir=${layout_base_libdir}' \ + '${STAGING_DIR_HOST}${layout_base_libdir}libc.so.6' \ '${STAGING_INCDIR}/bits/errno.h' \ '${STAGING_INCDIR}/bits/libc-lock.h' \ '${STAGING_INCDIR}/gnu/stubs.h' \ @@ -187,9 +187,9 @@ do_stage() { install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ done for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" + install -m 0644 ${B}/$i ${STAGING_DIR_HOST}/${layout_base_libdir}/ || die "failed to install $i" done - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so + echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_DIR_HOST}/${layout_base_libdir}/libc.so } require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.3.2+cvs20040726.bb b/packages/glibc/glibc_2.3.2+cvs20040726.bb index df39c659c9..c44bf7dd15 100644 --- a/packages/glibc/glibc_2.3.2+cvs20040726.bb +++ b/packages/glibc/glibc_2.3.2+cvs20040726.bb @@ -70,28 +70,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.3.2.bb b/packages/glibc/glibc_2.3.2.bb index 6022210857..9290c9b831 100644 --- a/packages/glibc/glibc_2.3.2.bb +++ b/packages/glibc/glibc_2.3.2.bb @@ -156,28 +156,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.3.3+cvs20041128.bb b/packages/glibc/glibc_2.3.3+cvs20041128.bb index 9fc4bcf738..829ef8f64e 100644 --- a/packages/glibc/glibc_2.3.3+cvs20041128.bb +++ b/packages/glibc/glibc_2.3.3+cvs20041128.bb @@ -92,28 +92,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.3.3+cvs20050221.bb b/packages/glibc/glibc_2.3.3+cvs20050221.bb index 1bb949665d..b94025881e 100644 --- a/packages/glibc/glibc_2.3.3+cvs20050221.bb +++ b/packages/glibc/glibc_2.3.3+cvs20050221.bb @@ -75,28 +75,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.3.3+cvs20050420.bb b/packages/glibc/glibc_2.3.3+cvs20050420.bb index 79ecd145a6..0a3759b6d2 100644 --- a/packages/glibc/glibc_2.3.3+cvs20050420.bb +++ b/packages/glibc/glibc_2.3.3+cvs20050420.bb @@ -76,28 +76,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.3.3.bb b/packages/glibc/glibc_2.3.3.bb index 5e43a07aee..46fc230d29 100644 --- a/packages/glibc/glibc_2.3.3.bb +++ b/packages/glibc/glibc_2.3.3.bb @@ -101,28 +101,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.3.5+cvs20050627.bb b/packages/glibc/glibc_2.3.5+cvs20050627.bb index b06acd792d..62cfd21cb9 100644 --- a/packages/glibc/glibc_2.3.5+cvs20050627.bb +++ b/packages/glibc/glibc_2.3.5+cvs20050627.bb @@ -129,28 +129,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.4.bb b/packages/glibc/glibc_2.4.bb index 6f408d70f8..67446cad7d 100644 --- a/packages/glibc/glibc_2.4.bb +++ b/packages/glibc/glibc_2.4.bb @@ -7,8 +7,8 @@ COMPATIBLE_HOST = '(i.86.*-linux|sh.*-linux)' DEFAULT_PREFERENCE_arm = "-1" # the -isystem in bitbake.conf screws up glibc do_stage -BUILD_CPPFLAGS = "-I${STAGING_DIR}/${BUILD_SYS}/include" -TARGET_CPPFLAGS = "-I${STAGING_DIR}/${TARGET_SYS}/include" +BUILD_CPPFLAGS = "-I${STAGING_INCDIR_NATIVE}" +TARGET_CPPFLAGS = "-I${STAGING_DIR_TARGET}${layout_includedir}" FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/glibc-2.4" @@ -113,7 +113,6 @@ do_munge() { addtask munge before do_patch after do_unpack - do_configure () { # override this function to avoid the autoconf/automake/aclocal/autoheader # calls for now @@ -144,28 +143,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.5.bb b/packages/glibc/glibc_2.5.bb index e35e1ced43..2ffa6f6367 100644 --- a/packages/glibc/glibc_2.5.bb +++ b/packages/glibc/glibc_2.5.bb @@ -8,8 +8,8 @@ RPROVIDES_${PN}-dev = "libc6-dev" PR = "r7" # the -isystem in bitbake.conf screws up glibc do_stage -BUILD_CPPFLAGS = "-I${STAGING_DIR}/${BUILD_SYS}/include" -TARGET_CPPFLAGS = "-I${STAGING_DIR}/${TARGET_SYS}/include" +BUILD_CPPFLAGS = "-I${STAGING_INCDIR_NATIVE}" +TARGET_CPPFLAGS = "-I${STAGING_DIR_TARGET}${layout_includedir}" FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/glibc-2.4" @@ -154,28 +154,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_2.6.1.bb b/packages/glibc/glibc_2.6.1.bb index 7a73a03794..46b56a0a65 100644 --- a/packages/glibc/glibc_2.6.1.bb +++ b/packages/glibc/glibc_2.6.1.bb @@ -8,8 +8,8 @@ RPROVIDES_${PN}-dev = "libc6-dev" PR = "r1" # the -isystem in bitbake.conf screws up glibc do_stage -BUILD_CPPFLAGS = "-I${STAGING_DIR}/${BUILD_SYS}/include" -TARGET_CPPFLAGS = "-I${STAGING_DIR}/${TARGET_SYS}/include" +BUILD_CPPFLAGS = "-I${STAGING_INCDIR_NATIVE}" +TARGET_CPPFLAGS = "-I${STAGING_DIR_TARGET}${layout_includedir}" FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/glibc-2.4" @@ -151,28 +151,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/glibc/glibc_cvs.bb b/packages/glibc/glibc_cvs.bb index 5ce25ae04f..9dbea14876 100644 --- a/packages/glibc/glibc_cvs.bb +++ b/packages/glibc/glibc_cvs.bb @@ -99,28 +99,6 @@ do_compile () { ) } -do_stage() { - rm -f ${STAGING_LIBDIR}/libc.so.6 - oe_runmake 'install_root=${STAGING_DIR}/${HOST_SYS}' \ - 'includedir=/include' 'libdir=/lib' 'slibdir=/lib' \ - '${STAGING_LIBDIR}/libc.so.6' \ - install-headers install-lib - - install -d ${STAGING_INCDIR}/gnu \ - ${STAGING_INCDIR}/bits \ - ${STAGING_INCDIR}/rpcsvc - install -m 0644 ${S}/include/gnu/stubs.h ${STAGING_INCDIR}/gnu/ - install -m 0644 ${B}/bits/stdio_lim.h ${STAGING_INCDIR}/bits/ - install -m 0644 misc/syscall-list.h ${STAGING_INCDIR}/bits/syscall.h - for r in ${rpcsvc}; do - h=`echo $r|sed -e's,\.x$,.h,'` - install -m 0644 ${S}/sunrpc/rpcsvc/$h ${STAGING_INCDIR}/rpcsvc/ - done - for i in libc.a libc_pic.a libc_nonshared.a; do - install -m 0644 ${B}/$i ${STAGING_LIBDIR}/ || die "failed to install $i" - done - echo 'GROUP ( libpthread.so.0 libpthread_nonshared.a )' > ${STAGING_LIBDIR}/libpthread.so - echo 'GROUP ( libc.so.6 libc_nonshared.a )' > ${STAGING_LIBDIR}/libc.so -} +require glibc-stage.inc require glibc-package.bbclass diff --git a/packages/gnome/epiphany_2.19.6.bb b/packages/gnome/epiphany_2.19.6.bb deleted file mode 100644 index 570f8ba4f5..0000000000 --- a/packages/gnome/epiphany_2.19.6.bb +++ /dev/null @@ -1,14 +0,0 @@ -DESCRIPTION = "GNOME default webbrowser" -DEPENDS = "gnome-desktop gnome-vfs libgnomeui webkit-gtk iso-codes libstartup-notification" -RDEPENDS = "gnome-vfs-plugin-http" - -PR = "r1" - -inherit gnome - -EXTRA_OECONF = "--with-engine=webkit" - - -FILES_${PN} += "${datadir}/icons ${datadir}/dbus-1" - - diff --git a/packages/gnome/epiphany_svn.bb b/packages/gnome/epiphany_svn.bb new file mode 100644 index 0000000000..97fd82b653 --- /dev/null +++ b/packages/gnome/epiphany_svn.bb @@ -0,0 +1,21 @@ +DESCRIPTION = "GNOME default webbrowser" +DEPENDS = "gnome-desktop gnome-vfs libgnomeui webkit-gtk iso-codes startup-notification" +RDEPENDS = "gnome-vfs-plugin-http" + +PV = "2.20.1+svnr${SRCREV}" +PR = "r0" + +inherit gnome + +SRC_URI = "svn://svn.gnome.org/svn/epiphany;module=trunk;proto=http" +S = "${WORKDIR}/trunk" + +EXTRA_OECONF = "--with-engine=webkit --with-distributor-name=${DISTRO}" + +do_configure_prepend() { + touch ${S}/gnome-doc-utils.make +} + +FILES_${PN} += "${datadir}/icons ${datadir}/dbus-1" + + diff --git a/packages/gnome/gnome-common_2.18.0.bb b/packages/gnome/gnome-common_2.18.0.bb index 2991db81c7..41c25b69c2 100644 --- a/packages/gnome/gnome-common_2.18.0.bb +++ b/packages/gnome/gnome-common_2.18.0.bb @@ -19,7 +19,7 @@ do_stage () { rm -rf ${STAGE_TEMP} mkdir -p ${STAGE_TEMP} make DESTDIR="${STAGE_TEMP}" install - cp -pPR ${STAGE_TEMP}${bindir}/* ${STAGING_DIR}/${BUILD_SYS}/bin + cp -pPR ${STAGE_TEMP}${bindir}/* ${STAGING_BINDIR_NATIVE} install -d ${STAGING_DATADIR}/gnome-common install -d ${STAGING_DATADIR}/aclocal cp -pPR ${STAGE_TEMP}${datadir}/gnome-common/* ${STAGING_DATADIR}/gnome-common diff --git a/packages/gnome/gnome-common_2.20.0.bb b/packages/gnome/gnome-common_2.20.0.bb index 2991db81c7..41c25b69c2 100644 --- a/packages/gnome/gnome-common_2.20.0.bb +++ b/packages/gnome/gnome-common_2.20.0.bb @@ -19,7 +19,7 @@ do_stage () { rm -rf ${STAGE_TEMP} mkdir -p ${STAGE_TEMP} make DESTDIR="${STAGE_TEMP}" install - cp -pPR ${STAGE_TEMP}${bindir}/* ${STAGING_DIR}/${BUILD_SYS}/bin + cp -pPR ${STAGE_TEMP}${bindir}/* ${STAGING_BINDIR_NATIVE} install -d ${STAGING_DATADIR}/gnome-common install -d ${STAGING_DATADIR}/aclocal cp -pPR ${STAGE_TEMP}${datadir}/gnome-common/* ${STAGING_DATADIR}/gnome-common diff --git a/packages/gsm/files/install-ts-headers.patch b/packages/gsm/files/install-ts-headers.patch new file mode 100644 index 0000000000..88e3b6dd1f --- /dev/null +++ b/packages/gsm/files/install-ts-headers.patch @@ -0,0 +1,11 @@ +Index: gsm/include/gsmd/Makefile.am +=================================================================== +--- gsm.orig/include/gsmd/Makefile.am 2007-10-29 21:05:57.000000000 +0100 ++++ gsm/include/gsmd/Makefile.am 2007-10-29 21:06:03.000000000 +0100 +@@ -1,4 +1,4 @@ + +-pkginclude_HEADERS = event.h usock.h ++pkginclude_HEADERS = event.h ts0705.h ts0707.h usock.h + +-noinst_HEADERS = atcmd.h gsmd.h select.h ts0705.h ts0707.h unsolicited.h usock.h vendorplugin.h ++noinst_HEADERS = atcmd.h gsmd.h select.h unsolicited.h usock.h vendorplugin.h diff --git a/packages/gsm/gsmd.inc b/packages/gsm/gsmd.inc index d84da91612..4fe36b9616 100644 --- a/packages/gsm/gsmd.inc +++ b/packages/gsm/gsmd.inc @@ -3,8 +3,9 @@ HOMEPAGE = "http://www.openmoko.org" LICENSE = "GPL LGPL" SECTION = "libs/gsm" PROVIDES += "gsmd" +RPROVIDES_${PN} = "libgsmd0 libgsmd gsmd gsmd-devel" PV = "0.1+svnr${SRCREV}" -PR = "r32" +PR = "r37" SRC_URI = "svn://svn.openmoko.org/trunk/src/target;module=gsm;proto=http \ file://gsmd \ @@ -30,7 +31,7 @@ do_install_append() { install ${WORKDIR}/default ${D}/${sysconfdir}/default/gsmd } -PACKAGES =+ "${PN}-tools ${BASEPN} \ +PACKAGES =+ "${PN}-tools \ ${BASEPN}-plugins \ ${BASEPN}-plugin-machine-generic \ ${BASEPN}-plugin-machine-tihtc \ @@ -40,7 +41,6 @@ PACKAGES =+ "${PN}-tools ${BASEPN} \ ${BASEPN}-plugin-vendor-tihtc \ " -RDEPENDS_${PN} = "${BASEPN}" RDEPENDS_${BASEPN}-plugins = "${BASEPN}-plugin-machine-generic \ ${BASEPN}-plugin-machine-tihtc \ ${BASEPN}-plugin-vendor-bcm \ @@ -49,12 +49,11 @@ RDEPENDS_${BASEPN}-plugins = "${BASEPN}-plugin-machine-generic \ ${BASEPN}-plugin-vendor-tihtc \ " -RDEPENDS_${BASEPN} = "update-rc.d initscripts" -RRECOMMENDS_${BASEPN} = "${BASEPN}-plugins" +RDEPENDS_${PN} += "update-rc.d initscripts" +RRECOMMENDS_${PN} += "${BASEPN}-plugins" FILES_${PN}-dbg += "${libdir}/gsmd/.debug/*" FILES_${PN}-tools = "${bindir}/*" -FILES_${BASEPN} = "${sbindir}/gsmd ${sysconfdir}" FILES_${BASEPN}-plugins = "" FILES_${BASEPN}-plugin-machine-generic = "${libdir}/gsmd/libgsmd-machine_generic.so*" FILES_${BASEPN}-plugin-machine-tihtc = "${libdir}/gsmd/libgsmd-machine_tihtc.so*" @@ -77,17 +76,7 @@ RCONFLICTS_${BASEPN}-plugin-vendor-bcm = "${CONFLICTNAME}-plugin-vendor-bcm" RCONFLICTS_${BASEPN}-plugin-vendor-ti = "${CONFLICTNAME}-plugin-vendor-ti" RCONFLICTS_${BASEPN}-plugin-vendor-tihtc = "${CONFLICTNAME}-plugin-vendor-tihtc" -RREPLACES_lib${BASEPN} = "lib${CONFLICTNAME}" -RREPLACES_${BASEPN} = "${CONFLICTNAME}" -RREPLACES_${BASEPN}-plugins = "${CONFLICTNAME}-plugins" -RREPLACES_${BASEPN}-plugin-machine-generic = "${CONFLICTNAME}-plugin-machine-generic" -RREPLACES_${BASEPN}-plugin-machine-tihtc = "${CONFLICTNAME}-plugin-machine-tihtc" -RREPLACES_${BASEPN}-plugin-vendor-qc = "${CONFLICTNAME}-plugin-vendor-qc" -RREPLACES_${BASEPN}-plugin-vendor-bcm = "${CONFLICTNAME}-plugin-vendor-bcm" -RREPLACES_${BASEPN}-plugin-vendor-ti = "${CONFLICTNAME}-plugin-vendor-ti" -RREPLACES_${BASEPN}-plugin-vendor-tihtc = "${CONFLICTNAME}-plugin-vendor-tihtc" - -RPROVIDES_lib${BASEPN} = "lib${CONFLICTNAME}" +RPROVIDES_lib${BASEPN} += "lib${CONFLICTNAME}" RPROVIDES_${BASEPN} = "${CONFLICTNAME}" RPROVIDES_${BASEPN}-plugins = "${CONFLICTNAME}-plugins" RPROVIDES_${BASEPN}-plugin-machine-generic = "${CONFLICTNAME}-plugin-machine-generic" diff --git a/packages/gsm/libgsmd-devel_svn.bb b/packages/gsm/libgsmd-devel_svn.bb index 4216dfc48b..d584e88d38 100644 --- a/packages/gsm/libgsmd-devel_svn.bb +++ b/packages/gsm/libgsmd-devel_svn.bb @@ -4,6 +4,7 @@ CONFLICTNAME = "gsmd" require gsmd.inc PROVIDES += "libgsmd" +RPROVIDES_${PN}-tools = "lib${CONFLICTNAME}-tools" SRC_URI += " file://024_sms-text-in-bracket.patch;patch=1;minrev=2957;maxrev=3199 \ file://025_sms-status-report.patch;patch=1;minrev=2957;maxrev=3200 \ @@ -15,6 +16,7 @@ SRC_URI += " file://024_sms-text-in-bracket.patch;patch=1;minrev=2957;maxrev=319 file://0004-Handle-read-and-write-return-values.patch;patch=1;minrev=2957 \ file://0005-Add-ask-ds-option-forSMS.patch;patch=1;minrev=2957;maxrev=3201 \ file://lgsm_send_fix_return_value.patch;patch=1;maxrev=3266 \ + file://install-ts-headers.patch;patch=1 \ file://gsmd \ file://default" diff --git a/packages/gsm/pty/.mtn2git_empty b/packages/gsm/pty/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/gsm/pty/.mtn2git_empty diff --git a/packages/gsm/pty/pty.c b/packages/gsm/pty/pty.c new file mode 100644 index 0000000000..4a33d0efd3 --- /dev/null +++ b/packages/gsm/pty/pty.c @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2007 OpenedHand, Ltd. + * Contact: <andrew@o-hand.com> + * + * This file is licensed under the terms of GNU GPL v2. + * + * $ pty [<hostname|ip> <port>] + * Opens a new pseudo terminal and forwards data between standard input + * and the pty and between the pty and standard output. If a hostname and + * port number are given, reads and writes to the socket instead of + * standard input or output. Path to the slave pty is printed on standard + * error. + */ +#include <unistd.h> +#include <stdlib.h> +#include <fcntl.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> +#include <poll.h> + +#define CHECK(val, name) \ + if (val == -1) { \ + fprintf(stderr, #name ": %s (%i)\n", strerror(errno), errno);\ + return -errno; \ + } + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +static int forward2(int in0, int out0, int in1, int out1, + int (*closed)(int fd)) { + int inpos = 0, inlen = 0, outpos = 0, outlen = 0, ret, n; + fd_set rfds, wfds; + char in[0x100], out[0x100]; + + n = max(max(in0, in1), max(out0, out1)) + 1; + while (1) { + FD_ZERO(&rfds); + FD_ZERO(&wfds); + if (inlen < sizeof(in)) + FD_SET(in0, &rfds); + if (outlen < sizeof(out)) + FD_SET(in1, &rfds); + if (inlen) + FD_SET(out0, &wfds); + if (outlen) + FD_SET(out1, &wfds); + CHECK(select(n, &rfds, &wfds, 0, 0), select); + + if (FD_ISSET(in0, &rfds)) { + ret = (inpos + inlen) & (sizeof(in) - 1); + ret = read(in0, in + ret, + sizeof(in) - max(ret, inlen)); + CHECK(ret, read(0)); + if (!ret) + return 0; + inlen += ret; + } + if (FD_ISSET(in1, &rfds)) { + ret = (outpos + outlen) & (sizeof(out) - 1); + ret = read(in1, out + ret, + sizeof(out) - max(ret, outlen)); + if (ret > 0) + outlen += ret; + if (ret < 0 && errno == EIO && closed) { + in1 = out0 = closed(in1); + if (in1 < 0) + return in1; + n = max(max(in0, in1), max(out0, out1)) + 1; + continue; + } + } + if (FD_ISSET(out0, &wfds)) { + ret = write(out0, in + inpos, + min(sizeof(in) - inpos, inlen)); + CHECK(ret, write(pty)); + inlen -= ret; + inpos += ret; + inpos &= sizeof(in) - 1; + } + if (FD_ISSET(out1, &wfds)) { + ret = write(out1, out + outpos, + min(sizeof(out) - outpos, outlen)); + CHECK(ret, write(1)); + outlen -= ret; + outpos += ret; + outpos &= sizeof(out) - 1; + } + } + + return pause(); +} + +static int reopen(int fd) { + const char *name = ttyname(fd); + + CHECK(close(fd), close(pty)); + fd = open(name, O_RDWR | O_NOCTTY); + CHECK(fd, open); + CHECK(grantpt(fd), grantpt); + CHECK(unlockpt(fd), unlockpt); + + fprintf(stderr, "%s\n", ptsname(fd)); + return fd; +} + +int main(int argc, char *argv[], char **envp) { + int sock, fd; + struct sockaddr_in sa; + struct hostent *hi; + + fd = posix_openpt(O_RDWR | O_NOCTTY); + CHECK(fd, open); + CHECK(grantpt(fd), grantpt); + CHECK(unlockpt(fd), unlockpt); + + fprintf(stderr, "%s\n", ptsname(fd)); +#if 0 + /* Connect stdin & stdout with a pty */ + CHECK(close(0), close(0)); + CHECK(close(1), close(1)); + CHECK(dup(fd), dup(0)); + CHECK(dup(fd), dup(1)); + return pause(); +#endif + if (argc != 3) + return forward2(0, fd, fd, 1, reopen); + +#if 0 + /* Connect a sub-process with a pty */ + for (len = 0, i = 1; i < argc; i ++) + len += strlen(argv[i]) + 4; + param = malloc(len); + strcpy(param, argv[1]); + for (i = 2; i < argc; i ++) + sprintf(param + strlen(param), " \"%s\"", argv[i]); + i = fileno(popen(param, O_RDWR)); + CHECK(i, popen); + free(param); + return forward2(i, fd, fd, i, reopen); +#endif + + /* Connect a TCP socket with a pty */ + hi = gethostbyname(argv[1]); + if (!hi) { + errno = h_errno; + CHECK(-1, gethostbyname); + } + sa.sin_family = hi->h_addrtype; + memcpy(&sa.sin_addr.s_addr, hi->h_addr_list[0], hi->h_length); + sa.sin_port = htons(strtol(argv[2], 0, 0)); + sock = socket(AF_INET, SOCK_STREAM, 0); + + CHECK(sock, socket); + CHECK(connect(sock, (struct sockaddr *) &sa, sizeof(sa)), connect); + return forward2(sock, fd, fd, sock, reopen); +} diff --git a/packages/gsm/pty_0.0.bb b/packages/gsm/pty_0.0.bb new file mode 100644 index 0000000000..39592a90a1 --- /dev/null +++ b/packages/gsm/pty_0.0.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "Forwards a socket to a tty" +LICENSE = "GPLv2" +PR = "r1" + +SRC_URI = "file://pty.c" + +do_compile() { + cp ${WORKDIR}/*.c ${S}/ + ${CC} pty.c -o pty -I${STAGING_INCDIR} -L${STAGING_LIBDIR} +} + +do_install() { + install -d ${D}${bindir} + install -m 0755 pty ${D}${bindir}/ +} + diff --git a/packages/gutenprint/gutenprint_5.1.3.bb b/packages/gutenprint/gutenprint_5.1.3.bb index 8886323da5..f0e0b734ab 100644 --- a/packages/gutenprint/gutenprint_5.1.3.bb +++ b/packages/gutenprint/gutenprint_5.1.3.bb @@ -36,7 +36,7 @@ do_configure() { do_install_append() { install -d ${D}${datadir}/cups/model/ - install -m 644 ${STAGING_DIR}/${BUILD_SYS}/share/cups/model/* ${D}${datadir}/cups/model/ + install -m 644 ${STAGING_DATADIR_NATIVE}/cups/model/* ${D}${datadir}/cups/model/ cp -pPr ${D}${STAGING_LIBDIR}/* ${D}${libdir}/ cp -pPr ${D}${STAGING_DATADIR}/* ${D}${datadir}/ } diff --git a/packages/icewm/icewm_1.2.20.bb b/packages/icewm/icewm_1.2.20.bb index 4da5da5146..b6a90a54a4 100644 --- a/packages/icewm/icewm_1.2.20.bb +++ b/packages/icewm/icewm_1.2.20.bb @@ -14,7 +14,7 @@ inherit autotools pkgconfig EXTRA_OECONF = "--disable-i18n --without-imlib --with-xpm --with-gnome-menus \ --x-includes=${STAGING_INCDIR} --x-libraries=${STAGING_LIBDIR} \ - --with-mkfontdir=${STAGING_DIR}/${BUILD_SYS}/bin/mkfontdir" + --with-mkfontdir=${STAGING_BINDIR_NATIVE}/mkfontdir" pkg_postinst() { update-alternatives --install /usr/bin/x-window-manager x-window-manager /usr/bin/icewm-session 10 diff --git a/packages/icewm/icewm_1.2.30.bb b/packages/icewm/icewm_1.2.30.bb index 5266b0adb9..4e7b7125ec 100644 --- a/packages/icewm/icewm_1.2.30.bb +++ b/packages/icewm/icewm_1.2.30.bb @@ -12,7 +12,7 @@ inherit autotools pkgconfig EXTRA_OECONF = "--disable-i18n --without-imlib --with-xpm --with-gnome-menus \ --x-includes=${STAGING_INCDIR} --x-libraries=${STAGING_LIBDIR} \ - --with-mkfontdir=${STAGING_DIR}/${BUILD_SYS}/bin/mkfontdir" + --with-mkfontdir=${STAGING_BINDIR_NATIVE}/mkfontdir" pkg_postinst() { update-alternatives --install /usr/bin/x-window-manager x-window-manager /usr/bin/icewm-session 10 diff --git a/packages/icu/icu_3.6.bb b/packages/icu/icu_3.6.bb index 39162d2179..2e8dca925e 100644 --- a/packages/icu/icu_3.6.bb +++ b/packages/icu/icu_3.6.bb @@ -2,7 +2,7 @@ require icu-3.6.inc DEPENDS += "icu-native" -PR = "r1" +PR = "r2" do_configure_append() { for i in */Makefile */*.inc */*/Makefile */*/*.inc ; do @@ -13,6 +13,9 @@ do_configure_append() { sed -i -e 's:$(BINDIR)/::g' extra/uconv/pkgdata.inc.in || true } +do_install_append() { + chmod +x ${D}${libdir}/lib* +} PACKAGES =+ "libicudata libicuuc libicui18n libicule libiculx libicutu libicuio" diff --git a/packages/klibc/klibc.inc b/packages/klibc/klibc.inc index 4e86824eac..0ddcef82d9 100644 --- a/packages/klibc/klibc.inc +++ b/packages/klibc/klibc.inc @@ -54,13 +54,13 @@ do_configure () { ln -sf ${STAGING_KERNEL_DIR} linux } -STAGING_KLIBC_DIR = "${STAGING_DIR}/${HOST_SYS}/klibc" +STAGING_KLIBC_DIR = "${STAGING_DIR_HOST}/klibc" do_stage() { rm -rf "${STAGING_KLIBC_DIR}" oe_runmake 'prefix=${STAGING_KLIBC_DIR}' \ 'bindir=${STAGING_BINDIR}' \ - 'mandir=${STAGING_DIR}/${BUILD_SYS}/share/man' \ + 'mandir=${STAGING_DIR_HOST}${layout_mandir}' \ install # The following is sufficient, at least in klibc 1.1.1 to make klcc # use the staged libraries and include files. diff --git a/packages/libid3tag/libid3tag_0.15.1b.bb b/packages/libid3tag/libid3tag_0.15.1b.bb index 21f2c0f41d..c093ea5310 100644 --- a/packages/libid3tag/libid3tag_0.15.1b.bb +++ b/packages/libid3tag/libid3tag_0.15.1b.bb @@ -1,17 +1,17 @@ +DESCRIPTION = "Library for interacting with ID3 tags." SECTION = "libs" PRIORITY = "optional" DEPENDS = "zlib" -DESCRIPTION = "Library for interacting with ID3 tags." LICENSE = "GPL" +PR = "r1" SRC_URI = "${SOURCEFORGE_MIRROR}/mad/libid3tag-${PV}.tar.gz" S = "${WORKDIR}/libid3tag-${PV}" -inherit autotools +inherit autotools pkgconfig EXTRA_OECONF = "-enable-speed" do_stage() { - oe_libinstall -so libid3tag ${STAGING_LIBDIR} - install -m 0644 id3tag.h ${STAGING_INCDIR} + autotools_stage_all } diff --git a/packages/libol/libol_0.3.16.bb b/packages/libol/libol_0.3.16.bb index 2dc33b6f2a..1e4a1e9408 100644 --- a/packages/libol/libol_0.3.16.bb +++ b/packages/libol/libol_0.3.16.bb @@ -1,6 +1,6 @@ PR = "r5" -SRC_URI = "http://www.balabit.com/downloads/libol/0.3/${PN}-${PV}.tar.gz" +SRC_URI = "http://www.balabit.com/downloads/files/libol/0.3/${P}.tar.gz" S = "${WORKDIR}/${PN}-${PV}" inherit autotools diff --git a/packages/libol/libol_0.3.18.bb b/packages/libol/libol_0.3.18.bb index b8ad9b30ac..0b6518c43e 100644 --- a/packages/libol/libol_0.3.18.bb +++ b/packages/libol/libol_0.3.18.bb @@ -1,6 +1,6 @@ PR = "r7" -SRC_URI = "http://www.balabit.com/downloads/libol/0.3/${P}.tar.gz" +SRC_URI = "http://www.balabit.com/downloads/files/libol/0.3/${P}.tar.gz" S = "${WORKDIR}/${PN}-${PV}" diff --git a/packages/libsidplay/libsidplay_1.36.59.bb b/packages/libsidplay/libsidplay_1.36.59.bb index 5dbc34c158..fc9a01279c 100644 --- a/packages/libsidplay/libsidplay_1.36.59.bb +++ b/packages/libsidplay/libsidplay_1.36.59.bb @@ -8,11 +8,5 @@ SRC_URI = "http://www.geocities.com/SiliconValley/Lakes/5147/sidplay/packages/li inherit autotools do_stage() { - oe_libinstall -so -C src libsidplay ${STAGING_LIBDIR} - install -d ${STAGING_INCDIR}/sidplay - for f in src/compconf.h src/emucfg.h src/fformat.h src/fixpoint.h src/libcfg.h src/myendian.h src/mytypes.h src/player.h src/sidtune.h src/version.h - do - install -m 0644 $f ${STAGING_INCDIR}/sidplay/ - done + autotools_stage_all } - diff --git a/packages/libtool/libtool-cross_1.5.10.bb b/packages/libtool/libtool-cross_1.5.10.bb index fbb37d88d7..4c1b7c2e1f 100644 --- a/packages/libtool/libtool-cross_1.5.10.bb +++ b/packages/libtool/libtool-cross_1.5.10.bb @@ -11,8 +11,8 @@ SRC_URI_append = " file://libdir-la.patch;patch=1 \ file://install-path-check.patch;patch=1" S = "${WORKDIR}/libtool-${PV}" -prefix = "${STAGING_DIR}" -exec_prefix = "${prefix}/${BUILD_SYS}" +prefix = "${STAGING_DIR_NATIVE}${layout_prefix}" +exec_prefix = "${STAGING_DIR_NATIVE}${layout_exec_prefix}" bindir = "${STAGING_BINDIR_NATIVE}" do_compile () { diff --git a/packages/libtool/libtool-cross_1.5.22.bb b/packages/libtool/libtool-cross_1.5.22.bb index 8edb1f0a44..c91647b559 100644 --- a/packages/libtool/libtool-cross_1.5.22.bb +++ b/packages/libtool/libtool-cross_1.5.22.bb @@ -14,8 +14,8 @@ SRC_URI_append = " file://libdir-la.patch;patch=1 \ file://install-path-check.patch;patch=1" S = "${WORKDIR}/libtool-${PV}" -prefix = "${STAGING_DIR}" -exec_prefix = "${prefix}/${BUILD_SYS}" +prefix = "${STAGING_DIR_NATIVE}${layout_prefix}" +exec_prefix = "${STAGING_DIR_NATIVE}${layout_exec_prefix}" bindir = "${STAGING_BINDIR_NATIVE}" do_compile () { diff --git a/packages/libtool/libtool-cross_1.5.24.bb b/packages/libtool/libtool-cross_1.5.24.bb index f782982b88..e60db4b808 100644 --- a/packages/libtool/libtool-cross_1.5.24.bb +++ b/packages/libtool/libtool-cross_1.5.24.bb @@ -11,8 +11,8 @@ SRC_URI_append = " file://libdir-la.patch;patch=1 \ file://install-path-check.patch;patch=1" S = "${WORKDIR}/libtool-${PV}" -prefix = "${STAGING_DIR}" -exec_prefix = "${prefix}/${BUILD_SYS}" +prefix = "${STAGING_DIR_NATIVE}${layout_prefix}" +exec_prefix = "${STAGING_DIR_NATIVE}${layout_exec_prefix}" bindir = "${STAGING_BINDIR_NATIVE}" do_compile () { diff --git a/packages/linux/linux-2.6.23/mpc8323e-rdb/defconfig b/packages/linux/linux-2.6.23/mpc8323e-rdb/defconfig index 6d1c3e8420..407530a993 100644 --- a/packages/linux/linux-2.6.23/mpc8323e-rdb/defconfig +++ b/packages/linux/linux-2.6.23/mpc8323e-rdb/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.23-rc4 -# Tue Aug 28 21:27:19 2007 +# Linux kernel version: 2.6.23 +# Sat Nov 3 08:17:08 2007 # # CONFIG_PPC64 is not set @@ -83,7 +83,6 @@ CONFIG_FUTEX=y CONFIG_ANON_INODES=y # CONFIG_EPOLL is not set CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_VM_EVENT_COUNTERS=y @@ -98,7 +97,7 @@ CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_KMOD is not set +CONFIG_KMOD=y CONFIG_BLOCK=y # CONFIG_LBD is not set # CONFIG_BLK_DEV_IO_TRACE is not set @@ -185,6 +184,8 @@ CONFIG_VIRT_TO_BUS=y CONFIG_PROC_DEVICETREE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_PM is not set +CONFIG_SUSPEND_UP_POSSIBLE=y +CONFIG_HIBERNATION_UP_POSSIBLE=y CONFIG_SECCOMP=y CONFIG_WANT_DEVICE_TREE=y CONFIG_DEVICE_TREE="" @@ -242,55 +243,269 @@ CONFIG_XFRM=y # CONFIG_NET_KEY is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y -# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_ASK_IP_FIB_HASH=y +# CONFIG_IP_FIB_TRIE is not set CONFIG_IP_FIB_HASH=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y -# CONFIG_IP_PNP_RARP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set +CONFIG_IP_PNP_RARP=y +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +# CONFIG_NET_IPGRE_BROADCAST is not set # CONFIG_IP_MROUTE is not set # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_XFRM_TUNNEL is not set -# CONFIG_INET_TUNNEL is not set -CONFIG_INET_XFRM_MODE_TRANSPORT=y -CONFIG_INET_XFRM_MODE_TUNNEL=y -CONFIG_INET_XFRM_MODE_BEET=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_XFRM_MODE_BEET=m CONFIG_INET_DIAG=y CONFIG_INET_TCP_DIAG=y # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -# CONFIG_IPV6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set +# CONFIG_IP_VS is not set +CONFIG_IPV6=m +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_MIP6=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_INET6_XFRM_MODE_BEET=m +CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m +CONFIG_IPV6_SIT=m +CONFIG_IPV6_TUNNEL=m +# CONFIG_IPV6_MULTIPLE_TABLES is not set # CONFIG_NETWORK_SECMARK is not set -# CONFIG_NETFILTER is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NF_CONNTRACK_ENABLED=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CT_ACCT=y +CONFIG_NF_CONNTRACK_MARK=y +# CONFIG_NF_CONNTRACK_EVENTS is not set +CONFIG_NF_CT_PROTO_GRE=m +CONFIG_NF_CT_PROTO_SCTP=m +CONFIG_NF_CT_PROTO_UDPLITE=m +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_CONNTRACK_IPV4=m +CONFIG_NF_CONNTRACK_PROC_COMPAT=y +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_NF_NAT=m +CONFIG_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PROTO_GRE=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration (EXPERIMENTAL) +# +CONFIG_NF_CONNTRACK_IPV6=m +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set -# CONFIG_ATM is not set -# CONFIG_BRIDGE is not set -# CONFIG_VLAN_8021Q is not set +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m # CONFIG_DECNET is not set -# CONFIG_LLC2 is not set -# CONFIG_IPX is not set +CONFIG_LLC=m +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set +CONFIG_WAN_ROUTER=m # # QoS and/or fair queueing # -# CONFIG_NET_SCHED is not set +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_FIFO=y + +# +# Queueing/Scheduling +# +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RR=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_STACK=32 +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +# CONFIG_NET_CLS_POLICE is not set +CONFIG_NET_CLS_IND=y # # Network testing @@ -298,17 +513,48 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO is not set # CONFIG_IRDA is not set -# CONFIG_BT is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +# CONFIG_BT_CMTP is not set +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m # CONFIG_AF_RXRPC is not set +CONFIG_FIB_RULES=y # # Wireless # -# CONFIG_CFG80211 is not set -# CONFIG_WIRELESS_EXT is not set -# CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set -# CONFIG_RFKILL is not set +CONFIG_CFG80211=y +CONFIG_WIRELESS_EXT=y +CONFIG_MAC80211=m +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IEEE80211_SOFTMAC=m +# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set +CONFIG_RFKILL=m +CONFIG_RFKILL_INPUT=m # CONFIG_NET_9P is not set # @@ -320,10 +566,88 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_FW_LOADER is not set +CONFIG_FW_LOADER=m # CONFIG_SYS_HYPERVISOR is not set # CONFIG_CONNECTOR is not set -# CONFIG_MTD is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0xFE000000 +CONFIG_MTD_PHYSMAP_LEN=0x01000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_PHYSMAP_OF is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set CONFIG_OF_DEVICE=y # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y @@ -334,7 +658,7 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y -# CONFIG_BLK_DEV_CRYPTOLOOP is not set +CONFIG_BLK_DEV_CRYPTOLOOP=m # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_UB is not set @@ -343,10 +667,10 @@ CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=32768 CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 # CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set +CONFIG_ATA_OVER_ETH=m CONFIG_MISC_DEVICES=y # CONFIG_PHANTOM is not set -# CONFIG_EEPROM_93CX6 is not set +CONFIG_EEPROM_93CX6=m # CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_IDE is not set @@ -442,6 +766,7 @@ CONFIG_SCSI_LOWLEVEL=y # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y # CONFIG_NETDEVICES_MULTIQUEUE is not set +# CONFIG_IFB is not set # CONFIG_DUMMY is not set # CONFIG_BONDING is not set # CONFIG_MACVLAN is not set @@ -485,6 +810,7 @@ CONFIG_E1000=y # CONFIG_SIS190 is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set +# CONFIG_SK98LIN is not set # CONFIG_VIA_VELOCITY is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2 is not set @@ -510,7 +836,44 @@ CONFIG_NETDEV_10000=y # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set -# CONFIG_WLAN_80211 is not set +CONFIG_WLAN_80211=y +CONFIG_IPW2100=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG is not set +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +# CONFIG_LIBERTAS_DEBUG is not set +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m +CONFIG_PRISM54=m +CONFIG_USB_ZD1201=m +CONFIG_RTL8187=m +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_BCM43XX=m +CONFIG_BCM43XX_DEBUG=y +CONFIG_BCM43XX_DMA=y +CONFIG_BCM43XX_PIO=y +CONFIG_BCM43XX_DMA_AND_PIO_MODE=y +# CONFIG_BCM43XX_DMA_MODE is not set +# CONFIG_BCM43XX_PIO_MODE is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set # # USB Network Adapters @@ -522,16 +885,137 @@ CONFIG_NETDEV_10000=y # CONFIG_USB_USBNET_MII is not set # CONFIG_USB_USBNET is not set # CONFIG_WAN is not set +CONFIG_ATM_DRIVERS=y +# CONFIG_ATM_DUMMY is not set +# CONFIG_ATM_TCP is not set +# CONFIG_ATM_LANAI is not set +# CONFIG_ATM_ENI is not set +# CONFIG_ATM_FIRESTREAM is not set +# CONFIG_ATM_ZATM is not set +# CONFIG_ATM_NICSTAR is not set +# CONFIG_ATM_IDT77252 is not set +# CONFIG_ATM_AMBASSADOR is not set +# CONFIG_ATM_HORIZON is not set +# CONFIG_ATM_IA is not set +# CONFIG_ATM_FORE200E_MAYBE is not set +# CONFIG_ATM_HE is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set -# CONFIG_PPP is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_PPPOL2TP=m # CONFIG_SLIP is not set +CONFIG_SLHC=m # CONFIG_NET_FC is not set # CONFIG_SHAPER is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_ISDN is not set +CONFIG_ISDN=m +CONFIG_ISDN_I4L=m +# CONFIG_ISDN_PPP is not set +# CONFIG_ISDN_AUDIO is not set + +# +# ISDN feature submodules +# +CONFIG_ISDN_DRV_LOOP=m +CONFIG_ISDN_DIVERSION=m + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_HFC4S8S=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_HYSDN=m +CONFIG_HYSDN_CAPI=y +CONFIG_ISDN_DRV_GIGASET=m +CONFIG_GIGASET_BASE=m +CONFIG_GIGASET_M105=m +CONFIG_GIGASET_M101=m +# CONFIG_GIGASET_DEBUG is not set +CONFIG_GIGASET_UNDOCREQ=y +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_CAPI_TRACE=y +# CONFIG_ISDN_CAPI_MIDDLEWARE is not set +CONFIG_ISDN_CAPI_CAPI20=m +# CONFIG_ISDN_CAPI_CAPIDRV is not set + +# +# CAPI hardware drivers +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +# CONFIG_ISDN_DRV_AVMB1_B1PCIV4 is not set +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m # CONFIG_PHONE is not set # @@ -622,7 +1106,8 @@ CONFIG_GEN_RTC=y # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_TCG_TPM is not set +CONFIG_TCG_TPM=y +# CONFIG_TCG_ATMEL is not set CONFIG_DEVPORT=y CONFIG_I2C=y CONFIG_I2C_BOARDINFO=y @@ -684,8 +1169,21 @@ CONFIG_I2C_MPC=y # # SPI support # -# CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set +CONFIG_SPI=y +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_BITBANG=y +CONFIG_SPI_MPC83xx=y + +# +# SPI Protocol Masters +# +CONFIG_SPI_AT25=m +CONFIG_SPI_SPIDEV=m +CONFIG_SPI_TLE62X0=m # CONFIG_W1 is not set # CONFIG_POWER_SUPPLY is not set CONFIG_HWMON=y @@ -709,6 +1207,7 @@ CONFIG_HWMON=y # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set @@ -890,12 +1389,28 @@ CONFIG_USB_MON=y # # USB DSL modem support # +# CONFIG_USB_ATM is not set # # USB Gadget Support # # CONFIG_USB_GADGET is not set -# CONFIG_MMC is not set +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=m +CONFIG_MMC_BLOCK_BOUNCE=y + +# +# MMC/SD Host Controller Drivers +# +# CONFIG_MMC_SDHCI is not set +# CONFIG_MMC_WBSD is not set +# CONFIG_MMC_TIFM_SD is not set # CONFIG_NEW_LEDS is not set # CONFIG_INFINIBAND is not set # CONFIG_EDAC is not set @@ -904,15 +1419,17 @@ CONFIG_USB_MON=y # # DMA Engine support # -# CONFIG_DMA_ENGINE is not set +CONFIG_DMA_ENGINE=y # # DMA Clients # +CONFIG_NET_DMA=y # # DMA Devices # +# CONFIG_INTEL_IOATDMA is not set # # Userspace I/O @@ -946,7 +1463,7 @@ CONFIG_INOTIFY_USER=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set -# CONFIG_AUTOFS4_FS is not set +CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # @@ -963,7 +1480,9 @@ CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -# CONFIG_NTFS_FS is not set +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +CONFIG_NTFS_RW=y # # Pseudo filesystems @@ -988,7 +1507,16 @@ CONFIG_RAMFS=y # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set -# CONFIG_CRAMFS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set @@ -1003,18 +1531,27 @@ CONFIG_NFS_V3=y # CONFIG_NFS_V3_ACL is not set CONFIG_NFS_V4=y # CONFIG_NFS_DIRECTIO is not set -# CONFIG_NFSD is not set +CONFIG_NFSD=m +# CONFIG_NFSD_V3 is not set +CONFIG_NFSD_TCP=y CONFIG_ROOT_NFS=y CONFIG_LOCKD=y CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y # CONFIG_SUNRPC_BIND34 is not set CONFIG_RPCSEC_GSS_KRB5=y # CONFIG_RPCSEC_GSS_SPKM3 is not set -# CONFIG_SMB_FS is not set -# CONFIG_CIFS is not set +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_WEAK_PW_HASH is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_EXPERIMENTAL is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set @@ -1098,12 +1635,18 @@ CONFIG_UCC=y # Library routines # CONFIG_BITREVERSE=y -# CONFIG_CRC_CCITT is not set -# CONFIG_CRC16 is not set -# CONFIG_CRC_ITU_T is not set +CONFIG_CRC_CCITT=m +CONFIG_CRC16=m +CONFIG_CRC_ITU_T=m CONFIG_CRC32=y -# CONFIG_CRC7 is not set -# CONFIG_LIBCRC32C is not set +CONFIG_CRC7=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m CONFIG_PLIST=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y @@ -1112,7 +1655,8 @@ CONFIG_HAS_DMA=y # # Instrumentation Support # -# CONFIG_PROFILING is not set +CONFIG_PROFILING=y +CONFIG_OPROFILE=m # # Kernel hacking @@ -1134,39 +1678,42 @@ CONFIG_ENABLE_MUST_CHECK=y # CONFIG_SECURITY is not set CONFIG_CRYPTO=y CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ABLKCIPHER=m CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_HASH=m CONFIG_CRYPTO_MANAGER=y -# CONFIG_CRYPTO_HMAC is not set -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_NULL is not set -# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_HMAC=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=y -# CONFIG_CRYPTO_SHA1 is not set -# CONFIG_CRYPTO_SHA256 is not set -# CONFIG_CRYPTO_SHA512 is not set -# CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_GF128MUL=m CONFIG_CRYPTO_ECB=m CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_PCBC=m -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_LRW=m +CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_AES is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_ARC4 is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_ANUBIS is not set -# CONFIG_CRYPTO_DEFLATE is not set -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_CRC32C is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_FCRYPT=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_HW=y diff --git a/packages/linux/linux-bfin_svn.bb b/packages/linux/linux-bfin_svn.bb index ee5b04910f..d7402e606a 100644 --- a/packages/linux/linux-bfin_svn.bb +++ b/packages/linux/linux-bfin_svn.bb @@ -1,5 +1,7 @@ require linux.inc +COMPATIBLE_HOST = 'bfin.*-uclinux' + PV = "2.6.22.10+svnr${SRCREV}" SRC_URI = "svn://sources.blackfin.uclinux.org/linux-kernel/;module=trunk \ diff --git a/packages/linux/linux-ezx-2.6.23/a780/defconfig b/packages/linux/linux-ezx-2.6.23/a780/defconfig index 921fa94b69..c59efc8906 100755 --- a/packages/linux/linux-ezx-2.6.23/a780/defconfig +++ b/packages/linux/linux-ezx-2.6.23/a780/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.23.1 -# Wed Oct 24 18:00:57 2007 +# Wed Oct 31 09:05:11 2007 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -35,7 +35,7 @@ CONFIG_LOCK_KERNEL=y CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_LOCALVERSION="-ezxdev" # CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_SWAP is not set +CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y # CONFIG_POSIX_MQUEUE is not set @@ -43,7 +43,8 @@ CONFIG_SYSVIPC_SYSCTL=y # CONFIG_TASKSTATS is not set # CONFIG_USER_NS is not set # CONFIG_AUDIT is not set -# CONFIG_IKCONFIG is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=14 # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set @@ -52,7 +53,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_EMBEDDED=y CONFIG_UID16=y -# CONFIG_SYSCTL_SYSCALL is not set +CONFIG_SYSCTL_SYSCALL=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_EXTRA_PASS is not set CONFIG_HOTPLUG=y @@ -204,13 +205,13 @@ CONFIG_XSCALE_PMU=y # # Kernel Features # -# CONFIG_TICK_ONESHOT is not set +CONFIG_TICK_ONESHOT=y # CONFIG_NO_HZ is not set -# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_HIGH_RES_TIMERS=y CONFIG_PREEMPT=y CONFIG_HZ=100 CONFIG_AEABI=y -# CONFIG_OABI_COMPAT is not set +CONFIG_OABI_COMPAT=y # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y @@ -231,9 +232,9 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="console=tty1 noinitrd root=/dev/mmcblk0p2 rootfstype=ext2 ip=192.168.0.202:192.168.0.200:192.168.0.200:255.255.255.0 debug mem=32M@0xA0000000 mem=16M@0xAC000000" +CONFIG_CMDLINE="console=tty1 root=/dev/mmcblk0p2 rootfstype=ext2 rootdelay=1 ip=192.168.0.202:192.168.0.200:192.168.0.200:255.255.255.0 debug mem=32M@0xA0000000 mem=16M@0xAC000000" # CONFIG_XIP_KERNEL is not set -# CONFIG_KEXEC is not set +CONFIG_KEXEC=y # # Floating point emulation @@ -242,6 +243,8 @@ CONFIG_CMDLINE="console=tty1 noinitrd root=/dev/mmcblk0p2 rootfstype=ext2 ip=192 # # At least one emulation must be selected # +# CONFIG_FPE_NWFPE is not set +# CONFIG_FPE_FASTFPE is not set # # Userspace binary formats @@ -269,8 +272,12 @@ CONFIG_NET=y # Networking options # CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set +CONFIG_PACKET_MMAP=y CONFIG_UNIX=y +CONFIG_XFRM=y +# CONFIG_XFRM_USER is not set +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set # CONFIG_NET_KEY is not set CONFIG_INET=y # CONFIG_IP_MULTICAST is not set @@ -278,8 +285,8 @@ CONFIG_INET=y CONFIG_IP_FIB_HASH=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y -# CONFIG_IP_PNP_BOOTP is not set -# CONFIG_IP_PNP_RARP is not set +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set # CONFIG_ARPD is not set @@ -288,7 +295,7 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set -# CONFIG_INET_TUNNEL is not set +CONFIG_INET_TUNNEL=m # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set @@ -297,18 +304,169 @@ CONFIG_SYN_COOKIES=y CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set -# CONFIG_IPV6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set +# CONFIG_IP_VS is not set +CONFIG_IPV6=m +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_MIP6=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_INET6_XFRM_MODE_BEET=m +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=m +CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y # CONFIG_NETWORK_SECMARK is not set -# CONFIG_NETFILTER is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NF_CONNTRACK_ENABLED=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CT_ACCT=y +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_GRE=m +CONFIG_NF_CT_PROTO_SCTP=m +CONFIG_NF_CT_PROTO_UDPLITE=m +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_CONNTRACK_IPV4=m +CONFIG_NF_CONNTRACK_PROC_COMPAT=y +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_NF_NAT=m +CONFIG_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PROTO_GRE=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration (EXPERIMENTAL) +# +CONFIG_NF_CONNTRACK_IPV6=m +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set -# CONFIG_BRIDGE is not set +CONFIG_BRIDGE=m # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set +CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set @@ -321,6 +479,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # QoS and/or fair queueing # # CONFIG_NET_SCHED is not set +CONFIG_NET_SCH_FIFO=y +CONFIG_NET_CLS_ROUTE=y # # Network testing @@ -329,35 +489,45 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_HAMRADIO is not set # CONFIG_IRDA is not set CONFIG_BT=y -CONFIG_BT_L2CAP=y +CONFIG_BT_L2CAP=m CONFIG_BT_SCO=y -CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y -CONFIG_BT_BNEP=y +CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y -CONFIG_BT_HIDP=y +CONFIG_BT_HIDP=m # # Bluetooth device drivers # -# CONFIG_BT_HCIUSB is not set +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y CONFIG_BT_HCIUART=y CONFIG_BT_HCIUART_H4=y -# CONFIG_BT_HCIUART_BCSP is not set +CONFIG_BT_HCIUART_BCSP=y # CONFIG_BT_HCIBCM203X is not set # CONFIG_BT_HCIBPA10X is not set # CONFIG_BT_HCIBFUSB is not set # CONFIG_BT_HCIVHCI is not set # CONFIG_AF_RXRPC is not set +CONFIG_FIB_RULES=y # # Wireless # -# CONFIG_CFG80211 is not set -# CONFIG_WIRELESS_EXT is not set -# CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set +CONFIG_CFG80211=m +CONFIG_WIRELESS_EXT=y +CONFIG_MAC80211=m +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IEEE80211_SOFTMAC=m +# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set @@ -436,8 +606,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2 # CONFIG_MTD_ARM_INTEGRATOR is not set # CONFIG_MTD_SHARP_SL is not set CONFIG_MTD_EZX=y -CONFIG_MTD_EZX_A780=y -# CONFIG_MTD_EZX_A780_ALTERNATE is not set +# CONFIG_MTD_EZX_A780 is not set +CONFIG_MTD_EZX_A780_ALTERNATE=y # CONFIG_MTD_EZX_A1200 is not set # CONFIG_MTD_EZX_E2 is not set # CONFIG_MTD_EZX_E6 is not set @@ -470,10 +640,13 @@ CONFIG_MTD_EZX_A780=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=m -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_UB is not set -# CONFIG_BLK_DEV_RAM is not set +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_IDE is not set @@ -713,7 +886,22 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=y # # Multimedia devices # -# CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2=y +CONFIG_VIDEO_CAPTURE_DRIVERS=y +# CONFIG_VIDEO_ADV_DEBUG is not set +CONFIG_VIDEO_HELPER_CHIPS_AUTO=y +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_CPIA2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_TUNER_3036 is not set +# CONFIG_TUNER_TEA5761 is not set +# CONFIG_V4L_USB_DRIVERS is not set +CONFIG_RADIO_ADAPTERS=y +# CONFIG_USB_DSBR is not set # CONFIG_DVB_CORE is not set # CONFIG_DAB is not set @@ -779,7 +967,10 @@ CONFIG_FONT_MINI_4x6=y # CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN12x22 is not set # CONFIG_FONT_10x18 is not set -# CONFIG_LOGO is not set +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y # # Sound @@ -967,7 +1158,7 @@ CONFIG_USB_ETH=y # CONFIG_USB_MIDI_GADGET is not set CONFIG_MMC=y # CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_UNSAFE_RESUME is not set +CONFIG_MMC_UNSAFE_RESUME=y # # MMC/SD Card Drivers @@ -980,16 +1171,64 @@ CONFIG_MMC_BLOCK_BOUNCE=y # CONFIG_MMC_PXA=y CONFIG_RTC_LIB=y -# CONFIG_RTC_CLASS is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_SA1100=m # # DMA Engine support # -# CONFIG_DMA_ENGINE is not set +CONFIG_DMA_ENGINE=y # # DMA Clients # +CONFIG_NET_DMA=y # # DMA Devices @@ -1017,7 +1256,11 @@ CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_REISERFS_FS_SECURITY=y # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y -# CONFIG_XFS_FS is not set +CONFIG_XFS_FS=m +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_SECURITY is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_RT is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_MINIX_FS is not set @@ -1028,7 +1271,7 @@ CONFIG_INOTIFY_USER=y CONFIG_DNOTIFY=y CONFIG_AUTOFS_FS=y CONFIG_AUTOFS4_FS=y -# CONFIG_FUSE_FS is not set +CONFIG_FUSE_FS=m # # CD-ROM/DVD Filesystems @@ -1081,7 +1324,7 @@ CONFIG_CRAMFS=m # # Network File Systems # -CONFIG_NFS_FS=m +CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y # CONFIG_NFS_V4 is not set @@ -1092,12 +1335,13 @@ CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y # CONFIG_NFSD_V4 is not set CONFIG_NFSD_TCP=y -CONFIG_LOCKD=m +# CONFIG_ROOT_NFS is not set +CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=m -CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y -CONFIG_SUNRPC=m +CONFIG_SUNRPC=y # CONFIG_SUNRPC_BIND34 is not set # CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_RPCSEC_GSS_SPKM3 is not set @@ -1194,7 +1438,47 @@ CONFIG_FRAME_POINTER=y # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set -# CONFIG_CRYPTO is not set +CONFIG_CRYPTO=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_ABLKCIPHER=m +CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_HMAC=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +# CONFIG_CRYPTO_WP512 is not set +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_GF128MUL=m +CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_PCBC=m +CONFIG_CRYPTO_LRW=m +CONFIG_CRYPTO_CRYPTD=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_FCRYPT=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +# CONFIG_CRYPTO_ANUBIS is not set +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +# CONFIG_CRYPTO_CAMELLIA is not set +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_HW=y # # Library routines @@ -1208,6 +1492,10 @@ CONFIG_CRC32=y CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_DEFLATE=m +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m CONFIG_PLIST=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y diff --git a/packages/linux/linux-ezx_2.6.23.bb b/packages/linux/linux-ezx_2.6.23.bb index 72004ebf83..42624dd5a8 100644 --- a/packages/linux/linux-ezx_2.6.23.bb +++ b/packages/linux/linux-ezx_2.6.23.bb @@ -2,7 +2,7 @@ DESCRIPTION = "2.6 Linux Development Kernel for the Motorola GSM phones A780 and AUTHOR = "The OpenEZX Team <openezx-devel@lists.openezx.org>" HOMEPAGE = "http://www.openezx.org" EZX = "ezxdev" -PR = "${EZX}-r0" +PR = "${EZX}-r2" # unstable branch, use 2.6.21 if you want something working DEFAULT_PREFERENCE = "-99" @@ -90,7 +90,7 @@ COMPATIBLE_MACHINE = '(a780|e680|a1200|rorkre2|rokre6)' #CMDLINE_CON = "console=ttyS2,115200n8 console=tty1 " CMDLINE_CON = "console=tty1 " -CMDLINE_ROOT = "root=/dev/mmcblk0p2 rootfstype=ext2 rootdelay=1" +CMDLINE_ROOT = "root=/dev/mmcblk0p2 rootfstype=ext2 rootwait=1" CMDLINE_NFSROOT = "root=/dev/nfs rootfstype=nfs nfsroot=192.168.0.200:/export/ezx-image rootdelay=1 " # Uncomment to enable dyntick #CMDLINE_OTHER = "dyntick=enable" diff --git a/packages/linux/linux-openmoko-devel/fix-gta01-flowcontrol2-2.6.23.patch b/packages/linux/linux-openmoko-devel/fix-gta01-flowcontrol2-2.6.23.patch new file mode 100644 index 0000000000..deb31dacd9 --- /dev/null +++ b/packages/linux/linux-openmoko-devel/fix-gta01-flowcontrol2-2.6.23.patch @@ -0,0 +1,193 @@ +--- linux-2.6.23/arch/arm/common/gta01_pm_gsm.c.orig 2007-10-30 23:29:53.000000000 -0500 ++++ linux-2.6.23/arch/arm/common/gta01_pm_gsm.c 2007-10-30 23:35:44.000000000 -0500 +@@ -23,6 +23,9 @@ + #include <asm/arch/gta01.h> + #include <asm/arch/gta02.h> + ++#include <linux/serial_core.h> ++void s3c24xx_set_flow_control(struct uart_port *port, int fc_on); ++ + struct gta01pm_priv { + int gpio_ngsm_en; + struct console *con; +@@ -49,6 +52,23 @@ + static ssize_t gsm_read(struct device *dev, struct device_attribute *attr, + char *buf) + { ++ struct uart_driver *udrive = NULL; ++ struct uart_state *ustate = NULL; ++ struct uart_port *uport = NULL; ++ ++ if (gta01_gsm.con) { ++ udrive = gta01_gsm.con->data; ++ if (udrive) { ++ ustate = udrive->state; ++ if (ustate) { ++ uport = ustate->port; ++ } ++ } ++ } ++ printk("gsm: gsm_read of \"%s\"\n", attr->attr.name); ++ printk("gsm: con=%p udrive=%p ustate=%p uport=%p\n", ++ gta01_gsm.con, udrive, ustate, uport); ++ + if (!strcmp(attr->attr.name, "power_on")) { + if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON)) + goto out_1; +@@ -58,6 +78,24 @@ + } else if (!strcmp(attr->attr.name, "download")) { + if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_DNLOAD)) + goto out_1; ++ } else if (!strcmp(attr->attr.name, "flowcontrol")) { ++ if (uport) { ++ if (uport->unused[2] & 0x2) { ++ if (uport->unused[2] & 0x1) { ++ printk("gsm: flow control allowed and on\n"); ++ goto out_1; ++ } else { ++ printk("gsm: flow control allowed and not on\n"); ++ } ++ } else { ++ if (uport->unused[2] & 0x1) ++ printk("gsm: flow control not allowed, " ++ "but is pending\n"); ++ else ++ printk("gsm: flow control not allowed, " ++ "not pending\n"); ++ } ++ } + } + + return strlcpy(buf, "0\n", 3); +@@ -68,10 +106,26 @@ + static ssize_t gsm_write(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { ++ struct uart_driver *udrive = NULL; ++ struct uart_state *ustate = NULL; ++ struct uart_port *uport = NULL; ++ static int was_on = 0; + unsigned long on = simple_strtoul(buf, NULL, 10); + ++ if (gta01_gsm.con) { ++ udrive = gta01_gsm.con->data; ++ if (udrive) { ++ ustate = udrive->state; ++ if (ustate) { ++ uport = ustate->port; ++ } ++ } ++ } ++ printk("gsm: con=%p udrive=%p ustate=%p uport=%p\n", ++ gta01_gsm.con, udrive, ustate, uport); ++ + if (!strcmp(attr->attr.name, "power_on")) { +- if (on) { ++ if (on && !was_on) { + if (gta01_gsm.con) { + dev_info(dev, "powering up GSM, thus " + "disconnecting serial console\n"); +@@ -83,7 +137,24 @@ + s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 0); + + s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 1); +- } else { ++ ++ if (uport) { ++ /* set any pending flow-control mode */ ++ uport->unused[2] |= 0x2; ++ s3c24xx_set_flow_control(uport, ++ (uport->unused[2] & 0x1)); ++ dev_info(dev, "flow control allowed\n"); ++ } ++ ++ was_on = 1; ++ ++ } else if (!on && was_on) { ++ if (uport) { ++ uport->unused[2] &= ~0x2; ++ s3c24xx_set_flow_control(uport, 0); ++ dev_info(dev, "flow control not allowed\n"); ++ } ++ + s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 0); + + if (gta01_gsm.gpio_ngsm_en) +@@ -95,6 +166,8 @@ + dev_info(dev, "powered down GSM, thus enabling " + "serial console\n"); + } ++ ++ was_on = 0; + } + } else if (!strcmp(attr->attr.name, "reset")) { + s3c2410_gpio_setpin(GTA01_GPIO_MODEM_RST, on); +@@ -105,6 +178,7 @@ + return count; + } + ++static DEVICE_ATTR(flowcontrol, 0644, gsm_read, gsm_write); + static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write); + static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write); + static DEVICE_ATTR(download, 0644, gsm_read, gsm_write); +@@ -136,6 +210,7 @@ + #endif + + static struct attribute *gta01_gsm_sysfs_entries[] = { ++ &dev_attr_flowcontrol.attr, + &dev_attr_power_on.attr, + &dev_attr_reset.attr, + NULL, +--- linux-2.6.23/drivers/serial/s3c2410.c.orig 2007-10-30 23:31:59.000000000 -0500 ++++ linux-2.6.23/drivers/serial/s3c2410.c 2007-10-30 23:35:44.000000000 -0500 +@@ -80,6 +80,8 @@ + + #include <asm/plat-s3c/regs-serial.h> + #include <asm/arch/regs-gpio.h> ++#include <asm/mach-types.h> ++#include <asm/arch/gta01.h> + + /* structures */ + +@@ -729,6 +731,17 @@ + return best->quot; + } + ++/* This routine is called whenever the gta01 modem/console switches */ ++void s3c24xx_set_flow_control(struct uart_port *port, int fc_on) ++{ ++ unsigned int umcon; ++ if (machine_is_neo1973_gta01() && port) { ++ umcon = (fc_on) ? S3C2410_UMCOM_AFC : 0; ++ wr_regl(port, S3C2410_UMCON, umcon); ++ } ++} ++EXPORT_SYMBOL(s3c24xx_set_flow_control); ++ + static void s3c24xx_serial_set_termios(struct uart_port *port, + struct ktermios *termios, + struct ktermios *old) +@@ -803,6 +816,23 @@ + + umcon = (termios->c_cflag & CRTSCTS) ? S3C2410_UMCOM_AFC : 0; + ++ /* ++ * Custom handling of flow control on hwport 0 for the GTA01: ++ * Save the desired state for flow control, but if the port ++ * is being used as a console, then do not actually enable ++ * flow control unless the flag permiting us to do so is set. ++ */ ++ if (machine_is_neo1973_gta01() && (cfg->hwport == 0)) { ++ if (umcon) ++ port->unused[2] |= 0x1; ++ else ++ port->unused[2] &= ~0x1; ++ if (port->cons && (port->cons->index >= 0)) { ++ if (!(port->unused[2] & 0x2)) ++ umcon = 0; ++ } ++ } ++ + if (termios->c_cflag & PARENB) { + if (termios->c_cflag & PARODD) + ulcon |= S3C2410_LCON_PODD; diff --git a/packages/linux/linux-openmoko-devel_svn+2.6.23.1.bb b/packages/linux/linux-openmoko-devel_svn+2.6.23.1.bb index 6be1a2382f..5cca31d74b 100644 --- a/packages/linux/linux-openmoko-devel_svn+2.6.23.1.bb +++ b/packages/linux/linux-openmoko-devel_svn+2.6.23.1.bb @@ -11,7 +11,7 @@ KERNEL_RELEASE = "2.6.23.1" KERNEL_VERSION = "${KERNEL_RELEASE}" PV = "${KERNEL_RELEASE}+svnr${SRCREV}" -PR = "r2" +PR = "r3" KERNEL_IMAGETYPE = "uImage" UBOOT_ENTRYPOINT = "30008000" @@ -29,6 +29,7 @@ SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${VANILLA_VERSION}.ta file://fix-EVIOCGRAB-semantics-2.6.22.5.patch;patch=1 \ # file://printascii-2.6.23.patch;patch=1 \ file://hack-gta02-cpu.patch;patch=1 \ + file://fix-gta01-flowcontrol2-2.6.23.patch;patch=1 \ file://defconfig-2.6.23.1 \ file://logo_linux_clut224.ppm" S = "${WORKDIR}/linux-${VANILLA_VERSION}" @@ -61,24 +62,7 @@ do_prepatch() { mv ${WORKDIR}/patches ${S}/patches && cd ${S} && quilt push -av mv patches patches.openmoko mv .pc .pc.old - mv ${WORKDIR}/defconfig-${KERNEL_VERSION} ${WORKDIR}/defconfig + mv ${WORKDIR}/defconfig-${KERNEL_VERSION} ${WORKDIR}/defconfig } addtask prepatch after do_unpack before do_patch - -############################################################### -# put into deploy directory and append u-boot header -# -do_deploy() { - install -d ${DEPLOY_DIR_IMAGE} - install -m 0644 arch/${ARCH}/boot/${KERNEL_IMAGETYPE} ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${PV}-${PR}-${MACHINE}.bin - tar -cvzf ${DEPLOY_DIR_IMAGE}/modules-${KERNEL_RELEASE}-${PR}-${MACHINE}.tgz -C ${D} lib - ${OBJCOPY} -O binary -R .note -R .comment -S vmlinux linux.bin - rm -f linux.bin.gz - gzip -9 linux.bin - ${STAGING_BINDIR_NATIVE}/uboot-mkimage -A arm -O linux -T kernel -C gzip -a 30008000 -e 30008000 -n "OpenMoko Kernel Image Neo1973" \ - -d linux.bin.gz ${DEPLOY_DIR_IMAGE}/uImage-${PV}-${PR}-${MACHINE}.bin - ln -sf ${DEPLOY_DIR_IMAGE}/uImage-${PV}-${PR}-${MACHINE}.bin ${DEPLOY_DIR_IMAGE}/uImage-${MACHINE}-latest.bin - rm -f linux.bin.gz -} - diff --git a/packages/linux/linux-openmoko/fix-gta01-flowcontrol2-2.6.22.5.patch b/packages/linux/linux-openmoko/fix-gta01-flowcontrol2-2.6.22.5.patch new file mode 100644 index 0000000000..ddb58f0cdb --- /dev/null +++ b/packages/linux/linux-openmoko/fix-gta01-flowcontrol2-2.6.22.5.patch @@ -0,0 +1,193 @@ +--- linux-2.6.22.5/arch/arm/common/gta01_pm_gsm.c.orig 2007-09-27 11:23:20.000000000 -0500 ++++ linux-2.6.22.5/arch/arm/common/gta01_pm_gsm.c 2007-09-27 21:09:00.000000000 -0500 +@@ -23,6 +23,9 @@ + #include <asm/arch/gta01.h> + #include <asm/arch/gta02.h> + ++#include <linux/serial_core.h> ++void s3c24xx_set_flow_control(struct uart_port *port, int fc_on); ++ + struct gta01pm_priv { + int gpio_ngsm_en; + struct console *con; +@@ -49,6 +52,23 @@ + static ssize_t gsm_read(struct device *dev, struct device_attribute *attr, + char *buf) + { ++ struct uart_driver *udrive = NULL; ++ struct uart_state *ustate = NULL; ++ struct uart_port *uport = NULL; ++ ++ if (gta01_gsm.con) { ++ udrive = gta01_gsm.con->data; ++ if (udrive) { ++ ustate = udrive->state; ++ if (ustate) { ++ uport = ustate->port; ++ } ++ } ++ } ++ printk("gsm: gsm_read of \"%s\"\n", attr->attr.name); ++ printk("gsm: con=%p udrive=%p ustate=%p uport=%p\n", ++ gta01_gsm.con, udrive, ustate, uport); ++ + if (!strcmp(attr->attr.name, "power_on")) { + if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON)) + goto out_1; +@@ -58,6 +78,24 @@ + } else if (!strcmp(attr->attr.name, "download")) { + if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_DNLOAD)) + goto out_1; ++ } else if (!strcmp(attr->attr.name, "flowcontrol")) { ++ if (uport) { ++ if (uport->unused[2] & 0x2) { ++ if (uport->unused[2] & 0x1) { ++ printk("gsm: flow control allowed and on\n"); ++ goto out_1; ++ } else { ++ printk("gsm: flow control allowed and not on\n"); ++ } ++ } else { ++ if (uport->unused[2] & 0x1) ++ printk("gsm: flow control not allowed, " ++ "but is pending\n"); ++ else ++ printk("gsm: flow control not allowed, " ++ "not pending\n"); ++ } ++ } + } + + return strlcpy(buf, "0\n", 3); +@@ -68,10 +106,26 @@ + static ssize_t gsm_write(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) + { ++ struct uart_driver *udrive = NULL; ++ struct uart_state *ustate = NULL; ++ struct uart_port *uport = NULL; ++ static int was_on = 0; + unsigned long on = simple_strtoul(buf, NULL, 10); + ++ if (gta01_gsm.con) { ++ udrive = gta01_gsm.con->data; ++ if (udrive) { ++ ustate = udrive->state; ++ if (ustate) { ++ uport = ustate->port; ++ } ++ } ++ } ++ printk("gsm: con=%p udrive=%p ustate=%p uport=%p\n", ++ gta01_gsm.con, udrive, ustate, uport); ++ + if (!strcmp(attr->attr.name, "power_on")) { +- if (on) { ++ if (on && !was_on) { + if (gta01_gsm.con) { + dev_info(dev, "powering up GSM, thus " + "disconnecting serial console\n"); +@@ -83,7 +137,24 @@ + s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 0); + + s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 1); +- } else { ++ ++ if (uport) { ++ /* set any pending flow-control mode */ ++ uport->unused[2] |= 0x2; ++ s3c24xx_set_flow_control(uport, ++ (uport->unused[2] & 0x1)); ++ dev_info(dev, "flow control allowed\n"); ++ } ++ ++ was_on = 1; ++ ++ } else if (!on && was_on) { ++ if (uport) { ++ uport->unused[2] &= ~0x2; ++ s3c24xx_set_flow_control(uport, 0); ++ dev_info(dev, "flow control not allowed\n"); ++ } ++ + s3c2410_gpio_setpin(GTA01_GPIO_MODEM_ON, 0); + + if (gta01_gsm.gpio_ngsm_en) +@@ -95,6 +166,8 @@ + dev_info(dev, "powered down GSM, thus enabling " + "serial console\n"); + } ++ ++ was_on = 0; + } + } else if (!strcmp(attr->attr.name, "reset")) { + s3c2410_gpio_setpin(GTA01_GPIO_MODEM_RST, on); +@@ -105,6 +178,7 @@ + return count; + } + ++static DEVICE_ATTR(flowcontrol, 0644, gsm_read, gsm_write); + static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write); + static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write); + static DEVICE_ATTR(download, 0644, gsm_read, gsm_write); +@@ -136,6 +210,7 @@ + #endif + + static struct attribute *gta01_gsm_sysfs_entries[] = { ++ &dev_attr_flowcontrol.attr, + &dev_attr_power_on.attr, + &dev_attr_reset.attr, + NULL, +--- linux-2.6.22.5/drivers/serial/s3c2410.c.orig 2007-09-27 11:23:27.000000000 -0500 ++++ linux-2.6.22.5/drivers/serial/s3c2410.c 2007-09-27 21:07:21.000000000 -0500 +@@ -80,6 +80,8 @@ + + #include <asm/arch/regs-serial.h> + #include <asm/arch/regs-gpio.h> ++#include <asm/mach-types.h> ++#include <asm/arch/gta01.h> + + /* structures */ + +@@ -729,6 +731,17 @@ + return best->quot; + } + ++/* This routine is called whenever the gta01 modem/console switches */ ++void s3c24xx_set_flow_control(struct uart_port *port, int fc_on) ++{ ++ unsigned int umcon; ++ if (machine_is_neo1973_gta01() && port) { ++ umcon = (fc_on) ? S3C2410_UMCOM_AFC : 0; ++ wr_regl(port, S3C2410_UMCON, umcon); ++ } ++} ++EXPORT_SYMBOL(s3c24xx_set_flow_control); ++ + static void s3c24xx_serial_set_termios(struct uart_port *port, + struct ktermios *termios, + struct ktermios *old) +@@ -803,6 +816,23 @@ + + umcon = (termios->c_cflag & CRTSCTS) ? S3C2410_UMCOM_AFC : 0; + ++ /* ++ * Custom handling of flow control on hwport 0 for the GTA01: ++ * Save the desired state for flow control, but if the port ++ * is being used as a console, then do not actually enable ++ * flow control unless the flag permiting us to do so is set. ++ */ ++ if (machine_is_neo1973_gta01() && (cfg->hwport == 0)) { ++ if (umcon) ++ port->unused[2] |= 0x1; ++ else ++ port->unused[2] &= ~0x1; ++ if (port->cons && (port->cons->index >= 0)) { ++ if (!(port->unused[2] & 0x2)) ++ umcon = 0; ++ } ++ } ++ + if (termios->c_cflag & PARENB) { + if (termios->c_cflag & PARODD) + ulcon |= S3C2410_LCON_PODD; diff --git a/packages/linux/linux-openmoko_2.6.22.5.bb b/packages/linux/linux-openmoko_2.6.22.5.bb index 239400df15..348537e4d2 100644 --- a/packages/linux/linux-openmoko_2.6.22.5.bb +++ b/packages/linux/linux-openmoko_2.6.22.5.bb @@ -9,7 +9,7 @@ KERNEL_RELEASE = "2.6.22.5" #PV = "${VANILLA_VERSION}+${KERNEL_RELEASE}-moko11+svnr${SRCREV}" PV = "${KERNEL_RELEASE}-moko11+svnr${SRCREV}" -PR = "r5" +PR = "r6" KERNEL_IMAGETYPE = "uImage" UBOOT_ENTRYPOINT = "30008000" @@ -23,6 +23,7 @@ SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${VANILLA_VERSION}.ta ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/patch-${KERNEL_RELEASE}.bz2;patch=1 \ svn://svn.openmoko.org/trunk/src/target/kernel;module=patches;proto=http \ file://fix-EVIOCGRAB-semantics-2.6.22.5.patch;patch=1 \ + file://fix-gta01-flowcontrol2-2.6.22.5.patch;patch=1 \ file://defconfig-${KERNEL_RELEASE}" S = "${WORKDIR}/linux-${VANILLA_VERSION}" diff --git a/packages/linux/linux-rp-2.6.17/defconfig-tosa b/packages/linux/linux-rp-2.6.17/defconfig-tosa index 4144e5cf38..b2ac915e07 100644 --- a/packages/linux/linux-rp-2.6.17/defconfig-tosa +++ b/packages/linux/linux-rp-2.6.17/defconfig-tosa @@ -794,7 +794,8 @@ CONFIG_TOUCHSCREEN_WM97XX=y CONFIG_TOUCHSCREEN_WM9712=y # CONFIG_TOUCHSCREEN_WM9713 is not set # CONFIG_TOUCHSCREEN_WM97XX_PXA is not set -# CONFIG_INPUT_MISC is not set +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m # # Hardware I/O ports diff --git a/packages/linux/linux-rp-2.6.22/defconfig-tosa b/packages/linux/linux-rp-2.6.22/defconfig-tosa index 74fc076608..ef44385067 100644 --- a/packages/linux/linux-rp-2.6.22/defconfig-tosa +++ b/packages/linux/linux-rp-2.6.22/defconfig-tosa @@ -262,6 +262,9 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_XFRM_MODE_BEET=m CONFIG_INET_DIAG=m CONFIG_INET_TCP_DIAG=m # CONFIG_TCP_CONG_ADVANCED is not set @@ -792,9 +795,11 @@ CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_WM97XX=y # CONFIG_TOUCHSCREEN_WM9705 is not set CONFIG_TOUCHSCREEN_WM9712=y +CONFIG_TOUCHSCREEN_TOSA=y # CONFIG_TOUCHSCREEN_WM9713 is not set # CONFIG_TOUCHSCREEN_WM97XX_PXA is not set -# CONFIG_INPUT_MISC is not set +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m # # Hardware I/O ports @@ -1040,7 +1045,7 @@ CONFIG_SND_SUPPORT_OLD_API=y # # Generic devices # -CONFIG_SND_AC97_BUS=y +CONFIG_AC97_BUS=y CONFIG_SND_DUMMY=m # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set @@ -1072,15 +1077,15 @@ CONFIG_SND_SOC=y # # SoC Audio for the Intel PXA2xx # -CONFIG_SND_PXA2xx_SOC=y -CONFIG_SND_PXA2xx_SOC_AC97=y -# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set -# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set -# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set -# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set -# CONFIG_SND_PXA2xx_SOC_CORGI is not set -# CONFIG_SND_PXA2xx_SOC_SPITZ is not set -CONFIG_SND_PXA2xx_SOC_TOSA=y +CONFIG_SND_PXA2XX_SOC=y +CONFIG_SND_PXA2XX_SOC_AC97=y +# CONFIG_SND_PXA2XX_SOC_MAINSTONE is not set +# CONFIG_SND_PXA2XX_SOC_MAINSTONE_WM8753 is not set +# CONFIG_SND_PXA2XX_SOC_MAINSTONE_WM9713 is not set +# CONFIG_SND_PXA2XX_SOC_MAINSTONE_WM9712 is not set +# CONFIG_SND_PXA2XX_SOC_CORGI is not set +# CONFIG_SND_PXA2XX_SOC_SPITZ is not set +CONFIG_SND_PXA2XX_SOC_TOSA=y # # Soc Codecs @@ -1572,6 +1577,7 @@ CONFIG_DEBUG_ERRORS=y # Cryptographic options # CONFIG_CRYPTO=y +CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m diff --git a/packages/linux/linux-rp-2.6.22/sharpsl-pm-postresume-r1.patch b/packages/linux/linux-rp-2.6.22/sharpsl-pm-postresume-r1.patch new file mode 100644 index 0000000000..409daf03e6 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/sharpsl-pm-postresume-r1.patch @@ -0,0 +1,30 @@ + arch/arm/common/sharpsl_pm.c | 3 +++ + include/asm-arm/hardware/sharpsl_pm.h | 1 + + 2 files changed, 4 insertions(+) + +Index: git/include/asm-arm/hardware/sharpsl_pm.h +=================================================================== +--- git.orig/include/asm-arm/hardware/sharpsl_pm.h 2006-10-31 16:09:33.000000000 +0000 ++++ git/include/asm-arm/hardware/sharpsl_pm.h 2006-11-07 22:08:41.000000000 +0000 +@@ -26,6 +26,7 @@ struct sharpsl_charger_machinfo { + void (*presuspend)(void); + void (*postsuspend)(void); + void (*earlyresume)(void); ++ void (*postresume)(void); + unsigned long (*read_devdata)(int); + #define SHARPSL_BATT_VOLT 1 + #define SHARPSL_BATT_TEMP 2 +Index: git/arch/arm/common/sharpsl_pm.c +=================================================================== +--- git.orig/arch/arm/common/sharpsl_pm.c 2006-11-07 22:03:48.000000000 +0000 ++++ git/arch/arm/common/sharpsl_pm.c 2006-11-07 22:04:20.000000000 +0000 +@@ -584,6 +584,9 @@ static int corgi_pxa_pm_enter(suspend_st + if (sharpsl_pm.machinfo->earlyresume) + sharpsl_pm.machinfo->earlyresume(); + ++ if (sharpsl_pm.machinfo->postresume) ++ sharpsl_pm.machinfo->postresume(); ++ + dev_dbg(sharpsl_pm.dev, "SharpSL resuming...\n"); + + return 0; diff --git a/packages/linux/linux-rp-2.6.22/tmio-fb-r6-fix-r0.patch b/packages/linux/linux-rp-2.6.22/tmio-fb-r6-fix-r0.patch new file mode 100644 index 0000000000..eab57c50e8 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tmio-fb-r6-fix-r0.patch @@ -0,0 +1,45 @@ +From 302745ce6f3bab7b1a97de32339405ae3fd8eacb Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 00:05:54 +0400 +Subject: [PATCH] tmio-fb-r6.patch fixes + +--- + drivers/video/tmiofb.c | 8 ++++---- + 1 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c +index 10b0105..72eb76c 100644 +--- a/drivers/video/tmiofb.c ++++ b/drivers/video/tmiofb.c +@@ -463,8 +463,8 @@ static int tmiofb_vblank (struct fb_info *fbi, struct fb_vblank *vblank) + #define FBIO_TMIO_ACC_WRITE 0x7C639300 + #define FBIO_TMIO_ACC_SYNC 0x7C639301 + +-static int tmiofb_ioctl (struct inode *inode, struct file *file, +- unsigned int cmd, unsigned long arg, struct fb_info *fbi) ++static int tmiofb_ioctl (struct fb_info *fbi, ++ unsigned int cmd, unsigned long arg) + { + switch (cmd) { + case FBIOGET_VBLANK: { +@@ -677,7 +677,7 @@ static struct fb_ops tmiofb_ops_acc = { + * 2000 0002 display start + * 2000 0004 line number match (0x1ff mask???) + */ +-static irqreturn_t tmiofb_irq (int irq, void *__fbi, struct pt_regs *r) ++static irqreturn_t tmiofb_irq (int irq, void *__fbi) + { + struct fb_info* fbi = __fbi; + struct tmiofb_par* par = fbi->par; +@@ -762,7 +762,7 @@ static int __init tmiofb_probe (struct device *dev) + } + fbi->screen_base = par->sram; + +- retval = request_irq (irq->start, &tmiofb_irq, SA_INTERRUPT, ++ retval = request_irq (irq->start, &tmiofb_irq, IRQF_DISABLED, + TMIO_NAME_LCD, fbi); + if (retval) + goto err_request_irq; +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.22/tmio-nand-r8.patch b/packages/linux/linux-rp-2.6.22/tmio-nand-r8.patch new file mode 100644 index 0000000000..a71fd114a8 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tmio-nand-r8.patch @@ -0,0 +1,594 @@ + drivers/mtd/nand/Kconfig | 7 + + drivers/mtd/nand/Makefile | 1 + + drivers/mtd/nand/tmio.c | 554 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 562 insertions(+), 0 deletions(-) + +diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig +index f1d60b6..b9c8796 100644 +--- a/drivers/mtd/nand/Kconfig ++++ b/drivers/mtd/nand/Kconfig +@@ -69,6 +69,13 @@ config MTD_NAND_AMS_DELTA + help + Support for NAND flash on Amstrad E3 (Delta). + ++config MTD_NAND_TMIO ++ tristate "NAND Flash device on Toshiba Mobile IO Controller" ++ depends on MTD_NAND && TOSHIBA_TC6393XB ++ help ++ Support for NAND flash connected to a Toshiba Mobile IO ++ Controller in some PDAs, including the Sharp SL6000x. ++ + config MTD_NAND_TOTO + tristate "NAND Flash device on TOTO board" + depends on ARCH_OMAP && BROKEN +diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile +index edba1db..64f24e1 100644 +--- a/drivers/mtd/nand/Makefile ++++ b/drivers/mtd/nand/Makefile +@@ -27,5 +27,6 @@ obj-$(CONFIG_MTD_NAND_AT91) += at91_nand.o + obj-$(CONFIG_MTD_NAND_CM_X270) += cmx270_nand.o + obj-$(CONFIG_MTD_NAND_BASLER_EXCITE) += excite_nandflash.o + obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o ++obj-$(CONFIG_MTD_NAND_TMIO) += tmio.o + + nand-objs := nand_base.o nand_bbt.o +diff --git a/drivers/mtd/nand/tmio.c b/drivers/mtd/nand/tmio.c +new file mode 100644 +index 0000000..d196553 +--- /dev/null ++++ b/drivers/mtd/nand/tmio.c +@@ -0,0 +1,554 @@ ++/* ++ * A device driver for NAND flash connected to a Toshiba Mobile IO ++ * controller. This is known to work with the following variants: ++ * TC6393XB revision 3 ++ * ++ * Maintainer: Chris Humbert <mahadri+mtd@drigon.com> ++ * ++ * Copyright (C) 2005 Chris Humbert ++ * Copyright (C) 2005 Dirk Opfer ++ * Copyright (C) 2004 SHARP ++ * Copyright (C) 2002 Lineo Japan, Inc. ++ * Copyright (C) Ian Molton and Sebastian Carlier ++ * ++ * Based on Sharp's NAND driver, sharp_sl_tc6393.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/module.h> ++#include <linux/types.h> ++#include <linux/delay.h> ++#include <linux/wait.h> ++#include <linux/ioport.h> ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/nand.h> ++#include <linux/mtd/nand_ecc.h> ++#include <linux/mtd/partitions.h> ++#include <asm/io.h> ++#include <asm/hardware/tmio.h> ++ ++#include <linux/interrupt.h> ++ ++#define mtd_printk(level, mtd, format, arg...) \ ++ printk (level "%s: " format, mtd->name, ## arg) ++#define mtd_warn(mtd, format, arg...) \ ++ mtd_printk (KERN_WARNING, mtd, format, ## arg) ++ ++/*--------------------------------------------------------------------------*/ ++ ++/* tmio_nfcr.mode Register Command List */ ++#define FCR_MODE_DATA 0x94 // Data Data_Mode ++#define FCR_MODE_COMMAND 0x95 // Data Command_Mode ++#define FCR_MODE_ADDRESS 0x96 // Data Address_Mode ++ ++#define FCR_MODE_HWECC_CALC 0xB4 // HW-ECC Data ++#define FCR_MODE_HWECC_RESULT 0xD4 // HW-ECC Calculation Result Read_Mode ++#define FCR_MODE_HWECC_RESET 0xF4 // HW-ECC Reset ++ ++#define FCR_MODE_POWER_ON 0x0C // Power Supply ON to SSFDC card ++#define FCR_MODE_POWER_OFF 0x08 // Power Supply OFF to SSFDC card ++ ++#define FCR_MODE_LED_OFF 0x00 // LED OFF ++#define FCR_MODE_LED_ON 0x04 // LED ON ++ ++#define FCR_MODE_EJECT_ON 0x68 // Ejection Demand from Penguin is Advanced ++#define FCR_MODE_EJECT_OFF 0x08 // Ejection Demand from Penguin is Not Advanced ++ ++#define FCR_MODE_LOCK 0x6C // Operates By Lock_Mode. Ejection Switch is Invalid ++#define FCR_MODE_UNLOCK 0x0C // Operates By UnLock_Mode.Ejection Switch is Effective ++ ++#define FCR_MODE_CONTROLLER_ID 0x40 // Controller ID Read ++#define FCR_MODE_STANDBY 0x00 // SSFDC card Changes Standby State ++ ++#define FCR_MODE_WE 0x80 ++#define FCR_MODE_ECC1 0x40 ++#define FCR_MODE_ECC0 0x20 ++#define FCR_MODE_CE 0x10 ++#define FCR_MODE_PCNT1 0x08 ++#define FCR_MODE_PCNT0 0x04 ++#define FCR_MODE_ALE 0x02 ++#define FCR_MODE_CLE 0x01 ++ ++#define FCR_STATUS_BUSY 0x80 ++ ++/* ++ * NAND Flash Host Controller Configuration Register ++ */ ++struct tmio_nfhccr { ++ u8 x00[4]; ++ u16 command; /* 0x04 Command */ ++ u8 x01[0x0a]; ++ u16 base[2]; /* 0x10 NAND Flash Control Reg Base Addr*/ ++ u8 x02[0x29]; ++ u8 intp; /* 0x3d Interrupt Pin */ ++ u8 x03[0x0a]; ++ u8 inte; /* 0x48 Interrupt Enable */ ++ u8 x04; ++ u8 ec; /* 0x4a Event Control */ ++ u8 x05; ++ u8 icc; /* 0x4c Internal Clock Control */ ++ u8 x06[0x0e]; ++ u8 eccc; /* 0x5b ECC Control */ ++ u8 x07[4]; ++ u8 nftc; /* 0x60 NAND Flash Transaction Control */ ++ u8 nfm; /* 0x61 NAND Flash Monitor */ ++ u8 nfpsc; /* 0x62 NAND Flash Power Supply Control */ ++ u8 nfdc; /* 0x63 NAND Flash Detect Control */ ++ u8 x08[0x9c]; ++} __attribute__ ((packed)); ++ ++/* ++ * NAND Flash Control Register ++ */ ++struct tmio_nfcr { ++union { ++ u8 u8; /* 0x00 Data Register */ ++ u16 u16; ++ u32 u32; ++} __attribute__ ((packed)); ++ u8 mode; /* 0x04 Mode Register */ ++ u8 status; /* 0x05 Status Register */ ++ u8 isr; /* 0x06 Interrupt Status Register */ ++ u8 imr; /* 0x07 Interrupt Mask Register */ ++} __attribute__ ((packed)); ++ ++struct tmio_nand { ++ struct mtd_info mtd; ++ struct nand_chip chip; ++ ++ struct tmio_nfhccr __iomem * ccr; ++ struct tmio_nfcr __iomem * fcr; ++ ++ unsigned int irq; ++ ++ /* for tmio_nand_read_byte */ ++ u8 read; ++ unsigned read_good:1; ++}; ++ ++#define mtd_to_tmio(m) container_of(m, struct tmio_nand, mtd) ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void tmio_nand_hwcontrol(struct mtd_info *mtd, int cmd, ++ unsigned int ctrl) ++{ ++ struct tmio_nand *tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem *fcr = tmio->fcr; ++ struct nand_chip *chip = mtd->priv; ++ ++ if (ctrl & NAND_CTRL_CHANGE) { ++ u8 mode; ++ ++ if (ctrl & NAND_NCE) { ++ mode = FCR_MODE_DATA; ++ ++ if (ctrl & NAND_CLE) ++ mode |= FCR_MODE_CLE; ++ else ++ mode &= ~FCR_MODE_CLE; ++ ++ if (ctrl & NAND_ALE) ++ mode |= FCR_MODE_ALE; ++ else ++ mode &= ~FCR_MODE_ALE; ++ } else { ++ mode = FCR_MODE_STANDBY; ++ } ++ ++ iowrite8 (mode, &fcr->mode); ++ tmio->read_good = 0; ++ } ++ ++ if (cmd != NAND_CMD_NONE) ++ writeb(cmd, chip->IO_ADDR_W); ++} ++ ++static int tmio_nand_dev_ready (struct mtd_info* mtd) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ return !(ioread8 (&fcr->status) & FCR_STATUS_BUSY); ++} ++ ++static irqreturn_t tmio_irq (int irq, void *__tmio) ++{ ++ struct tmio_nand* tmio = __tmio; ++ struct nand_chip* this = &tmio->chip; ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ /* disable RDYREQ interrupt */ ++ iowrite8 (0x00, &fcr->imr); ++ ++ if (unlikely (!waitqueue_active (&this->controller->wq))) ++ printk (KERN_WARNING TMIO_NAME_NAND ": spurious interrupt\n"); ++ ++ wake_up (&this->controller->wq); ++ return IRQ_HANDLED; ++} ++ ++/* ++ * The TMIO core has a RDYREQ interrupt on the posedge of #SMRB. ++ * This interrupt is normally disabled, but for long operations like ++ * erase and write, we enable it to wake us up. The irq handler ++ * disables the interrupt. ++ */ ++static int ++tmio_nand_wait (struct mtd_info *mtd, struct nand_chip *this) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ long timeout; ++ ++ /* enable RDYREQ interrupt */ ++ iowrite8 (0x0f, &fcr->isr); ++ iowrite8 (0x81, &fcr->imr); ++ ++ timeout = wait_event_timeout (this->controller->wq, tmio_nand_dev_ready (mtd), ++ msecs_to_jiffies (this->state == FL_ERASING ? 400 : 20)); ++ ++ if (unlikely (!tmio_nand_dev_ready (mtd))) { ++ iowrite8 (0x00, &fcr->imr); ++ mtd_warn (mtd, "still busy with %s after %d ms\n", ++ this->state == FL_ERASING ? "erase" : "program", ++ this->state == FL_ERASING ? 400 : 20); ++ ++ } else if (unlikely (!timeout)) { ++ iowrite8 (0x00, &fcr->imr); ++ mtd_warn (mtd, "timeout waiting for interrupt\n"); ++ } ++ ++ this->cmdfunc (mtd, NAND_CMD_STATUS, -1, -1); ++ return this->read_byte (mtd); ++} ++ ++/* ++ * The TMIO controller combines two 8-bit data bytes into one 16-bit ++ * word. This function separates them so nand_base.c works as expected, ++ * especially its NAND_CMD_READID routines. ++ * ++ * To prevent stale data from being read, tmio_nand_hwcontrol() clears ++ * tmio->read_good. ++ */ ++static u_char tmio_nand_read_byte (struct mtd_info *mtd) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ unsigned int data; ++ ++ if (tmio->read_good--) ++ return tmio->read; ++ ++ data = ioread16 (&fcr->u16); ++ tmio->read = data >> 8; ++ return data; ++} ++ ++/* ++ * The TMIO controller converts an 8-bit NAND interface to a 16-bit ++ * bus interface, so all data reads and writes must be 16-bit wide. ++ * Thus, we implement 16-bit versions of the read, write, and verify ++ * buffer functions. ++ */ ++static void ++tmio_nand_write_buf (struct mtd_info *mtd, const u_char *buf, int len) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ iowrite16_rep (&fcr->u16, buf, len >> 1); ++} ++ ++static void tmio_nand_read_buf (struct mtd_info *mtd, u_char *buf, int len) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ ioread16_rep (&fcr->u16, buf, len >> 1); ++} ++ ++static int ++tmio_nand_verify_buf (struct mtd_info *mtd, const u_char *buf, int len) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ u16* p = (u16*) buf; ++ ++ for (len >>= 1; len; len--) ++ if (*(p++) != ioread16 (&fcr->u16)) ++ return -EFAULT; ++ return 0; ++} ++ ++static void tmio_nand_enable_hwecc (struct mtd_info* mtd, int mode) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ iowrite8 (FCR_MODE_HWECC_RESET, &fcr->mode); ++ ioread8 (&fcr->u8); /* dummy read */ ++ iowrite8 (FCR_MODE_HWECC_CALC, &fcr->mode); ++} ++ ++static int tmio_nand_calculate_ecc (struct mtd_info* mtd, const u_char* dat, ++ u_char* ecc_code) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ unsigned int ecc; ++ ++ iowrite8 (FCR_MODE_HWECC_RESULT, &fcr->mode); ++ ++ ecc = ioread16 (&fcr->u16); ++ ecc_code[1] = ecc; // 000-255 LP7-0 ++ ecc_code[0] = ecc >> 8; // 000-255 LP15-8 ++ ecc = ioread16 (&fcr->u16); ++ ecc_code[2] = ecc; // 000-255 CP5-0,11b ++ ecc_code[4] = ecc >> 8; // 256-511 LP7-0 ++ ecc = ioread16 (&fcr->u16); ++ ecc_code[3] = ecc; // 256-511 LP15-8 ++ ecc_code[5] = ecc >> 8; // 256-511 CP5-0,11b ++ ++ iowrite8 (FCR_MODE_DATA, &fcr->mode); ++ return 0; ++} ++ ++static void tmio_hw_init (struct device *dev, struct tmio_nand *tmio) ++{ ++ struct resource* nfcr = tmio_resource_control (dev); ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_nfhccr __iomem * ccr = tmio->ccr; ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ unsigned long base; ++ ++ /* (89h) SMD Buffer ON By TC6393XB SystemConfig gpibfc1 */ ++ tdev->ops->clock (dev, 1); ++ tdev->ops->function (dev, 1); ++ ++ /* (4Ch) CLKRUN Enable 1st spcrunc */ ++ iowrite8 (0x81, &ccr->icc); ++ ++ /* (10h)BaseAddress 0x1000 spba.spba2 */ ++ base = nfcr->start - tdev->iomem->start; ++ iowrite16 (base, ccr->base + 0); ++ iowrite16 (base >> 16, ccr->base + 1); ++ ++ /* (04h)Command Register I/O spcmd */ ++ iowrite8 (0x02, &ccr->command); ++ ++ /* (62h) Power Supply Control ssmpwc */ ++ /* HardPowerOFF - SuspendOFF - PowerSupplyWait_4MS */ ++ iowrite8 (0x02, &ccr->nfpsc); ++ ++ /* (63h) Detect Control ssmdtc */ ++ iowrite8 (0x02, &ccr->nfdc); ++ ++ /* Interrupt status register clear sintst */ ++ iowrite8 (0x0f, &fcr->isr); ++ ++ /* After power supply, Media are reset smode */ ++ iowrite8 (FCR_MODE_POWER_ON, &fcr->mode); ++ iowrite8 (FCR_MODE_COMMAND, &fcr->mode); ++ iowrite8 (NAND_CMD_RESET, &fcr->u8); ++ ++ /* Standby Mode smode */ ++ iowrite8 (FCR_MODE_STANDBY, &fcr->mode); ++ ++ mdelay (5); ++} ++ ++static void tmio_hw_stop (struct device *dev, struct tmio_nand *tmio) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ iowrite8 (FCR_MODE_POWER_OFF, &fcr->mode); ++ tdev->ops->function (dev, 0); ++ tdev->ops->clock (dev, 0); ++} ++ ++/*--------------------------------------------------------------------------*/ ++ ++#ifdef CONFIG_MTD_PARTITIONS ++static const char *part_probes[] = { "cmdlinepart", NULL }; ++#endif ++ ++static int tmio_probe (struct device *dev) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_nand_platform_data* tnpd = dev->platform_data; ++ struct resource* ccr = tmio_resource_config (dev); ++ struct resource* fcr = tmio_resource_control (dev); ++ struct resource* irq = tmio_resource_irq (dev); ++ struct tmio_nand* tmio; ++ struct mtd_info* mtd; ++ struct nand_chip* this; ++ struct mtd_partition* parts; ++ int nbparts = 0; ++ int retval; ++ ++ if (!tnpd) ++ return -EINVAL; ++ ++ retval = request_resource (tdev->iomem, ccr); ++ if (retval) ++ goto err_request_ccr; ++ ++ retval = request_resource (tdev->iomem, fcr); ++ if (retval) ++ goto err_request_fcr; ++ ++ tmio = kzalloc (sizeof *tmio, GFP_KERNEL); ++ if (!tmio) { ++ retval = -ENOMEM; ++ goto err_kzalloc; ++ } ++ ++ dev_set_drvdata (dev, tmio); ++ mtd = &tmio->mtd; ++ this = &tmio->chip; ++ mtd->priv = this; ++ mtd->name = TMIO_NAME_NAND; ++ ++ tmio->ccr = ioremap (ccr->start, ccr->end - ccr->start + 1); ++ if (!tmio->ccr) { ++ retval = -EIO; ++ goto err_iomap_ccr; ++ } ++ ++ tmio->fcr = ioremap (fcr->start, fcr->end - fcr->start + 1); ++ if (!tmio->fcr) { ++ retval = -EIO; ++ goto err_iomap_fcr; ++ } ++ ++ tmio_hw_init (dev, tmio); ++ ++ /* Set address of NAND IO lines */ ++ this->IO_ADDR_R = tmio->fcr; ++ this->IO_ADDR_W = tmio->fcr; ++ ++ /* Set address of hardware control function */ ++ this->cmd_ctrl = tmio_nand_hwcontrol; ++ this->dev_ready = tmio_nand_dev_ready; ++ this->read_byte = tmio_nand_read_byte; ++ this->write_buf = tmio_nand_write_buf; ++ this->read_buf = tmio_nand_read_buf; ++ this->verify_buf = tmio_nand_verify_buf; ++ ++ /* set eccmode using hardware ECC */ ++ this->ecc.mode = NAND_ECC_HW; ++ this->ecc.size = 512; ++ this->ecc.bytes = 6; ++ this->ecc.hwctl = tmio_nand_enable_hwecc; ++ this->ecc.calculate = tmio_nand_calculate_ecc; ++ this->ecc.correct = nand_correct_data; ++ this->badblock_pattern = tnpd->badblock_pattern; ++ ++ /* 15 us command delay time */ ++ this->chip_delay = 15; ++ ++ if (irq->start) { ++ retval = request_irq (irq->start, &tmio_irq, ++ IRQF_DISABLED, irq->name, tmio); ++ if (!retval) { ++ tmio->irq = irq->start; ++ this->waitfunc = tmio_nand_wait; ++ } else ++ mtd_warn (mtd, "request_irq error %d\n", retval); ++ } ++ ++ /* Scan to find existence of the device */ ++ if (nand_scan (mtd, 1)) { ++ retval = -ENODEV; ++ goto err_scan; ++ } ++ ++ /* Register the partitions */ ++#ifdef CONFIG_MTD_PARTITIONS ++ nbparts = parse_mtd_partitions (mtd, part_probes, &parts, 0); ++#endif ++ if (nbparts <= 0) { ++ parts = tnpd->partition; ++ nbparts = tnpd->num_partitions; ++ } ++ ++ add_mtd_partitions (mtd, parts, nbparts); ++ return 0; ++ ++err_scan: ++ if (tmio->irq) ++ free_irq (tmio->irq, tmio); ++ tmio_hw_stop (dev, tmio); ++ iounmap (tmio->fcr); ++err_iomap_fcr: ++ iounmap (tmio->ccr); ++err_iomap_ccr: ++ kfree (tmio); ++err_kzalloc: ++ release_resource (fcr); ++err_request_fcr: ++ release_resource (ccr); ++err_request_ccr: ++ return retval; ++} ++ ++static int tmio_remove (struct device *dev) ++{ ++ struct tmio_nand* tmio = dev_get_drvdata (dev); ++ ++ nand_release (&tmio->mtd); ++ if (tmio->irq) ++ free_irq (tmio->irq, tmio); ++ tmio_hw_stop (dev, tmio); ++ iounmap (tmio->fcr); ++ iounmap (tmio->ccr); ++ kfree (tmio); ++ release_resource (tmio_resource_control (dev)); ++ release_resource (tmio_resource_config (dev)); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int tmio_suspend (struct device *dev, pm_message_t state) ++{ ++ tmio_hw_stop (dev, dev_get_drvdata (dev)); ++ return 0; ++} ++ ++static int tmio_resume (struct device *dev) ++{ ++ tmio_hw_init (dev, dev_get_drvdata (dev)); ++ return 0; ++} ++#endif ++ ++static struct device_driver tmio_driver = { ++ .name = TMIO_NAME_NAND, ++ .bus = &tmio_bus_type, ++ .probe = tmio_probe, ++ .remove = tmio_remove, ++#ifdef CONFIG_PM ++ .suspend = tmio_suspend, ++ .resume = tmio_resume, ++#endif ++}; ++ ++static int __init tmio_init (void) { ++ return driver_register (&tmio_driver); ++} ++ ++static void __exit tmio_exit (void) { ++ driver_unregister (&tmio_driver); ++} ++ ++module_init (tmio_init); ++module_exit (tmio_exit); ++ ++MODULE_LICENSE ("GPL"); ++MODULE_AUTHOR ("Dirk Opfer, Chris Humbert"); ++MODULE_DESCRIPTION ("NAND flash driver on Toshiba Mobile IO controller"); diff --git a/packages/linux/linux-rp-2.6.22/tmio-ohci-r6.patch b/packages/linux/linux-rp-2.6.22/tmio-ohci-r6.patch new file mode 100644 index 0000000000..9fdd2962c9 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tmio-ohci-r6.patch @@ -0,0 +1,929 @@ + + drivers/usb/host/Kconfig | 1 + drivers/usb/host/ohci-hcd.c | 1 + drivers/usb/host/ohci-tmio.c | 894 +++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 896 insertions(+) + +Index: git/drivers/usb/host/ohci-tmio.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/usb/host/ohci-tmio.c 2006-11-07 21:48:33.000000000 +0000 +@@ -0,0 +1,894 @@ ++/* ++ * OHCI HCD (Host Controller Driver) for USB. ++ * ++ * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> ++ * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net> ++ * (C) Copyright 2002 Hewlett-Packard Company ++ * ++ * Bus glue for Toshiba Mobile IO (TMIO) Controller's OHCI core ++ * (C) Copyright 2005 Chris Humbert <mahadri-usb@drigon.com> ++ * ++ * This is known to work with the following variants: ++ * TC6393XB revision 3 (32kB SRAM) ++ * ++ * The TMIO's OHCI core DMAs through a small internal buffer that ++ * is directly addressable by the CPU. dma_declare_coherent_memory ++ * and DMA bounce buffers allow the higher-level OHCI host driver to ++ * work. However, the dma API doesn't handle dma mapping failures ++ * well (dma_sg_map() is a prime example), so it is unusable. ++ * ++ * This HC pretends be a PIO-ish controller and uses the kernel's ++ * generic allocator for the entire SRAM. Using the USB core's ++ * usb_operations, we provide hcd_buffer_alloc/free. Using the OHCI's ++ * ohci_ops, we provide memory management for OHCI's TDs and EDs. We ++ * internally queue a URB's TDs until enough dma memory is available ++ * to enqueue them with the HC. ++ * ++ * Written from sparse documentation from Toshiba and Sharp's driver ++ * for the 2.4 kernel, ++ * usb-ohci-tc6393.c (C) Copyright 2004 Lineo Solutions, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/fs.h> ++#include <linux/mount.h> ++#include <linux/pagemap.h> ++#include <linux/init.h> ++#include <linux/namei.h> ++#include <linux/sched.h> ++ ++#include <linux/genalloc.h> ++#include <asm/dma-mapping.h> /* for consistent_sync() */ ++#include <asm/hardware/tmio.h> ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* ++ * USB Host Controller Configuration Register ++ */ ++struct tmio_uhccr { ++ u8 x00[8]; ++ u8 revid; /* 0x08 Revision ID */ ++ u8 x01[7]; ++ u16 basel; /* 0x10 USB Control Register Base Address Low */ ++ u16 baseh; /* 0x12 USB Control Register Base Address High */ ++ u8 x02[0x2c]; ++ u8 ilme; /* 0x40 Internal Local Memory Enable */ ++ u8 x03[0x0b]; ++ u16 pm; /* 0x4c Power Management */ ++ u8 x04[2]; ++ u8 intc; /* 0x50 INT Control */ ++ u8 x05[3]; ++ u16 lmw1l; /* 0x54 Local Memory Window 1 LMADRS Low */ ++ u16 lmw1h; /* 0x56 Local Memory Window 1 LMADRS High */ ++ u16 lmw1bl; /* 0x58 Local Memory Window 1 Base Address Low */ ++ u16 lmw1bh; /* 0x5A Local Memory Window 1 Base Address High */ ++ u16 lmw2l; /* 0x5C Local Memory Window 2 LMADRS Low */ ++ u16 lmw2h; /* 0x5E Local Memory Window 2 LMADRS High */ ++ u16 lmw2bl; /* 0x60 Local Memory Window 2 Base Address Low */ ++ u16 lmw2bh; /* 0x62 Local Memory Window 2 Base Address High */ ++ u8 x06[0x98]; ++ u8 misc; /* 0xFC MISC */ ++ u8 x07[3]; ++} __attribute__ ((packed)); ++ ++union tmio_uhccr_pm { ++ u16 raw; ++struct { ++ unsigned gcken:1; /* D0 */ ++ unsigned ckrnen:1; /* D1 */ ++ unsigned uspw1:1; /* D2 USB Port 1 Power Disable */ ++ unsigned uspw2:1; /* D3 USB Port 2 Power Disable */ ++ unsigned x00:4; ++ unsigned pmee:1; /* D8 */ ++ unsigned x01:6; ++ unsigned pmes:1; /* D15 */ ++} __attribute__ ((packed)); ++} __attribute__ ((packed)); ++ ++/*-------------------------------------------------------------------------*/ ++ ++struct tmio_dma_pool { ++ struct device* dev; ++ unsigned int size; ++}; ++ ++struct tmio_hcd { ++ struct gen_pool* poolp; ++ struct usb_operations ops; ++ struct tmio_dma_pool td_pool; ++ struct tmio_dma_pool ed_pool; ++ ++ struct tmio_uhccr __iomem *ccr; ++ void __iomem * sram; ++ size_t sram_len; ++}; ++ ++#define hcd_to_tmio(hcd) ((struct tmio_hcd*)(hcd_to_ohci (hcd) + 1)) ++ ++struct tmio_td { ++ void* data; /* td's data buffer */ ++ void __iomem * bounce; /* dma bounce buffer */ ++ dma_addr_t dma; /* bounce buffer dma address */ ++ size_t len; /* bounce buffer length */ ++ u32 info; /* parameter for td_fill */ ++}; ++ ++struct tmio_urb { ++ int td_add; /* next index to be added */ ++ int td_queue; /* next index to be HC enqueued */ ++ ++ struct tmio_td td [0]; /* private td data */ ++}; ++ ++static inline struct tmio_urb *urb_to_turb (struct urb *urb) ++{ ++ urb_priv_t* urb_priv = urb->hcpriv; ++ return (struct tmio_urb*)(urb_priv->td + urb_priv->length); ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* gen_pool_alloc page allocator callback */ ++static unsigned long tmio_pool_callback(struct gen_pool *poolp) ++{ ++ return 0; ++} ++ ++static inline void tmio_pool_destroy(struct tmio_hcd *tmio) ++{ ++ struct gen_pool *poolp = tmio->poolp; ++ ++ if (!poolp) ++ return; ++ if (poolp->h) ++ kfree(poolp->h); ++ kfree(poolp); ++ tmio->poolp = NULL; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++#define BOUNDED_XYL(x,y,ylen) (((y) <= (x)) && ((x) < ((y)+(ylen)))) ++#define BOUNDED_XYY(x,y1,y2) (((y1) <= (x)) && ((x) < (y2))) ++ ++static inline dma_addr_t tmio_virt_to_dma (struct usb_hcd *hcd, void *vaddr) ++{ ++ struct resource* sram = tmio_resource_mem (hcd->self.controller); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ ++ return BOUNDED_XYL (vaddr, tmio->sram, tmio->sram_len) ++ ? sram->start + (vaddr - tmio->sram) ++ : ~0; ++} ++ ++static inline void* tmio_dma_to_virt (struct usb_hcd *hcd, dma_addr_t handle) ++{ ++ struct resource* sram = tmio_resource_mem (hcd->self.controller); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ ++ return BOUNDED_XYY (handle, sram->start, sram->end + 1) ++ ? tmio->sram + handle - sram->start ++ : NULL; ++} ++ ++/* ++ * allocate dma-able memory in the device's internal sram ++ * ++ * The generic pool allocator's minimum chunk size is 32 bytes, ++ * which is the cache line size on the PXA255, so we don't need ++ * to do anything special for smaller requests. ++ */ ++static inline void *tmio_dma_alloc (struct device *dev, size_t size, ++ dma_addr_t *handle, gfp_t mem_flags) ++{ ++ struct usb_hcd* hcd = dev_get_drvdata (dev); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ void* virt = (void*) gen_pool_alloc (tmio->poolp, size); ++ ++ return (*handle = tmio_virt_to_dma (hcd, virt)) == ~0 ? NULL : virt; ++} ++ ++static inline void tmio_dma_free (struct device *dev, size_t size, ++ void *cpu_addr, dma_addr_t handle) ++{ ++ struct usb_hcd* hcd = dev_get_drvdata (dev); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ dma_addr_t dma = tmio_virt_to_dma (hcd, cpu_addr); ++ ++ if (unlikely (dma == ~0)) { ++ dev_err (dev, "trying to free bad address 0x%p\n", cpu_addr); ++ return; ++ } ++ ++ if (unlikely (handle != dma)) ++ dev_err (dev, "dma address mismatch for 0x%p: %08x != %08x\n", ++ cpu_addr, handle, dma); ++ ++ gen_pool_free (tmio->poolp, (unsigned long) cpu_addr, size); ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static void *tmio_dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, ++ dma_addr_t *handle) ++{ ++ struct tmio_dma_pool *tdp = (struct tmio_dma_pool*) pool; ++ return tmio_dma_alloc (tdp->dev, tdp->size, handle, mem_flags); ++} ++ ++static void ++tmio_dma_pool_free (struct dma_pool *pool, void *vaddr, dma_addr_t addr) ++{ ++ struct tmio_dma_pool *tdp = (struct tmio_dma_pool*) pool; ++ return tmio_dma_free (tdp->dev, tdp->size, vaddr, addr); ++} ++ ++static void *tmio_buffer_alloc (struct usb_bus *bus, size_t size, ++ gfp_t mem_flags, dma_addr_t *dma) ++{ ++ return tmio_dma_alloc (bus->controller, size, dma, mem_flags); ++} ++ ++static void tmio_buffer_free (struct usb_bus *bus, size_t size, ++ void *addr, dma_addr_t dma) ++{ ++ tmio_dma_free (bus->controller, size, addr, dma); ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static void tmio_hc_stop (struct usb_hcd *hcd) ++{ ++ struct device* dev = hcd->self.controller; ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ struct tmio_uhccr __iomem* ccr = tmio->ccr; ++ union tmio_uhccr_pm pm = {0}; ++ ++ pm.gcken = 1; ++ pm.ckrnen = 1; ++ pm.uspw1 = 1; ++ pm.uspw2 = 1; ++ ++ iowrite8 (0, &ccr->intc); ++ iowrite8 (0, &ccr->ilme); ++ iowrite16(0, &ccr->basel); ++ iowrite16(0, &ccr->baseh); ++ iowrite16(pm.raw, &ccr->pm); ++ ++ tdev->ops->function (dev, 0); ++ tdev->ops->clock (dev, 0); ++} ++ ++static void tmio_hc_start (struct usb_hcd *hcd) ++{ ++ struct device* dev = hcd->self.controller; ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ struct tmio_uhccr __iomem* ccr = tmio->ccr; ++ union tmio_uhccr_pm pm = {0}; ++ ++ pm.pmes = 1; ++ pm.pmee = 1; ++ pm.ckrnen = 1; ++ pm.gcken = 1; ++ ++ tdev->ops->clock (dev, 1); ++ tdev->ops->function (dev, 1); ++ ++ iowrite16(pm.raw, &ccr->pm); ++ iowrite16(hcd->rsrc_start, &ccr->basel); ++ iowrite16(hcd->rsrc_start >> 16, &ccr->baseh); ++ iowrite8 (1, &ccr->ilme); ++ iowrite8 (2, &ccr->intc); ++ ++ consistent_sync (tmio->sram, tmio->sram_len, DMA_BIDIRECTIONAL); ++ ++ dev_info (dev, "revision %d @ 0x%08llx, irq %d\n", ++ ioread8 (&ccr->revid), hcd->rsrc_start, hcd->irq); ++} ++ ++static void tmio_stop (struct usb_hcd *hcd) ++{ ++ struct ohci_hcd* ohci = hcd_to_ohci (hcd); ++ ++ /* NULL these so ohci_stop() doesn't try to free them */ ++ ohci->hcca = NULL; ++ ohci->td_cache = NULL; ++ ohci->ed_cache = NULL; ++ ++ ohci_stop (hcd); ++ tmio_hc_stop (hcd); ++ tmio_pool_destroy (hcd_to_tmio (hcd)); ++ ++ /* We don't free the hcca because tmio_hc_stop() turns off ++ * the sram and the memory allocation data is destroyed. */ ++} ++ ++static int tmio_start (struct usb_hcd *hcd) ++{ ++ struct device* dev = hcd->self.controller; ++ struct ohci_hcd* ohci = hcd_to_ohci (hcd); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ int retval; ++ ++ tmio_hc_start (hcd); ++ ++ tmio->poolp = gen_pool_create(0, fls(tmio->sram_len) - 1, ++ tmio_pool_callback, 0); ++ if (!tmio->poolp) { ++ retval = -ENOMEM; ++ goto err_gen_pool_create; ++ } ++ ++ gen_pool_free (tmio->poolp, (unsigned long)(tmio->sram), ++ tmio->sram_len); ++ ++ ohci->hcca = tmio_dma_alloc (dev, sizeof *ohci->hcca, ++ &ohci->hcca_dma, GFP_KERNEL); ++ if (!ohci->hcca) { ++ retval = -ENOMEM; ++ goto err_hcca_alloc; ++ } ++ ++ /* for our dma_pool_alloc/free hooks */ ++ ohci->td_cache = (struct dma_pool*) &tmio->td_pool; ++ ohci->ed_cache = (struct dma_pool*) &tmio->ed_pool; ++ ++ if ((retval = ohci_init (ohci)) < 0) ++ goto err_ohci_init; ++ ++ if ((retval = ohci_run (ohci)) < 0) ++ goto err_ohci_run; ++ ++ return 0; ++ ++err_ohci_run: ++ err ("can't start %s", hcd->self.bus_name); ++err_ohci_init: ++err_hcca_alloc: ++err_gen_pool_create: ++ tmio_stop (hcd); ++ return retval; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static inline void *tmio_urb_dma_to_virt(struct urb *urb, dma_addr_t dma) ++{ ++ if (BOUNDED_XYL(dma, urb->transfer_dma, urb->transfer_buffer_length)) ++ return urb->transfer_buffer + dma - urb->transfer_dma; ++ ++ if (BOUNDED_XYL(dma, urb->setup_dma, sizeof (struct usb_ctrlrequest))) ++ return urb->setup_packet + dma - urb->setup_dma; ++ ++ return NULL; ++} ++ ++static struct tmio_td* tmio_td_find (struct td *td, int *index) ++{ ++ struct urb* urb = td->urb; ++ urb_priv_t* urb_priv = urb->hcpriv; ++ struct tmio_urb* turb = urb_to_turb (urb); ++ int i; ++ ++ for (i=0; i < urb_priv->length; i++) ++ if (urb_priv->td[i] == td) { ++ *index = i; ++ return turb->td + i; ++ } ++ ++ return NULL; ++} ++ ++/* ++ * map the td's data to dma-able memory ++ * ++ * if this td transfers data, ++ * sets tmtd->data to the urb's data buffer ++ * sets tmtd->dma to dma-able memory ++ * sets tmtd->bounce to non-NULL if a bounce buffer is allocated ++ * copies the urb's data buffer to the bounce buffer if necessary ++ */ ++static int tmio_td_dma_map (struct ohci_hcd *ohci, struct urb *urb, ++ struct tmio_td *tmtd, int idx) ++{ ++ struct usb_hcd* hcd = ohci_to_hcd (ohci); ++ struct device* dev = hcd->self.controller; ++ dma_addr_t dma; ++ ++ if (!tmtd->len) ++ return 0; ++ ++ if (tmio_dma_to_virt (hcd, tmtd->dma)) ++ return 0; ++ ++ tmtd->data = tmio_urb_dma_to_virt (urb, tmtd->dma); ++ if (unlikely (!tmtd->data)) { ++ dev_err (dev, "TD has bad dma address 0x%08x\n", tmtd->dma); ++ return 0; ++ } ++ ++ tmtd->bounce = tmio_dma_alloc (dev, tmtd->len, &dma, GFP_ATOMIC); ++ if (!tmtd->bounce) ++ return -ENOMEM; ++ ++ if ((usb_pipecontrol (urb->pipe) && !idx) || usb_pipeout (urb->pipe)) { ++ consistent_sync (tmtd->bounce, tmtd->len, DMA_TO_DEVICE); ++ memcpy (tmtd->bounce, tmtd->data, tmtd->len); ++ } else ++ consistent_sync (tmtd->bounce, tmtd->len, DMA_FROM_DEVICE); ++ ++ tmtd->dma = dma; ++ return 0; ++} ++ ++/* ++ * unmaps the td's data from dma-able memory ++ * ++ * if a bounce buffer has been allocated, ++ * copy the bounce buffer to the urb's data buffer if necessary ++ * free the bounce buffer ++ */ ++static void tmio_td_dma_unmap (struct ohci_hcd *ohci, struct td *td) ++{ ++ struct device* dev = (ohci_to_hcd (ohci))->self.controller; ++ struct urb* urb = td->urb; ++ int idx; ++ struct tmio_td* tmtd = tmio_td_find (td, &idx); ++ ++ if (!tmtd->bounce) ++ return; ++ ++ if (usb_pipein (urb->pipe) && (usb_pipecontrol (urb->pipe) ? idx : 1)) { ++ memcpy (tmtd->data, tmtd->bounce, tmtd->len); ++ consistent_sync (tmtd->data, tmtd->len, DMA_TO_DEVICE); ++ } ++ ++ tmio_dma_free (dev, tmtd->len, tmtd->bounce, tmtd->dma); ++} ++ ++static int tmio_urb_runqueue (struct ohci_hcd *ohci, struct urb *urb) ++{ ++ struct tmio_urb* turb = urb_to_turb (urb); ++ urb_priv_t* urb_priv= urb->hcpriv; ++ int start = turb->td_queue; ++ int retval = 0; ++ int i; ++ ++ for (i = start; i < turb->td_add; i = ++turb->td_queue) { ++ struct tmio_td *tmtd = turb->td + i; ++ ++ if ((retval = tmio_td_dma_map (ohci, urb, tmtd, i))) ++ break; ++ ++ td_fill (ohci, tmtd->info, tmtd->dma, tmtd->len, urb, i); ++ } ++ ++ if (i <= start) ++ return retval; ++ ++ /* kickstart the appropriate list */ ++ wmb (); ++ switch (urb_priv->ed->type) { ++ case PIPE_BULK: ++ ohci_writel (ohci, OHCI_BLF, &ohci->regs->cmdstatus); ++ break; ++ case PIPE_CONTROL: ++ ohci_writel (ohci, OHCI_CLF, &ohci->regs->cmdstatus); ++ break; ++ } ++ ++ return retval; ++} ++ ++/* ++ * This needs to be called with ohci->lock held so the pending urb list ++ * isn't modified. ++ */ ++static int tmio_ohci_runqueue (struct ohci_hcd *ohci) ++{ ++ urb_priv_t* priv; ++ int retval = 0; ++ ++ list_for_each_entry_reverse (priv, &ohci->pending, pending) ++ if ((retval = tmio_urb_runqueue (ohci, priv->td[0]->urb))) ++ return retval; ++ ++ return retval; ++} ++ ++static void tmio_td_fill (struct ohci_hcd *ohci, u32 info, ++ dma_addr_t data, int len, struct urb *urb, int index) ++{ ++ struct tmio_urb* turb = urb_to_turb (urb); ++ struct tmio_td* tmtd = turb->td + index; ++ ++ tmtd->data = NULL; ++ tmtd->bounce = NULL; ++ tmtd->dma = data; ++ tmtd->len = len; ++ tmtd->info = info; ++ turb->td_add = index + 1; ++} ++ ++static void ++tmio_td_done (struct ohci_hcd *ohci, struct urb *urb, struct td *td) ++{ ++ tmio_td_dma_unmap (ohci, td); ++ td_done (ohci, urb, td); ++} ++ ++const static struct ohci_ops tmio_ops = { ++ .dma_pool_alloc = tmio_dma_pool_alloc, ++ .dma_pool_free = tmio_dma_pool_free, ++ .td_fill = tmio_td_fill, ++ .td_done = tmio_td_done, ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++static irqreturn_t tmio_irq (struct usb_hcd *hcd, struct pt_regs *ptregs) ++{ ++ irqreturn_t retval = ohci_irq (hcd, ptregs); ++ ++ if (retval == IRQ_HANDLED) { ++ struct ohci_hcd *ohci = hcd_to_ohci (hcd); ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ohci->lock, flags); ++ tmio_ohci_runqueue (ohci); ++ spin_unlock_irqrestore (&ohci->lock, flags); ++ } ++ ++ return retval; ++} ++ ++/* ++ * This is ohci_urb_enqueue with: ++ * dma address sanitization for tmio_urb_dma_to_virt() ++ * allocate extra space in urb_priv for our private data ++ * initialize urb_priv->td[0]->urb for tmio_ohci_runqueue() ++ * call tmio_ohci_runqueue() after submitting TDs ++ */ ++static int tmio_urb_enqueue ( ++ struct usb_hcd *hcd, ++ struct usb_host_endpoint *ep, ++ struct urb *urb, ++ gfp_t mem_flags ++) { ++ struct ohci_hcd *ohci = hcd_to_ohci (hcd); ++ struct ed *ed; ++ urb_priv_t *urb_priv; ++ unsigned int pipe = urb->pipe; ++ int i, size = 0; ++ unsigned long flags; ++ int retval = 0; ++ ++#ifdef OHCI_VERBOSE_DEBUG ++ urb_print (urb, "SUB", usb_pipein (pipe)); ++#endif ++ ++ /* make sure we can convert dma offsets back to virtual addresses */ ++ if (!tmio_dma_to_virt (hcd, urb->setup_dma)) ++ urb->setup_dma = 0; ++ ++ if (!tmio_dma_to_virt (hcd, urb->transfer_dma)) ++ urb->transfer_dma = sizeof (struct usb_ctrlrequest); ++ ++ /* every endpoint has a ed, locate and maybe (re)initialize it */ ++ if (! (ed = ed_get (ohci, ep, urb->dev, pipe, urb->interval))) ++ return -ENOMEM; ++ ++ /* for the private part of the URB we need the number of TDs (size) */ ++ switch (ed->type) { ++ case PIPE_CONTROL: ++ /* td_submit_urb() doesn't yet handle these */ ++ if (urb->transfer_buffer_length > 4096) ++ return -EMSGSIZE; ++ ++ /* 1 TD for setup, 1 for ACK, plus ... */ ++ size = 2; ++ /* FALLTHROUGH */ ++ // case PIPE_INTERRUPT: ++ // case PIPE_BULK: ++ default: ++ /* one TD for every 4096 Bytes (can be upto 8K) */ ++ size += urb->transfer_buffer_length / 4096; ++ /* ... and for any remaining bytes ... */ ++ if ((urb->transfer_buffer_length % 4096) != 0) ++ size++; ++ /* ... and maybe a zero length packet to wrap it up */ ++ if (size == 0) ++ size++; ++ else if ((urb->transfer_flags & URB_ZERO_PACKET) != 0 ++ && (urb->transfer_buffer_length ++ % usb_maxpacket (urb->dev, pipe, ++ usb_pipeout (pipe))) == 0) ++ size++; ++ break; ++ case PIPE_ISOCHRONOUS: /* number of packets from URB */ ++ size = urb->number_of_packets; ++ break; ++ } ++ ++ /* allocate the private part of the URB */ ++ urb_priv = kzalloc (sizeof (urb_priv_t) ++ + size * sizeof (struct td*) ++ + sizeof (struct tmio_urb) ++ + size * sizeof (struct tmio_td), ++ mem_flags); ++ if (!urb_priv) ++ return -ENOMEM; ++ INIT_LIST_HEAD (&urb_priv->pending); ++ urb_priv->length = size; ++ urb_priv->ed = ed; ++ ++ /* allocate the TDs (deferring hash chain updates) */ ++ for (i = 0; i < size; i++) { ++ urb_priv->td [i] = td_alloc (ohci, mem_flags); ++ if (!urb_priv->td [i]) { ++ urb_priv->length = i; ++ urb_free_priv (ohci, urb_priv); ++ return -ENOMEM; ++ } ++ urb_priv->td [i]->urb = urb; ++ } ++ ++ spin_lock_irqsave (&ohci->lock, flags); ++ ++ /* don't submit to a dead HC */ ++ if (!HC_IS_RUNNING(hcd->state)) { ++ retval = -ENODEV; ++ goto fail; ++ } ++ ++ /* in case of unlink-during-submit */ ++ spin_lock (&urb->lock); ++ if (urb->status != -EINPROGRESS) { ++ spin_unlock (&urb->lock); ++ urb->hcpriv = urb_priv; ++ finish_urb (ohci, urb, NULL); ++ retval = 0; ++ goto fail; ++ } ++ ++ /* schedule the ed if needed */ ++ if (ed->state == ED_IDLE) { ++ retval = ed_schedule (ohci, ed); ++ if (retval < 0) ++ goto fail0; ++ if (ed->type == PIPE_ISOCHRONOUS) { ++ u16 frame = ohci_frame_no(ohci); ++ ++ /* delay a few frames before the first TD */ ++ frame += max_t (u16, 8, ed->interval); ++ frame &= ~(ed->interval - 1); ++ frame |= ed->branch; ++ urb->start_frame = frame; ++ ++ /* yes, only URB_ISO_ASAP is supported, and ++ * urb->start_frame is never used as input. ++ */ ++ } ++ } else if (ed->type == PIPE_ISOCHRONOUS) ++ urb->start_frame = ed->last_iso + ed->interval; ++ ++ /* fill the TDs and link them to the ed; and ++ * enable that part of the schedule, if needed ++ * and update count of queued periodic urbs ++ */ ++ urb->hcpriv = urb_priv; ++ td_submit_urb (ohci, urb); ++ tmio_ohci_runqueue (ohci); ++ ++fail0: ++ spin_unlock (&urb->lock); ++fail: ++ if (retval) ++ urb_free_priv (ohci, urb_priv); ++ spin_unlock_irqrestore (&ohci->lock, flags); ++ return retval; ++} ++ ++static const struct hc_driver tmio_hc_driver = { ++ .description = hcd_name, ++ .product_desc = "TMIO OHCI USB Host Controller", ++ .hcd_priv_size = sizeof (struct ohci_hcd) ++ + sizeof (struct tmio_hcd), ++ ++ /* generic hardware linkage */ ++ .irq = tmio_irq, ++ .flags = HCD_USB11 | HCD_MEMORY, ++ ++ /* basic lifecycle operations */ ++ .start = tmio_start, ++ .stop = tmio_stop, ++ ++ /* managing i/o requests and associated device resources */ ++ .urb_enqueue = tmio_urb_enqueue, ++ .urb_dequeue = ohci_urb_dequeue, ++ .endpoint_disable = ohci_endpoint_disable, ++ ++ /* scheduling support */ ++ .get_frame_number = ohci_get_frame, ++ ++ /* root hub support */ ++ .hub_status_data = ohci_hub_status_data, ++ .hub_control = ohci_hub_control, ++#ifdef CONFIG_PM ++ .bus_suspend = ohci_bus_suspend, ++ .bus_resume = ohci_bus_resume, ++#endif ++ .start_port_reset = ohci_start_port_reset, ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* configure so an HC device and id are always provided */ ++/* always called with process context; sleeping is OK */ ++ ++/** ++ * tmio_probe - initialize TMIO-based HCDs ++ * Context: !in_interrupt() ++ * ++ * Allocates basic resources for this USB host controller, and ++ * then invokes the start() method for the HCD associated with it ++ * through the hotplug entry's driver_data. ++ */ ++static int tmio_probe (struct device *dev) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct resource* config = tmio_resource_config (dev); ++ struct resource* regs = tmio_resource_control (dev); ++ struct resource* sram = tmio_resource_mem (dev); ++ struct resource* irq = tmio_resource_irq (dev); ++ struct usb_operations* ops; ++ struct tmio_hcd* tmio; ++ struct ohci_hcd* ohci; ++ struct usb_hcd* hcd; ++ int retval; ++ ++ if (usb_disabled ()) ++ return -ENODEV; ++ ++ if (dev->dma_mask || dev->coherent_dma_mask) { ++ dev_err (dev, "DMA not supported\n"); ++ return -ENODEV; ++ } ++ ++ hcd = usb_create_hcd (&tmio_hc_driver, dev, dev->bus_id); ++ if (!hcd) { ++ retval = -ENOMEM; ++ goto err_create_hcd; ++ } ++ ++ tmio = hcd_to_tmio (hcd); ++ tmio->td_pool.dev = dev; ++ tmio->ed_pool.dev = dev; ++ tmio->td_pool.size = sizeof (struct td); ++ tmio->ed_pool.size = sizeof (struct ed); ++ ohci = hcd_to_ohci (hcd); ++ ohci_hcd_init (ohci); ++ ohci->ops = &tmio_ops; ++ ++ retval = request_resource (tdev->iomem, config); ++ if (retval) ++ goto err_request_config_resource; ++ ++ retval = request_resource (tdev->iomem, regs); ++ if (retval) ++ goto err_request_regs_resource; ++ ++ retval = request_resource (tdev->iomem, sram); ++ if (retval) ++ goto err_request_sram_resource; ++ ++ hcd->rsrc_start = regs->start; ++ hcd->rsrc_len = regs->end - regs->start + 1; ++ tmio->sram_len = sram->end - sram->start + 1; ++ ++ tmio->ccr = ioremap (config->start, config->end - config->start + 1); ++ if (!tmio->ccr) { ++ retval = -ENOMEM; ++ goto err_ioremap_ccr; ++ } ++ ++ hcd->regs = ioremap (hcd->rsrc_start, hcd->rsrc_len); ++ if (!hcd->regs) { ++ retval = -ENOMEM; ++ goto err_ioremap_regs; ++ } ++ ++ tmio->sram = ioremap (sram->start, tmio->sram_len); ++ if (!tmio->sram) { ++ retval = -ENOMEM; ++ goto err_ioremap_sram; ++ } ++ ++ /* drivers should use our coherent buffer allocator */ ++ ops = &tmio->ops; ++ memcpy (ops, hcd->self.op, sizeof *ops); ++ ops->buffer_alloc = tmio_buffer_alloc; ++ ops->buffer_free = tmio_buffer_free; ++ hcd->self.op = ops; ++ ++ retval = usb_add_hcd (hcd, irq->start, SA_INTERRUPT); ++ if (retval) ++ goto err_usb_add_hcd; ++ ++ return 0; ++ ++err_usb_add_hcd: ++ iounmap (tmio->sram); ++err_ioremap_sram: ++ iounmap (hcd->regs); ++err_ioremap_regs: ++ iounmap (tmio->ccr); ++err_ioremap_ccr: ++ release_resource (sram); ++err_request_sram_resource: ++ release_resource (regs); ++err_request_regs_resource: ++ release_resource (config); ++err_request_config_resource: ++ usb_put_hcd (hcd); ++err_create_hcd: ++ return retval; ++} ++ ++/* may be called without controller electrically present */ ++/* may be called with controller, bus, and devices active */ ++ ++/** ++ * tmio_remove - shutdown processing for TMIO-based HCDs ++ * @dev: USB Host Controller being removed ++ * Context: !in_interrupt() ++ * ++ * Reverses the effect of tmio_probe(), first invoking ++ * the HCD's stop() method. It is always called from a thread ++ * context, normally "rmmod", "apmd", or something similar. ++ */ ++static int tmio_remove (struct device *dev) ++{ ++ struct usb_hcd* hcd = dev_get_drvdata (dev); ++ struct tmio_hcd* tmio = hcd_to_tmio (hcd); ++ ++ usb_remove_hcd (hcd); ++ iounmap (tmio->sram); ++ iounmap (hcd->regs); ++ iounmap (tmio->ccr); ++ release_resource (tmio_resource_mem (dev)); ++ release_resource (tmio_resource_control (dev)); ++ release_resource (tmio_resource_config (dev)); ++ usb_put_hcd (hcd); ++ return 0; ++} ++ ++static struct device_driver tmio_ohci = { ++ .name = TMIO_NAME_OHCI, ++ .bus = &tmio_bus_type, ++ .probe = tmio_probe, ++ .remove = tmio_remove, ++}; ++ ++static int __init tmio_init (void) ++{ ++ dbg (DRIVER_INFO " (%s)", TMIO_SOC_NAME); ++ dbg ("block sizes: ed %d td %d", ++ sizeof (struct ed), sizeof (struct td)); ++ ++ return driver_register (&tmio_ohci); ++} ++ ++static void __exit tmio_exit (void) ++{ ++ driver_unregister (&tmio_ohci); ++} ++ ++module_init (tmio_init); ++module_exit (tmio_exit); +Index: git/drivers/usb/host/Kconfig +=================================================================== +--- git.orig/drivers/usb/host/Kconfig 2006-11-07 21:46:32.000000000 +0000 ++++ git/drivers/usb/host/Kconfig 2006-11-07 21:48:38.000000000 +0000 +@@ -84,6 +84,7 @@ config USB_OHCI_HCD + depends on USB && USB_ARCH_HAS_OHCI + select ISP1301_OMAP if MACH_OMAP_H2 || MACH_OMAP_H3 + select I2C if ARCH_PNX4008 ++ select GENERIC_ALLOCATOR if TOSHIBA_TC6393XB + ---help--- + The Open Host Controller Interface (OHCI) is a standard for accessing + USB 1.1 host controller hardware. It does more in hardware than Intel's +Index: git/drivers/usb/host/ohci-hcd.c +=================================================================== +--- git.orig/drivers/usb/host/ohci-hcd.c 2006-11-07 21:46:32.000000000 +0000 ++++ git/drivers/usb/host/ohci-hcd.c 2006-11-07 21:48:33.000000000 +0000 +@@ -944,6 +944,7 @@ MODULE_LICENSE ("GPL"); + || defined(CONFIG_ARCH_OMAP) \ + || defined (CONFIG_ARCH_LH7A404) \ + || defined (CONFIG_PXA27x) \ ++ || defined (CONFIG_TOSHIBA_TC6393XB) \ + || defined (CONFIG_ARCH_EP93XX) \ + || defined (CONFIG_SOC_AU1X00) \ + || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ diff --git a/packages/linux/linux-rp-2.6.22/tmio-tc6393-r8.patch b/packages/linux/linux-rp-2.6.22/tmio-tc6393-r8.patch new file mode 100644 index 0000000000..1bfdc23630 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tmio-tc6393-r8.patch @@ -0,0 +1,800 @@ + arch/arm/common/Kconfig | 3 + arch/arm/common/Makefile | 1 + arch/arm/common/tc6393xb.c | 668 ++++++++++++++++++++++++++++++++++++++++ + arch/arm/mach-pxa/Kconfig | 1 + include/asm-arm/arch-pxa/irqs.h | 10 + include/asm-arm/hardware/tmio.h | 44 ++ + 6 files changed, 727 insertions(+) + +Index: git/arch/arm/common/tc6393xb.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/arch/arm/common/tc6393xb.c 2006-11-07 22:14:49.000000000 +0000 +@@ -0,0 +1,668 @@ ++/* ++ * Toshiba TC6393XB SoC support ++ * ++ * Maintainer: Chris Humbert <mahadri-kernel@drigon.com> ++ * ++ * Copyright (c) 2005-2006 Chris Humbert ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * Based on code written by Sharp/Lineo for 2.4 kernels ++ * Based on locomo.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/delay.h> ++#include <linux/errno.h> ++#include <linux/ioport.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/slab.h> ++#include <linux/spinlock.h> ++#include <linux/fb.h> ++ ++#include <asm/hardware.h> ++#include <asm/mach-types.h> ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <asm/mach/irq.h> ++#include <asm/arch/irqs.h> ++#include <asm/hardware/tmio.h> ++ ++#ifndef TMIO_SOC_TC6393XB ++#error "TC6393XB SoC not configured" ++#endif ++ ++/*--------------------------------------------------------------------------*/ ++ ++/* cell ids must be 0-based because they are used as array indexes. */ ++#define TC6393_CELL_NAND 0 ++#define TC6393_CELL_SD 1 ++#define TC6393_CELL_OHCI 2 ++#define TC6393_CELL_SERIAL 3 ++#define TC6393_CELL_LCD 4 ++#define TC6393_NUM_CELLS 5 ++ ++#define TC6393_RESOURCE(_name, _start, _end, _flags) \ ++ { \ ++ .name = _name, \ ++ .start = _start, \ ++ .end = _end, \ ++ .flags = _flags, \ ++ } ++ ++#define TC6393_MEM(name, start, size) \ ++ TC6393_RESOURCE(name, start, (start) + (size) - 1, IORESOURCE_MEM) ++ ++#define TC6393_IRQ(name, irq) \ ++ TC6393_RESOURCE(name, irq, irq, IORESOURCE_IRQ) ++ ++const static struct resource tc6393_NAND_resource[] = { ++ TC6393_MEM (TMIO_NAME_NAND, 0x000100, 0x100), ++ TC6393_MEM (TMIO_NAME_NAND, 0x001000, 0x008), ++ TC6393_MEM (TMIO_NAME_NAND, 0, 0), ++ TC6393_IRQ (TMIO_NAME_NAND, IRQ_TC6393_NAND), ++}; ++ ++const static struct resource tc6393_SD_resource[] = { ++ TC6393_MEM (TMIO_NAME_SD, 0x000200, 0x100), ++ TC6393_MEM (TMIO_NAME_SD, 0x002000, 0x200), ++ TC6393_MEM (TMIO_NAME_SD, 0, 0), ++ TC6393_IRQ (TMIO_NAME_SD, IRQ_TC6393_SD), ++}; ++ ++const static struct resource tc6393_OHCI_resource[] = { ++ TC6393_MEM (TMIO_NAME_OHCI, 0x000300, 0x100), ++ TC6393_MEM (TMIO_NAME_OHCI, 0x003000, 0x100), ++ TC6393_MEM (TMIO_NAME_OHCI, 0x010000, 32 * 1024), ++ TC6393_IRQ (TMIO_NAME_OHCI, IRQ_TC6393_OHCI), ++}; ++ ++const static struct resource tc6393_SERIAL_resource[] = { ++ TC6393_MEM (TMIO_NAME_SERIAL, 0x000400, 0x100), ++ TC6393_MEM (TMIO_NAME_SERIAL, 0x004000, 0x100), ++ TC6393_MEM (TMIO_NAME_SERIAL, 0, 0), ++ TC6393_IRQ (TMIO_NAME_SERIAL, IRQ_TC6393_SERIAL), ++}; ++ ++const static struct resource tc6393_LCD_resource[] = { ++ TC6393_MEM (TMIO_NAME_LCD, 0x000500, 0x100), ++ TC6393_MEM (TMIO_NAME_LCD, 0x005000, 0x200), ++ TC6393_MEM (TMIO_NAME_LCD, 0x100000, 1024 * 1024), ++ TC6393_IRQ (TMIO_NAME_LCD, IRQ_TC6393_LCD), ++}; ++ ++#define TC6393_CELL(_NAME) \ ++ [TC6393_CELL_##_NAME] = { \ ++ .name = TMIO_NAME_##_NAME, \ ++ .id = TC6393_CELL_##_NAME, \ ++ .resource = tc6393_##_NAME##_resource, \ ++ .num_resources = ARRAY_SIZE (tc6393_##_NAME##_resource), \ ++ } ++ ++struct tc6393_cell { ++ const char* name; ++ unsigned int id; ++ const struct resource* resource; ++ unsigned int num_resources; ++}; ++ ++const static struct tc6393_cell tc6393_cell [TC6393_NUM_CELLS] = { ++ TC6393_CELL (NAND ), ++ TC6393_CELL (SD ), ++ TC6393_CELL (OHCI ), ++ TC6393_CELL (SERIAL ), ++ TC6393_CELL (LCD ), ++}; ++ ++/*--------------------------------------------------------------------------*/ ++ ++/* ++ * TC6393 System Configuration Register ++ */ ++struct tc6393_scr { ++ u8 x00[8]; ++ u8 revid; /* 0x08 Revision ID */ ++ u8 x01[0x47]; ++ u8 isr; /* 0x50 Interrupt Status */ ++ u8 x02; ++ u8 imr; /* 0x52 Interrupt Mask */ ++ u8 x03; ++ u8 irr; /* 0x54 Interrupt Routing */ ++ u8 x04[0x0b]; ++ u16 gper; /* 0x60 GP Enable */ ++ u8 x05[2]; ++ u16 gpi_sr[2]; /* 0x64 GPI Status */ ++ u16 gpi_imr[2]; /* 0x68 GPI INT Mask */ ++ u16 gpi_eder[2]; /* 0x6c GPI Edge Detect Enable */ ++ u16 gpi_lir[4]; /* 0x70 GPI Level Invert */ ++ u16 gpo_dsr[2]; /* 0x78 GPO Data Set */ ++ u16 gpo_doecr[2]; /* 0x7c GPO Data OE Control */ ++ u16 gp_iarcr[2]; /* 0x80 GP Internal Active Reg Control */ ++ u16 gp_iarlcr[2]; /* 0x84 GP Internal Active Reg Level Con*/ ++ u8 gpi_bcr[4]; /* 0x88 GPI Buffer Control */ ++ u16 gpa_iarcr; /* 0x8c GPa Internal Active Reg Control */ ++ u8 x06[2]; ++ u16 gpa_iarlcr; /* 0x90 GPa Internal Active Reg Level Co*/ ++ u8 x07[2]; ++ u16 gpa_bcr; /* 0x94 GPa Buffer Control */ ++ u8 x08[2]; ++ u16 ccr; /* 0x98 Clock Control */ ++ u16 pll2cr; /* 0x9a PLL2 Control */ ++ u16 pll1cr[2]; /* 0x9c PLL1 Control */ ++ u8 diarcr; /* 0xa0 Device Internal Active Reg Contr*/ ++ u8 dbocr; /* 0xa1 Device Buffer Off Control */ ++ u8 x09[0x3e]; ++ u8 fer; /* 0xe0 Function Enable */ ++ u8 x10[3]; ++ u16 mcr; /* 0xe4 Mode Control */ ++ u8 x11[0x14]; ++ u8 config; /* 0xfc Configuration Control */ ++ u8 x12[2]; ++ u8 debug; /* 0xff Debug */ ++} __attribute__ ((packed)); ++ ++union tc6393_scr_fer { ++ u8 raw; ++struct { ++ unsigned usben:1; /* D0 USB enable */ ++ unsigned lcdcven:1; /* D1 polysylicon TFT enable */ ++ unsigned slcden:1; /* D2 SLCD enable */ ++} __attribute__ ((packed)); ++} __attribute__ ((packed)); ++ ++union tc6393_scr_ccr { ++ u16 raw; ++struct { ++ unsigned ck32ken:1; /* D0 SD host clock enable */ ++ unsigned usbcken:1; /* D1 USB host clock enable */ ++ unsigned x00:2; ++ unsigned sharp:1; /* D4 ??? set in Sharp's code */ ++ unsigned x01:3; ++ enum { disable = 0, ++ m12MHz = 1, ++ m24MHz = 2, ++ m48MHz = 3, ++ } mclksel:3; /* D10-D8 LCD controller clock */ ++ unsigned x02:1; ++ enum { h24MHz = 0, ++ h48MHz = 1, ++ } hclksel:2; /* D13-D12 host bus clock */ ++ unsigned x03:2; ++} __attribute__ ((packed)); ++} __attribute__ ((packed)); ++ ++/*--------------------------------------------------------------------------*/ ++ ++struct tc6393 { ++ spinlock_t lock; /* read-modify-write lock */ ++ struct device* dev; /* TC6393 device */ ++ struct tc6393_scr __iomem *scr; /* system configuration reg */ ++ ++ struct resource rscr; /* system config reg resource */ ++ struct resource* iomem; /* entire TC6393 iomem resource */ ++ unsigned int irq; /* hardware cascade irq */ ++ ++ struct tmio_device tdev [TC6393_NUM_CELLS]; ++}; ++ ++/*--------------------------------------------------------------------------*/ ++ ++static u32 tc6393_ioread32 (const void __iomem *addr) ++{ ++ return ((u32) ioread16 (addr)) | (((u32) ioread16 (addr + 2)) << 16); ++} ++ ++static u32 tc6393_iowrite32 (u32 val, const void __iomem *addr) ++{ ++ iowrite16 (val, addr); ++ iowrite16 (val >> 16, addr + 2); ++ return val; ++} ++ ++u32 get_tc6393_gpio (struct device *dev) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ ++ return tc6393_ioread32 (scr->gpo_dsr); ++} ++EXPORT_SYMBOL (get_tc6393_gpio); ++ ++u32 set_tc6393_gpio (struct device *dev, u32 bits) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ u32 dsr; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ dsr = tc6393_ioread32 (scr->gpo_dsr) | bits; ++ tc6393_iowrite32 (dsr, scr->gpo_dsr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++ ++ return dsr; ++} ++EXPORT_SYMBOL (set_tc6393_gpio); ++ ++u32 reset_tc6393_gpio (struct device *dev, u32 bits) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ u32 dsr; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ dsr = tc6393_ioread32 (scr->gpo_dsr) & ~bits; ++ tc6393_iowrite32 (dsr, scr->gpo_dsr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++ ++ return dsr; ++} ++EXPORT_SYMBOL (reset_tc6393_gpio); ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void ++tc6393_irq (unsigned int irq, struct irq_desc *desc) ++{ ++ struct tc6393* tc6393 = get_irq_chip_data (irq); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned int isr; ++ unsigned int bit; ++ unsigned int i; ++ ++ desc->chip->ack (irq); ++ ++ while ((isr = ioread8(&scr->isr) & ~ioread8(&scr->imr))) ++ for (bit = 1, i = IRQ_TC6393_START; i <= IRQ_TC6393_LCD; ++ bit <<= 1, i++) ++ if (isr & bit) ++ desc_handle_irq (i, irq_desc + i); ++} ++ ++static void tc6393_irq_ack (unsigned int irq) ++{ ++} ++ ++static void tc6393_irq_mask (unsigned int irq) ++{ ++ struct tc6393* tc6393 = get_irq_chip_data (irq); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ iowrite8 (ioread8 (&scr->imr) | (1 << (irq - IRQ_TC6393_START)), ++ &scr->imr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static void tc6393_irq_unmask (unsigned int irq) ++{ ++ struct tc6393* tc6393 = get_irq_chip_data (irq); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ iowrite8 (ioread8 (&scr->imr) & ~(1 << (irq - IRQ_TC6393_START)), ++ &scr->imr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static struct irq_chip tc6393_chip = { ++ .ack = tc6393_irq_ack, ++ .mask = tc6393_irq_mask, ++ .unmask = tc6393_irq_unmask, ++}; ++ ++static void tc6393_attach_irq (struct tc6393 *tc6393) ++{ ++ unsigned int irq; ++ ++ for (irq = IRQ_TC6393_START; irq <= IRQ_TC6393_LCD; irq++) { ++ set_irq_chip (irq, &tc6393_chip); ++ set_irq_chip_data(irq, tc6393); ++ set_irq_handler (irq, handle_edge_irq); ++ set_irq_flags (irq, IRQF_VALID | IRQF_PROBE); ++ } ++ ++ set_irq_type (tc6393->irq, IRQT_FALLING); ++ set_irq_chip_data (tc6393->irq, tc6393); ++ set_irq_chained_handler (tc6393->irq, tc6393_irq); ++} ++ ++static void tc6393_detach_irq (struct tc6393 *tc6393) ++{ ++ unsigned int irq; ++ ++ set_irq_chained_handler (tc6393->irq, NULL); ++ set_irq_chip_data (tc6393->irq, NULL); ++ ++ for (irq = IRQ_TC6393_START; irq <= IRQ_TC6393_LCD; irq++) { ++ set_irq_flags (irq, 0); ++ set_irq_chip (irq, NULL); ++ set_irq_chip_data(irq, NULL); ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++ ++static int tc6393_bus_match (struct device *dev, struct device_driver *drv) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ const struct tc6393_cell* cell = tdev->soc_data; ++ ++ return !strcmp (cell->name, drv->name); ++} ++ ++static int tc6393_bus_suspend (struct device *dev, pm_message_t state) ++{ ++ struct device_driver* drv = dev->driver; ++ return drv && drv->suspend ? drv->suspend (dev, state) : 0; ++} ++ ++static int tc6393_bus_resume (struct device *dev) ++{ ++ struct device_driver* drv = dev->driver; ++ return drv && drv->resume ? drv->resume (dev) : 0; ++} ++ ++struct bus_type tc6393_bus_type = { ++ .name = TMIO_NAME_BUS, ++ .match = tc6393_bus_match, ++ .suspend = tc6393_bus_suspend, ++ .resume = tc6393_bus_resume, ++}; ++EXPORT_SYMBOL (tc6393_bus_type); ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void tc6393_cell_clock (struct device *dev, int enable) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ const struct tc6393_cell* cell = tdev->soc_data; ++ struct tc6393* tc6393 = dev_get_drvdata (dev->parent); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ union tc6393_scr_ccr ccr; ++ unsigned long flags; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ ccr.raw = ioread16 (&scr->ccr); ++ ++ switch (cell->id) { ++ case TC6393_CELL_SD: ccr.ck32ken = enable; break; ++ case TC6393_CELL_OHCI: ccr.usbcken = enable; break; ++ case TC6393_CELL_LCD: ++ ccr.mclksel = enable ? m48MHz : disable; ++ break; ++ } ++ ++ printk (KERN_DEBUG TMIO_NAME_CORE ": scr->ccr = %04x\n", ccr.raw); ++ ++ iowrite16(ccr.raw, &scr->ccr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static void tc6393_cell_function (struct device *dev, int enable) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ const struct tc6393_cell* cell = tdev->soc_data; ++ struct tc6393* tc6393 = dev_get_drvdata (dev->parent); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ union tc6393_scr_fer fer; ++ unsigned long flags; ++ ++ if (cell->id == TC6393_CELL_NAND) { ++ if (enable) { ++ /* SMD buffer on */ ++ printk (KERN_DEBUG TMIO_NAME_CORE ": SMD buffer on\n"); ++ iowrite8 (0xff, scr->gpi_bcr + 1); ++ } ++ return; ++ } ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ fer.raw = ioread16 (&scr->fer); ++ ++ switch (cell->id) { ++ case TC6393_CELL_OHCI: fer.usben = enable; break; ++ case TC6393_CELL_LCD: fer.slcden = enable; break; ++ } ++ ++ printk (KERN_DEBUG TMIO_NAME_CORE ": scr->fer = %02x\n", fer.raw); ++ ++ iowrite8 (fer.raw, &scr->fer); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static void ++tc6393_lcd_mode (struct device *dev, const struct fb_videomode *mode) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev->parent); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ ++ iowrite16 (mode->pixclock, scr->pll1cr + 0); ++ iowrite16 (mode->pixclock >> 16, scr->pll1cr + 1); ++} ++ ++static struct tmio_cell_ops tc6393_cell_ops = { ++ .clock = tc6393_cell_clock, ++ .function = tc6393_cell_function, ++ .lcd_mode = tc6393_lcd_mode, ++}; ++ ++static void tc6393_device_release (struct device *dev) ++{ ++} ++ ++static int ++tc6393_device_register (struct tc6393 *tc6393, struct tmio_cell *tcell) ++{ ++ const struct tc6393_cell* cell; ++ struct tmio_device* tdev; ++ struct device* dev; ++ int i; ++ ++ for (i = 0; strcmp (tcell->name, tc6393_cell [i].name); ) ++ if (++i >= ARRAY_SIZE(tc6393_cell)) ++ return -EINVAL; ++ ++ cell = tc6393_cell + i; ++ tdev = tc6393->tdev + i; ++ dev = &tdev->dev; ++ ++ tdev->ops = &tc6393_cell_ops; ++ tdev->iomem = tc6393->iomem; ++ tdev->soc_data = (void*) cell; ++ ++ dev->parent = tc6393->dev; ++ strncpy (dev->bus_id, cell->name, sizeof dev->bus_id); ++ dev->bus = &tc6393_bus_type; ++ dev->dma_mask = tc6393->dev->dma_mask; ++ dev->coherent_dma_mask = tc6393->dev->coherent_dma_mask; ++ dev->release = tc6393_device_release; ++ dev->platform_data = tcell->platform_data; ++ ++ for (i=0; i < cell->num_resources; i++) { ++ const struct resource* cr = cell->resource + i; ++ struct resource* dr = tdev->resource + i; ++ ++ dr->name = cr->name; ++ dr->start = cr->start; ++ dr->end = cr->end; ++ dr->flags = cr->flags; ++ ++ /* convert memory offsets to absolutes */ ++ if (cr->flags & IORESOURCE_MEM) { ++ dr->start += tc6393->iomem->start; ++ dr->end += tc6393->iomem->start; ++ } ++ } ++ ++ return device_register (dev); ++} ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void tc6393_hw_init (struct tc6393 *tc6393) ++{ ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ struct tc6393_platform_data* tcpd = tc6393->dev->platform_data; ++ ++ tcpd->enable (tc6393->dev); ++ ++ iowrite8 (0, &scr->fer); ++ iowrite16(tcpd->scr_pll2cr, &scr->pll2cr); ++ iowrite16(tcpd->scr_ccr, &scr->ccr); ++ iowrite16(tcpd->scr_mcr, &scr->mcr); ++ iowrite16(tcpd->scr_gper, &scr->gper); ++ iowrite8 (0, &scr->irr); ++ iowrite8 (0xbf, &scr->imr); ++ iowrite16(tcpd->scr_gpo_dsr, scr->gpo_dsr + 0); ++ iowrite16(tcpd->scr_gpo_dsr >> 16, scr->gpo_dsr + 1); ++ iowrite16(tcpd->scr_gpo_doecr, scr->gpo_doecr + 0); ++ iowrite16(tcpd->scr_gpo_doecr >> 16, scr->gpo_doecr + 1); ++} ++ ++static int tc6393_probe (struct device *dev) ++{ ++ struct platform_device* pdev = to_platform_device (dev); ++ struct tc6393_platform_data* tcpd = dev->platform_data; ++ struct tc6393* tc6393; ++ struct resource* iomem; ++ struct resource* rscr; ++ int retval; ++ int i; ++ ++ iomem = platform_get_resource (pdev, IORESOURCE_MEM, 0); ++ if (!iomem) ++ return -EINVAL; ++ ++ tc6393 = kzalloc (sizeof *tc6393, GFP_KERNEL); ++ if (!tc6393) { ++ retval = -ENOMEM; ++ goto err_kzalloc; ++ } ++ ++ dev_set_drvdata (dev, tc6393); ++ spin_lock_init (&tc6393->lock); ++ tc6393->dev = dev; ++ tc6393->iomem = iomem; ++ tc6393->irq = platform_get_irq (pdev, 0); ++ ++ rscr = &tc6393->rscr; ++ rscr->name = TMIO_NAME_CORE; ++ rscr->start = iomem->start; ++ rscr->end = iomem->start + 0xff; ++ rscr->flags = IORESOURCE_MEM; ++ ++ retval = request_resource (iomem, rscr); ++ if (retval) ++ goto err_request_scr; ++ ++ tc6393->scr = ioremap (rscr->start, rscr->end - rscr->start + 1); ++ if (!tc6393->scr) { ++ retval = -ENOMEM; ++ goto err_ioremap; ++ } ++ ++ tc6393_hw_init (tc6393); ++ ++ printk (KERN_INFO "Toshiba %s revision %d at 0x%08lx, irq %d\n", ++ TMIO_SOC_NAME, ioread8 (&tc6393->scr->revid), ++ iomem->start, tc6393->irq); ++ ++ if (tc6393->irq) ++ tc6393_attach_irq (tc6393); ++ ++ for (i = 0; i < tcpd->num_cells; i++) ++ tc6393_device_register (tc6393, tcpd->cell + i); ++ ++ return 0; ++ ++err_ioremap: ++ release_resource (rscr); ++err_request_scr: ++ kfree(tc6393); ++err_kzalloc: ++ release_resource (iomem); ++ return retval; ++} ++ ++static int tc6393_dev_remove (struct device *dev, void *data) ++{ ++ device_unregister (dev); ++ return 0; ++} ++ ++static int tc6393_remove (struct device *dev) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ ++ device_for_each_child (dev, tc6393, tc6393_dev_remove); ++ ++ if (tc6393->irq) ++ tc6393_detach_irq (tc6393); ++ ++ iounmap (tc6393->scr); ++ release_resource (&tc6393->rscr); ++ release_resource (tc6393->iomem); ++ kfree (tc6393); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int tc6393_suspend (struct device *dev, pm_message_t state) ++{ ++ struct tc6393_platform_data* tcpd = dev->platform_data; ++ tcpd->disable (dev); ++ return 0; ++} ++ ++static int tc6393_resume (struct device *dev) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ tc6393_hw_init (tc6393); ++ return 0; ++} ++#endif ++ ++static struct device_driver tc6393_device_driver = { ++ .name = TMIO_SOC_NAME, ++ .bus = &platform_bus_type, ++ .probe = tc6393_probe, ++ .remove = tc6393_remove, ++#ifdef CONFIG_PM ++ .suspend = tc6393_suspend, ++ .resume = tc6393_resume, ++#endif ++}; ++ ++/*--------------------------------------------------------------------------*/ ++ ++static int __init tc6393_init (void) ++{ ++ int retval = bus_register (&tc6393_bus_type); ++ if (retval) ++ return retval; ++ ++ return driver_register (&tc6393_device_driver); ++} ++ ++static void __exit tc6393_exit (void) ++{ ++ driver_unregister (&tc6393_device_driver); ++ bus_unregister (&tc6393_bus_type); ++} ++ ++module_init (tc6393_init); ++module_exit (tc6393_exit); ++ ++MODULE_DESCRIPTION ("TC6393 SoC bus driver"); ++MODULE_AUTHOR ("Chris Humbert, Dirk Opfer"); ++MODULE_LICENSE ("GPL"); +Index: git/arch/arm/common/Kconfig +=================================================================== +--- git.orig/arch/arm/common/Kconfig 2006-10-31 16:08:28.000000000 +0000 ++++ git/arch/arm/common/Kconfig 2006-11-07 22:13:09.000000000 +0000 +@@ -31,3 +31,6 @@ config SHARPSL_PM + + config SHARP_SCOOP + bool ++ ++config TOSHIBA_TC6393XB ++ bool +Index: git/arch/arm/mach-pxa/Kconfig +=================================================================== +--- git.orig/arch/arm/mach-pxa/Kconfig 2006-11-07 22:13:06.000000000 +0000 ++++ git/arch/arm/mach-pxa/ 2006-11-07 23:30:34.000000000 +0000 +@@ -128,6 +128,7 @@ config MACH_BORZOI + config MACH_TOSA + bool "Enable Sharp SL-6000x (Tosa) Support" + depends on PXA_SHARPSL_25x ++ select TOSHIBA_TC6393XB + + config PXA25x + bool +Index: git/arch/arm/common/Makefile +=================================================================== +--- git.orig/arch/arm/common/Makefile 2006-10-31 16:08:28.000000000 +0000 ++++ git/arch/arm/common/Makefile 2006-11-07 22:13:09.000000000 +0000 +@@ -17,3 +17,4 @@ obj-$(CONFIG_SHARPSL_PM) += sharpsl_pm.o + obj-$(CONFIG_SHARP_SCOOP) += scoop.o + obj-$(CONFIG_ARCH_IXP2000) += uengine.o + obj-$(CONFIG_ARCH_IXP23XX) += uengine.o ++obj-$(CONFIG_TOSHIBA_TC6393XB) += tc6393xb.o +Index: git/include/asm-arm/hardware/tmio.h +=================================================================== +--- git.orig/include/asm-arm/hardware/tmio.h 2006-11-07 22:13:09.000000000 +0000 ++++ git/include/asm-arm/hardware/tmio.h 2006-11-07 22:13:09.000000000 +0000 +@@ -91,6 +91,50 @@ struct tmio_device { + + /*--------------------------------------------------------------------------*/ + ++/* ++ * TC6393XB SoC ++ */ ++#ifdef CONFIG_TOSHIBA_TC6393XB ++#define TMIO_SOC_TC6393XB ++#define TMIO_SOC_NAME "TC6393XB" ++#define TMIO_NAME_BUS "tc6393-bus" ++#define TMIO_NAME_CORE "tc6393-core" ++#define TMIO_NAME_NAND "tc6393-nand" ++#define TMIO_NAME_SD "tc6393-sd" ++#define TMIO_NAME_OHCI "tc6393-ohci" ++#define TMIO_NAME_SERIAL "tc6393-serial" ++#define TMIO_NAME_LCD "tc6393-lcd" ++#define tmio_bus_type tc6393_bus_type ++ ++#define TC6393_GPIO(x) (1 << (x)) ++ ++extern struct bus_type tc6393_bus_type; ++ ++struct tc6393_platform_data { ++ u16 scr_pll2cr; /* PLL2 Control */ ++ u16 scr_ccr; /* Clock Control */ ++ u16 scr_mcr; /* Mode Control */ ++ u16 scr_gper; /* GP Enable */ ++ u32 scr_gpo_doecr; /* GPO Data OE Control */ ++ u32 scr_gpo_dsr; /* GPO Data Set */ ++ ++ /* cells to register as devices */ ++ struct tmio_cell* cell; ++ unsigned int num_cells; ++ ++ /* callbacks to enable and disable the TC6393XB's power and clock */ ++ void (*enable) (struct device *dev); ++ void (*disable) (struct device *dev); ++}; ++ ++u32 get_tc6393_gpio (struct device *dev); ++u32 set_tc6393_gpio (struct device *dev, u32 bits); ++u32 reset_tc6393_gpio (struct device *dev, u32 bits); ++ ++/*--------------------------------------------------------------------------*/ ++ ++#else + #error "no TMIO SoC configured" ++#endif + + #endif +Index: git/include/asm-arm/arch-pxa/irqs.h +=================================================================== +--- git.orig/include/asm-arm/arch-pxa/irqs.h 2006-10-31 16:09:33.000000000 +0000 ++++ git/include/asm-arm/arch-pxa/irqs.h 2006-11-07 22:13:09.000000000 +0000 +@@ -163,17 +163,27 @@ + #define IRQ_LOCOMO_SPI_OVRN (IRQ_BOARD_END + 20) + #define IRQ_LOCOMO_SPI_TEND (IRQ_BOARD_END + 21) + ++#define IRQ_TC6393_START (IRQ_BOARD_END) ++#define IRQ_TC6393_NAND (IRQ_BOARD_END + 0) ++#define IRQ_TC6393_SD (IRQ_BOARD_END + 1) ++#define IRQ_TC6393_OHCI (IRQ_BOARD_END + 2) ++#define IRQ_TC6393_SERIAL (IRQ_BOARD_END + 3) ++#define IRQ_TC6393_LCD (IRQ_BOARD_END + 4) ++ + /* + * Figure out the MAX IRQ number. + * + * If we have an SA1111, the max IRQ is S1_BVD1_STSCHG+1. + * If we have an LoCoMo, the max IRQ is IRQ_LOCOMO_SPI_TEND+1 ++ * If we have an TC6393XB, the max IRQ is IRQ_TC6393_LCD+1 + * Otherwise, we have the standard IRQs only. + */ + #ifdef CONFIG_SA1111 + #define NR_IRQS (IRQ_S1_BVD1_STSCHG + 1) + #elif defined(CONFIG_SHARP_LOCOMO) + #define NR_IRQS (IRQ_LOCOMO_SPI_TEND + 1) ++#elif defined(CONFIG_TOSHIBA_TC6393XB) ++#define NR_IRQS (IRQ_TC6393_LCD + 1) + #elif defined(CONFIG_ARCH_LUBBOCK) || \ + defined(CONFIG_MACH_LOGICPD_PXA270) || \ + defined(CONFIG_MACH_MAINSTONE) diff --git a/packages/linux/linux-rp-2.6.22/tosa-keyboard-r19.patch b/packages/linux/linux-rp-2.6.22/tosa-keyboard-r19.patch new file mode 100644 index 0000000000..948c27fdce --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tosa-keyboard-r19.patch @@ -0,0 +1,514 @@ + drivers/input/keyboard/Kconfig | 12 - + drivers/input/keyboard/Makefile | 1 + drivers/input/keyboard/tosakbd.c | 467 +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 479 insertions(+), 1 deletion(-) + +Index: git/drivers/input/keyboard/Kconfig +=================================================================== +--- git.orig/drivers/input/keyboard/Kconfig 2006-10-31 16:08:57.000000000 +0000 ++++ git/drivers/input/keyboard/Kconfig 2006-11-07 22:13:10.000000000 +0000 +@@ -148,12 +148,22 @@ config KEYBOARD_SPITZ + depends on PXA_SHARPSL + default y + help +- Say Y here to enable the keyboard on the Sharp Zaurus SL-C1000, ++ Say Y here to enable the keyboard on the Sharp Zaurus SL-C1000, + SL-C3000 and Sl-C3100 series of PDAs. + + To compile this driver as a module, choose M here: the + module will be called spitzkbd. + ++config KEYBOARD_TOSA ++ tristate "Tosa keyboard" ++ depends on PXA_SHARPSL ++ default y ++ help ++ Say Y here to enable the keyboard on the Sharp Zaurus SL-6000x (Tosa) ++ ++ To compile this driver as a module, choose M here: the ++ module will be called tosakbd. ++ + config KEYBOARD_AMIGA + tristate "Amiga keyboard" + depends on AMIGA +Index: git/drivers/input/keyboard/Makefile +=================================================================== +--- git.orig/drivers/input/keyboard/Makefile 2006-10-31 16:08:57.000000000 +0000 ++++ git/drivers/input/keyboard/Makefile 2006-11-07 22:13:10.000000000 +0000 +@@ -17,3 +17,4 @@ obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkb + obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o + obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o + obj-$(CONFIG_KEYBOARD_ASIC3) += asic3_keys.o ++obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o +Index: git/drivers/input/keyboard/tosakbd.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/input/keyboard/tosakbd.c 2006-11-07 23:27:19.000000000 +0000 +@@ -0,0 +1,467 @@ ++/* ++ * Keyboard driver for Sharp Tosa models (SL-6000x) ++ * ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * Based on xtkbd.c/locomkbd.c/corgikbd.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++#include <linux/init.h> ++#include <linux/input.h> ++#include <linux/interrupt.h> ++#include <linux/jiffies.h> ++#include <linux/module.h> ++#include <linux/slab.h> ++ ++#include <asm/arch/tosa.h> ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++ ++ ++#define TOSA_KEY_STROBE_NUM (11) ++#define TOSA_KEY_SENSE_NUM (7) ++ ++#define KEYMASK_ON (0x1<<0) ++#define KEYMASK_REC (0x1<<1) ++#define KEYMASK_SYNC (0x1<<2) ++ ++#define KB_ROWS 7 ++#define KB_COLS 11 ++#define KB_ROWMASK(r) (1 << (r)) ++#define SCANCODE(r,c) ( ((r)<<4) + (c) + 1 ) ++#define NR_SCANCODES (SCANCODE(KB_ROWS-1,KB_COLS)+1+1) ++ ++#define SCAN_INTERVAL (HZ/10) ++#define HP_SCAN_INTERVAL (150) /* ms */ ++#define HP_STABLE_COUNT 2 ++ ++#define TOSA_KEY_CALENDER KEY_F1 ++#define TOSA_KEY_ADDRESS KEY_F2 ++#define TOSA_KEY_FN KEY_F3 ++#define TOSA_KEY_CANCEL KEY_F4 ++#define TOSA_KEY_OFF KEY_SUSPEND ++#define TOSA_KEY_CENTER KEY_F5 ++#define TOSA_KEY_REC KEY_F6 ++#define TOSA_KEY_LIGHT KEY_F7 ++#define TOSA_KEY_RECORD KEY_F8 ++#define TOSA_KEY_HOME KEY_F9 ++#define TOSA_KEY_MAIL KEY_F10 ++#define TOSA_KEY_OK KEY_F11 ++#define TOSA_KEY_MENU KEY_F12 ++#define TOSA_KEY_SYNC KEY_F13 ++ ++#define GET_ROWS_STATUS(c) ((GPLR2 & TOSA_GPIO_ALL_SENSE_BIT) >> TOSA_GPIO_ALL_SENSE_RSHIFT) ++#define KB_DISCHARGE_DELAY 10 ++#define KB_ACTIVATE_DELAY 10 ++ ++ ++static unsigned char tosakbd_keycode[NR_SCANCODES] = { ++ 0, /* 0 */ ++ 0, KEY_W, 0, 0, 0, KEY_K, KEY_BACKSPACE, KEY_P, 0, 0, 0, TOSA_KEY_OFF, 0, 0, 0, 0, /*1 - 16*/ ++ KEY_Q, KEY_E, KEY_T, KEY_Y, 0, KEY_O, KEY_I, KEY_COMMA, 0, 0, 0, TOSA_KEY_RECORD, 0, 0, 0, 0, /*17 - 32*/ ++ KEY_A, KEY_D, KEY_G, KEY_U, 0, KEY_L, KEY_ENTER, KEY_DOT, 0, 0, 0, TOSA_KEY_SYNC, 0, 0, 0, 0, /*33 - 48*/ ++ KEY_Z, KEY_C, KEY_V, KEY_J, TOSA_KEY_ADDRESS, TOSA_KEY_CANCEL, TOSA_KEY_CENTER, TOSA_KEY_OK, KEY_LEFTSHIFT, 0 , 0,0 , 0, 0, 0, 0, /*49 - 64*/ ++ KEY_S, KEY_R, KEY_B, KEY_N, TOSA_KEY_CALENDER, TOSA_KEY_HOME, TOSA_KEY_REC, TOSA_KEY_LIGHT, 0, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, 0, /*65 - 80*/ ++ KEY_TAB, KEY_SLASH, KEY_H, KEY_M, TOSA_KEY_MENU, 0, KEY_UP, 0, 0, 0, TOSA_KEY_FN, 0, 0, 0, 0, 0, /*81 - 96*/ ++ KEY_X, KEY_F, KEY_SPACE, KEY_APOSTROPHE, TOSA_KEY_MAIL, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0, 0, /*97 - 109*/ ++}; ++ ++struct tosakbd { ++ unsigned char keycode[ARRAY_SIZE(tosakbd_keycode)]; ++ struct input_dev *input; ++ ++ spinlock_t lock; ++ struct timer_list timer; ++ struct timer_list hptimer; ++ ++ int hp_state; ++ int hp_count; ++ ++ unsigned int suspended; ++ unsigned long suspend_jiffies; ++}; ++ ++/* Helper functions for reading the keyboard matrix ++ * Note: We should really be using pxa_gpio_mode to alter GPDR but it ++ * requires a function call per GPIO bit which is excessive ++ * when we need to access 12 bits at once, multiple times. ++ * These functions must be called within local_irq_save()/local_irq_restore() ++ * or similar. ++ */ ++static inline void tosakbd_discharge_all(void) ++{ ++ /* STROBE All HiZ */ ++ GPCR1 = TOSA_GPIO_HIGH_STROBE_BIT; ++ GPDR1 &= ~TOSA_GPIO_HIGH_STROBE_BIT; ++ GPCR2 = TOSA_GPIO_LOW_STROBE_BIT; ++ GPDR2 &= ~TOSA_GPIO_LOW_STROBE_BIT; ++} ++ ++static inline void tosakbd_activate_all(void) ++{ ++ /* STROBE ALL -> High */ ++ GPSR1 = TOSA_GPIO_HIGH_STROBE_BIT; ++ GPDR1 |= TOSA_GPIO_HIGH_STROBE_BIT; ++ GPSR2 = TOSA_GPIO_LOW_STROBE_BIT; ++ GPDR2 |= TOSA_GPIO_LOW_STROBE_BIT; ++ ++ udelay(KB_DISCHARGE_DELAY); ++ ++ /* STATE CLEAR */ ++ GEDR2 |= TOSA_GPIO_ALL_SENSE_BIT; ++} ++ ++static inline void tosakbd_activate_col(int col) ++{ ++ if (col<=5) { ++ /* STROBE col -> High, not col -> HiZ */ ++ GPSR1 = TOSA_GPIO_STROBE_BIT(col); ++ GPDR1 = (GPDR1 & ~TOSA_GPIO_HIGH_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } else { ++ /* STROBE col -> High, not col -> HiZ */ ++ GPSR2 = TOSA_GPIO_STROBE_BIT(col); ++ GPDR2 = (GPDR2 & ~TOSA_GPIO_LOW_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } ++} ++ ++static inline void tosakbd_reset_col(int col) ++{ ++ if (col<=5) { ++ /* STROBE col -> Low */ ++ GPCR1 = TOSA_GPIO_STROBE_BIT(col); ++ /* STROBE col -> out, not col -> HiZ */ ++ GPDR1 = (GPDR1 & ~TOSA_GPIO_HIGH_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } else { ++ /* STROBE col -> Low */ ++ GPCR2 = TOSA_GPIO_STROBE_BIT(col); ++ /* STROBE col -> out, not col -> HiZ */ ++ GPDR2 = (GPDR2 & ~TOSA_GPIO_LOW_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } ++} ++ ++/* ++ * Read the GPIOs for POWER, RECORD and SYNC ++ */ ++static int read_port_key_status_raw(void) ++{ ++ int val=0; ++ ++ /* Power key */ ++ if ((GPLR0 & GPIO_bit(TOSA_GPIO_ON_KEY))==0) ++ val |= KEYMASK_ON; ++ /* Record key */ ++ if ((GPLR0 & GPIO_bit(TOSA_GPIO_RECORD_BTN))==0) ++ val |= KEYMASK_REC; ++ /* Sync key */ ++ if ((GPLR0 & GPIO_bit(TOSA_GPIO_SYNC))==0) ++ val |= KEYMASK_SYNC; ++ return val; ++} ++ ++ ++/* ++ * The tosa keyboard only generates interrupts when a key is pressed. ++ * So when a key is pressed, we enable a timer. This timer scans the ++ * keyboard, and this is how we detect when the key is released. ++ */ ++ ++/* Scan the hardware keyboard and push any changes up through the input layer */ ++static void tosakbd_scankeyboard(struct tosakbd *tosakbd_data) ++{ ++ unsigned int row, col, rowd; ++ unsigned long flags; ++ unsigned int num_pressed = 0; ++ ++ if (tosakbd_data->suspended) ++ return; ++ ++ spin_lock_irqsave(&tosakbd_data->lock, flags); ++ ++ for (col = 0; col < KB_COLS; col++) { ++ /* ++ * Discharge the output driver capacitatance ++ * in the keyboard matrix. (Yes it is significant..) ++ */ ++ tosakbd_discharge_all(); ++ udelay(KB_DISCHARGE_DELAY); ++ ++ tosakbd_activate_col( col); ++ udelay(KB_ACTIVATE_DELAY); ++ ++ rowd = GET_ROWS_STATUS(col); ++ ++ for (row = 0; row < KB_ROWS; row++) { ++ unsigned int scancode, pressed; ++ scancode = SCANCODE(row, col); ++ pressed = rowd & KB_ROWMASK(row); ++ input_report_key(tosakbd_data->input, tosakbd_data->keycode[scancode], pressed); ++ if (pressed) ++ num_pressed++; ++ } ++ ++ tosakbd_reset_col(col); ++ } ++ ++ tosakbd_activate_all(); ++ ++ rowd = read_port_key_status_raw(); ++ ++ for (row = 0; row < 3; row++ ) { ++ unsigned int scancode, pressed; ++ scancode = SCANCODE(row, KB_COLS); ++ pressed = rowd & KB_ROWMASK(row); ++ input_report_key(tosakbd_data->input, tosakbd_data->keycode[scancode], pressed); ++ if (pressed) ++ num_pressed++; ++ ++ if (pressed && (tosakbd_data->keycode[scancode] == TOSA_KEY_OFF) ++ && time_after(jiffies, tosakbd_data->suspend_jiffies + msecs_to_jiffies(1000))) { ++ input_event(tosakbd_data->input, EV_PWR, TOSA_KEY_OFF, 1); ++ tosakbd_data->suspend_jiffies = jiffies; ++ } ++ } ++ ++ input_sync(tosakbd_data->input); ++ ++ /* if any keys are pressed, enable the timer */ ++ if (num_pressed) ++ mod_timer(&tosakbd_data->timer, jiffies + SCAN_INTERVAL); ++ ++ spin_unlock_irqrestore(&tosakbd_data->lock, flags); ++} ++ ++/* ++ * tosa keyboard interrupt handler. ++ */ ++static irqreturn_t tosakbd_interrupt(int irq, void *dev_id) ++{ ++ struct tosakbd *tosakbd_data = dev_id; ++ ++ if (!timer_pending(&tosakbd_data->timer)) ++ { ++ /** wait chattering delay **/ ++ udelay(20); ++ tosakbd_scankeyboard(tosakbd_data); ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++/* ++ * tosa timer checking for released keys ++ */ ++static void tosakbd_timer_callback(unsigned long data) ++{ ++ struct tosakbd *tosakbd_data = (struct tosakbd *) data; ++ tosakbd_scankeyboard(tosakbd_data); ++} ++ ++/* ++ * The headphone generates an interrupt. ++ * We debounce the switche and pass them to the input system. ++ */ ++ ++static irqreturn_t tosakbd_hp_isr(int irq, void *dev_id) ++{ ++ struct tosakbd *tosakbd_data = dev_id; ++ ++ if (!timer_pending(&tosakbd_data->hptimer)) ++ mod_timer(&tosakbd_data->hptimer, jiffies + msecs_to_jiffies(HP_SCAN_INTERVAL)); ++ ++ return IRQ_HANDLED; ++} ++ ++static void tosakbd_hp_timer(unsigned long data) ++{ ++ struct tosakbd *tosakbd_data = (struct tosakbd *) data; ++ unsigned long state; ++ unsigned long flags; ++ ++ state = (GPLR(TOSA_GPIO_EAR_IN) & GPIO_bit(TOSA_GPIO_EAR_IN)); ++ if (state != tosakbd_data->hp_state) { ++ tosakbd_data->hp_count = 0; ++ tosakbd_data->hp_state = state; ++ } else if (tosakbd_data->hp_count < HP_STABLE_COUNT) { ++ tosakbd_data->hp_count++; ++ } ++ ++ if (tosakbd_data->hp_count >= HP_STABLE_COUNT) { ++ spin_lock_irqsave(&tosakbd_data->lock, flags); ++ ++ input_report_switch(tosakbd_data->input, SW_HEADPHONE_INSERT, ((GPLR(TOSA_GPIO_EAR_IN) & GPIO_bit(TOSA_GPIO_EAR_IN)) == 0)); ++ input_sync(tosakbd_data->input); ++ ++ spin_unlock_irqrestore(&tosakbd_data->lock, flags); ++ } else { ++ mod_timer(&tosakbd_data->hptimer, jiffies + msecs_to_jiffies(HP_SCAN_INTERVAL)); ++ } ++} ++ ++#ifdef CONFIG_PM ++static int tosakbd_suspend(struct platform_device *dev, pm_message_t state) ++{ ++ struct tosakbd *tosakbd = platform_get_drvdata(dev); ++ ++ tosakbd->suspended = 1; ++ ++ return 0; ++} ++ ++static int tosakbd_resume(struct platform_device *dev) ++{ ++ struct tosakbd *tosakbd = platform_get_drvdata(dev); ++ ++ /* Upon resume, ignore the suspend key for a short while */ ++ tosakbd->suspend_jiffies = jiffies; ++ tosakbd->suspended = 0; ++ ++ return 0; ++} ++#else ++#define tosakbd_suspend NULL ++#define tosakbd_resume NULL ++#endif ++ ++static int __init tosakbd_probe(struct platform_device *pdev) { ++ ++ int i; ++ struct tosakbd *tosakbd; ++ struct input_dev *input_dev; ++ ++ tosakbd = kzalloc(sizeof(struct tosakbd), GFP_KERNEL); ++ if (!tosakbd) ++ return -ENOMEM; ++ ++ input_dev = input_allocate_device(); ++ if (!input_dev) { ++ kfree(tosakbd); ++ return -ENOMEM; ++ } ++ ++ platform_set_drvdata(pdev,tosakbd); ++ ++ spin_lock_init(&tosakbd->lock); ++ ++ /* Init Keyboard rescan timer */ ++ init_timer(&tosakbd->timer); ++ tosakbd->timer.function = tosakbd_timer_callback; ++ tosakbd->timer.data = (unsigned long) tosakbd; ++ ++ /* Init Headphone Timer */ ++ init_timer(&tosakbd->hptimer); ++ tosakbd->hptimer.function = tosakbd_hp_timer; ++ tosakbd->hptimer.data = (unsigned long) tosakbd; ++ ++ tosakbd->suspend_jiffies = jiffies; ++ ++ tosakbd->input = input_dev; ++ ++ input_dev->private = tosakbd; ++ input_dev->name = "Tosa Keyboard"; ++ input_dev->phys = "tosakbd/input0"; ++ input_dev->cdev.dev = &pdev->dev; ++ ++ input_dev->id.bustype = BUS_HOST; ++ input_dev->id.vendor = 0x0001; ++ input_dev->id.product = 0x0001; ++ input_dev->id.version = 0x0100; ++ ++ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR) | BIT(EV_SW); ++ input_dev->keycode = tosakbd->keycode; ++ input_dev->keycodesize = sizeof(unsigned char); ++ input_dev->keycodemax = ARRAY_SIZE(tosakbd_keycode); ++ ++ memcpy(tosakbd->keycode, tosakbd_keycode, sizeof(tosakbd->keycode)); ++ for (i = 0; i < ARRAY_SIZE(tosakbd_keycode); i++) ++ set_bit(tosakbd->keycode[i], input_dev->keybit); ++ clear_bit(0, input_dev->keybit); ++ set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); ++ ++ input_register_device(tosakbd->input); ++ ++ /* Setup sense interrupts - RisingEdge Detect, sense lines as inputs */ ++ for (i = 0; i < TOSA_KEY_SENSE_NUM; i++) { ++ pxa_gpio_mode( TOSA_GPIO_KEY_SENSE(i) | GPIO_IN); ++ if (request_irq(TOSA_IRQ_GPIO_KEY_SENSE(i), tosakbd_interrupt, ++ IRQF_DISABLED | IRQF_TRIGGER_RISING, "tosakbd", tosakbd)) { ++ printk("tosakbd: Can't get IRQ: %d !\n", i); ++ } ++ } ++ ++ /* Set Strobe lines as outputs - set high */ ++ for (i = 0; i < TOSA_KEY_STROBE_NUM; i++) { ++ pxa_gpio_mode( TOSA_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH); ++ } ++ ++ // Power&Rec Button ++ pxa_gpio_mode( TOSA_GPIO_ON_KEY | GPIO_IN); ++ pxa_gpio_mode( TOSA_GPIO_RECORD_BTN | GPIO_IN); ++ pxa_gpio_mode( TOSA_GPIO_SYNC | GPIO_IN); ++ pxa_gpio_mode( TOSA_GPIO_EAR_IN | GPIO_IN); ++ ++ if (request_irq(TOSA_IRQ_GPIO_ON_KEY, tosakbd_interrupt, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "On key", tosakbd) || ++ request_irq(TOSA_IRQ_GPIO_RECORD_BTN, tosakbd_interrupt, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "Record key", tosakbd) || ++ request_irq(TOSA_IRQ_GPIO_SYNC, tosakbd_interrupt, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "Sync key", tosakbd) || ++ request_irq(TOSA_IRQ_GPIO_EAR_IN, tosakbd_hp_isr, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "HP in", tosakbd)) { ++ printk("Could not allocate KEYBD IRQ!\n"); ++ } ++ ++ printk(KERN_INFO "input: Tosa Keyboard Registered\n"); ++ ++ return 0; ++} ++ ++static int tosakbd_remove(struct platform_device *dev) { ++ ++ int i; ++ struct tosakbd *tosakbd = platform_get_drvdata(dev); ++ ++ for (i = 0; i < TOSA_KEY_SENSE_NUM; i++) ++ free_irq(TOSA_IRQ_GPIO_KEY_SENSE(i),tosakbd); ++ ++ free_irq(TOSA_IRQ_GPIO_ON_KEY,tosakbd); ++ free_irq(TOSA_IRQ_GPIO_RECORD_BTN,tosakbd); ++ free_irq(TOSA_IRQ_GPIO_SYNC,tosakbd); ++ ++ del_timer_sync(&tosakbd->timer); ++ ++ input_unregister_device(tosakbd->input); ++ ++ kfree(tosakbd); ++ ++ return 0; ++} ++ ++static struct platform_driver tosakbd_driver = { ++ .probe = tosakbd_probe, ++ .remove = tosakbd_remove, ++ .suspend = tosakbd_suspend, ++ .resume = tosakbd_resume, ++ .driver = { ++ .name = "tosa-keyboard", ++ }, ++}; ++ ++static int __devinit tosakbd_init(void) ++{ ++ return platform_driver_register(&tosakbd_driver); ++} ++ ++static void __exit tosakbd_exit(void) ++{ ++ platform_driver_unregister(&tosakbd_driver); ++} ++ ++module_init(tosakbd_init); ++module_exit(tosakbd_exit); ++ ++MODULE_AUTHOR("Dirk Opfer <Dirk@Opfer-Online.de>"); ++MODULE_DESCRIPTION("Tosa Keyboard Driver"); ++MODULE_LICENSE("GPLv2"); diff --git a/packages/linux/linux-rp-2.6.22/tosa-lcdnoise-r1-fix-r0.patch b/packages/linux/linux-rp-2.6.22/tosa-lcdnoise-r1-fix-r0.patch new file mode 100644 index 0000000000..93a9c18720 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tosa-lcdnoise-r1-fix-r0.patch @@ -0,0 +1,135 @@ +From eada869814636157956641ba1503f0d6cc04e2b7 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 17:43:51 +0400 +Subject: [PATCH] tosa-lcdnoise-r1.patch fixes + +--- + arch/arm/mach-pxa/tosa_lcd.c | 34 ++++++++++++++++++++++++++++++++++ + drivers/input/touchscreen/tosa_ts.c | 9 +-------- + include/asm-arm/arch-pxa/tosa.h | 5 +++++ + 3 files changed, 40 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa_lcd.c b/arch/arm/mach-pxa/tosa_lcd.c +index d52f63f..447ca86 100644 +--- a/arch/arm/mach-pxa/tosa_lcd.c ++++ b/arch/arm/mach-pxa/tosa_lcd.c +@@ -59,6 +59,8 @@ static int bl_intensity; + static struct ssp_dev tosa_nssp_dev; + static struct ssp_state tosa_nssp_state; + static spinlock_t tosa_nssp_lock; ++static int blanked; ++static unsigned long hsync_time; + + static unsigned short normal_i2c[] = { + DAC_BASE, +@@ -130,6 +132,17 @@ static void tosa_lcd_tg_init(struct device *dev) + pxa_nssp_output(TG_GPOSR,0x02); /* GPOS0=powercontrol, GPOS1=GPIO, GPOS2=TCTL */ + } + ++static unsigned long calc_hsync_time(const struct fb_videomode *mode) { ++ /* The 25 and 44 'magic numbers' are from Sharp's 2.4 patches */ ++ if (mode->yres == 640) { ++ return 25; ++ } ++ if (mode->yres == 320) { ++ return 44; ++ } ++ return 0; ++} ++ + static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode) + { + const int value = TG_REG0_COLOR | TG_REG0_UD | TG_REG0_LR; +@@ -154,6 +167,8 @@ static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode) + /* set common voltage */ + i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj); + ++ blanked = 0; ++ hsync_time = calc_hsync_time(mode); + } + + static void tosa_lcd_tg_off(struct device *dev) +@@ -172,6 +187,8 @@ static void tosa_lcd_tg_off(struct device *dev) + + /* L3V Off */ + reset_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); ++ ++ blanked = 1; + } + + static int tosa_detect_client(struct i2c_adapter* adapter, int address, int kind) { +@@ -238,6 +255,23 @@ static int tosa_detach_client(struct i2c_client* client) { + return 0; + } + ++unsigned long tosa_lcd_get_hsync_time(void) ++{ ++/* This method should eventually contain the correct algorithm for calculating ++ the hsync_time */ ++ if (blanked) ++ return 0; ++ else ++ return hsync_time; ++} ++ ++void tosa_lcd_wait_hsync(void) ++{ ++ /* Waits for a rising edge on the VGA line */ ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0); ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0); ++} ++ + static struct i2c_driver tosa_driver={ + .id = TOSA_LCD_I2C_DEVICEID, + .attach_adapter = tosa_attach_adapter, +diff --git a/drivers/input/touchscreen/tosa_ts.c b/drivers/input/touchscreen/tosa_ts.c +index bc733e9..134f8ce 100644 +--- a/drivers/input/touchscreen/tosa_ts.c ++++ b/drivers/input/touchscreen/tosa_ts.c +@@ -25,13 +25,6 @@ + #define CCNT_ON() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) + #define CCNT_OFF() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) + +-static inline void tosa_lcd_wait_hsync(void) +-{ +- /* Waits for a rising edge on the VGA line */ +- while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0); +- while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0); +-} +- + /* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait + * before sampling the Y axis of the touchscreen */ + void tosa_lcd_sync_on(int adcsel) { +@@ -54,7 +47,7 @@ void tosa_lcd_sync_on(int adcsel) { + } + } + +-void tosa_lcd_sync_off(void) { ++void tosa_lcd_sync_off(int adcsel) { + CCNT_OFF(); + } + +diff --git a/include/asm-arm/arch-pxa/tosa.h b/include/asm-arm/arch-pxa/tosa.h +index ce7322d..7f446fd 100644 +--- a/include/asm-arm/arch-pxa/tosa.h ++++ b/include/asm-arm/arch-pxa/tosa.h +@@ -1,6 +1,7 @@ + /* + * Hardware specific definitions for Sharp SL-C6000x series of PDAs + * ++ * Copyright (c) 2006 Wolfson Microelectronics PLC. + * Copyright (c) 2005 Dirk Opfer + * + * Based on Sharp's 2.4 kernel patches +@@ -187,4 +188,8 @@ + extern struct platform_device tosascoop_jc_device; + extern struct platform_device tosascoop_device; + extern struct platform_device tc6393_device; ++ ++unsigned long tosa_lcd_get_hsync_time(void); ++void tosa_lcd_wait_hsync(void); ++ + #endif /* _ASM_ARCH_TOSA_H_ */ +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.22/tosa-lcdnoise-r1.patch b/packages/linux/linux-rp-2.6.22/tosa-lcdnoise-r1.patch new file mode 100644 index 0000000000..21f3cf66b1 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tosa-lcdnoise-r1.patch @@ -0,0 +1,158 @@ +From 564b757ba44b517ac6d693b94a177708bb5d3887 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 17:30:30 +0400 +Subject: [PATCH] tosa-lcdnoise-r1.patch + +--- + drivers/input/touchscreen/Kconfig | 13 +++++ + drivers/input/touchscreen/Makefile | 1 + + drivers/input/touchscreen/tosa_ts.c | 102 +++++++++++++++++++++++++++++++++++ + 3 files changed, 116 insertions(+), 0 deletions(-) + +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index 3ac01b4..6862e8f 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -219,6 +219,19 @@ config TOUCHSCREEN_USB_DMC_TSC10 + bool "DMC TSC-10/25 device support" if EMBEDDED + depends on TOUCHSCREEN_USB_COMPOSITE + ++config TOUCHSCREEN_TOSA ++ tristate "Sharp Tosa touchscreen driver" ++ depends on TOUCHSCREEN_WM97XX && MACH_TOSA ++ default n ++ help ++ Say Y here to enable the driver for the touchscreen on the ++ Sharp Tosa PDA. ++ depends on TOUCHSCREEN_WM97XX && MACH_TOSA ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called tosa_ts. ++ + config TOUCHSCREEN_TSC2101 + tristate "TI TSC2101 touchscreen input driver" + depends on MACH_HX2750 && INPUT && INPUT_TOUCHSCREEN +diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile +index f64d1a5..4fc0e17 100644 +--- a/drivers/input/touchscreen/Makefile ++++ b/drivers/input/touchscreen/Makefile +@@ -22,6 +22,7 @@ obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o + obj-$(CONFIG_TOUCHSCREEN_TSC2101) += tsc2101_ts.o + obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o + obj-$(CONFIG_TOUCHSCREEN_WM97XX_PXA) += pxa-wm97xx.o ++obj-$(CONFIG_TOUCHSCREEN_TOSA) += tosa_ts.o + + ifeq ($(CONFIG_TOUCHSCREEN_WM9713),y) + wm97xx-ts-objs += wm9713.o +diff --git a/drivers/input/touchscreen/tosa_ts.c b/drivers/input/touchscreen/tosa_ts.c +new file mode 100644 +index 0000000..bc733e9 +--- /dev/null ++++ b/drivers/input/touchscreen/tosa_ts.c +@@ -0,0 +1,102 @@ ++/* ++ * tosa_ts.c -- Touchscreen driver for Sharp SL-6000 (Tosa). ++ * ++ * Copyright 2006 Wolfson Microelectronics PLC. ++ * Author: Mike Arthur ++ * linux@wolfsonmicro.com ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 1st Sep 2006 Initial version. ++ * ++ */ ++ ++#include <linux/wm97xx.h> ++#include <asm/arch/tosa.h> ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++ ++/* Taken from the Sharp 2.4 kernel code */ ++#define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a)) ++#define CCNT_ON() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) ++#define CCNT_OFF() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) ++ ++static inline void tosa_lcd_wait_hsync(void) ++{ ++ /* Waits for a rising edge on the VGA line */ ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0); ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0); ++} ++ ++/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait ++ * before sampling the Y axis of the touchscreen */ ++void tosa_lcd_sync_on(int adcsel) { ++ unsigned long timer1 = 0, timer2 = 0, wait_time = 0; ++ if (adcsel == WM97XX_ADCSEL_Y) { ++ wait_time = tosa_lcd_get_hsync_time(); ++ CCNT_ON(); ++ ++ if (wait_time) { ++ /* wait for LCD rising edge */ ++ tosa_lcd_wait_hsync(); ++ /* get clock */ ++ CCNT(timer1); ++ CCNT(timer2); ++ ++ while ((timer2 - timer1) < wait_time) { ++ CCNT(timer2); ++ } ++ } ++ } ++} ++ ++void tosa_lcd_sync_off(void) { ++ CCNT_OFF(); ++} ++ ++static struct wm97xx_mach_ops tosa_mach_ops = { ++ .pre_sample = tosa_lcd_sync_on, ++ .post_sample = tosa_lcd_sync_off, ++}; ++ ++int tosa_ts_probe(struct device *dev) { ++ struct wm97xx *wm = dev->driver_data; ++ return wm97xx_register_mach_ops (wm, &tosa_mach_ops); ++} ++ ++ ++int tosa_ts_remove(struct device *dev) { ++ struct wm97xx *wm = dev->driver_data; ++ wm97xx_unregister_mach_ops (wm); ++ return 0; ++} ++ ++static struct device_driver tosa_ts_driver = { ++ .name = "wm97xx-touchscreen", ++ .bus = &wm97xx_bus_type, ++ .owner = THIS_MODULE, ++ .probe = tosa_ts_probe, ++ .remove = tosa_ts_remove, ++}; ++ ++static int __init tosa_ts_init(void) ++{ ++ return driver_register(&tosa_ts_driver); ++} ++ ++static void __exit tosa_ts_exit(void) ++{ ++ driver_unregister(&tosa_ts_driver); ++} ++ ++module_init(tosa_ts_init); ++module_exit(tosa_ts_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Mike Arthur, mike@mikearthur.co.uk, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("Sharp SL6000 Tosa Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.22/tosa-power-r18-fix-r0.patch b/packages/linux/linux-rp-2.6.22/tosa-power-r18-fix-r0.patch new file mode 100644 index 0000000000..8899ae270b --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tosa-power-r18-fix-r0.patch @@ -0,0 +1,59 @@ +From 24813da9b0aac0e92635d7307837d89a9f4a1ee7 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 16:47:15 +0400 +Subject: [PATCH] tosa-power-r18.patch fixes + +--- + arch/arm/mach-pxa/tosa_pm.c | 9 +++++---- + 1 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa_pm.c b/arch/arm/mach-pxa/tosa_pm.c +index 1eab1af..2df75f0 100644 +--- a/arch/arm/mach-pxa/tosa_pm.c ++++ b/arch/arm/mach-pxa/tosa_pm.c +@@ -17,9 +17,9 @@ + #include <linux/interrupt.h> + #include <linux/platform_device.h> + #include <linux/pm.h> ++#include <linux/apm-emulation.h> + #include <linux/wm97xx.h> + +-#include <asm/apm.h> + #include <asm/irq.h> + #include <asm/mach-types.h> + #include <asm/hardware.h> +@@ -144,7 +144,7 @@ static int tosa_ac97_init(void) + pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD); + pxa_gpio_mode(GPIO20_DREQ0_MD); + +- pxa_set_cken(CKEN2_AC97, 1); ++ pxa_set_cken(CKEN_AC97, 1); + /* AC97 power on sequense */ + while ( 1 ) { + GCR = 0; +@@ -184,11 +184,12 @@ static int tosa_ac97_init(void) + pxa_gpio_mode(GPIO32_SDATA_IN1_AC97_MD); + ad_polling = 1; + printk("tosa_ac97_init\n"); ++ return 0; + } + + void tosa_ac97_exit(void) + { +- if (!(CKEN & CKEN2_AC97)) ++ if (!(CKEN & CKEN_AC97)) + return; + + // power down the whole chip +@@ -197,7 +198,7 @@ void tosa_ac97_exit(void) + // GCR &= ~(GCR_CDONE_IE | GCR_SDONE_IE | GCR_SECRDY_IEN | GCR_PRIRDY_IEN | GCR_SECRES_IEN | GCR_PRIRES_IEN); + // GSR = GSR; + // GCR = GCR_ACLINK_OFF; +- pxa_set_cken(CKEN2_AC97, 0); ++ pxa_set_cken(CKEN_AC97, 0); + /* switch back to irq driver */ + ad_polling = 0; + printk("tosa_ac97_exit\n"); +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.22/tosa-pxaac97-r6-fix-r0.patch b/packages/linux/linux-rp-2.6.22/tosa-pxaac97-r6-fix-r0.patch new file mode 100644 index 0000000000..9c18aae98d --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tosa-pxaac97-r6-fix-r0.patch @@ -0,0 +1,29 @@ +From 005693333f4b3e0495bb80cc3cfd812e3e6f0a30 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 00:48:42 +0400 +Subject: [PATCH] tosa-pxaac97-r6.patch fixes + +--- + arch/arm/mach-pxa/tosa.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c +index 059fa07..61536d4 100644 +--- a/arch/arm/mach-pxa/tosa.c ++++ b/arch/arm/mach-pxa/tosa.c +@@ -310,10 +310,10 @@ static void __init tosa_init(void) + PMCR = 0x01; + + // AC97 Disable all IRQ's +- pxa_set_cken(CKEN2_AC97, 1); ++ pxa_set_cken(CKEN_AC97, 1); + GCR &= ~(GCR_CDONE_IE | GCR_SDONE_IE | GCR_SECRDY_IEN | GCR_PRIRDY_IEN | GCR_SECRES_IEN | GCR_PRIRES_IEN); + GSR = GSR; +- pxa_set_cken(CKEN2_AC97, 0); ++ pxa_set_cken(CKEN_AC97, 0); + + pxa_set_mci_info(&tosa_mci_platform_data); + pxa_set_udc_info(&udc_info); +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.22/tosa-tmio-lcd-r10-fix-r0.patch b/packages/linux/linux-rp-2.6.22/tosa-tmio-lcd-r10-fix-r0.patch new file mode 100644 index 0000000000..a2e2bee151 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tosa-tmio-lcd-r10-fix-r0.patch @@ -0,0 +1,35 @@ +From bb3ed6577c592d86f0976a92978c9454bbdfbe59 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 02:01:23 +0400 +Subject: [PATCH] tosa-tmio-lcd-r10.patch fixes + +--- + arch/arm/mach-pxa/tosa_lcd.c | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa_lcd.c b/arch/arm/mach-pxa/tosa_lcd.c +index eeeee3e..d52f63f 100644 +--- a/arch/arm/mach-pxa/tosa_lcd.c ++++ b/arch/arm/mach-pxa/tosa_lcd.c +@@ -66,7 +66,7 @@ static unsigned short normal_i2c[] = { + }; + I2C_CLIENT_INSMOD; + +-static struct corgibl_machinfo tosa_bl_machinfo = { ++static struct generic_bl_info tosa_bl_machinfo = { + .max_intensity = 255, + .default_intensity = 68, + .limit_mask = 0x0b, +@@ -80,7 +80,8 @@ int tosa_bl_intensity(void) + + static void pxa_nssp_output(unsigned char reg, unsigned char data) + { +- unsigned long flag, dummy; ++ unsigned long flag; ++ u32 dummy; + u32 dat = ( ((reg << 5) & 0xe0) | (data & 0x1f) ); + spin_lock_irqsave(&tosa_nssp_lock, flag); + +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.22/tosa-tmio-lcd-r10.patch b/packages/linux/linux-rp-2.6.22/tosa-tmio-lcd-r10.patch new file mode 100644 index 0000000000..aef3a047c1 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/tosa-tmio-lcd-r10.patch @@ -0,0 +1,472 @@ + arch/arm/mach-pxa/Kconfig | 5 + arch/arm/mach-pxa/Makefile | 2 + arch/arm/mach-pxa/tosa.c | 49 +++++- + arch/arm/mach-pxa/tosa_lcd.c | 344 +++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 396 insertions(+), 4 deletions(-) + +Index: git/arch/arm/mach-pxa/Makefile +=================================================================== +--- git.orig/arch/arm/mach-pxa/Makefile 2006-11-07 22:13:10.000000000 +0000 ++++ git/arch/arm/mach-pxa/Makefile 2006-11-07 23:29:38.000000000 +0000 +@@ -17,7 +17,7 @@ obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o + obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o + obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o + obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o sharpsl_pm.o poodle_pm.o +-obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o ++obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o tosa_lcd.o + obj-$(CONFIG_MACH_HX2750) += hx2750.o hx2750_test.o + + # Support for blinky lights +Index: git/arch/arm/mach-pxa/tosa_lcd.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/arch/arm/mach-pxa/tosa_lcd.c 2006-11-07 23:29:25.000000000 +0000 +@@ -0,0 +1,344 @@ ++/* ++ * LCD / Backlight control code for Sharp SL-6000x (tosa) ++ * ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++#include <linux/i2c.h> ++#include <linux/fb.h> ++ ++#include <asm/mach/sharpsl_param.h> ++#include <asm/hardware.h> ++#include <asm/hardware/scoop.h> ++#include <asm/hardware/tmio.h> ++#include <asm/arch/ssp.h> ++#include <asm/arch/sharpsl.h> ++#include <asm/arch/tosa.h> ++#include <asm/arch/pxa-regs.h> ++ ++#define DAC_BASE 0x4e ++#define DAC_CH1 0 ++#define DAC_CH2 1 ++ ++#define TG_REG0_VQV 0x0001 ++#define TG_REG0_COLOR 0x0002 ++#define TG_REG0_UD 0x0004 ++#define TG_REG0_LR 0x0008 ++#define COMADJ_DEFAULT 97 ++#define TOSA_LCD_I2C_DEVICEID 0x4711 // Fixme: new value ++ ++static void tosa_lcd_tg_init(struct device *dev); ++static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode); ++static void tosa_lcd_tg_off(struct device *dev); ++static void tosa_set_backlight(int intensity); ++ ++const static struct tmio_lcd_ops tosa_tc6393_lcd_ops = { ++ .init = tosa_lcd_tg_init, ++ .tg_on = tosa_lcd_tg_on, ++ .tg_off = tosa_lcd_tg_off, ++}; ++ ++static struct platform_device *tosabl_device; ++static struct i2c_driver tosa_driver; ++static struct i2c_client* tosa_i2c_dac; ++static int initialised; ++static int comadj; ++static int bl_intensity; ++static struct ssp_dev tosa_nssp_dev; ++static struct ssp_state tosa_nssp_state; ++static spinlock_t tosa_nssp_lock; ++ ++static unsigned short normal_i2c[] = { ++ DAC_BASE, ++ I2C_CLIENT_END ++}; ++I2C_CLIENT_INSMOD; ++ ++static struct corgibl_machinfo tosa_bl_machinfo = { ++ .max_intensity = 255, ++ .default_intensity = 68, ++ .limit_mask = 0x0b, ++ .set_bl_intensity = tosa_set_backlight, ++}; ++ ++int tosa_bl_intensity(void) ++{ ++ return bl_intensity; ++} ++ ++static void pxa_nssp_output(unsigned char reg, unsigned char data) ++{ ++ unsigned long flag, dummy; ++ u32 dat = ( ((reg << 5) & 0xe0) | (data & 0x1f) ); ++ spin_lock_irqsave(&tosa_nssp_lock, flag); ++ ++ ssp_config(&tosa_nssp_dev, (SSCR0_Motorola | (SSCR0_DSS & 0x07 )), 0, 0, SSCR0_SerClkDiv(128)); ++ ssp_enable(&tosa_nssp_dev); ++ ++ ssp_write_word(&tosa_nssp_dev,dat); ++ ++ /* Read null data back from device to prevent SSP overflow */ ++ ssp_read_word(&tosa_nssp_dev, &dummy); ++ ssp_disable(&tosa_nssp_dev); ++ spin_unlock_irqrestore(&tosa_nssp_lock, flag); ++ ++} ++ ++static void tosa_set_backlight(int intensity) ++{ ++ if (!tosa_i2c_dac) ++ return; ++ ++ bl_intensity = intensity; ++ /* SetBacklightDuty */ ++ i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH2, (unsigned char)intensity); ++ ++ /* SetBacklightVR */ ++ if (intensity) ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BL_C20MA); ++ else ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BL_C20MA); ++ ++ /* bl_enable GP04=1 otherwise GP04=0*/ ++ pxa_nssp_output(TG_GPODR2, intensity ? 0x01 : 0x00); ++} ++ ++static void tosa_lcd_tg_init(struct device *dev) ++{ ++ /* L3V On */ ++ set_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); ++ mdelay(60); ++ ++ /* TG On */ ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_TG_ON); ++ mdelay(60); ++ ++ pxa_nssp_output(TG_TPOSCTL,0x00); /* delayed 0clk TCTL signal for VGA */ ++ pxa_nssp_output(TG_GPOSR,0x02); /* GPOS0=powercontrol, GPOS1=GPIO, GPOS2=TCTL */ ++} ++ ++static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode) ++{ ++ const int value = TG_REG0_COLOR | TG_REG0_UD | TG_REG0_LR; ++ pxa_nssp_output(TG_PNLCTL, value | (mode->yres == 320 ? 0 : TG_REG0_VQV)); ++ ++ /* TG LCD pannel power up */ ++ pxa_nssp_output(TG_PINICTL,0x4); ++ mdelay(50); ++ ++ /* TG LCD GVSS */ ++ pxa_nssp_output(TG_PINICTL,0x0); ++ ++ if (!initialised) ++ { ++ /* after the pannel is powered up the first time, we can access the i2c bus */ ++ /* so probe for the DAC */ ++ i2c_add_driver(&tosa_driver); ++ initialised = 1; ++ mdelay(50); ++ } ++ if (tosa_i2c_dac) ++ /* set common voltage */ ++ i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj); ++ ++} ++ ++static void tosa_lcd_tg_off(struct device *dev) ++{ ++ /* TG LCD VHSA off */ ++ pxa_nssp_output(TG_PINICTL,0x4); ++ mdelay(50); ++ ++ /* TG LCD signal off */ ++ pxa_nssp_output(TG_PINICTL,0x6); ++ mdelay(50); ++ ++ /* TG Off */ ++ set_tc6393_gpio(&tc6393_device.dev, TOSA_TC6393_TG_ON); ++ mdelay(100); ++ ++ /* L3V Off */ ++ reset_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); ++} ++ ++static int tosa_detect_client(struct i2c_adapter* adapter, int address, int kind) { ++ int err = 0; ++ ++ printk("Tosa-LCD: DAC detected address:0x%2.2x\n",address); ++ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA )) ++ goto ERROR0; ++ ++ if (!(tosa_i2c_dac = (struct i2c_client*)kzalloc(sizeof(*tosa_i2c_dac), GFP_KERNEL))) { ++ err = -ENOMEM; ++ goto ERROR0; ++ } ++ ++ //i2c_set_clientdata(tosa_i2c_dac, data); ++ tosa_i2c_dac->addr = address; ++ tosa_i2c_dac->adapter = adapter; ++ tosa_i2c_dac->driver = &tosa_driver; ++ tosa_i2c_dac->dev.parent = &tc6393_device.dev; ++ strcpy(tosa_i2c_dac->name, "tosa lcd"); ++ if ((err = i2c_attach_client(tosa_i2c_dac))) ++ goto ERROR3; ++ ++ /* Now i2c is ready, allocate the backlight device*/ ++ tosabl_device = platform_device_alloc("corgi-bl", -1); ++ if (!tosabl_device) { ++ err = -ENOMEM; ++ goto ERROR4; ++ } ++ ++ /* set parent device */ ++ tosabl_device->dev.parent = &tosa_i2c_dac->dev; ++ tosabl_device->dev.platform_data = &tosa_bl_machinfo; ++ ++ err = platform_device_add(tosabl_device); ++ ++ if (err) ++ platform_device_put(tosabl_device); ++ ++ /* set common voltage */ ++ i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj); ++ ++ return 0; ++ERROR4: ++ i2c_detach_client(tosa_i2c_dac); ++ERROR3: ++ kfree(tosa_i2c_dac); ++ERROR0: ++ return err; ++} ++ ++static int tosa_attach_adapter(struct i2c_adapter* adapter) { ++ return i2c_probe(adapter, &addr_data, &tosa_detect_client); ++} ++ ++static int tosa_detach_client(struct i2c_client* client) { ++ int err; ++ ++ if ((err = i2c_detach_client(client))) { ++ printk(KERN_ERR "tosa: Cannot deregister client\n"); ++ return err; ++ } ++ kfree(client); ++ return 0; ++} ++ ++static struct i2c_driver tosa_driver={ ++ .id = TOSA_LCD_I2C_DEVICEID, ++ .attach_adapter = tosa_attach_adapter, ++ .detach_client = tosa_detach_client, ++}; ++ ++static int __init tosa_lcd_probe(struct platform_device *pdev) ++{ ++ int ret; ++ spin_lock_init(&tosa_nssp_lock); ++ ++ if (!pdev->dev.platform_data) ++ return -EINVAL; ++ ++ /* Set Common Voltage */ ++ comadj = sharpsl_param.comadj == -1 ? COMADJ_DEFAULT : sharpsl_param.comadj; ++ ++ ret=ssp_init(&tosa_nssp_dev,2,0); ++ ++ /* initialize SSP */ ++ pxa_gpio_mode(GPIO83_NSSP_TX); ++ pxa_gpio_mode(GPIO81_NSSP_CLK_OUT); ++ pxa_gpio_mode(GPIO82_NSSP_FRM_OUT); ++ ++ if (ret) ++ printk(KERN_ERR "Unable to register NSSP handler!\n"); ++ else { ++ struct tmio_lcd_ops* *tmio_ops = pdev->dev.platform_data; ++ ssp_disable(&tosa_nssp_dev); ++ initialised = 0; ++ ++ /* Set the lcd functions */ ++ *tmio_ops = (struct tmio_lcd_ops*) &tosa_tc6393_lcd_ops; ++ } ++ ++ return ret; ++} ++ ++static int tosa_lcd_remove(struct platform_device *pdev) ++{ ++ /* delete the lcd functions */ ++ struct tmio_lcd_ops* *tmio_ops = pdev->dev.platform_data; ++ *tmio_ops = NULL; ++ ++ ssp_exit(&tosa_nssp_dev); ++ ++ if (tosa_i2c_dac) { ++ i2c_detach_client(tosa_i2c_dac); ++ kfree(tosa_i2c_dac); ++ } ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++ ++static int tosa_lcd_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ ssp_flush(&tosa_nssp_dev); ++ ssp_save_state(&tosa_nssp_dev,&tosa_nssp_state); ++ return 0; ++} ++ ++static int tosa_lcd_resume(struct platform_device *pdev) ++{ ++ printk("tosa_lcd_resume\n"); ++ ssp_restore_state(&tosa_nssp_dev,&tosa_nssp_state); ++ ssp_enable(&tosa_nssp_dev); ++ printk("tosa_lcd_resume ok\n"); ++ return 0; ++} ++#else ++ ++#define tosa_lcd_suspend NULL ++#define tosa_lcd_resume NULL ++ ++#endif ++ ++ ++static struct platform_driver tosalcd_driver = { ++ .probe = tosa_lcd_probe, ++ .remove = tosa_lcd_remove, ++ .suspend = tosa_lcd_suspend, ++ .resume = tosa_lcd_resume, ++ .driver = { ++ .name = "tosa-lcd", ++ }, ++}; ++ ++static int __init tosa_lcd_init(void) ++{ ++ return platform_driver_register(&tosalcd_driver); ++} ++ ++static void __exit tosa_lcd_cleanup (void) ++{ ++ platform_driver_unregister (&tosalcd_driver); ++} ++ ++device_initcall(tosa_lcd_init); ++module_exit (tosa_lcd_cleanup); ++ ++MODULE_DESCRIPTION ("Tosa LCD device"); ++MODULE_AUTHOR ("Dirk Opfer"); ++MODULE_LICENSE ("GPL v2"); +Index: git/arch/arm/mach-pxa/tosa.c +=================================================================== +--- git.orig/arch/arm/mach-pxa/tosa.c 2006-11-07 22:13:10.000000000 +0000 ++++ git/arch/arm/mach-pxa/tosa.c 2006-11-07 23:29:38.000000000 +0000 +@@ -24,6 +24,7 @@ + #include <linux/mtd/partitions.h> + #include <linux/pm.h> + #include <linux/delay.h> ++#include <linux/fb.h> + + #include <asm/setup.h> + #include <asm/memory.h> +@@ -48,7 +49,6 @@ + + #include "generic.h" + +- + /* + * SCOOP Device + */ +@@ -345,7 +345,38 @@ static struct tmio_nand_platform_data to + .badblock_pattern = &tosa_tc6393_nand_bbt, + }; + +-extern struct tmio_lcd_platform_data tosa_tc6393_lcd_platform_data; ++static struct fb_videomode tosa_tc6393_lcd_mode[] = { ++ { ++ .xres = 480, ++ .yres = 640, ++ .pixclock = 0x002cdf00,/* PLL divisor */ ++ .left_margin = 0x004c, ++ .right_margin = 0x005b, ++ .upper_margin = 0x0001, ++ .lower_margin = 0x000d, ++ .hsync_len = 0x0002, ++ .vsync_len = 0x0001, ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++ .vmode = FB_VMODE_NONINTERLACED, ++ },{ ++ .xres = 240, ++ .yres = 320, ++ .pixclock = 0x00e7f203,/* PLL divisor */ ++ .left_margin = 0x0024, ++ .right_margin = 0x002f, ++ .upper_margin = 0x0001, ++ .lower_margin = 0x000d, ++ .hsync_len = 0x0002, ++ .vsync_len = 0x0001, ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++ .vmode = FB_VMODE_NONINTERLACED, ++}}; ++ ++struct tmio_lcd_platform_data tosa_tc6393_lcd_platform_data = { ++ .ops = NULL, ++ .modelist = tosa_tc6393_lcd_mode, ++ .num_modes = ARRAY_SIZE(tosa_tc6393_lcd_mode), ++}; + + static struct tmio_cell tosa_tc6393_cells[] = { + { +@@ -384,6 +415,19 @@ struct platform_device tc6393_device = { + .num_resources = ARRAY_SIZE(tc6393_resources), + .resource = tc6393_resources, + }; ++EXPORT_SYMBOL (tc6393_device); ++ ++/* ++ * Tosa LCD / Backlight stuff ++ */ ++static struct platform_device tosalcd_device = { ++ .name = "tosa-lcd", ++ .id = -1, ++ .dev = { ++ .parent = &tc6393_device.dev, ++ .platform_data = &tosa_tc6393_lcd_platform_data.ops, ++ }, ++}; + + static struct platform_device *devices[] __initdata = { + &tosascoop_device, +@@ -391,6 +435,7 @@ static struct platform_device *devices[] + &tosakbd_device, + &tosaled_device, + &tc6393_device, ++ &tosalcd_device, + }; + + static void tosa_poweroff(void) +Index: git/arch/arm/mach-pxa/Kconfig +=================================================================== +--- git.orig/arch/arm/mach-pxa/Kconfig 2006-11-07 22:13:10.000000000 +0000 ++++ git/arch/arm/mach-pxa/Kconfig 2006-11-07 22:13:10.000000000 +0000 +@@ -129,7 +129,10 @@ config MACH_TOSA + bool "Enable Sharp SL-6000x (Tosa) Support" + depends PXA_SHARPSL_25x + select TOSHIBA_TC6393XB +- select SHARPSL_PM ++ select I2C ++ select I2C_PXA ++ select SHARPSL_PM ++ select PXA_SSP + + config PXA25x + bool diff --git a/packages/linux/linux-rp-2.6.22/usb-ohci-hooks-r2.patch b/packages/linux/linux-rp-2.6.22/usb-ohci-hooks-r2.patch new file mode 100644 index 0000000000..3656e98f0c --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/usb-ohci-hooks-r2.patch @@ -0,0 +1,180 @@ +Index: linux-2.6.15/drivers/usb/host/ohci.h +=================================================================== +--- linux-2.6.15.orig/drivers/usb/host/ohci.h ++++ linux-2.6.15/drivers/usb/host/ohci.h +@@ -336,6 +336,23 @@ typedef struct urb_priv { + // sizeof (struct td) ~= 64 == 2^6 ... + #define TD_HASH_FUNC(td_dma) ((td_dma ^ (td_dma >> 6)) % TD_HASH_SIZE) + ++struct ohci_hcd; ++ ++/* ++ * Hooks to support controllers that must resort to a PIO-ish ++ * implementation because they only dma with on-chip memory. ++ */ ++struct ohci_ops { ++ void* (*dma_pool_alloc) (struct dma_pool *pool, gfp_t mem_flags, ++ dma_addr_t *handle); ++ void (*dma_pool_free) (struct dma_pool *pool, void *vaddr, ++ dma_addr_t addr); ++ ++ void (*td_fill) (struct ohci_hcd *ohci, u32 info, dma_addr_t data, ++ int len, struct urb *urb, int index); ++ void (*td_done) (struct ohci_hcd *ohci, struct urb *urb, ++ struct td *td); ++}; + + /* + * This is the full ohci controller description +@@ -346,6 +363,7 @@ typedef struct urb_priv { + + struct ohci_hcd { + spinlock_t lock; ++ const struct ohci_ops *ops; + + /* + * I/O memory used to communicate with the HC (dma-consistent) +Index: linux-2.6.15/drivers/usb/host/ohci-mem.c +=================================================================== +--- linux-2.6.15.orig/drivers/usb/host/ohci-mem.c ++++ linux-2.6.15/drivers/usb/host/ohci-mem.c +@@ -21,10 +21,13 @@ + * No memory seen by this driver is pagable. + */ + ++static const struct ohci_ops ohci_ops; ++ + /*-------------------------------------------------------------------------*/ + + static void ohci_hcd_init (struct ohci_hcd *ohci) + { ++ ohci->ops = &ohci_ops; + ohci->next_statechange = jiffies; + spin_lock_init (&ohci->lock); + INIT_LIST_HEAD (&ohci->pending); +@@ -88,7 +91,7 @@ td_alloc (struct ohci_hcd *hc, gfp_t mem + dma_addr_t dma; + struct td *td; + +- td = dma_pool_alloc (hc->td_cache, mem_flags, &dma); ++ td = hc->ops->dma_pool_alloc (hc->td_cache, mem_flags, &dma); + if (td) { + /* in case hc fetches it, make it look dead */ + memset (td, 0, sizeof *td); +@@ -110,7 +113,7 @@ td_free (struct ohci_hcd *hc, struct td + *prev = td->td_hash; + else if ((td->hwINFO & cpu_to_hc32(hc, TD_DONE)) != 0) + ohci_dbg (hc, "no hash for td %p\n", td); +- dma_pool_free (hc->td_cache, td, td->td_dma); ++ hc->ops->dma_pool_free (hc->td_cache, td, td->td_dma); + } + + /*-------------------------------------------------------------------------*/ +@@ -122,7 +125,7 @@ ed_alloc (struct ohci_hcd *hc, gfp_t mem + dma_addr_t dma; + struct ed *ed; + +- ed = dma_pool_alloc (hc->ed_cache, mem_flags, &dma); ++ ed = hc->ops->dma_pool_alloc (hc->ed_cache, mem_flags, &dma); + if (ed) { + memset (ed, 0, sizeof (*ed)); + INIT_LIST_HEAD (&ed->td_list); +@@ -134,6 +137,6 @@ ed_alloc (struct ohci_hcd *hc, gfp_t mem + static void + ed_free (struct ohci_hcd *hc, struct ed *ed) + { +- dma_pool_free (hc->ed_cache, ed, ed->dma); ++ hc->ops->dma_pool_free (hc->ed_cache, ed, ed->dma); + } + +Index: linux-2.6.15/drivers/usb/host/ohci-q.c +=================================================================== +--- linux-2.6.15.orig/drivers/usb/host/ohci-q.c ++++ linux-2.6.15/drivers/usb/host/ohci-q.c +@@ -629,7 +629,7 @@ static void td_submit_urb ( + : TD_T_TOGGLE | TD_CC | TD_DP_IN; + /* TDs _could_ transfer up to 8K each */ + while (data_len > 4096) { +- td_fill (ohci, info, data, 4096, urb, cnt); ++ ohci->ops->td_fill (ohci, info, data, 4096, urb, cnt); + data += 4096; + data_len -= 4096; + cnt++; +@@ -637,11 +637,11 @@ static void td_submit_urb ( + /* maybe avoid ED halt on final TD short read */ + if (!(urb->transfer_flags & URB_SHORT_NOT_OK)) + info |= TD_R; +- td_fill (ohci, info, data, data_len, urb, cnt); ++ ohci->ops->td_fill (ohci, info, data, data_len, urb, cnt); + cnt++; + if ((urb->transfer_flags & URB_ZERO_PACKET) + && cnt < urb_priv->length) { +- td_fill (ohci, info, 0, 0, urb, cnt); ++ ohci->ops->td_fill (ohci, info, 0, 0, urb, cnt); + cnt++; + } + /* maybe kickstart bulk list */ +@@ -656,17 +656,18 @@ static void td_submit_urb ( + */ + case PIPE_CONTROL: + info = TD_CC | TD_DP_SETUP | TD_T_DATA0; +- td_fill (ohci, info, urb->setup_dma, 8, urb, cnt++); ++ ohci->ops->td_fill (ohci, info, urb->setup_dma, 8, urb, cnt++); + if (data_len > 0) { + info = TD_CC | TD_R | TD_T_DATA1; + info |= is_out ? TD_DP_OUT : TD_DP_IN; + /* NOTE: mishandles transfers >8K, some >4K */ +- td_fill (ohci, info, data, data_len, urb, cnt++); ++ ohci->ops->td_fill (ohci, info, data, data_len, ++ urb, cnt++); + } + info = (is_out || data_len == 0) + ? TD_CC | TD_DP_IN | TD_T_DATA1 + : TD_CC | TD_DP_OUT | TD_T_DATA1; +- td_fill (ohci, info, data, 0, urb, cnt++); ++ ohci->ops->td_fill (ohci, info, data, 0, urb, cnt++); + /* maybe kickstart control list */ + wmb (); + ohci_writel (ohci, OHCI_CLF, &ohci->regs->cmdstatus); +@@ -685,7 +686,7 @@ static void td_submit_urb ( + // a 2^16 iso range, vs other HCs max of 2^10) + frame += cnt * urb->interval; + frame &= 0xffff; +- td_fill (ohci, TD_CC | TD_ISO | frame, ++ ohci->ops->td_fill (ohci, TD_CC | TD_ISO | frame, + data + urb->iso_frame_desc [cnt].offset, + urb->iso_frame_desc [cnt].length, urb, cnt); + } +@@ -788,6 +789,14 @@ static void td_done (struct ohci_hcd *oh + } + } + ++/* default operations for most HCs */ ++static const struct ohci_ops ohci_ops = { ++ .dma_pool_alloc = dma_pool_alloc, ++ .dma_pool_free = dma_pool_free, ++ .td_fill = td_fill, ++ .td_done = td_done, ++}; ++ + /*-------------------------------------------------------------------------*/ + + static inline struct td * +@@ -984,7 +993,7 @@ rescan_this: + *prev = td->hwNextTD | savebits; + + /* HC may have partly processed this TD */ +- td_done (ohci, urb, td); ++ ohci->ops->td_done (ohci, urb, td); + urb_priv->td_cnt++; + + /* if URB is done, clean up */ +@@ -1079,7 +1088,7 @@ dl_done_list (struct ohci_hcd *ohci, str + struct ed *ed = td->ed; + + /* update URB's length and status from TD */ +- td_done (ohci, urb, td); ++ ohci->ops->td_done (ohci, urb, td); + urb_priv->td_cnt++; + + /* If all this urb's TDs are done, call complete() */ diff --git a/packages/linux/linux-rp-2.6.22/wm9712-reset-loop-r2.patch b/packages/linux/linux-rp-2.6.22/wm9712-reset-loop-r2.patch new file mode 100644 index 0000000000..78e81ea83a --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/wm9712-reset-loop-r2.patch @@ -0,0 +1,44 @@ + sound/soc/codecs/wm9712.c | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +Index: git/sound/soc/codecs/wm9712.c +=================================================================== +--- git.orig/sound/soc/codecs/wm9712.c 2006-11-07 22:10:01.000000000 +0000 ++++ git/sound/soc/codecs/wm9712.c 2006-11-07 22:11:50.000000000 +0000 +@@ -618,18 +618,26 @@ static int wm9712_dapm_event(struct snd_ + + static int wm9712_reset(struct snd_soc_codec *codec, int try_warm) + { +- if (try_warm && soc_ac97_ops.warm_reset) { +- soc_ac97_ops.warm_reset(codec->ac97); +- if (!(ac97_read(codec, 0) & 0x8000)) +- return 1; +- } ++ int retry = 3; + +- soc_ac97_ops.reset(codec->ac97); +- if (ac97_read(codec, 0) & 0x8000) +- goto err; +- return 0; ++ while (retry--) ++ { ++ if(try_warm && soc_ac97_ops.warm_reset) { ++ soc_ac97_ops.warm_reset(codec->ac97); ++ if(ac97_read(codec, 0) & 0x8000) ++ continue; ++ else ++ return 1; ++ } ++ ++ soc_ac97_ops.reset(codec->ac97); ++ if(ac97_read(codec, 0) & 0x8000) ++ continue; ++ else ++ return 0; ++ ++ } + +-err: + printk(KERN_ERR "WM9712 AC97 reset failed\n"); + return -EIO; + } diff --git a/packages/linux/linux-rp-2.6.22/wm9712-suspend-cold-res-r2.patch b/packages/linux/linux-rp-2.6.22/wm9712-suspend-cold-res-r2.patch new file mode 100644 index 0000000000..5179b47cc4 --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/wm9712-suspend-cold-res-r2.patch @@ -0,0 +1,16 @@ + sound/soc/codecs/wm9712.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: git/sound/soc/codecs/wm9712.c +=================================================================== +--- git.orig/sound/soc/codecs/wm9712.c 2006-11-07 21:57:34.000000000 +0000 ++++ git/sound/soc/codecs/wm9712.c 2006-11-07 21:59:30.000000000 +0000 +@@ -651,7 +651,7 @@ static int wm9712_soc_resume(struct plat + int i, ret; + u16 *cache = codec->reg_cache; + +- ret = wm9712_reset(codec, 1); ++ ret = wm9712_reset(codec, 0); + if (ret < 0){ + printk(KERN_ERR "could not reset AC97 codec\n"); + return ret; diff --git a/packages/linux/linux-rp-2.6.22/wm97xx-lcdnoise-r0.patch b/packages/linux/linux-rp-2.6.22/wm97xx-lcdnoise-r0.patch deleted file mode 100644 index 191de3af22..0000000000 --- a/packages/linux/linux-rp-2.6.22/wm97xx-lcdnoise-r0.patch +++ /dev/null @@ -1,208 +0,0 @@ -Index: linux-tosa/drivers/input/touchscreen/wm9712.c -=================================================================== ---- linux-tosa.orig/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:36.008543280 +0100 -+++ linux-tosa/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:50.923275896 +0100 -@@ -1,7 +1,7 @@ - /* - * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. - * -- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC. -+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. - * Author: Liam Girdwood - * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com - * Parts Copyright : Ian Molton <spyro@f2s.com> -@@ -13,6 +13,12 @@ - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * -+ * Revision history -+ * 4th Jul 2005 Initial version. -+ * 29th Aug 2006 Mike Arthur <mike@mikearthur.co.uk> -+ * Added fixes for Sharp SL-6000 (Tosa) LCD noise causing -+ * touchscreen interference. -+ * - */ - - #include <linux/module.h> -@@ -28,6 +34,10 @@ - #define WM9705_VERSION "0.60" - #define DEFAULT_PRESSURE 0xb0c0 - -+#define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a)) -+#define CCNT_ON() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) -+#define CCNT_OFF() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) -+ - /* - * Debug - */ -@@ -243,6 +253,36 @@ - return wm->dig[2] & WM9712_PDEN; - } - -+ -+#ifdef CONFIG_MACH_TOSA -+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait -+ * before sampling the Y axis of the touchscreen */ -+static inline void wm9712_lcd_sync_on(struct wm97xx* wm, int adcsel) { -+ unsigned long timer1 = 0, timer2 = 0, wait_time = 0; -+ if (adcsel == WM97XX_ADCSEL_Y) { -+ wait_time = wm97xx_calc_lcd_waittime(wm); -+ -+ CCNT_ON(); -+ -+ if (wait_time) { -+ /* wait for LCD rising edge */ -+ wm_machinfo->wait_hsync(); -+ /* get clock */ -+ CCNT(timer1); -+ CCNT(timer2); -+ -+ while ((timer2 - timer1) < wait_time) { -+ CCNT(timer2); -+ } -+ } -+ } -+} -+ -+static inline void wm9712_lcd_sync_off(void) { -+ CCNT_OFF(); -+} -+#endif -+ - /* - * Read a sample from the WM9712 adc in polling mode. - */ -@@ -260,6 +300,9 @@ - /* set up digitiser */ - if (adcsel & 0x8000) - adcsel = ((adcsel & 0x7fff) + 3) << 12; -+ #ifdef CONFIG_MACH_TOSA -+ wm9712_lcd_sync_on(wm, adcsel); -+ #endif - wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); - - /* wait 3 AC97 time slots + delay for conversion */ -@@ -282,6 +325,10 @@ - - *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); - -+ #ifdef CONFIG_MACH_TOSA -+ wm9712_lcd_sync_off(); -+ #endif -+ - /* check we have correct sample */ - if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { - dbg ("adc wrong sample, read %x got %x", adcsel, -@@ -303,11 +350,12 @@ - static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) - { - int rc; -- - if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) - return rc; -+ - if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) - return rc; -+ - if (pil && !five_wire) { - if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) - return rc; -Index: linux-tosa/drivers/input/touchscreen/wm97xx-core.c -=================================================================== ---- linux-tosa.orig/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:36.008543280 +0100 -+++ linux-tosa/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:50.924275744 +0100 -@@ -2,7 +2,7 @@ - * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 - * and WM9713 AC97 Codecs. - * -- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC. -+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. - * Author: Liam Girdwood - * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com - * Parts Copyright : Ian Molton <spyro@f2s.com> -@@ -67,6 +67,9 @@ - * GPIOs) and 2.6 power management. - * 29th Nov 2004 Added WM9713 support. - * 4th Jul 2005 Moved codec specific code out to seperate files. -+ * 29th Aug 2006 Mike Arthur <mike@mikearthur.co.uk> -+ * Added fixes for Sharp SL-6000 (Tosa) LCD noise causing -+ * touchscreen interference. - */ - - #include <linux/module.h> -@@ -94,6 +97,7 @@ - static DECLARE_MUTEX(gpio_sem); - static LIST_HEAD(wm97xx_misc_list); - static struct wm97xx* wm_codec = NULL; -+struct wm97xx_machinfo *wm_machinfo; - - /* - * WM97xx - enable/disable AUX ADC sysfs -@@ -832,6 +836,23 @@ - mdev->remove(wm_codec); - } - -+#ifdef CONFIG_MACH_TOSA -+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait -+ * before sampling the Y axis of the touchscreen */ -+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm) { -+ unsigned long hsync_time = wm_machinfo->get_hsync_time(); -+ return hsync_time; -+} -+ -+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo) { -+ wm_machinfo = machinfo; -+} -+ -+void wm97xx_unset_machinfo() { -+ wm_machinfo = NULL; -+} -+#endif -+ - static struct device_driver wm97xx_driver = { - .name = "ac97", - .bus = &ac97_bus_type, -@@ -861,6 +882,9 @@ - EXPORT_SYMBOL_GPL(wm97xx_reg_write); - EXPORT_SYMBOL_GPL(wm97xx_register_misc_dev); - EXPORT_SYMBOL_GPL(wm97xx_unregister_misc_dev); -+EXPORT_SYMBOL_GPL(wm97xx_calc_lcd_waittime); -+EXPORT_SYMBOL_GPL(wm97xx_set_machinfo); -+EXPORT_SYMBOL_GPL(wm97xx_unset_machinfo); - - module_init(wm97xx_init); - module_exit(wm97xx_exit); -Index: linux-tosa/include/linux/wm97xx.h -=================================================================== ---- linux-tosa.orig/include/linux/wm97xx.h 2006-08-29 16:52:36.008543280 +0100 -+++ linux-tosa/include/linux/wm97xx.h 2006-08-29 16:52:50.924275744 +0100 -@@ -207,6 +207,7 @@ - - struct wm97xx; - extern struct wm97xx_codec_drv wm97xx_codec; -+extern struct wm97xx_machinfo *wm_machinfo; - - /* - * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs -@@ -253,6 +254,11 @@ - struct list_head list; - }; - -+struct wm97xx_machinfo { -+ unsigned long (*get_hsync_time)(void); -+ void (*wait_hsync)(void); -+}; -+ - int wm97xx_register_misc_dev(struct wm97xx_misc_dev* mdev); - void wm97xx_unregister_misc_dev(struct wm97xx_misc_dev* mdev); - -@@ -281,4 +287,9 @@ - int wm97xx_acc_startup(struct wm97xx* wm); - void wm97xx_acc_shutdown(struct wm97xx* wm); - -+ -+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm); -+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo); -+void wm97xx_unset_machinfo(void); -+ - #endif diff --git a/packages/linux/linux-rp-2.6.22/wm97xx-lg13-r0-fix-r0.patch b/packages/linux/linux-rp-2.6.22/wm97xx-lg13-r0-fix-r0.patch new file mode 100644 index 0000000000..5ad0d8703d --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/wm97xx-lg13-r0-fix-r0.patch @@ -0,0 +1,128 @@ + drivers/input/power.c | 2 +- + drivers/input/touchscreen/Kconfig | 2 +- + drivers/input/touchscreen/wm97xx-core.c | 35 ++++++++++++++++--------------- + include/linux/wm97xx.h | 2 +- + 4 files changed, 21 insertions(+), 20 deletions(-) + +diff --git a/drivers/input/power.c b/drivers/input/power.c +index 4443e34..7aac875 100644 +--- a/drivers/input/power.c ++++ b/drivers/input/power.c +@@ -156,7 +156,7 @@ static void power_event(struct input_handle *handle, unsigned int type, + } + } + +-static struct input_handle *power_connect(struct input_handler *handler, ++static int power_connect(struct input_handler *handler, + struct input_dev *dev, + const struct input_device_id *id) + { +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index 6862e8f..9b532e9 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -247,7 +247,7 @@ config TOUCHSCREEN_TSC2101 + + config TOUCHSCREEN_WM97XX + tristate "Support for WM97xx AC97 touchscreen controllers" +- depends SND_AC97_BUS ++ depends AC97_BUS + + choice + prompt "WM97xx codec type" +diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c +index 9b2710e..d3ce3f3 100644 +--- a/drivers/input/touchscreen/wm97xx-core.c ++++ b/drivers/input/touchscreen/wm97xx-core.c +@@ -84,6 +84,7 @@ + #include <linux/bitops.h> + #include <linux/workqueue.h> + #include <linux/device.h> ++#include <linux/freezer.h> + #include <linux/wm97xx.h> + #include <asm/uaccess.h> + #include <asm/io.h> +@@ -241,14 +242,15 @@ WM97XX_STATUS_ATTR(gpio); + + static int wm97xx_sys_add(struct device *dev) + { ++ int err; + if (aux_sys) { +- device_create_file(dev, &dev_attr_aux1); +- device_create_file(dev, &dev_attr_aux2); +- device_create_file(dev, &dev_attr_aux3); +- device_create_file(dev, &dev_attr_aux4); ++ err = device_create_file(dev, &dev_attr_aux1); ++ err = device_create_file(dev, &dev_attr_aux2); ++ err = device_create_file(dev, &dev_attr_aux3); ++ err = device_create_file(dev, &dev_attr_aux4); + } + if (status_sys) +- device_create_file(dev, &dev_attr_gpio); ++ err = device_create_file(dev, &dev_attr_gpio); + return 0; + } + +@@ -366,12 +368,12 @@ void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, wm97xx_gpio_dir_t dir, + + /* + * Handle a pen down interrupt. +- */ +-static void wm97xx_pen_irq_worker(void *ptr) +-{ +- struct wm97xx *wm = (struct wm97xx *) ptr; +- +- /* do we need to enable the touch panel reader */ ++ */ ++static void wm97xx_pen_irq_worker(struct work_struct *work) ++{ ++ struct wm97xx *wm = container_of(work, struct wm97xx, pen_event_work); ++ ++ /* do we need to enable the touch panel reader */ + if (wm->id == WM9705_ID2) { + if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & WM97XX_PEN_DOWN) + wm->pen_is_down = 1; +@@ -411,9 +413,8 @@ static void wm97xx_pen_irq_worker(void *ptr) + * We have to disable the codec interrupt in the handler because it can + * take upto 1ms to clear the interrupt source. The interrupt is then enabled + * again in the slow handler when the source has been cleared. +- */ +-static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id, +- struct pt_regs *regs) ++ */ ++static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id) + { + struct wm97xx *wm = (struct wm97xx *) dev_id; + disable_irq(wm->pen_irq); +@@ -428,15 +429,15 @@ static int wm97xx_init_pen_irq(struct wm97xx *wm) + { + u16 reg; + +- INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker, wm); +- if ((wm->pen_irq_workq = ++ INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker); ++ if ((wm->pen_irq_workq = + create_singlethread_workqueue("kwm97pen")) == NULL) { + err("could not create pen irq work queue"); + wm->pen_irq = 0; + return -EINVAL; + } + +- if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, SA_SHIRQ, "wm97xx-pen", wm)) { ++ if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, IRQF_SHARED, "wm97xx-pen", wm)) { + err("could not register codec pen down interrupt, will poll for pen down"); + destroy_workqueue(wm->pen_irq_workq); + wm->pen_irq = 0; +diff --git a/include/linux/wm97xx.h b/include/linux/wm97xx.h +index b1c1740..a9bd57e 100644 +--- a/include/linux/wm97xx.h ++++ b/include/linux/wm97xx.h +@@ -243,7 +243,7 @@ struct wm97xx { + u16 dig_save[3]; /* saved during aux reading */ + struct wm97xx_codec_drv *codec; /* attached codec driver*/ + struct input_dev* input_dev; /* touchscreen input device */ +- ac97_t *ac97; /* ALSA codec access */ ++ struct snd_ac97 *ac97; /* ALSA codec access */ + struct device *dev; /* ALSA device */ + struct device *battery_dev; + struct device *touch_dev; diff --git a/packages/linux/linux-rp-2.6.22/wm97xx-lg13-r0.patch b/packages/linux/linux-rp-2.6.22/wm97xx-lg13-r0.patch new file mode 100644 index 0000000000..c918c5daff --- /dev/null +++ b/packages/linux/linux-rp-2.6.22/wm97xx-lg13-r0.patch @@ -0,0 +1,2899 @@ +Index: linux-2.6.17/drivers/input/touchscreen/Kconfig +=================================================================== +--- linux-2.6.17.orig/drivers/input/touchscreen/Kconfig 2006-09-19 20:35:35.060495500 +0200 ++++ linux-2.6.17/drivers/input/touchscreen/Kconfig 2006-09-19 20:36:47.965051750 +0200 +@@ -121,4 +121,57 @@ config TOUCHSCREEN_TSC2101 + To compile this driver as a module, choose M here: the + module will be called ads7846_ts. + ++config TOUCHSCREEN_WM97XX ++ tristate "Support for WM97xx AC97 touchscreen controllers" ++ depends SND_AC97_BUS ++ ++choice ++ prompt "WM97xx codec type" ++ ++config TOUCHSCREEN_WM9705 ++ bool "WM9705 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9705 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9705. ++ ++config TOUCHSCREEN_WM9712 ++ bool "WM9712 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9712 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9712. ++ ++config TOUCHSCREEN_WM9713 ++ bool "WM9713 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9713 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9713. ++ ++endchoice ++ ++config TOUCHSCREEN_WM97XX_PXA ++ tristate "WM97xx PXA accelerated touch" ++ depends on TOUCHSCREEN_WM97XX && ARCH_PXA ++ help ++ Say Y here for continuous mode touch on the PXA ++ ++ If unsure, say N ++ ++ To compile this driver as a module, choose M here: the ++ module will be called pxa-wm97xx ++ + endif +Index: linux-2.6.17/drivers/input/touchscreen/Makefile +=================================================================== +--- linux-2.6.17.orig/drivers/input/touchscreen/Makefile 2006-09-19 20:35:35.072496250 +0200 ++++ linux-2.6.17/drivers/input/touchscreen/Makefile 2006-09-19 20:37:40.540337500 +0200 +@@ -4,6 +4,8 @@ + + # Each configuration option enables a list of files. + ++wm97xx-ts-objs := wm97xx-core.o ++ + obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o + obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o + obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o +@@ -13,3 +15,16 @@ obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtou + obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o + obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o + obj-$(CONFIG_TOUCHSCREEN_TSC2101) += tsc2101_ts.o ++obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o ++obj-$(CONFIG_TOUCHSCREEN_WM97XX_PXA) += pxa-wm97xx.o ++ ++ifeq ($(CONFIG_TOUCHSCREEN_WM9713),y) ++wm97xx-ts-objs += wm9713.o ++endif ++ ++ifeq ($(CONFIG_TOUCHSCREEN_WM9712),y) ++wm97xx-ts-objs += wm9712.o ++endif ++ifeq ($(CONFIG_TOUCHSCREEN_WM9705),y) ++wm97xx-ts-objs += wm9705.o ++endif +Index: linux-2.6.17/drivers/input/touchscreen/pxa-wm97xx.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/pxa-wm97xx.c 2006-09-19 20:36:47.965051750 +0200 +@@ -0,0 +1,289 @@ ++/* ++ * pxa-wm97xx.c -- pxa-wm97xx Continuous Touch screen driver for ++ * Wolfson WM97xx AC97 Codecs. ++ * ++ * Copyright 2004 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Notes: ++ * This is a wm97xx extended touch driver to capture touch ++ * data in a continuous manner on the Intel XScale archictecture ++ * ++ * Features: ++ * - codecs supported:- WM9705, WM9712, WM9713 ++ * - processors supported:- Intel XScale PXA25x, PXA26x, PXA27x ++ * ++ * Revision history ++ * 18th Aug 2004 Initial version. ++ * 26th Jul 2005 Improved continous read back and added FIFO flushing. ++ * 06th Sep 2005 Mike Arthur <linux@wolfsonmicro.com> ++ * Moved to using the wm97xx bus ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/irq.h> ++#include <linux/wm97xx.h> ++#include <asm/io.h> ++#include <asm/arch/pxa-regs.h> ++ ++#define VERSION "0.13" ++ ++struct continuous { ++ u16 id; /* codec id */ ++ u8 code; /* continuous code */ ++ u8 reads; /* number of coord reads per read cycle */ ++ u32 speed; /* number of coords per second */ ++}; ++ ++#define WM_READS(sp) ((sp / HZ) + 1) ++ ++static const struct continuous cinfo[] = { ++ {WM9705_ID2, 0, WM_READS(94), 94}, ++ {WM9705_ID2, 1, WM_READS(188), 188}, ++ {WM9705_ID2, 2, WM_READS(375), 375}, ++ {WM9705_ID2, 3, WM_READS(750), 750}, ++ {WM9712_ID2, 0, WM_READS(94), 94}, ++ {WM9712_ID2, 1, WM_READS(188), 188}, ++ {WM9712_ID2, 2, WM_READS(375), 375}, ++ {WM9712_ID2, 3, WM_READS(750), 750}, ++ {WM9713_ID2, 0, WM_READS(94), 94}, ++ {WM9713_ID2, 1, WM_READS(120), 120}, ++ {WM9713_ID2, 2, WM_READS(154), 154}, ++ {WM9713_ID2, 3, WM_READS(188), 188}, ++}; ++ ++/* continuous speed index */ ++static int sp_idx = 0; ++static u16 last = 0, tries = 0; ++ ++/* ++ * Pen sampling frequency (Hz) in continuous mode. ++ */ ++static int cont_rate = 200; ++module_param(cont_rate, int, 0); ++MODULE_PARM_DESC(cont_rate, "Sampling rate in continuous mode (Hz)"); ++ ++/* ++ * Pen down detection. ++ * ++ * This driver can either poll or use an interrupt to indicate a pen down ++ * event. If the irq request fails then it will fall back to polling mode. ++ */ ++static int pen_int = 1; ++module_param(pen_int, int, 0); ++MODULE_PARM_DESC(pen_int, "Pen down detection (1 = interrupt, 0 = polling)"); ++ ++/* ++ * Pressure readback. ++ * ++ * Set to 1 to read back pen down pressure ++ */ ++static int pressure = 0; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Pressure readback (1 = pressure, 0 = no pressure)"); ++ ++/* ++ * AC97 touch data slot. ++ * ++ * Touch screen readback data ac97 slot ++ */ ++static int ac97_touch_slot = 5; ++module_param(ac97_touch_slot, int, 0); ++MODULE_PARM_DESC(ac97_touch_slot, "Touch screen data slot AC97 number"); ++ ++ ++/* flush AC97 slot 5 FIFO on pxa machines */ ++#ifdef CONFIG_PXA27x ++void wm97xx_acc_pen_up (struct wm97xx* wm) ++{ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ ++ while (MISR & (1 << 2)) ++ MODR; ++} ++#else ++void wm97xx_acc_pen_up (struct wm97xx* wm) ++{ ++ int count = 16; ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ ++ while (count < 16) { ++ MODR; ++ count--; ++ } ++} ++#endif ++ ++int wm97xx_acc_pen_down (struct wm97xx* wm) ++{ ++ u16 x, y, p = 0x100 | WM97XX_ADCSEL_PRES; ++ int reads = 0; ++ ++ /* data is never immediately available after pen down irq */ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ ++ if (tries > 5){ ++ tries = 0; ++ return RC_PENUP; ++ } ++ ++ x = MODR; ++ if (x == last) { ++ tries++; ++ return RC_AGAIN; ++ } ++ last = x; ++ do { ++ if (reads) ++ x= MODR; ++ y= MODR; ++ if (pressure) ++ p = MODR; ++ ++ /* are samples valid */ ++ if ((x & 0x7000) != WM97XX_ADCSEL_X || ++ (y & 0x7000) != WM97XX_ADCSEL_Y || ++ (p & 0x7000) != WM97XX_ADCSEL_PRES) ++ goto up; ++ ++ /* coordinate is good */ ++ tries = 0; ++ //printk("x %x y %x p %x\n", x,y,p); ++ input_report_abs (wm->input_dev, ABS_X, x & 0xfff); ++ input_report_abs (wm->input_dev, ABS_Y, y & 0xfff); ++ input_report_abs (wm->input_dev, ABS_PRESSURE, p & 0xfff); ++ input_sync (wm->input_dev); ++ reads++; ++ } while (reads < cinfo[sp_idx].reads); ++up: ++ return RC_PENDOWN | RC_AGAIN; ++} ++ ++int wm97xx_acc_startup(struct wm97xx* wm) ++{ ++ int idx = 0; ++ ++ /* check we have a codec */ ++ if (wm->ac97 == NULL) ++ return -ENODEV; ++ ++ /* Go you big red fire engine */ ++ for (idx = 0; idx < ARRAY_SIZE(cinfo); idx++) { ++ if (wm->id != cinfo[idx].id) ++ continue; ++ sp_idx = idx; ++ if (cont_rate <= cinfo[idx].speed) ++ break; ++ } ++ wm->acc_rate = cinfo[sp_idx].code; ++ wm->acc_slot = ac97_touch_slot; ++ printk(KERN_INFO "pxa2xx accelerated touchscreen driver, %d samples (sec)\n", ++ cinfo[sp_idx].speed); ++ ++ /* codec specific irq config */ ++ if (pen_int) { ++ switch (wm->id) { ++ case WM9705_ID2: ++ wm->pen_irq = IRQ_GPIO(4); ++ set_irq_type(IRQ_GPIO(4), IRQT_BOTHEDGE); ++ break; ++ case WM9712_ID2: ++ case WM9713_ID2: ++ /* enable pen down interrupt */ ++ /* use PEN_DOWN GPIO 13 to assert IRQ on GPIO line 2 */ ++ wm->pen_irq = MAINSTONE_AC97_IRQ; ++ wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, ++ WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_STICKY, WM97XX_GPIO_WAKE); ++ wm97xx_config_gpio(wm, WM97XX_GPIO_2, WM97XX_GPIO_OUT, ++ WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_NOTSTICKY, WM97XX_GPIO_NOWAKE); ++ break; ++ default: ++ printk(KERN_WARNING "pen down irq not supported on this device\n"); ++ pen_int = 0; ++ break; ++ } ++ } ++ ++ return 0; ++} ++ ++void wm97xx_acc_shutdown(struct wm97xx* wm) ++{ ++ /* codec specific deconfig */ ++ if (pen_int) { ++ switch (wm->id & 0xffff) { ++ case WM9705_ID2: ++ wm->pen_irq = 0; ++ break; ++ case WM9712_ID2: ++ case WM9713_ID2: ++ /* disable interrupt */ ++ wm->pen_irq = 0; ++ break; ++ } ++ } ++} ++ ++static struct wm97xx_mach_ops pxa_mach_ops = { ++ .acc_enabled = 1, ++ .acc_pen_up = wm97xx_acc_pen_up, ++ .acc_pen_down = wm97xx_acc_pen_down, ++ .acc_startup = wm97xx_acc_startup, ++ .acc_shutdown = wm97xx_acc_shutdown, ++}; ++ ++int pxa_wm97xx_probe(struct device *dev) ++{ ++ struct wm97xx *wm = dev->driver_data; ++ return wm97xx_register_mach_ops (wm, &pxa_mach_ops); ++} ++ ++int pxa_wm97xx_remove(struct device *dev) ++{ ++ struct wm97xx *wm = dev->driver_data; ++ wm97xx_unregister_mach_ops (wm); ++ return 0; ++} ++ ++static struct device_driver pxa_wm97xx_driver = { ++ .name = "wm97xx-touchscreen", ++ .bus = &wm97xx_bus_type, ++ .owner = THIS_MODULE, ++ .probe = pxa_wm97xx_probe, ++ .remove = pxa_wm97xx_remove ++}; ++ ++static int __init pxa_wm97xx_init(void) ++{ ++ return driver_register(&pxa_wm97xx_driver); ++} ++ ++static void __exit pxa_wm97xx_exit(void) ++{ ++ driver_unregister(&pxa_wm97xx_driver); ++} ++ ++module_init(pxa_wm97xx_init); ++module_exit(pxa_wm97xx_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood <liam.girdwood@wolfsonmicro.com>"); ++MODULE_DESCRIPTION("wm97xx continuous touch driver for pxa2xx"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm9705.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm9705.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,360 @@ ++/* ++ * wm9705.c -- Codec driver for Wolfson WM9705 AC97 Codec. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9705_VERSION "0.62" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 4; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Pen detect comparator threshold. ++ * ++ * 0 to Vmid in 15 steps, 0 = use zero power comparator with Vmid threshold ++ * i.e. 1 = Vmid/15 threshold ++ * 15 = Vmid/1 threshold ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down events. ++ */ ++static int pdd = 8; ++module_param(pdd, int, 0); ++MODULE_PARM_DESC(pdd, "Set pen detect comparator threshold"); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9705 ++ */ ++static void init_wm9705_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0, dig2 = WM97XX_RPR; ++ ++ /* ++ * mute VIDEO and AUX as they share X and Y touchscreen ++ * inputs on the WM9705 ++ */ ++ wm97xx_reg_write(wm, AC97_AUX, 0x8000); ++ wm97xx_reg_write(wm, AC97_VIDEO, 0x8000); ++ ++ /* touchpanel pressure current*/ ++ if (pil == 2) { ++ dig2 |= WM9705_PIL; ++ dbg("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ dbg("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* polling mode sample settling delay */ ++ if (delay!=4) { ++ if (delay < 0 || delay > 15) { ++ dbg("supplied delay out of range."); ++ delay = 4; ++ } ++ } ++ dig1 &= 0xff0f; ++ dig1 |= WM97XX_DELAY(delay); ++ dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ ++ /* WM9705 pdd */ ++ dig2 |= (pdd & 0x000f); ++ dbg("setting pdd to Vmid/%d", 1 - (pdd & 0x000f)); ++ ++ /* mask */ ++ dig2 |= ((mask & 0x3) << 4); ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++} ++ ++static int wm9705_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ switch(cmd) { ++ case WM97XX_DIG_START: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] & ~WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9705_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9705_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9705 adc in polling mode. ++ */ ++static int wm9705_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = ((adcsel & 0x7fff) + 3) << 12; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay (delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSEL_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Sample the WM9705 touchscreen in polling mode ++ */ ++static int wm9705_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ if (pil) { ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9705 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9705_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2; ++ int ret = 0; ++ ++ dig1 = wm->dig[1]; ++ dig2 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | ++ WM97XX_DELAY_MASK | WM97XX_SLT_MASK); ++ dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | ++ WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | ++ WM97XX_RATE (wm->acc_rate); ++ if (pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ dig2 |= WM9705_PDEN; ++ } else { ++ dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); ++ dig2 &= ~WM9705_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++ return ret; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9705_ID2, ++ .name = "wm9705", ++ .poll_sample = wm9705_poll_sample, ++ .poll_touch = wm9705_poll_touch, ++ .acc_enable = wm9705_acc_enable, ++ .digitiser_ioctl = wm9705_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9705 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm9712.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm9712.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,464 @@ ++/* ++ * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 4th Jul 2005 Initial version. ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9712_VERSION "0.61" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set internal pull up for pen detect. ++ * ++ * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) ++ * i.e. pull up resistance = 64k Ohms / rpu. ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down event. ++ */ ++static int rpu = 3; ++module_param(rpu, int, 0); ++MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 3; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Set five_wire = 1 to use a 5 wire touchscreen. ++ * ++ * NOTE: Five wire mode does not allow for readback of pressure. ++ */ ++static int five_wire; ++module_param(five_wire, int, 0); ++MODULE_PARM_DESC(five_wire, "Set to '1' to use 5-wire touchscreen."); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * Coordinate Polling Enable. ++ * ++ * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together ++ * for every poll. ++ */ ++static int coord = 0; ++module_param(coord, int, 0); ++MODULE_PARM_DESC(coord, "Polling coordinate mode"); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9712 ++ */ ++static void init_wm9712_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0; ++ u16 dig2 = WM97XX_RPR | WM9712_RPU(1); ++ ++ /* WM9712 rpu */ ++ if (rpu) { ++ dig2 &= 0xffc0; ++ dig2 |= WM9712_RPU(rpu); ++ dbg("setting pen detect pull-up to %d Ohms",64000 / rpu); ++ } ++ ++ /* touchpanel pressure current*/ ++ if (pil == 2) { ++ dig2 |= WM9712_PIL; ++ dbg("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ dbg("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* WM9712 five wire */ ++ if (five_wire) { ++ dig2 |= WM9712_45W; ++ dbg("setting 5-wire touchscreen mode."); ++ } ++ ++ /* polling mode sample settling delay */ ++ if (delay < 0 || delay > 15) { ++ dbg("supplied delay out of range."); ++ delay = 4; ++ } ++ dig1 &= 0xff0f; ++ dig1 |= WM97XX_DELAY(delay); ++ dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ ++ /* mask */ ++ dig2 |= ((mask & 0x3) << 6); ++ if (mask) { ++ u16 reg; ++ /* Set GPIO4 as Mask Pin*/ ++ reg = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, reg | WM97XX_GPIO_4); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, reg | WM97XX_GPIO_4); ++ } ++ ++ /* wait - coord mode */ ++ if(coord) ++ dig2 |= WM9712_WAIT; ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++} ++ ++static int wm9712_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ u16 dig2 = wm->dig[2]; ++ ++ switch(cmd) { ++ case WM97XX_DIG_START: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 & ~WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9712_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9712_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9712 adc in polling mode. ++ */ ++static int wm9712_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = ((adcsel & 0x7fff) + 3) << 12; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay (delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSEL_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Read a coord from the WM9712 adc in polling mode. ++ */ ++static int wm9712_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, ++ WM97XX_COO | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion and read x */ ++ poll_delay(delay); ++ data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ /* read back y data */ ++ data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (pil) ++ data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ else ++ data->p = DEFAULT_PRESSURE; ++ ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ /* check we have correct sample */ ++ if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) ++ goto err; ++ if(pil && !(data->p & WM97XX_ADCSEL_PRES)) ++ goto err; ++ ++ if (!(data->x & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ return RC_VALID; ++err: ++ return RC_PENUP; ++} ++ ++/* ++ * Sample the WM9712 touchscreen in polling mode ++ */ ++static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if(coord) { ++ if((rc = wm9712_poll_coord(wm, data)) != RC_VALID) ++ return rc; ++ } else { ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ ++ if (pil && !five_wire) { ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ } ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9712 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9712_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2; ++ int ret = 0; ++ ++ dig1 = wm->dig[1]; ++ dig2 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | ++ WM97XX_DELAY_MASK | WM97XX_SLT_MASK); ++ dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | ++ WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | ++ WM97XX_RATE (wm->acc_rate); ++ if (pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ dig2 |= WM9712_PDEN; ++ } else { ++ dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); ++ dig2 &= ~WM9712_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++ return 0; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9712_ID2, ++ .name = "wm9712", ++ .poll_sample = wm9712_poll_sample, ++ .poll_touch = wm9712_poll_touch, ++ .acc_enable = wm9712_acc_enable, ++ .digitiser_ioctl = wm9712_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9712 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm9713.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm9713.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,461 @@ ++/* ++ * wm9713.c -- Codec touch driver for Wolfson WM9713 AC97 Codec. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9713_VERSION "0.53" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set internal pull up for pen detect. ++ * ++ * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) ++ * i.e. pull up resistance = 64k Ohms / rpu. ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down event. ++ */ ++static int rpu = 1; ++module_param(rpu, int, 0); ++MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 4; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * Coordinate Polling Enable. ++ * ++ * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together ++ * for every poll. ++ */ ++static int coord = 1; ++module_param(coord, int, 0); ++MODULE_PARM_DESC(coord, "Polling coordinate mode"); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9713 ++ */ ++static void init_wm9713_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0, dig2, dig3; ++ ++ /* default values */ ++ dig2 = WM97XX_DELAY(4) | WM97XX_SLT(5); ++ dig3= WM9712_RPU(1); ++ ++ /* rpu */ ++ if (rpu) { ++ dig3 &= 0xffc0; ++ dig3 |= WM9712_RPU(rpu); ++ info("setting pen detect pull-up to %d Ohms",64000 / rpu); ++ } ++ ++ /* touchpanel pressure */ ++ if (pil == 2) { ++ dig3 |= WM9712_PIL; ++ info("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ info ("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* sample settling delay */ ++ if (delay < 0 || delay > 15) { ++ info ("supplied delay out of range."); ++ delay = 4; ++ info("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ } ++ dig2 &= 0xff0f; ++ dig2 |= WM97XX_DELAY(delay); ++ ++ /* mask */ ++ dig3 |= ((mask & 0x3) << 4); ++ if(coord) ++ dig3 |= WM9713_WAIT; ++ ++ wm->misc = wm97xx_reg_read(wm, 0x5a); ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, 0x0); ++} ++ ++static int wm9713_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ u16 val = 0; ++ ++ switch(cmd){ ++ case WM97XX_DIG_START: ++ val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, val & 0x7fff); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] & ~WM97XX_PRP_DET_DIG); ++ val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, val | 0x8000); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, 0); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, 0); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig_save[0]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9713_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9713_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9713 adc in polling mode. ++ */ ++static int wm9713_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ u16 dig1; ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = 1 << ((adcsel & 0x7fff) + 3); ++ ++ dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | adcsel |WM9713_POLL); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay(delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample =wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSRC_MASK) != ffs(adcsel >> 1) << 12) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSRC_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Read a coordinate from the WM9713 adc in polling mode. ++ */ ++static int wm9713_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ u16 dig1; ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ if(pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | WM9713_POLL | WM9713_COO); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay(delay); ++ data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ /* read back data */ ++ data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (pil) ++ data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ else ++ data->p = DEFAULT_PRESSURE; ++ ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ /* check we have correct sample */ ++ if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) ++ goto err; ++ if(pil && !(data->p & WM97XX_ADCSEL_PRES)) ++ goto err; ++ ++ if (!(data->x & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ return RC_VALID; ++err: ++ return RC_PENUP; ++} ++ ++/* ++ * Sample the WM9713 touchscreen in polling mode ++ */ ++static int wm9713_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if(coord) { ++ if((rc = wm9713_poll_coord(wm, data)) != RC_VALID) ++ return rc; ++ } else { ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ if (pil) { ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ } ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9713 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9713_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2, dig3; ++ int ret = 0; ++ ++ dig1 = wm->dig[0]; ++ dig2 = wm->dig[1]; ++ dig3 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && ++ (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ dig1 |= WM9713_CTC | WM9713_COO | WM9713_ADCSEL_X | WM9713_ADCSEL_Y; ++ if (pil) ++ dig1 |= WM9713_ADCSEL_PRES; ++ dig2 &= ~(WM97XX_DELAY_MASK | WM97XX_SLT_MASK | WM97XX_CM_RATE_MASK); ++ dig2 |= WM97XX_SLEN | WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | WM97XX_RATE (wm->acc_rate); ++ dig3 |= WM9713_PDEN; ++ } else { ++ dig1 &= ~(WM9713_CTC | WM9713_COO); ++ dig2 &= ~WM97XX_SLEN; ++ dig3 &= ~WM9713_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); ++ return ret; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9713_ID2, ++ .name = "wm9713", ++ .poll_sample = wm9713_poll_sample, ++ .poll_touch = wm9713_poll_touch, ++ .acc_enable = wm9713_acc_enable, ++ .digitiser_ioctl = wm9713_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9713 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm97xx-core.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm97xx-core.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,912 @@ ++/* ++ * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 ++ * and WM9713 AC97 Codecs. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Notes: ++ * ++ * Features: ++ * - supports WM9705, WM9712, WM9713 ++ * - polling mode ++ * - continuous mode (arch-dependent) ++ * - adjustable rpu/dpp settings ++ * - adjustable pressure current ++ * - adjustable sample settle delay ++ * - 4 and 5 wire touchscreens (5 wire is WM9712 only) ++ * - pen down detection ++ * - battery monitor ++ * - sample AUX adc's ++ * - power management ++ * - codec GPIO ++ * - codec event notification ++ * Todo ++ * - Support for async sampling control for noisy LCD's. ++ * ++ * Revision history ++ * 7th May 2003 Initial version. ++ * 6th June 2003 Added non module support and AC97 registration. ++ * 18th June 2003 Added AUX adc sampling. ++ * 23rd June 2003 Did some minimal reformatting, fixed a couple of ++ * codec_mutexing bugs and noted a race to fix. ++ * 24th June 2003 Added power management and fixed race condition. ++ * 10th July 2003 Changed to a misc device. ++ * 31st July 2003 Moved TS_EVENT and TS_CAL to wm97xx.h ++ * 8th Aug 2003 Added option for read() calling wm97xx_sample_touch() ++ * because some ac97_read/ac_97_write call schedule() ++ * 7th Nov 2003 Added Input touch event interface, stanley.cai@intel.com ++ * 13th Nov 2003 Removed h3600 touch interface, added interrupt based ++ * pen down notification and implemented continous mode ++ * on XScale arch. ++ * 16th Nov 2003 Ian Molton <spyro@f2s.com> ++ * Modified so that it suits the new 2.6 driver model. ++ * 25th Jan 2004 Andrew Zabolotny <zap@homelink.ru> ++ * Implemented IRQ-driven pen down detection, implemented ++ * the private API meant to be exposed to platform-specific ++ * drivers, reorganized the driver so that it supports ++ * an arbitrary number of devices. ++ * 1st Feb 2004 Moved continuous mode handling to a separate ++ * architecture-dependent file. For now only PXA ++ * built-in AC97 controller is supported (pxa-ac97-wm97xx.c). ++ * 11th Feb 2004 Reduced CPU usage by keeping a cached copy of both ++ * digitizer registers instead of reading them every time. ++ * A reorganization of the whole code for better ++ * error handling. ++ * 17th Apr 2004 Added BMON support. ++ * 17th Nov 2004 Added codec GPIO, codec event handling (real and virtual ++ * GPIOs) and 2.6 power management. ++ * 29th Nov 2004 Added WM9713 support. ++ * 4th Jul 2005 Moved codec specific code out to seperate files. ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added bus interface. ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/string.h> ++#include <linux/proc_fs.h> ++#include <linux/pm.h> ++#include <linux/interrupt.h> ++#include <linux/bitops.h> ++#include <linux/workqueue.h> ++#include <linux/device.h> ++#include <linux/wm97xx.h> ++#include <asm/uaccess.h> ++#include <asm/io.h> ++ ++#define TS_NAME "wm97xx" ++#define WM_CORE_VERSION "0.63" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * WM97xx - enable/disable AUX ADC sysfs ++ */ ++static int aux_sys = 1; ++module_param(aux_sys, int, 0); ++MODULE_PARM_DESC(aux_sys, "enable AUX ADC sysfs entries"); ++ ++/* ++ * WM97xx - enable/disable codec status sysfs ++ */ ++static int status_sys = 1; ++module_param(status_sys, int, 0); ++MODULE_PARM_DESC(status_sys, "enable codec status sysfs entries"); ++ ++/* ++ * Touchscreen absolute values ++ * ++ * These parameters are used to help the input layer discard out of ++ * range readings and reduce jitter etc. ++ * ++ * o min, max:- indicate the min and max values your touch screen returns ++ * o fuzz:- use a higher number to reduce jitter ++ * ++ * The default values correspond to Mainstone II in QVGA mode ++ * ++ * Please read ++ * Documentation/input/input-programming.txt for more details. ++ */ ++ ++static int abs_x[3] = {350,3900,5}; ++module_param_array(abs_x, int, NULL, 0); ++MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); ++ ++static int abs_y[3] = {320,3750,40}; ++module_param_array(abs_y, int, NULL, 0); ++MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); ++ ++static int abs_p[3] = {0,150,4}; ++module_param_array(abs_p, int, NULL, 0); ++MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz"); ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* codec AC97 IO access */ ++int wm97xx_reg_read(struct wm97xx *wm, u16 reg) ++{ ++ if (wm->ac97) ++ return wm->ac97->bus->ops->read(wm->ac97, reg); ++ else ++ return -1; ++} ++ ++void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val) ++{ ++ /* cache digitiser registers */ ++ if(reg >= AC97_WM9713_DIG1 && reg <= AC97_WM9713_DIG3) ++ wm->dig[(reg - AC97_WM9713_DIG1) >> 1] = val; ++ ++ /* cache gpio regs */ ++ if(reg >= AC97_GPIO_CFG && reg <= AC97_MISC_AFE) ++ wm->gpio[(reg - AC97_GPIO_CFG) >> 1] = val; ++ ++ /* wm9713 irq reg */ ++ if(reg == 0x5a) ++ wm->misc = val; ++ ++ if (wm->ac97) ++ wm->ac97->bus->ops->write(wm->ac97, reg, val); ++} ++ ++ ++/** ++ * wm97xx_read_aux_adc - Read the aux adc. ++ * @wm: wm97xx device. ++ * @adcsel: codec ADC to be read ++ * ++ * Reads the selected AUX ADC. ++ */ ++ ++int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel) ++{ ++ int power_adc = 0, auxval; ++ u16 power = 0; ++ ++ /* get codec */ ++ mutex_lock(&wm->codec_mutex); ++ ++ /* When the touchscreen is not in use, we may have to power up the AUX ADC ++ * before we can use sample the AUX inputs-> ++ */ ++ if (wm->id == WM9713_ID2 && ++ (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) { ++ power_adc = 1; ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff); ++ } ++ ++ /* Prepare the codec for AUX reading */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_AUX_PREPARE); ++ ++ /* Turn polling mode on to read AUX ADC */ ++ wm->pen_probably_down = 1; ++ wm->codec->poll_sample(wm, adcsel, &auxval); ++ ++ if (power_adc) ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000); ++ ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_RESTORE); ++ ++ wm->pen_probably_down = 0; ++ ++ mutex_unlock(&wm->codec_mutex); ++ return auxval & 0xfff; ++} ++ ++#define WM97XX_AUX_ATTR(name,input) \ ++static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf) \ ++{ \ ++ struct wm97xx *wm = (struct wm97xx*)dev->driver_data; \ ++ return sprintf(buf, "%d\n", wm97xx_read_aux_adc(wm, input)); \ ++} \ ++static DEVICE_ATTR(name, 0444, name##_show, NULL) ++ ++WM97XX_AUX_ATTR(aux1, WM97XX_AUX_ID1); ++WM97XX_AUX_ATTR(aux2, WM97XX_AUX_ID2); ++WM97XX_AUX_ATTR(aux3, WM97XX_AUX_ID3); ++WM97XX_AUX_ATTR(aux4, WM97XX_AUX_ID4); ++ ++#define WM97XX_STATUS_ATTR(name) \ ++static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf) \ ++{ \ ++ struct wm97xx *wm = (struct wm97xx*)dev->driver_data; \ ++ return sprintf(buf, "%d\n", wm97xx_reg_read(wm, AC97_GPIO_STATUS)); \ ++} \ ++static DEVICE_ATTR(name, 0444, name##_show, NULL) ++ ++WM97XX_STATUS_ATTR(gpio); ++ ++static int wm97xx_sys_add(struct device *dev) ++{ ++ if (aux_sys) { ++ device_create_file(dev, &dev_attr_aux1); ++ device_create_file(dev, &dev_attr_aux2); ++ device_create_file(dev, &dev_attr_aux3); ++ device_create_file(dev, &dev_attr_aux4); ++ } ++ if (status_sys) ++ device_create_file(dev, &dev_attr_gpio); ++ return 0; ++} ++ ++static void wm97xx_sys_remove(struct device *dev) ++{ ++ if (status_sys) ++ device_remove_file(dev, &dev_attr_gpio); ++ if (aux_sys) { ++ device_remove_file(dev, &dev_attr_aux1); ++ device_remove_file(dev, &dev_attr_aux2); ++ device_remove_file(dev, &dev_attr_aux3); ++ device_remove_file(dev, &dev_attr_aux4); ++ } ++} ++ ++/** ++ * wm97xx_get_gpio - Get the status of a codec GPIO. ++ * @wm: wm97xx device. ++ * @gpio: gpio ++ * ++ * Get the status of a codec GPIO pin ++ */ ++ ++wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio) ++{ ++ u16 status; ++ wm97xx_gpio_status_t ret; ++ ++ mutex_lock(&wm->codec_mutex); ++ status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ ++ if (status & gpio) ++ ret = WM97XX_GPIO_HIGH; ++ else ++ ret = WM97XX_GPIO_LOW; ++ ++ mutex_unlock(&wm->codec_mutex); ++ return ret; ++} ++ ++/** ++ * wm97xx_set_gpio - Set the status of a codec GPIO. ++ * @wm: wm97xx device. ++ * @gpio: gpio ++ * ++ * ++ * Set the status of a codec GPIO pin ++ */ ++ ++void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_status_t status) ++{ ++ u16 reg; ++ ++ mutex_lock(&wm->codec_mutex); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ ++ if (status & WM97XX_GPIO_HIGH) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ if (wm->id == WM9712_ID2) ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg << 1); ++ else ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg); ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++/* ++ * Codec GPIO pin configuration, this set's pin direction, polarity, ++ * stickyness and wake up. ++ */ ++void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, wm97xx_gpio_dir_t dir, ++ wm97xx_gpio_pol_t pol, wm97xx_gpio_sticky_t sticky, ++ wm97xx_gpio_wake_t wake) ++{ ++ u16 reg; ++ ++ mutex_lock(&wm->codec_mutex); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ ++ if (pol == WM97XX_GPIO_POL_HIGH) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_STICKY); ++ ++ if (sticky == WM97XX_GPIO_STICKY) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); ++ ++ if (wake == WM97XX_GPIO_WAKE) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ ++ if (dir == WM97XX_GPIO_IN) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, reg); ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++/* ++ * Handle a pen down interrupt. ++ */ ++static void wm97xx_pen_irq_worker(void *ptr) ++{ ++ struct wm97xx *wm = (struct wm97xx *) ptr; ++ ++ /* do we need to enable the touch panel reader */ ++ if (wm->id == WM9705_ID2) { ++ if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & WM97XX_PEN_DOWN) ++ wm->pen_is_down = 1; ++ else ++ wm->pen_is_down = 0; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } else { ++ u16 status, pol; ++ mutex_lock(&wm->codec_mutex); ++ status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ pol = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ ++ if (WM97XX_GPIO_13 & pol & status) { ++ wm->pen_is_down = 1; ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol & ~WM97XX_GPIO_13); ++ } else { ++ wm->pen_is_down = 0; ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol | WM97XX_GPIO_13); ++ } ++ ++ if (wm->id == WM9712_ID2) ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, (status & ~WM97XX_GPIO_13) << 1); ++ else ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, status & ~WM97XX_GPIO_13); ++ mutex_unlock(&wm->codec_mutex); ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } ++ ++ if (!wm->pen_is_down && wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->mach_ops->acc_pen_up(wm); ++ enable_irq(wm->pen_irq); ++} ++ ++/* ++ * Codec PENDOWN irq handler ++ * ++ * We have to disable the codec interrupt in the handler because it can ++ * take upto 1ms to clear the interrupt source. The interrupt is then enabled ++ * again in the slow handler when the source has been cleared. ++ */ ++static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id, ++ struct pt_regs *regs) ++{ ++ struct wm97xx *wm = (struct wm97xx *) dev_id; ++ disable_irq(wm->pen_irq); ++ queue_work(wm->pen_irq_workq, &wm->pen_event_work); ++ return IRQ_HANDLED; ++} ++ ++/* ++ * initialise pen IRQ handler and workqueue ++ */ ++static int wm97xx_init_pen_irq(struct wm97xx *wm) ++{ ++ u16 reg; ++ ++ INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker, wm); ++ if ((wm->pen_irq_workq = ++ create_singlethread_workqueue("kwm97pen")) == NULL) { ++ err("could not create pen irq work queue"); ++ wm->pen_irq = 0; ++ return -EINVAL; ++ } ++ ++ if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, SA_SHIRQ, "wm97xx-pen", wm)) { ++ err("could not register codec pen down interrupt, will poll for pen down"); ++ destroy_workqueue(wm->pen_irq_workq); ++ wm->pen_irq = 0; ++ return -EINVAL; ++ } ++ ++ /* enable PEN down on wm9712/13 */ ++ if (wm->id != WM9705_ID2) { ++ reg = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, reg & 0xfffb); ++ reg = wm97xx_reg_read(wm, 0x5a); ++ wm97xx_reg_write(wm, 0x5a, reg & ~0x0001); ++ } ++ ++ return 0; ++} ++ ++/* Private struct for communication between struct wm97xx_tshread ++ * and wm97xx_read_samples */ ++struct ts_state { ++ int sleep_time; ++ int min_sleep_time; ++}; ++ ++static int wm97xx_read_samples(struct wm97xx *wm, struct ts_state *state) ++{ ++ struct wm97xx_data data; ++ int rc; ++ ++ mutex_lock(&wm->codec_mutex); ++ ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ rc = wm->mach_ops->acc_pen_down(wm); ++ else ++ rc = wm->codec->poll_touch(wm, &data); ++ ++ if (rc & RC_PENUP) { ++ if (wm->pen_is_down) { ++ wm->pen_is_down = 0; ++ dbg("pen up"); ++ input_report_abs(wm->input_dev, ABS_PRESSURE, 0); ++ input_sync(wm->input_dev); ++ } else if (!(rc & RC_AGAIN)) { ++ /* We need high frequency updates only while pen is down, ++ * the user never will be able to touch screen faster than ++ * a few times per second... On the other hand, when the ++ * user is actively working with the touchscreen we don't ++ * want to lose the quick response. So we will slowly ++ * increase sleep time after the pen is up and quicky ++ * restore it to ~one task switch when pen is down again. ++ */ ++ if (state->sleep_time < HZ / 10) ++ state->sleep_time++; ++ } ++ ++ } else if (rc & RC_VALID) { ++ dbg("pen down: x=%x:%d, y=%x:%d, pressure=%x:%d\n", ++ data.x >> 12, data.x & 0xfff, data.y >> 12, ++ data.y & 0xfff, data.p >> 12, data.p & 0xfff); ++ input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff); ++ input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff); ++ input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff); ++ input_sync(wm->input_dev); ++ wm->pen_is_down = 1; ++ state->sleep_time = state->min_sleep_time; ++ } else if (rc & RC_PENDOWN) { ++ dbg("pen down"); ++ wm->pen_is_down = 1; ++ state->sleep_time = state->min_sleep_time; ++ } ++ ++ mutex_unlock(&wm->codec_mutex); ++ return rc; ++} ++ ++/* ++* The touchscreen sample reader thread. ++*/ ++static int wm97xx_ts_read(void *data) ++{ ++ int rc; ++ struct ts_state state; ++ struct wm97xx *wm = (struct wm97xx *) data; ++ ++ /* set up thread context */ ++ wm->ts_task = current; ++ daemonize("kwm97xxts"); ++ ++ if (wm->codec == NULL) { ++ wm->ts_task = NULL; ++ printk(KERN_ERR "codec is NULL, bailing\n"); ++ } ++ ++ complete(&wm->ts_init); ++ wm->pen_is_down = 0; ++ state.min_sleep_time = HZ >= 100 ? HZ / 100 : 1; ++ if (state.min_sleep_time < 1) ++ state.min_sleep_time = 1; ++ state.sleep_time = state.min_sleep_time; ++ ++ /* touch reader loop */ ++ while (wm->ts_task) { ++ do { ++ try_to_freeze(); ++ rc = wm97xx_read_samples(wm, &state); ++ } while (rc & RC_AGAIN); ++ if (!wm->pen_is_down && wm->pen_irq) { ++ /* Nice, we don't have to poll for pen down event */ ++ wait_event_interruptible(wm->pen_irq_wait, wm->pen_is_down); ++ } else { ++ set_task_state(current, TASK_INTERRUPTIBLE); ++ schedule_timeout(state.sleep_time); ++ } ++ } ++ complete_and_exit(&wm->ts_exit, 0); ++} ++ ++/** ++ * wm97xx_ts_input_open - Open the touch screen input device. ++ * @idev: Input device to be opened. ++ * ++ * Called by the input sub system to open a wm97xx touchscreen device. ++ * Starts the touchscreen thread and touch digitiser. ++ */ ++static int wm97xx_ts_input_open(struct input_dev *idev) ++{ ++ int ret = 0; ++ struct wm97xx *wm = (struct wm97xx *) idev->private; ++ ++ mutex_lock(&wm->codec_mutex); ++ /* first time opened ? */ ++ if (wm->ts_use_count++ == 0) { ++ /* start touchscreen thread */ ++ init_completion(&wm->ts_init); ++ init_completion(&wm->ts_exit); ++ ret = kernel_thread(wm97xx_ts_read, wm, CLONE_KERNEL); ++ ++ if (ret >= 0) { ++ wait_for_completion(&wm->ts_init); ++ if (wm->ts_task == NULL) ++ ret = -EINVAL; ++ } else { ++ mutex_unlock(&wm->codec_mutex); ++ return ret; ++ } ++ ++ /* start digitiser */ ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->codec->acc_enable(wm, 1); ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_START); ++ ++ /* init pen down/up irq handling */ ++ if (wm->pen_irq) { ++ wm97xx_init_pen_irq(wm); ++ ++ if (wm->pen_irq == 0) { ++ /* we failed to get an irq for pen down events, ++ * so we resort to polling. kickstart the reader */ ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } ++ } ++ } ++ ++ mutex_unlock(&wm->codec_mutex); ++ return 0; ++} ++ ++/** ++ * wm97xx_ts_input_close - Close the touch screen input device. ++ * @idev: Input device to be closed. ++ * ++ * Called by the input sub system to close a wm97xx touchscreen device. ++ * Kills the touchscreen thread and stops the touch digitiser. ++ */ ++ ++static void wm97xx_ts_input_close(struct input_dev *idev) ++{ ++ struct wm97xx *wm = (struct wm97xx *) idev->private; ++ ++ mutex_lock(&wm->codec_mutex); ++ if (--wm->ts_use_count == 0) { ++ /* destroy workqueues and free irqs */ ++ if (wm->pen_irq) { ++ free_irq(wm->pen_irq, wm); ++ destroy_workqueue(wm->pen_irq_workq); ++ } ++ ++ /* kill thread */ ++ if (wm->ts_task) { ++ wm->ts_task = NULL; ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ wait_for_completion(&wm->ts_exit); ++ wm->pen_is_down = 0; ++ } ++ ++ /* stop digitiser */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_STOP); ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->codec->acc_enable(wm, 0); ++ } ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++static int wm97xx_bus_match(struct device *dev, struct device_driver *drv) ++{ ++ return !(strcmp(dev->bus_id,drv->name)); ++} ++ ++/* ++ * The AC97 audio driver will do all the Codec suspend and resume ++ * tasks. This is just for anything machine specific or extra. ++ */ ++static int wm97xx_bus_suspend(struct device *dev, pm_message_t state) ++{ ++ int ret = 0; ++ ++ if (dev->driver && dev->driver->suspend) ++ ret = dev->driver->suspend(dev, state); ++ ++ return ret; ++} ++ ++static int wm97xx_bus_resume(struct device *dev) ++{ ++ int ret = 0; ++ ++ if (dev->driver && dev->driver->resume) ++ ret = dev->driver->resume(dev); ++ ++ return ret; ++} ++ ++struct bus_type wm97xx_bus_type = { ++ .name = "wm97xx", ++ .match = wm97xx_bus_match, ++ .suspend = wm97xx_bus_suspend, ++ .resume = wm97xx_bus_resume, ++}; ++ ++static void wm97xx_release(struct device *dev) ++{ ++ kfree(dev); ++} ++ ++static int wm97xx_probe(struct device *dev) ++{ ++ struct wm97xx* wm; ++ int ret = 0, id = 0; ++ ++ if (!(wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL))) ++ return -ENOMEM; ++ mutex_init(&wm->codec_mutex); ++ ++ init_waitqueue_head(&wm->pen_irq_wait); ++ wm->dev = dev; ++ dev->driver_data = wm; ++ wm->ac97 = to_ac97_t(dev); ++ ++ /* check that we have a supported codec */ ++ if ((id = wm97xx_reg_read(wm, AC97_VENDOR_ID1)) != WM97XX_ID1) { ++ err("could not find a wm97xx, found a %x instead\n", id); ++ kfree(wm); ++ return -ENODEV; ++ } ++ ++ wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2); ++ if(wm->id != wm97xx_codec.id) { ++ err("could not find a the selected codec, please build for wm97%2x", wm->id & 0xff); ++ kfree(wm); ++ return -ENODEV; ++ } ++ ++ if((wm->input_dev = input_allocate_device()) == NULL) { ++ kfree(wm); ++ return -ENOMEM; ++ } ++ ++ /* set up touch configuration */ ++ info("detected a wm97%2x codec", wm->id & 0xff); ++ wm->input_dev->name = "wm97xx touchscreen"; ++ wm->input_dev->open = wm97xx_ts_input_open; ++ wm->input_dev->close = wm97xx_ts_input_close; ++ set_bit(EV_ABS, wm->input_dev->evbit); ++ set_bit(ABS_X, wm->input_dev->absbit); ++ set_bit(ABS_Y, wm->input_dev->absbit); ++ set_bit(ABS_PRESSURE, wm->input_dev->absbit); ++ wm->input_dev->absmax[ABS_X] = abs_x[1]; ++ wm->input_dev->absmax[ABS_Y] = abs_y[1]; ++ wm->input_dev->absmax[ABS_PRESSURE] = abs_p[1]; ++ wm->input_dev->absmin[ABS_X] = abs_x[0]; ++ wm->input_dev->absmin[ABS_Y] = abs_y[0]; ++ wm->input_dev->absmin[ABS_PRESSURE] = abs_p[0]; ++ wm->input_dev->absfuzz[ABS_X] = abs_x[2]; ++ wm->input_dev->absfuzz[ABS_Y] = abs_y[2]; ++ wm->input_dev->absfuzz[ABS_PRESSURE] = abs_p[2]; ++ wm->input_dev->private = wm; ++ wm->codec = &wm97xx_codec; ++ if((ret = input_register_device(wm->input_dev)) < 0) { ++ kfree(wm); ++ return -ENOMEM; ++ } ++ ++ if(aux_sys) ++ wm97xx_sys_add(dev); ++ ++ /* set up physical characteristics */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_PHY_INIT); ++ ++ /* load gpio cache */ ++ wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); ++ wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); ++ wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ ++ /* register our battery device */ ++ if (!(wm->battery_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { ++ ret = -ENOMEM; ++ goto batt_err; ++ } ++ wm->battery_dev->bus = &wm97xx_bus_type; ++ strcpy(wm->battery_dev->bus_id,"wm97xx-battery"); ++ wm->battery_dev->driver_data = wm; ++ wm->battery_dev->parent = dev; ++ wm->battery_dev->release = wm97xx_release; ++ if((ret = device_register(wm->battery_dev)) < 0) ++ goto batt_reg_err; ++ ++ /* register our extended touch device (for machine specific extensions) */ ++ if (!(wm->touch_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { ++ ret = -ENOMEM; ++ goto touch_err; ++ } ++ wm->touch_dev->bus = &wm97xx_bus_type; ++ strcpy(wm->touch_dev->bus_id,"wm97xx-touchscreen"); ++ wm->touch_dev->driver_data = wm; ++ wm->touch_dev->parent = dev; ++ wm->touch_dev->release = wm97xx_release; ++ if((ret = device_register(wm->touch_dev)) < 0) ++ goto touch_reg_err; ++ ++ return ret; ++ ++touch_reg_err: ++ kfree(wm->touch_dev); ++touch_err: ++ device_unregister(wm->battery_dev); ++batt_reg_err: ++ kfree(wm->battery_dev); ++batt_err: ++ input_unregister_device(wm->input_dev); ++ kfree(wm); ++ return ret; ++} ++ ++static int wm97xx_remove(struct device *dev) ++{ ++ struct wm97xx *wm = dev_get_drvdata(dev); ++ ++ /* Stop touch reader thread */ ++ if (wm->ts_task) { ++ wm->ts_task = NULL; ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ wait_for_completion(&wm->ts_exit); ++ } ++ device_unregister(wm->battery_dev); ++ device_unregister(wm->touch_dev); ++ input_unregister_device(wm->input_dev); ++ ++ if(aux_sys) ++ wm97xx_sys_remove(dev); ++ ++ kfree(wm); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++int wm97xx_resume(struct device* dev) ++{ ++ struct wm97xx *wm = dev_get_drvdata(dev); ++ ++ /* restore digitiser and gpio's */ ++ if(wm->id == WM9713_ID2) { ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]); ++ wm97xx_reg_write(wm, 0x5a, wm->misc); ++ if(wm->ts_use_count) { ++ u16 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff; ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); ++ } ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2]); ++ ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, wm->gpio[0]); ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, wm->gpio[1]); ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, wm->gpio[2]); ++ wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, wm->gpio[3]); ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, wm->gpio[4]); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, wm->gpio[5]); ++ ++ return 0; ++} ++ ++#else ++#define wm97xx_resume NULL ++#endif ++ ++int wm97xx_register_mach_ops(struct wm97xx *wm, struct wm97xx_mach_ops *mach_ops) ++{ ++ mutex_lock(&wm->codec_mutex); ++ if(wm->mach_ops) { ++ mutex_unlock(&wm->codec_mutex); ++ return -EINVAL; ++ } ++ wm->mach_ops = mach_ops; ++ mutex_unlock(&wm->codec_mutex); ++ return 0; ++} ++ ++void wm97xx_unregister_mach_ops(struct wm97xx *wm) ++{ ++ mutex_lock(&wm->codec_mutex); ++ wm->mach_ops = NULL; ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++static struct device_driver wm97xx_driver = { ++ .name = "ac97", ++ .bus = &ac97_bus_type, ++ .owner = THIS_MODULE, ++ .probe = wm97xx_probe, ++ .remove = wm97xx_remove, ++ .resume = wm97xx_resume, ++}; ++ ++static int __init wm97xx_init(void) ++{ ++ int ret; ++ ++ info("version %s liam.girdwood@wolfsonmicro.com", WM_CORE_VERSION); ++ if((ret = bus_register(&wm97xx_bus_type)) < 0) ++ return ret; ++ return driver_register(&wm97xx_driver); ++} ++ ++static void __exit wm97xx_exit(void) ++{ ++ driver_unregister(&wm97xx_driver); ++ bus_unregister(&wm97xx_bus_type); ++} ++ ++EXPORT_SYMBOL_GPL(wm97xx_get_gpio); ++EXPORT_SYMBOL_GPL(wm97xx_set_gpio); ++EXPORT_SYMBOL_GPL(wm97xx_config_gpio); ++EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc); ++EXPORT_SYMBOL_GPL(wm97xx_reg_read); ++EXPORT_SYMBOL_GPL(wm97xx_reg_write); ++EXPORT_SYMBOL_GPL(wm97xx_bus_type); ++EXPORT_SYMBOL_GPL(wm97xx_register_mach_ops); ++EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops); ++ ++module_init(wm97xx_init); ++module_exit(wm97xx_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/include/linux/wm97xx.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/include/linux/wm97xx.h 2006-09-19 20:36:47.973052250 +0200 +@@ -0,0 +1,291 @@ ++ ++/* ++ * Register bits and API for Wolfson WM97xx series of codecs ++ */ ++ ++#ifndef _LINUX_WM97XX_H ++#define _LINUX_WM97XX_H ++ ++#include <sound/driver.h> ++#include <sound/core.h> ++#include <sound/pcm.h> ++#include <sound/ac97_codec.h> ++#include <sound/initval.h> ++#include <linux/types.h> ++#include <linux/list.h> ++#include <linux/input.h> /* Input device layer */ ++ ++/* ++ * WM97xx AC97 Touchscreen registers ++ */ ++#define AC97_WM97XX_DIGITISER1 0x76 ++#define AC97_WM97XX_DIGITISER2 0x78 ++#define AC97_WM97XX_DIGITISER_RD 0x7a ++#define AC97_WM9713_DIG1 0x74 ++#define AC97_WM9713_DIG2 AC97_WM97XX_DIGITISER1 ++#define AC97_WM9713_DIG3 AC97_WM97XX_DIGITISER2 ++ ++/* ++ * WM97xx register bits ++ */ ++#define WM97XX_POLL 0x8000 /* initiate a polling measurement */ ++#define WM97XX_ADCSEL_X 0x1000 /* x coord measurement */ ++#define WM97XX_ADCSEL_Y 0x2000 /* y coord measurement */ ++#define WM97XX_ADCSEL_PRES 0x3000 /* pressure measurement */ ++#define WM97XX_ADCSEL_MASK 0x7000 ++#define WM97XX_COO 0x0800 /* enable coordinate mode */ ++#define WM97XX_CTC 0x0400 /* enable continuous mode */ ++#define WM97XX_CM_RATE_93 0x0000 /* 93.75Hz continuous rate */ ++#define WM97XX_CM_RATE_187 0x0100 /* 187.5Hz continuous rate */ ++#define WM97XX_CM_RATE_375 0x0200 /* 375Hz continuous rate */ ++#define WM97XX_CM_RATE_750 0x0300 /* 750Hz continuous rate */ ++#define WM97XX_CM_RATE_8K 0x00f0 /* 8kHz continuous rate */ ++#define WM97XX_CM_RATE_12K 0x01f0 /* 12kHz continuous rate */ ++#define WM97XX_CM_RATE_24K 0x02f0 /* 24kHz continuous rate */ ++#define WM97XX_CM_RATE_48K 0x03f0 /* 48kHz continuous rate */ ++#define WM97XX_CM_RATE_MASK 0x03f0 ++#define WM97XX_RATE(i) (((i & 3) << 8) | ((i & 4) ? 0xf0 : 0)) ++#define WM97XX_DELAY(i) ((i << 4) & 0x00f0) /* sample delay times */ ++#define WM97XX_DELAY_MASK 0x00f0 ++#define WM97XX_SLEN 0x0008 /* slot read back enable */ ++#define WM97XX_SLT(i) ((i - 5) & 0x7) /* touchpanel slot selection (5-11) */ ++#define WM97XX_SLT_MASK 0x0007 ++#define WM97XX_PRP_DETW 0x4000 /* pen detect on, digitiser off, wake up */ ++#define WM97XX_PRP_DET 0x8000 /* pen detect on, digitiser off, no wake up */ ++#define WM97XX_PRP_DET_DIG 0xc000 /* pen detect on, digitiser on */ ++#define WM97XX_RPR 0x2000 /* wake up on pen down */ ++#define WM97XX_PEN_DOWN 0x8000 /* pen is down */ ++#define WM97XX_ADCSRC_MASK 0x7000 /* ADC source mask */ ++ ++#define WM97XX_AUX_ID1 0x8001 ++#define WM97XX_AUX_ID2 0x8002 ++#define WM97XX_AUX_ID3 0x8003 ++#define WM97XX_AUX_ID4 0x8004 ++ ++ ++/* WM9712 Bits */ ++#define WM9712_45W 0x1000 /* set for 5-wire touchscreen */ ++#define WM9712_PDEN 0x0800 /* measure only when pen down */ ++#define WM9712_WAIT 0x0200 /* wait until adc is read before next sample */ ++#define WM9712_PIL 0x0100 /* current used for pressure measurement. set 400uA else 200uA */ ++#define WM9712_MASK_HI 0x0040 /* hi on mask pin (47) stops conversions */ ++#define WM9712_MASK_EDGE 0x0080 /* rising/falling edge on pin delays sample */ ++#define WM9712_MASK_SYNC 0x00c0 /* rising/falling edge on mask initiates sample */ ++#define WM9712_RPU(i) (i&0x3f) /* internal pull up on pen detect (64k / rpu) */ ++#define WM9712_PD(i) (0x1 << i) /* power management */ ++ ++/* WM9712 Registers */ ++#define AC97_WM9712_POWER 0x24 ++#define AC97_WM9712_REV 0x58 ++ ++/* WM9705 Bits */ ++#define WM9705_PDEN 0x1000 /* measure only when pen is down */ ++#define WM9705_PINV 0x0800 /* inverts sense of pen down output */ ++#define WM9705_BSEN 0x0400 /* BUSY flag enable, pin47 is 1 when busy */ ++#define WM9705_BINV 0x0200 /* invert BUSY (pin47) output */ ++#define WM9705_WAIT 0x0100 /* wait until adc is read before next sample */ ++#define WM9705_PIL 0x0080 /* current used for pressure measurement. set 400uA else 200uA */ ++#define WM9705_PHIZ 0x0040 /* set PHONE and PCBEEP inputs to high impedance */ ++#define WM9705_MASK_HI 0x0010 /* hi on mask stops conversions */ ++#define WM9705_MASK_EDGE 0x0020 /* rising/falling edge on pin delays sample */ ++#define WM9705_MASK_SYNC 0x0030 /* rising/falling edge on mask initiates sample */ ++#define WM9705_PDD(i) (i & 0x000f) /* pen detect comparator threshold */ ++ ++ ++/* WM9713 Bits */ ++#define WM9713_PDPOL 0x0400 /* Pen down polarity */ ++#define WM9713_POLL 0x0200 /* initiate a polling measurement */ ++#define WM9713_CTC 0x0100 /* enable continuous mode */ ++#define WM9713_ADCSEL_X 0x0002 /* X measurement */ ++#define WM9713_ADCSEL_Y 0x0004 /* Y measurement */ ++#define WM9713_ADCSEL_PRES 0x0008 /* Pressure measurement */ ++#define WM9713_COO 0x0001 /* enable coordinate mode */ ++#define WM9713_PDEN 0x0800 /* measure only when pen down */ ++#define WM9713_ADCSEL_MASK 0x00fe /* ADC selection mask */ ++#define WM9713_WAIT 0x0200 /* coordinate wait */ ++ ++/* AUX ADC ID's */ ++#define TS_COMP1 0x0 ++#define TS_COMP2 0x1 ++#define TS_BMON 0x2 ++#define TS_WIPER 0x3 ++ ++/* ID numbers */ ++#define WM97XX_ID1 0x574d ++#define WM9712_ID2 0x4c12 ++#define WM9705_ID2 0x4c05 ++#define WM9713_ID2 0x4c13 ++ ++/* Codec GPIO's */ ++#define WM97XX_MAX_GPIO 16 ++#define WM97XX_GPIO_1 (1 << 1) ++#define WM97XX_GPIO_2 (1 << 2) ++#define WM97XX_GPIO_3 (1 << 3) ++#define WM97XX_GPIO_4 (1 << 4) ++#define WM97XX_GPIO_5 (1 << 5) ++#define WM97XX_GPIO_6 (1 << 6) ++#define WM97XX_GPIO_7 (1 << 7) ++#define WM97XX_GPIO_8 (1 << 8) ++#define WM97XX_GPIO_9 (1 << 9) ++#define WM97XX_GPIO_10 (1 << 10) ++#define WM97XX_GPIO_11 (1 << 11) ++#define WM97XX_GPIO_12 (1 << 12) ++#define WM97XX_GPIO_13 (1 << 13) ++#define WM97XX_GPIO_14 (1 << 14) ++#define WM97XX_GPIO_15 (1 << 15) ++ ++ ++#define AC97_LINK_FRAME 21 /* time in uS for AC97 link frame */ ++ ++ ++/*---------------- Return codes from sample reading functions ---------------*/ ++ ++/* More data is available; call the sample gathering function again */ ++#define RC_AGAIN 0x00000001 ++/* The returned sample is valid */ ++#define RC_VALID 0x00000002 ++/* The pen is up (the first RC_VALID without RC_PENUP means pen is down) */ ++#define RC_PENUP 0x00000004 ++/* The pen is down (RC_VALID implies RC_PENDOWN, but sometimes it is helpful ++ to tell the handler that the pen is down but we don't know yet his coords, ++ so the handler should not sleep or wait for pendown irq) */ ++#define RC_PENDOWN 0x00000008 ++ ++/* The wm97xx driver provides a private API for writing platform-specific ++ * drivers. ++ */ ++ ++/* The structure used to return arch specific sampled data into */ ++struct wm97xx_data { ++ int x; ++ int y; ++ int p; ++}; ++ ++/* Codec GPIO status ++ */ ++typedef enum { ++ WM97XX_GPIO_HIGH, ++ WM97XX_GPIO_LOW ++} wm97xx_gpio_status_t; ++ ++/* Codec GPIO direction ++ */ ++typedef enum { ++ WM97XX_GPIO_IN, ++ WM97XX_GPIO_OUT ++} wm97xx_gpio_dir_t; ++ ++/* Codec GPIO polarity ++ */ ++typedef enum { ++ WM97XX_GPIO_POL_HIGH, ++ WM97XX_GPIO_POL_LOW ++} wm97xx_gpio_pol_t; ++ ++/* Codec GPIO sticky ++ */ ++typedef enum { ++ WM97XX_GPIO_STICKY, ++ WM97XX_GPIO_NOTSTICKY ++} wm97xx_gpio_sticky_t; ++ ++/* Codec GPIO wake ++ */ ++typedef enum { ++ WM97XX_GPIO_WAKE, ++ WM97XX_GPIO_NOWAKE ++} wm97xx_gpio_wake_t; ++ ++ ++/* ++ * Digitiser ioctl commands ++ */ ++#define WM97XX_DIG_START 0x1 ++#define WM97XX_DIG_STOP 0x2 ++#define WM97XX_PHY_INIT 0x3 ++#define WM97XX_AUX_PREPARE 0x4 ++#define WM97XX_DIG_RESTORE 0x5 ++ ++struct wm97xx; ++extern struct wm97xx_codec_drv wm97xx_codec; ++ ++/* ++ * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs ++ */ ++struct wm97xx_codec_drv { ++ u16 id; ++ char *name; ++ int (*poll_sample) (struct wm97xx *, int adcsel, int *sample); /* read 1 sample */ ++ int (*poll_touch) (struct wm97xx *, struct wm97xx_data *); /* read X,Y,[P] in poll */ ++ int (*digitiser_ioctl) (struct wm97xx *, int cmd); ++ int (*acc_enable) (struct wm97xx *, int enable); ++}; ++ ++ ++/* Machine specific and accelerated touch operations */ ++struct wm97xx_mach_ops { ++ ++ /* accelerated touch readback - coords are transmited on AC97 link */ ++ int acc_enabled; ++ void (*acc_pen_up) (struct wm97xx *); ++ int (*acc_pen_down) (struct wm97xx *); ++ int (*acc_startup) (struct wm97xx *); ++ void (*acc_shutdown) (struct wm97xx *); ++ ++ /* pre and post sample - can be used to minimise any analog noise */ ++ void (*pre_sample) (int); /* function to run before sampling */ ++ void (*post_sample) (int); /* function to run after sampling */ ++}; ++ ++struct wm97xx { ++ u16 dig[3], id, gpio[6], misc; /* Cached codec registers */ ++ u16 dig_save[3]; /* saved during aux reading */ ++ struct wm97xx_codec_drv *codec; /* attached codec driver*/ ++ struct input_dev* input_dev; /* touchscreen input device */ ++ ac97_t *ac97; /* ALSA codec access */ ++ struct device *dev; /* ALSA device */ ++ struct device *battery_dev; ++ struct device *touch_dev; ++ struct wm97xx_mach_ops *mach_ops; ++ struct mutex codec_mutex; ++ struct completion ts_init; ++ struct completion ts_exit; ++ struct task_struct *ts_task; ++ unsigned int pen_irq; /* Pen IRQ number in use */ ++ wait_queue_head_t pen_irq_wait; /* Pen IRQ wait queue */ ++ struct workqueue_struct *pen_irq_workq; ++ struct work_struct pen_event_work; ++ u16 acc_slot; /* AC97 slot used for acc touch data */ ++ u16 acc_rate; /* acc touch data rate */ ++ unsigned int ts_use_count; ++ unsigned pen_is_down:1; /* Pen is down */ ++ unsigned aux_waiting:1; /* aux measurement waiting */ ++ unsigned pen_probably_down:1; /* used in polling mode */ ++}; ++ ++/* Codec GPIO access (not supported on WM9705) ++ * This can be used to set/get codec GPIO and Virtual GPIO status. ++ */ ++wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio); ++void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_status_t status); ++void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_dir_t dir, ++ wm97xx_gpio_pol_t pol, ++ wm97xx_gpio_sticky_t sticky, ++ wm97xx_gpio_wake_t wake); ++ ++/* codec AC97 IO access */ ++int wm97xx_reg_read(struct wm97xx *wm, u16 reg); ++void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val); ++ ++/* aux adc readback */ ++int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel); ++ ++/* machine ops */ ++int wm97xx_register_mach_ops(struct wm97xx *, struct wm97xx_mach_ops *); ++void wm97xx_unregister_mach_ops(struct wm97xx *); ++ ++extern struct bus_type wm97xx_bus_type; ++#endif diff --git a/packages/linux/linux-rp-2.6.23/defconfig-akita b/packages/linux/linux-rp-2.6.23/defconfig-akita index 59ec5c95b7..7d9adaf0e3 100644 --- a/packages/linux/linux-rp-2.6.23/defconfig-akita +++ b/packages/linux/linux-rp-2.6.23/defconfig-akita @@ -677,8 +677,24 @@ CONFIG_MII=m # # Wireless LAN # -# CONFIG_WLAN_PRE80211 is not set -# CONFIG_WLAN_80211 is not set +CONFIG_WLAN_PRE80211=y +# CONFIG_STRIP is not set +# CONFIG_PCMCIA_WAVELAN is not set +# CONFIG_PCMCIA_NETWAVE is not set +CONFIG_WLAN_80211=y +# CONFIG_PCMCIA_RAYCS is not set +# CONFIG_LIBERTAS is not set +CONFIG_HERMES=m +# CONFIG_ATMEL is not set +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_AIRO_CS=m +# CONFIG_PCMCIA_WL3501 is not set +# CONFIG_USB_ZD1201 is not set +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set +CONFIG_HOSTAP_CS=m # # USB Network Adapters @@ -989,7 +1005,7 @@ CONFIG_FB_DEFERRED_IO=y CONFIG_FB_PXA=y CONFIG_FB_PXA_LCD_QVGA=y # CONFIG_FB_PXA_LCD_VGA is not set -# CONFIG_FB_PXA_OVERLAY is not set +CONFIG_FB_PXA_OVERLAY=y # CONFIG_FB_PXA_PARAMETERS is not set # CONFIG_FB_MBX is not set # CONFIG_FB_W100 is not set diff --git a/packages/linux/linux-rp-2.6.23/defconfig-tosa b/packages/linux/linux-rp-2.6.23/defconfig-tosa index 74fc076608..08c2bbe87a 100644 --- a/packages/linux/linux-rp-2.6.23/defconfig-tosa +++ b/packages/linux/linux-rp-2.6.23/defconfig-tosa @@ -248,7 +248,7 @@ CONFIG_PACKET_MMAP=y CONFIG_UNIX=y CONFIG_XFRM=y CONFIG_XFRM_USER=m -# CONFIG_NET_KEY is not set +CONFIG_NET_KEY=m CONFIG_INET=y # CONFIG_IP_MULTICAST is not set # CONFIG_IP_ADVANCED_ROUTER is not set @@ -262,6 +262,9 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_TUNNEL is not set +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_XFRM_MODE_BEET=m CONFIG_INET_DIAG=m CONFIG_INET_TCP_DIAG=m # CONFIG_TCP_CONG_ADVANCED is not set @@ -792,9 +795,11 @@ CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_WM97XX=y # CONFIG_TOUCHSCREEN_WM9705 is not set CONFIG_TOUCHSCREEN_WM9712=y +CONFIG_TOUCHSCREEN_TOSA=y # CONFIG_TOUCHSCREEN_WM9713 is not set # CONFIG_TOUCHSCREEN_WM97XX_PXA is not set -# CONFIG_INPUT_MISC is not set +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m # # Hardware I/O ports @@ -1004,10 +1009,10 @@ CONFIG_FONT_8x8=y # # Logo configuration # -CONFIG_LOGO=y +# CONFIG_LOGO is not set # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set -CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_LOGO_LINUX_CLUT224 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_DEVICE=y @@ -1033,14 +1038,14 @@ CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m CONFIG_SND_PCM_OSS=m # CONFIG_SND_DYNAMIC_MINORS is not set -CONFIG_SND_SUPPORT_OLD_API=y +# CONFIG_SND_SUPPORT_OLD_API is not set # CONFIG_SND_VERBOSE_PRINTK is not set # CONFIG_SND_DEBUG is not set # # Generic devices # -CONFIG_SND_AC97_BUS=y +CONFIG_AC97_BUS=y CONFIG_SND_DUMMY=m # CONFIG_SND_MTPAV is not set # CONFIG_SND_SERIAL_U16550 is not set @@ -1072,15 +1077,15 @@ CONFIG_SND_SOC=y # # SoC Audio for the Intel PXA2xx # -CONFIG_SND_PXA2xx_SOC=y -CONFIG_SND_PXA2xx_SOC_AC97=y -# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set -# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set -# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set -# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set -# CONFIG_SND_PXA2xx_SOC_CORGI is not set -# CONFIG_SND_PXA2xx_SOC_SPITZ is not set -CONFIG_SND_PXA2xx_SOC_TOSA=y +CONFIG_SND_PXA2XX_SOC=y +CONFIG_SND_PXA2XX_SOC_AC97=y +# CONFIG_SND_PXA2XX_SOC_MAINSTONE is not set +# CONFIG_SND_PXA2XX_SOC_MAINSTONE_WM8753 is not set +# CONFIG_SND_PXA2XX_SOC_MAINSTONE_WM9713 is not set +# CONFIG_SND_PXA2XX_SOC_MAINSTONE_WM9712 is not set +# CONFIG_SND_PXA2XX_SOC_CORGI is not set +# CONFIG_SND_PXA2XX_SOC_SPITZ is not set +CONFIG_SND_PXA2XX_SOC_TOSA=y # # Soc Codecs @@ -1100,6 +1105,7 @@ CONFIG_SND_SOC_WM9712=y # Open Sound System # # CONFIG_SOUND_PRIME is not set +CONFIG_HID=m # # USB support @@ -1301,12 +1307,12 @@ CONFIG_USB_IDMOUSE=m # # USB Gadget Support # -CONFIG_USB_GADGET=y +CONFIG_USB_GADGET=m # CONFIG_USB_GADGET_DEBUG_FILES is not set CONFIG_USB_GADGET_SELECTED=y # CONFIG_USB_GADGET_NET2280 is not set -CONFIG_USB_GADGET_PXA2XX=y -CONFIG_USB_PXA2XX=y +CONFIG_USB_GADGET_PXA2XX=m +CONFIG_USB_PXA2XX=m # CONFIG_USB_PXA2XX_SMALL is not set # CONFIG_USB_GADGET_PXA27X is not set # CONFIG_USB_GADGET_GOKU is not set @@ -1379,7 +1385,7 @@ CONFIG_FUSE_FS=m # # CD-ROM/DVD Filesystems # -# CONFIG_ISO9660_FS is not set +CONFIG_ISO9660_FS=m # CONFIG_UDF_FS is not set # @@ -1399,7 +1405,7 @@ CONFIG_PROC_FS=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_HUGETLB_PAGE is not set -CONFIG_RAMFS=y +# CONFIG_RAMFS is not set # CONFIG_RELAYFS_FS is not set # CONFIG_CONFIGFS_FS is not set @@ -1543,6 +1549,7 @@ CONFIG_DEBUG_KERNEL=y CONFIG_LOG_BUF_SHIFT=14 CONFIG_DETECT_SOFTLOCKUP=y CONFIG_TIMER_STATS=y +# CONFIG_SCHED_DEBUG is not set # CONFIG_SCHEDSTATS is not set # CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_PREEMPT is not set @@ -1572,7 +1579,8 @@ CONFIG_DEBUG_ERRORS=y # Cryptographic options # CONFIG_CRYPTO=y -CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_HMAC=m CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=m diff --git a/packages/linux/linux-rp-2.6.23/sharpsl-pm-postresume-r1.patch b/packages/linux/linux-rp-2.6.23/sharpsl-pm-postresume-r1.patch new file mode 100644 index 0000000000..409daf03e6 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/sharpsl-pm-postresume-r1.patch @@ -0,0 +1,30 @@ + arch/arm/common/sharpsl_pm.c | 3 +++ + include/asm-arm/hardware/sharpsl_pm.h | 1 + + 2 files changed, 4 insertions(+) + +Index: git/include/asm-arm/hardware/sharpsl_pm.h +=================================================================== +--- git.orig/include/asm-arm/hardware/sharpsl_pm.h 2006-10-31 16:09:33.000000000 +0000 ++++ git/include/asm-arm/hardware/sharpsl_pm.h 2006-11-07 22:08:41.000000000 +0000 +@@ -26,6 +26,7 @@ struct sharpsl_charger_machinfo { + void (*presuspend)(void); + void (*postsuspend)(void); + void (*earlyresume)(void); ++ void (*postresume)(void); + unsigned long (*read_devdata)(int); + #define SHARPSL_BATT_VOLT 1 + #define SHARPSL_BATT_TEMP 2 +Index: git/arch/arm/common/sharpsl_pm.c +=================================================================== +--- git.orig/arch/arm/common/sharpsl_pm.c 2006-11-07 22:03:48.000000000 +0000 ++++ git/arch/arm/common/sharpsl_pm.c 2006-11-07 22:04:20.000000000 +0000 +@@ -584,6 +584,9 @@ static int corgi_pxa_pm_enter(suspend_st + if (sharpsl_pm.machinfo->earlyresume) + sharpsl_pm.machinfo->earlyresume(); + ++ if (sharpsl_pm.machinfo->postresume) ++ sharpsl_pm.machinfo->postresume(); ++ + dev_dbg(sharpsl_pm.dev, "SharpSL resuming...\n"); + + return 0; diff --git a/packages/linux/linux-rp-2.6.23/tmio-fb-r6-fix-r0.patch b/packages/linux/linux-rp-2.6.23/tmio-fb-r6-fix-r0.patch new file mode 100644 index 0000000000..eab57c50e8 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tmio-fb-r6-fix-r0.patch @@ -0,0 +1,45 @@ +From 302745ce6f3bab7b1a97de32339405ae3fd8eacb Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 00:05:54 +0400 +Subject: [PATCH] tmio-fb-r6.patch fixes + +--- + drivers/video/tmiofb.c | 8 ++++---- + 1 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c +index 10b0105..72eb76c 100644 +--- a/drivers/video/tmiofb.c ++++ b/drivers/video/tmiofb.c +@@ -463,8 +463,8 @@ static int tmiofb_vblank (struct fb_info *fbi, struct fb_vblank *vblank) + #define FBIO_TMIO_ACC_WRITE 0x7C639300 + #define FBIO_TMIO_ACC_SYNC 0x7C639301 + +-static int tmiofb_ioctl (struct inode *inode, struct file *file, +- unsigned int cmd, unsigned long arg, struct fb_info *fbi) ++static int tmiofb_ioctl (struct fb_info *fbi, ++ unsigned int cmd, unsigned long arg) + { + switch (cmd) { + case FBIOGET_VBLANK: { +@@ -677,7 +677,7 @@ static struct fb_ops tmiofb_ops_acc = { + * 2000 0002 display start + * 2000 0004 line number match (0x1ff mask???) + */ +-static irqreturn_t tmiofb_irq (int irq, void *__fbi, struct pt_regs *r) ++static irqreturn_t tmiofb_irq (int irq, void *__fbi) + { + struct fb_info* fbi = __fbi; + struct tmiofb_par* par = fbi->par; +@@ -762,7 +762,7 @@ static int __init tmiofb_probe (struct device *dev) + } + fbi->screen_base = par->sram; + +- retval = request_irq (irq->start, &tmiofb_irq, SA_INTERRUPT, ++ retval = request_irq (irq->start, &tmiofb_irq, IRQF_DISABLED, + TMIO_NAME_LCD, fbi); + if (retval) + goto err_request_irq; +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.23/tmio-nand-r8.patch b/packages/linux/linux-rp-2.6.23/tmio-nand-r8.patch new file mode 100644 index 0000000000..a71fd114a8 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tmio-nand-r8.patch @@ -0,0 +1,594 @@ + drivers/mtd/nand/Kconfig | 7 + + drivers/mtd/nand/Makefile | 1 + + drivers/mtd/nand/tmio.c | 554 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 562 insertions(+), 0 deletions(-) + +diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig +index f1d60b6..b9c8796 100644 +--- a/drivers/mtd/nand/Kconfig ++++ b/drivers/mtd/nand/Kconfig +@@ -69,6 +69,13 @@ config MTD_NAND_AMS_DELTA + help + Support for NAND flash on Amstrad E3 (Delta). + ++config MTD_NAND_TMIO ++ tristate "NAND Flash device on Toshiba Mobile IO Controller" ++ depends on MTD_NAND && TOSHIBA_TC6393XB ++ help ++ Support for NAND flash connected to a Toshiba Mobile IO ++ Controller in some PDAs, including the Sharp SL6000x. ++ + config MTD_NAND_TOTO + tristate "NAND Flash device on TOTO board" + depends on ARCH_OMAP && BROKEN +diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile +index edba1db..64f24e1 100644 +--- a/drivers/mtd/nand/Makefile ++++ b/drivers/mtd/nand/Makefile +@@ -27,5 +27,6 @@ obj-$(CONFIG_MTD_NAND_AT91) += at91_nand.o + obj-$(CONFIG_MTD_NAND_CM_X270) += cmx270_nand.o + obj-$(CONFIG_MTD_NAND_BASLER_EXCITE) += excite_nandflash.o + obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o ++obj-$(CONFIG_MTD_NAND_TMIO) += tmio.o + + nand-objs := nand_base.o nand_bbt.o +diff --git a/drivers/mtd/nand/tmio.c b/drivers/mtd/nand/tmio.c +new file mode 100644 +index 0000000..d196553 +--- /dev/null ++++ b/drivers/mtd/nand/tmio.c +@@ -0,0 +1,554 @@ ++/* ++ * A device driver for NAND flash connected to a Toshiba Mobile IO ++ * controller. This is known to work with the following variants: ++ * TC6393XB revision 3 ++ * ++ * Maintainer: Chris Humbert <mahadri+mtd@drigon.com> ++ * ++ * Copyright (C) 2005 Chris Humbert ++ * Copyright (C) 2005 Dirk Opfer ++ * Copyright (C) 2004 SHARP ++ * Copyright (C) 2002 Lineo Japan, Inc. ++ * Copyright (C) Ian Molton and Sebastian Carlier ++ * ++ * Based on Sharp's NAND driver, sharp_sl_tc6393.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/module.h> ++#include <linux/types.h> ++#include <linux/delay.h> ++#include <linux/wait.h> ++#include <linux/ioport.h> ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/nand.h> ++#include <linux/mtd/nand_ecc.h> ++#include <linux/mtd/partitions.h> ++#include <asm/io.h> ++#include <asm/hardware/tmio.h> ++ ++#include <linux/interrupt.h> ++ ++#define mtd_printk(level, mtd, format, arg...) \ ++ printk (level "%s: " format, mtd->name, ## arg) ++#define mtd_warn(mtd, format, arg...) \ ++ mtd_printk (KERN_WARNING, mtd, format, ## arg) ++ ++/*--------------------------------------------------------------------------*/ ++ ++/* tmio_nfcr.mode Register Command List */ ++#define FCR_MODE_DATA 0x94 // Data Data_Mode ++#define FCR_MODE_COMMAND 0x95 // Data Command_Mode ++#define FCR_MODE_ADDRESS 0x96 // Data Address_Mode ++ ++#define FCR_MODE_HWECC_CALC 0xB4 // HW-ECC Data ++#define FCR_MODE_HWECC_RESULT 0xD4 // HW-ECC Calculation Result Read_Mode ++#define FCR_MODE_HWECC_RESET 0xF4 // HW-ECC Reset ++ ++#define FCR_MODE_POWER_ON 0x0C // Power Supply ON to SSFDC card ++#define FCR_MODE_POWER_OFF 0x08 // Power Supply OFF to SSFDC card ++ ++#define FCR_MODE_LED_OFF 0x00 // LED OFF ++#define FCR_MODE_LED_ON 0x04 // LED ON ++ ++#define FCR_MODE_EJECT_ON 0x68 // Ejection Demand from Penguin is Advanced ++#define FCR_MODE_EJECT_OFF 0x08 // Ejection Demand from Penguin is Not Advanced ++ ++#define FCR_MODE_LOCK 0x6C // Operates By Lock_Mode. Ejection Switch is Invalid ++#define FCR_MODE_UNLOCK 0x0C // Operates By UnLock_Mode.Ejection Switch is Effective ++ ++#define FCR_MODE_CONTROLLER_ID 0x40 // Controller ID Read ++#define FCR_MODE_STANDBY 0x00 // SSFDC card Changes Standby State ++ ++#define FCR_MODE_WE 0x80 ++#define FCR_MODE_ECC1 0x40 ++#define FCR_MODE_ECC0 0x20 ++#define FCR_MODE_CE 0x10 ++#define FCR_MODE_PCNT1 0x08 ++#define FCR_MODE_PCNT0 0x04 ++#define FCR_MODE_ALE 0x02 ++#define FCR_MODE_CLE 0x01 ++ ++#define FCR_STATUS_BUSY 0x80 ++ ++/* ++ * NAND Flash Host Controller Configuration Register ++ */ ++struct tmio_nfhccr { ++ u8 x00[4]; ++ u16 command; /* 0x04 Command */ ++ u8 x01[0x0a]; ++ u16 base[2]; /* 0x10 NAND Flash Control Reg Base Addr*/ ++ u8 x02[0x29]; ++ u8 intp; /* 0x3d Interrupt Pin */ ++ u8 x03[0x0a]; ++ u8 inte; /* 0x48 Interrupt Enable */ ++ u8 x04; ++ u8 ec; /* 0x4a Event Control */ ++ u8 x05; ++ u8 icc; /* 0x4c Internal Clock Control */ ++ u8 x06[0x0e]; ++ u8 eccc; /* 0x5b ECC Control */ ++ u8 x07[4]; ++ u8 nftc; /* 0x60 NAND Flash Transaction Control */ ++ u8 nfm; /* 0x61 NAND Flash Monitor */ ++ u8 nfpsc; /* 0x62 NAND Flash Power Supply Control */ ++ u8 nfdc; /* 0x63 NAND Flash Detect Control */ ++ u8 x08[0x9c]; ++} __attribute__ ((packed)); ++ ++/* ++ * NAND Flash Control Register ++ */ ++struct tmio_nfcr { ++union { ++ u8 u8; /* 0x00 Data Register */ ++ u16 u16; ++ u32 u32; ++} __attribute__ ((packed)); ++ u8 mode; /* 0x04 Mode Register */ ++ u8 status; /* 0x05 Status Register */ ++ u8 isr; /* 0x06 Interrupt Status Register */ ++ u8 imr; /* 0x07 Interrupt Mask Register */ ++} __attribute__ ((packed)); ++ ++struct tmio_nand { ++ struct mtd_info mtd; ++ struct nand_chip chip; ++ ++ struct tmio_nfhccr __iomem * ccr; ++ struct tmio_nfcr __iomem * fcr; ++ ++ unsigned int irq; ++ ++ /* for tmio_nand_read_byte */ ++ u8 read; ++ unsigned read_good:1; ++}; ++ ++#define mtd_to_tmio(m) container_of(m, struct tmio_nand, mtd) ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void tmio_nand_hwcontrol(struct mtd_info *mtd, int cmd, ++ unsigned int ctrl) ++{ ++ struct tmio_nand *tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem *fcr = tmio->fcr; ++ struct nand_chip *chip = mtd->priv; ++ ++ if (ctrl & NAND_CTRL_CHANGE) { ++ u8 mode; ++ ++ if (ctrl & NAND_NCE) { ++ mode = FCR_MODE_DATA; ++ ++ if (ctrl & NAND_CLE) ++ mode |= FCR_MODE_CLE; ++ else ++ mode &= ~FCR_MODE_CLE; ++ ++ if (ctrl & NAND_ALE) ++ mode |= FCR_MODE_ALE; ++ else ++ mode &= ~FCR_MODE_ALE; ++ } else { ++ mode = FCR_MODE_STANDBY; ++ } ++ ++ iowrite8 (mode, &fcr->mode); ++ tmio->read_good = 0; ++ } ++ ++ if (cmd != NAND_CMD_NONE) ++ writeb(cmd, chip->IO_ADDR_W); ++} ++ ++static int tmio_nand_dev_ready (struct mtd_info* mtd) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ return !(ioread8 (&fcr->status) & FCR_STATUS_BUSY); ++} ++ ++static irqreturn_t tmio_irq (int irq, void *__tmio) ++{ ++ struct tmio_nand* tmio = __tmio; ++ struct nand_chip* this = &tmio->chip; ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ /* disable RDYREQ interrupt */ ++ iowrite8 (0x00, &fcr->imr); ++ ++ if (unlikely (!waitqueue_active (&this->controller->wq))) ++ printk (KERN_WARNING TMIO_NAME_NAND ": spurious interrupt\n"); ++ ++ wake_up (&this->controller->wq); ++ return IRQ_HANDLED; ++} ++ ++/* ++ * The TMIO core has a RDYREQ interrupt on the posedge of #SMRB. ++ * This interrupt is normally disabled, but for long operations like ++ * erase and write, we enable it to wake us up. The irq handler ++ * disables the interrupt. ++ */ ++static int ++tmio_nand_wait (struct mtd_info *mtd, struct nand_chip *this) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ long timeout; ++ ++ /* enable RDYREQ interrupt */ ++ iowrite8 (0x0f, &fcr->isr); ++ iowrite8 (0x81, &fcr->imr); ++ ++ timeout = wait_event_timeout (this->controller->wq, tmio_nand_dev_ready (mtd), ++ msecs_to_jiffies (this->state == FL_ERASING ? 400 : 20)); ++ ++ if (unlikely (!tmio_nand_dev_ready (mtd))) { ++ iowrite8 (0x00, &fcr->imr); ++ mtd_warn (mtd, "still busy with %s after %d ms\n", ++ this->state == FL_ERASING ? "erase" : "program", ++ this->state == FL_ERASING ? 400 : 20); ++ ++ } else if (unlikely (!timeout)) { ++ iowrite8 (0x00, &fcr->imr); ++ mtd_warn (mtd, "timeout waiting for interrupt\n"); ++ } ++ ++ this->cmdfunc (mtd, NAND_CMD_STATUS, -1, -1); ++ return this->read_byte (mtd); ++} ++ ++/* ++ * The TMIO controller combines two 8-bit data bytes into one 16-bit ++ * word. This function separates them so nand_base.c works as expected, ++ * especially its NAND_CMD_READID routines. ++ * ++ * To prevent stale data from being read, tmio_nand_hwcontrol() clears ++ * tmio->read_good. ++ */ ++static u_char tmio_nand_read_byte (struct mtd_info *mtd) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ unsigned int data; ++ ++ if (tmio->read_good--) ++ return tmio->read; ++ ++ data = ioread16 (&fcr->u16); ++ tmio->read = data >> 8; ++ return data; ++} ++ ++/* ++ * The TMIO controller converts an 8-bit NAND interface to a 16-bit ++ * bus interface, so all data reads and writes must be 16-bit wide. ++ * Thus, we implement 16-bit versions of the read, write, and verify ++ * buffer functions. ++ */ ++static void ++tmio_nand_write_buf (struct mtd_info *mtd, const u_char *buf, int len) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ iowrite16_rep (&fcr->u16, buf, len >> 1); ++} ++ ++static void tmio_nand_read_buf (struct mtd_info *mtd, u_char *buf, int len) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ ioread16_rep (&fcr->u16, buf, len >> 1); ++} ++ ++static int ++tmio_nand_verify_buf (struct mtd_info *mtd, const u_char *buf, int len) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ u16* p = (u16*) buf; ++ ++ for (len >>= 1; len; len--) ++ if (*(p++) != ioread16 (&fcr->u16)) ++ return -EFAULT; ++ return 0; ++} ++ ++static void tmio_nand_enable_hwecc (struct mtd_info* mtd, int mode) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ iowrite8 (FCR_MODE_HWECC_RESET, &fcr->mode); ++ ioread8 (&fcr->u8); /* dummy read */ ++ iowrite8 (FCR_MODE_HWECC_CALC, &fcr->mode); ++} ++ ++static int tmio_nand_calculate_ecc (struct mtd_info* mtd, const u_char* dat, ++ u_char* ecc_code) ++{ ++ struct tmio_nand* tmio = mtd_to_tmio (mtd); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ unsigned int ecc; ++ ++ iowrite8 (FCR_MODE_HWECC_RESULT, &fcr->mode); ++ ++ ecc = ioread16 (&fcr->u16); ++ ecc_code[1] = ecc; // 000-255 LP7-0 ++ ecc_code[0] = ecc >> 8; // 000-255 LP15-8 ++ ecc = ioread16 (&fcr->u16); ++ ecc_code[2] = ecc; // 000-255 CP5-0,11b ++ ecc_code[4] = ecc >> 8; // 256-511 LP7-0 ++ ecc = ioread16 (&fcr->u16); ++ ecc_code[3] = ecc; // 256-511 LP15-8 ++ ecc_code[5] = ecc >> 8; // 256-511 CP5-0,11b ++ ++ iowrite8 (FCR_MODE_DATA, &fcr->mode); ++ return 0; ++} ++ ++static void tmio_hw_init (struct device *dev, struct tmio_nand *tmio) ++{ ++ struct resource* nfcr = tmio_resource_control (dev); ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_nfhccr __iomem * ccr = tmio->ccr; ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ unsigned long base; ++ ++ /* (89h) SMD Buffer ON By TC6393XB SystemConfig gpibfc1 */ ++ tdev->ops->clock (dev, 1); ++ tdev->ops->function (dev, 1); ++ ++ /* (4Ch) CLKRUN Enable 1st spcrunc */ ++ iowrite8 (0x81, &ccr->icc); ++ ++ /* (10h)BaseAddress 0x1000 spba.spba2 */ ++ base = nfcr->start - tdev->iomem->start; ++ iowrite16 (base, ccr->base + 0); ++ iowrite16 (base >> 16, ccr->base + 1); ++ ++ /* (04h)Command Register I/O spcmd */ ++ iowrite8 (0x02, &ccr->command); ++ ++ /* (62h) Power Supply Control ssmpwc */ ++ /* HardPowerOFF - SuspendOFF - PowerSupplyWait_4MS */ ++ iowrite8 (0x02, &ccr->nfpsc); ++ ++ /* (63h) Detect Control ssmdtc */ ++ iowrite8 (0x02, &ccr->nfdc); ++ ++ /* Interrupt status register clear sintst */ ++ iowrite8 (0x0f, &fcr->isr); ++ ++ /* After power supply, Media are reset smode */ ++ iowrite8 (FCR_MODE_POWER_ON, &fcr->mode); ++ iowrite8 (FCR_MODE_COMMAND, &fcr->mode); ++ iowrite8 (NAND_CMD_RESET, &fcr->u8); ++ ++ /* Standby Mode smode */ ++ iowrite8 (FCR_MODE_STANDBY, &fcr->mode); ++ ++ mdelay (5); ++} ++ ++static void tmio_hw_stop (struct device *dev, struct tmio_nand *tmio) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_nfcr __iomem * fcr = tmio->fcr; ++ ++ iowrite8 (FCR_MODE_POWER_OFF, &fcr->mode); ++ tdev->ops->function (dev, 0); ++ tdev->ops->clock (dev, 0); ++} ++ ++/*--------------------------------------------------------------------------*/ ++ ++#ifdef CONFIG_MTD_PARTITIONS ++static const char *part_probes[] = { "cmdlinepart", NULL }; ++#endif ++ ++static int tmio_probe (struct device *dev) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ struct tmio_nand_platform_data* tnpd = dev->platform_data; ++ struct resource* ccr = tmio_resource_config (dev); ++ struct resource* fcr = tmio_resource_control (dev); ++ struct resource* irq = tmio_resource_irq (dev); ++ struct tmio_nand* tmio; ++ struct mtd_info* mtd; ++ struct nand_chip* this; ++ struct mtd_partition* parts; ++ int nbparts = 0; ++ int retval; ++ ++ if (!tnpd) ++ return -EINVAL; ++ ++ retval = request_resource (tdev->iomem, ccr); ++ if (retval) ++ goto err_request_ccr; ++ ++ retval = request_resource (tdev->iomem, fcr); ++ if (retval) ++ goto err_request_fcr; ++ ++ tmio = kzalloc (sizeof *tmio, GFP_KERNEL); ++ if (!tmio) { ++ retval = -ENOMEM; ++ goto err_kzalloc; ++ } ++ ++ dev_set_drvdata (dev, tmio); ++ mtd = &tmio->mtd; ++ this = &tmio->chip; ++ mtd->priv = this; ++ mtd->name = TMIO_NAME_NAND; ++ ++ tmio->ccr = ioremap (ccr->start, ccr->end - ccr->start + 1); ++ if (!tmio->ccr) { ++ retval = -EIO; ++ goto err_iomap_ccr; ++ } ++ ++ tmio->fcr = ioremap (fcr->start, fcr->end - fcr->start + 1); ++ if (!tmio->fcr) { ++ retval = -EIO; ++ goto err_iomap_fcr; ++ } ++ ++ tmio_hw_init (dev, tmio); ++ ++ /* Set address of NAND IO lines */ ++ this->IO_ADDR_R = tmio->fcr; ++ this->IO_ADDR_W = tmio->fcr; ++ ++ /* Set address of hardware control function */ ++ this->cmd_ctrl = tmio_nand_hwcontrol; ++ this->dev_ready = tmio_nand_dev_ready; ++ this->read_byte = tmio_nand_read_byte; ++ this->write_buf = tmio_nand_write_buf; ++ this->read_buf = tmio_nand_read_buf; ++ this->verify_buf = tmio_nand_verify_buf; ++ ++ /* set eccmode using hardware ECC */ ++ this->ecc.mode = NAND_ECC_HW; ++ this->ecc.size = 512; ++ this->ecc.bytes = 6; ++ this->ecc.hwctl = tmio_nand_enable_hwecc; ++ this->ecc.calculate = tmio_nand_calculate_ecc; ++ this->ecc.correct = nand_correct_data; ++ this->badblock_pattern = tnpd->badblock_pattern; ++ ++ /* 15 us command delay time */ ++ this->chip_delay = 15; ++ ++ if (irq->start) { ++ retval = request_irq (irq->start, &tmio_irq, ++ IRQF_DISABLED, irq->name, tmio); ++ if (!retval) { ++ tmio->irq = irq->start; ++ this->waitfunc = tmio_nand_wait; ++ } else ++ mtd_warn (mtd, "request_irq error %d\n", retval); ++ } ++ ++ /* Scan to find existence of the device */ ++ if (nand_scan (mtd, 1)) { ++ retval = -ENODEV; ++ goto err_scan; ++ } ++ ++ /* Register the partitions */ ++#ifdef CONFIG_MTD_PARTITIONS ++ nbparts = parse_mtd_partitions (mtd, part_probes, &parts, 0); ++#endif ++ if (nbparts <= 0) { ++ parts = tnpd->partition; ++ nbparts = tnpd->num_partitions; ++ } ++ ++ add_mtd_partitions (mtd, parts, nbparts); ++ return 0; ++ ++err_scan: ++ if (tmio->irq) ++ free_irq (tmio->irq, tmio); ++ tmio_hw_stop (dev, tmio); ++ iounmap (tmio->fcr); ++err_iomap_fcr: ++ iounmap (tmio->ccr); ++err_iomap_ccr: ++ kfree (tmio); ++err_kzalloc: ++ release_resource (fcr); ++err_request_fcr: ++ release_resource (ccr); ++err_request_ccr: ++ return retval; ++} ++ ++static int tmio_remove (struct device *dev) ++{ ++ struct tmio_nand* tmio = dev_get_drvdata (dev); ++ ++ nand_release (&tmio->mtd); ++ if (tmio->irq) ++ free_irq (tmio->irq, tmio); ++ tmio_hw_stop (dev, tmio); ++ iounmap (tmio->fcr); ++ iounmap (tmio->ccr); ++ kfree (tmio); ++ release_resource (tmio_resource_control (dev)); ++ release_resource (tmio_resource_config (dev)); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int tmio_suspend (struct device *dev, pm_message_t state) ++{ ++ tmio_hw_stop (dev, dev_get_drvdata (dev)); ++ return 0; ++} ++ ++static int tmio_resume (struct device *dev) ++{ ++ tmio_hw_init (dev, dev_get_drvdata (dev)); ++ return 0; ++} ++#endif ++ ++static struct device_driver tmio_driver = { ++ .name = TMIO_NAME_NAND, ++ .bus = &tmio_bus_type, ++ .probe = tmio_probe, ++ .remove = tmio_remove, ++#ifdef CONFIG_PM ++ .suspend = tmio_suspend, ++ .resume = tmio_resume, ++#endif ++}; ++ ++static int __init tmio_init (void) { ++ return driver_register (&tmio_driver); ++} ++ ++static void __exit tmio_exit (void) { ++ driver_unregister (&tmio_driver); ++} ++ ++module_init (tmio_init); ++module_exit (tmio_exit); ++ ++MODULE_LICENSE ("GPL"); ++MODULE_AUTHOR ("Dirk Opfer, Chris Humbert"); ++MODULE_DESCRIPTION ("NAND flash driver on Toshiba Mobile IO controller"); diff --git a/packages/linux/linux-rp-2.6.23/tmio-tc6393-r8.patch b/packages/linux/linux-rp-2.6.23/tmio-tc6393-r8.patch new file mode 100644 index 0000000000..1bfdc23630 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tmio-tc6393-r8.patch @@ -0,0 +1,800 @@ + arch/arm/common/Kconfig | 3 + arch/arm/common/Makefile | 1 + arch/arm/common/tc6393xb.c | 668 ++++++++++++++++++++++++++++++++++++++++ + arch/arm/mach-pxa/Kconfig | 1 + include/asm-arm/arch-pxa/irqs.h | 10 + include/asm-arm/hardware/tmio.h | 44 ++ + 6 files changed, 727 insertions(+) + +Index: git/arch/arm/common/tc6393xb.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/arch/arm/common/tc6393xb.c 2006-11-07 22:14:49.000000000 +0000 +@@ -0,0 +1,668 @@ ++/* ++ * Toshiba TC6393XB SoC support ++ * ++ * Maintainer: Chris Humbert <mahadri-kernel@drigon.com> ++ * ++ * Copyright (c) 2005-2006 Chris Humbert ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * Based on code written by Sharp/Lineo for 2.4 kernels ++ * Based on locomo.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/delay.h> ++#include <linux/errno.h> ++#include <linux/ioport.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++#include <linux/slab.h> ++#include <linux/spinlock.h> ++#include <linux/fb.h> ++ ++#include <asm/hardware.h> ++#include <asm/mach-types.h> ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <asm/mach/irq.h> ++#include <asm/arch/irqs.h> ++#include <asm/hardware/tmio.h> ++ ++#ifndef TMIO_SOC_TC6393XB ++#error "TC6393XB SoC not configured" ++#endif ++ ++/*--------------------------------------------------------------------------*/ ++ ++/* cell ids must be 0-based because they are used as array indexes. */ ++#define TC6393_CELL_NAND 0 ++#define TC6393_CELL_SD 1 ++#define TC6393_CELL_OHCI 2 ++#define TC6393_CELL_SERIAL 3 ++#define TC6393_CELL_LCD 4 ++#define TC6393_NUM_CELLS 5 ++ ++#define TC6393_RESOURCE(_name, _start, _end, _flags) \ ++ { \ ++ .name = _name, \ ++ .start = _start, \ ++ .end = _end, \ ++ .flags = _flags, \ ++ } ++ ++#define TC6393_MEM(name, start, size) \ ++ TC6393_RESOURCE(name, start, (start) + (size) - 1, IORESOURCE_MEM) ++ ++#define TC6393_IRQ(name, irq) \ ++ TC6393_RESOURCE(name, irq, irq, IORESOURCE_IRQ) ++ ++const static struct resource tc6393_NAND_resource[] = { ++ TC6393_MEM (TMIO_NAME_NAND, 0x000100, 0x100), ++ TC6393_MEM (TMIO_NAME_NAND, 0x001000, 0x008), ++ TC6393_MEM (TMIO_NAME_NAND, 0, 0), ++ TC6393_IRQ (TMIO_NAME_NAND, IRQ_TC6393_NAND), ++}; ++ ++const static struct resource tc6393_SD_resource[] = { ++ TC6393_MEM (TMIO_NAME_SD, 0x000200, 0x100), ++ TC6393_MEM (TMIO_NAME_SD, 0x002000, 0x200), ++ TC6393_MEM (TMIO_NAME_SD, 0, 0), ++ TC6393_IRQ (TMIO_NAME_SD, IRQ_TC6393_SD), ++}; ++ ++const static struct resource tc6393_OHCI_resource[] = { ++ TC6393_MEM (TMIO_NAME_OHCI, 0x000300, 0x100), ++ TC6393_MEM (TMIO_NAME_OHCI, 0x003000, 0x100), ++ TC6393_MEM (TMIO_NAME_OHCI, 0x010000, 32 * 1024), ++ TC6393_IRQ (TMIO_NAME_OHCI, IRQ_TC6393_OHCI), ++}; ++ ++const static struct resource tc6393_SERIAL_resource[] = { ++ TC6393_MEM (TMIO_NAME_SERIAL, 0x000400, 0x100), ++ TC6393_MEM (TMIO_NAME_SERIAL, 0x004000, 0x100), ++ TC6393_MEM (TMIO_NAME_SERIAL, 0, 0), ++ TC6393_IRQ (TMIO_NAME_SERIAL, IRQ_TC6393_SERIAL), ++}; ++ ++const static struct resource tc6393_LCD_resource[] = { ++ TC6393_MEM (TMIO_NAME_LCD, 0x000500, 0x100), ++ TC6393_MEM (TMIO_NAME_LCD, 0x005000, 0x200), ++ TC6393_MEM (TMIO_NAME_LCD, 0x100000, 1024 * 1024), ++ TC6393_IRQ (TMIO_NAME_LCD, IRQ_TC6393_LCD), ++}; ++ ++#define TC6393_CELL(_NAME) \ ++ [TC6393_CELL_##_NAME] = { \ ++ .name = TMIO_NAME_##_NAME, \ ++ .id = TC6393_CELL_##_NAME, \ ++ .resource = tc6393_##_NAME##_resource, \ ++ .num_resources = ARRAY_SIZE (tc6393_##_NAME##_resource), \ ++ } ++ ++struct tc6393_cell { ++ const char* name; ++ unsigned int id; ++ const struct resource* resource; ++ unsigned int num_resources; ++}; ++ ++const static struct tc6393_cell tc6393_cell [TC6393_NUM_CELLS] = { ++ TC6393_CELL (NAND ), ++ TC6393_CELL (SD ), ++ TC6393_CELL (OHCI ), ++ TC6393_CELL (SERIAL ), ++ TC6393_CELL (LCD ), ++}; ++ ++/*--------------------------------------------------------------------------*/ ++ ++/* ++ * TC6393 System Configuration Register ++ */ ++struct tc6393_scr { ++ u8 x00[8]; ++ u8 revid; /* 0x08 Revision ID */ ++ u8 x01[0x47]; ++ u8 isr; /* 0x50 Interrupt Status */ ++ u8 x02; ++ u8 imr; /* 0x52 Interrupt Mask */ ++ u8 x03; ++ u8 irr; /* 0x54 Interrupt Routing */ ++ u8 x04[0x0b]; ++ u16 gper; /* 0x60 GP Enable */ ++ u8 x05[2]; ++ u16 gpi_sr[2]; /* 0x64 GPI Status */ ++ u16 gpi_imr[2]; /* 0x68 GPI INT Mask */ ++ u16 gpi_eder[2]; /* 0x6c GPI Edge Detect Enable */ ++ u16 gpi_lir[4]; /* 0x70 GPI Level Invert */ ++ u16 gpo_dsr[2]; /* 0x78 GPO Data Set */ ++ u16 gpo_doecr[2]; /* 0x7c GPO Data OE Control */ ++ u16 gp_iarcr[2]; /* 0x80 GP Internal Active Reg Control */ ++ u16 gp_iarlcr[2]; /* 0x84 GP Internal Active Reg Level Con*/ ++ u8 gpi_bcr[4]; /* 0x88 GPI Buffer Control */ ++ u16 gpa_iarcr; /* 0x8c GPa Internal Active Reg Control */ ++ u8 x06[2]; ++ u16 gpa_iarlcr; /* 0x90 GPa Internal Active Reg Level Co*/ ++ u8 x07[2]; ++ u16 gpa_bcr; /* 0x94 GPa Buffer Control */ ++ u8 x08[2]; ++ u16 ccr; /* 0x98 Clock Control */ ++ u16 pll2cr; /* 0x9a PLL2 Control */ ++ u16 pll1cr[2]; /* 0x9c PLL1 Control */ ++ u8 diarcr; /* 0xa0 Device Internal Active Reg Contr*/ ++ u8 dbocr; /* 0xa1 Device Buffer Off Control */ ++ u8 x09[0x3e]; ++ u8 fer; /* 0xe0 Function Enable */ ++ u8 x10[3]; ++ u16 mcr; /* 0xe4 Mode Control */ ++ u8 x11[0x14]; ++ u8 config; /* 0xfc Configuration Control */ ++ u8 x12[2]; ++ u8 debug; /* 0xff Debug */ ++} __attribute__ ((packed)); ++ ++union tc6393_scr_fer { ++ u8 raw; ++struct { ++ unsigned usben:1; /* D0 USB enable */ ++ unsigned lcdcven:1; /* D1 polysylicon TFT enable */ ++ unsigned slcden:1; /* D2 SLCD enable */ ++} __attribute__ ((packed)); ++} __attribute__ ((packed)); ++ ++union tc6393_scr_ccr { ++ u16 raw; ++struct { ++ unsigned ck32ken:1; /* D0 SD host clock enable */ ++ unsigned usbcken:1; /* D1 USB host clock enable */ ++ unsigned x00:2; ++ unsigned sharp:1; /* D4 ??? set in Sharp's code */ ++ unsigned x01:3; ++ enum { disable = 0, ++ m12MHz = 1, ++ m24MHz = 2, ++ m48MHz = 3, ++ } mclksel:3; /* D10-D8 LCD controller clock */ ++ unsigned x02:1; ++ enum { h24MHz = 0, ++ h48MHz = 1, ++ } hclksel:2; /* D13-D12 host bus clock */ ++ unsigned x03:2; ++} __attribute__ ((packed)); ++} __attribute__ ((packed)); ++ ++/*--------------------------------------------------------------------------*/ ++ ++struct tc6393 { ++ spinlock_t lock; /* read-modify-write lock */ ++ struct device* dev; /* TC6393 device */ ++ struct tc6393_scr __iomem *scr; /* system configuration reg */ ++ ++ struct resource rscr; /* system config reg resource */ ++ struct resource* iomem; /* entire TC6393 iomem resource */ ++ unsigned int irq; /* hardware cascade irq */ ++ ++ struct tmio_device tdev [TC6393_NUM_CELLS]; ++}; ++ ++/*--------------------------------------------------------------------------*/ ++ ++static u32 tc6393_ioread32 (const void __iomem *addr) ++{ ++ return ((u32) ioread16 (addr)) | (((u32) ioread16 (addr + 2)) << 16); ++} ++ ++static u32 tc6393_iowrite32 (u32 val, const void __iomem *addr) ++{ ++ iowrite16 (val, addr); ++ iowrite16 (val >> 16, addr + 2); ++ return val; ++} ++ ++u32 get_tc6393_gpio (struct device *dev) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ ++ return tc6393_ioread32 (scr->gpo_dsr); ++} ++EXPORT_SYMBOL (get_tc6393_gpio); ++ ++u32 set_tc6393_gpio (struct device *dev, u32 bits) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ u32 dsr; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ dsr = tc6393_ioread32 (scr->gpo_dsr) | bits; ++ tc6393_iowrite32 (dsr, scr->gpo_dsr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++ ++ return dsr; ++} ++EXPORT_SYMBOL (set_tc6393_gpio); ++ ++u32 reset_tc6393_gpio (struct device *dev, u32 bits) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ u32 dsr; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ dsr = tc6393_ioread32 (scr->gpo_dsr) & ~bits; ++ tc6393_iowrite32 (dsr, scr->gpo_dsr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++ ++ return dsr; ++} ++EXPORT_SYMBOL (reset_tc6393_gpio); ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void ++tc6393_irq (unsigned int irq, struct irq_desc *desc) ++{ ++ struct tc6393* tc6393 = get_irq_chip_data (irq); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned int isr; ++ unsigned int bit; ++ unsigned int i; ++ ++ desc->chip->ack (irq); ++ ++ while ((isr = ioread8(&scr->isr) & ~ioread8(&scr->imr))) ++ for (bit = 1, i = IRQ_TC6393_START; i <= IRQ_TC6393_LCD; ++ bit <<= 1, i++) ++ if (isr & bit) ++ desc_handle_irq (i, irq_desc + i); ++} ++ ++static void tc6393_irq_ack (unsigned int irq) ++{ ++} ++ ++static void tc6393_irq_mask (unsigned int irq) ++{ ++ struct tc6393* tc6393 = get_irq_chip_data (irq); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ iowrite8 (ioread8 (&scr->imr) | (1 << (irq - IRQ_TC6393_START)), ++ &scr->imr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static void tc6393_irq_unmask (unsigned int irq) ++{ ++ struct tc6393* tc6393 = get_irq_chip_data (irq); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ unsigned long flags; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ iowrite8 (ioread8 (&scr->imr) & ~(1 << (irq - IRQ_TC6393_START)), ++ &scr->imr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static struct irq_chip tc6393_chip = { ++ .ack = tc6393_irq_ack, ++ .mask = tc6393_irq_mask, ++ .unmask = tc6393_irq_unmask, ++}; ++ ++static void tc6393_attach_irq (struct tc6393 *tc6393) ++{ ++ unsigned int irq; ++ ++ for (irq = IRQ_TC6393_START; irq <= IRQ_TC6393_LCD; irq++) { ++ set_irq_chip (irq, &tc6393_chip); ++ set_irq_chip_data(irq, tc6393); ++ set_irq_handler (irq, handle_edge_irq); ++ set_irq_flags (irq, IRQF_VALID | IRQF_PROBE); ++ } ++ ++ set_irq_type (tc6393->irq, IRQT_FALLING); ++ set_irq_chip_data (tc6393->irq, tc6393); ++ set_irq_chained_handler (tc6393->irq, tc6393_irq); ++} ++ ++static void tc6393_detach_irq (struct tc6393 *tc6393) ++{ ++ unsigned int irq; ++ ++ set_irq_chained_handler (tc6393->irq, NULL); ++ set_irq_chip_data (tc6393->irq, NULL); ++ ++ for (irq = IRQ_TC6393_START; irq <= IRQ_TC6393_LCD; irq++) { ++ set_irq_flags (irq, 0); ++ set_irq_chip (irq, NULL); ++ set_irq_chip_data(irq, NULL); ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++ ++static int tc6393_bus_match (struct device *dev, struct device_driver *drv) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ const struct tc6393_cell* cell = tdev->soc_data; ++ ++ return !strcmp (cell->name, drv->name); ++} ++ ++static int tc6393_bus_suspend (struct device *dev, pm_message_t state) ++{ ++ struct device_driver* drv = dev->driver; ++ return drv && drv->suspend ? drv->suspend (dev, state) : 0; ++} ++ ++static int tc6393_bus_resume (struct device *dev) ++{ ++ struct device_driver* drv = dev->driver; ++ return drv && drv->resume ? drv->resume (dev) : 0; ++} ++ ++struct bus_type tc6393_bus_type = { ++ .name = TMIO_NAME_BUS, ++ .match = tc6393_bus_match, ++ .suspend = tc6393_bus_suspend, ++ .resume = tc6393_bus_resume, ++}; ++EXPORT_SYMBOL (tc6393_bus_type); ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void tc6393_cell_clock (struct device *dev, int enable) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ const struct tc6393_cell* cell = tdev->soc_data; ++ struct tc6393* tc6393 = dev_get_drvdata (dev->parent); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ union tc6393_scr_ccr ccr; ++ unsigned long flags; ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ ccr.raw = ioread16 (&scr->ccr); ++ ++ switch (cell->id) { ++ case TC6393_CELL_SD: ccr.ck32ken = enable; break; ++ case TC6393_CELL_OHCI: ccr.usbcken = enable; break; ++ case TC6393_CELL_LCD: ++ ccr.mclksel = enable ? m48MHz : disable; ++ break; ++ } ++ ++ printk (KERN_DEBUG TMIO_NAME_CORE ": scr->ccr = %04x\n", ccr.raw); ++ ++ iowrite16(ccr.raw, &scr->ccr); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static void tc6393_cell_function (struct device *dev, int enable) ++{ ++ struct tmio_device* tdev = dev_to_tdev (dev); ++ const struct tc6393_cell* cell = tdev->soc_data; ++ struct tc6393* tc6393 = dev_get_drvdata (dev->parent); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ union tc6393_scr_fer fer; ++ unsigned long flags; ++ ++ if (cell->id == TC6393_CELL_NAND) { ++ if (enable) { ++ /* SMD buffer on */ ++ printk (KERN_DEBUG TMIO_NAME_CORE ": SMD buffer on\n"); ++ iowrite8 (0xff, scr->gpi_bcr + 1); ++ } ++ return; ++ } ++ ++ spin_lock_irqsave (&tc6393->lock, flags); ++ fer.raw = ioread16 (&scr->fer); ++ ++ switch (cell->id) { ++ case TC6393_CELL_OHCI: fer.usben = enable; break; ++ case TC6393_CELL_LCD: fer.slcden = enable; break; ++ } ++ ++ printk (KERN_DEBUG TMIO_NAME_CORE ": scr->fer = %02x\n", fer.raw); ++ ++ iowrite8 (fer.raw, &scr->fer); ++ spin_unlock_irqrestore (&tc6393->lock, flags); ++} ++ ++static void ++tc6393_lcd_mode (struct device *dev, const struct fb_videomode *mode) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev->parent); ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ ++ iowrite16 (mode->pixclock, scr->pll1cr + 0); ++ iowrite16 (mode->pixclock >> 16, scr->pll1cr + 1); ++} ++ ++static struct tmio_cell_ops tc6393_cell_ops = { ++ .clock = tc6393_cell_clock, ++ .function = tc6393_cell_function, ++ .lcd_mode = tc6393_lcd_mode, ++}; ++ ++static void tc6393_device_release (struct device *dev) ++{ ++} ++ ++static int ++tc6393_device_register (struct tc6393 *tc6393, struct tmio_cell *tcell) ++{ ++ const struct tc6393_cell* cell; ++ struct tmio_device* tdev; ++ struct device* dev; ++ int i; ++ ++ for (i = 0; strcmp (tcell->name, tc6393_cell [i].name); ) ++ if (++i >= ARRAY_SIZE(tc6393_cell)) ++ return -EINVAL; ++ ++ cell = tc6393_cell + i; ++ tdev = tc6393->tdev + i; ++ dev = &tdev->dev; ++ ++ tdev->ops = &tc6393_cell_ops; ++ tdev->iomem = tc6393->iomem; ++ tdev->soc_data = (void*) cell; ++ ++ dev->parent = tc6393->dev; ++ strncpy (dev->bus_id, cell->name, sizeof dev->bus_id); ++ dev->bus = &tc6393_bus_type; ++ dev->dma_mask = tc6393->dev->dma_mask; ++ dev->coherent_dma_mask = tc6393->dev->coherent_dma_mask; ++ dev->release = tc6393_device_release; ++ dev->platform_data = tcell->platform_data; ++ ++ for (i=0; i < cell->num_resources; i++) { ++ const struct resource* cr = cell->resource + i; ++ struct resource* dr = tdev->resource + i; ++ ++ dr->name = cr->name; ++ dr->start = cr->start; ++ dr->end = cr->end; ++ dr->flags = cr->flags; ++ ++ /* convert memory offsets to absolutes */ ++ if (cr->flags & IORESOURCE_MEM) { ++ dr->start += tc6393->iomem->start; ++ dr->end += tc6393->iomem->start; ++ } ++ } ++ ++ return device_register (dev); ++} ++ ++/*--------------------------------------------------------------------------*/ ++ ++static void tc6393_hw_init (struct tc6393 *tc6393) ++{ ++ struct tc6393_scr __iomem * scr = tc6393->scr; ++ struct tc6393_platform_data* tcpd = tc6393->dev->platform_data; ++ ++ tcpd->enable (tc6393->dev); ++ ++ iowrite8 (0, &scr->fer); ++ iowrite16(tcpd->scr_pll2cr, &scr->pll2cr); ++ iowrite16(tcpd->scr_ccr, &scr->ccr); ++ iowrite16(tcpd->scr_mcr, &scr->mcr); ++ iowrite16(tcpd->scr_gper, &scr->gper); ++ iowrite8 (0, &scr->irr); ++ iowrite8 (0xbf, &scr->imr); ++ iowrite16(tcpd->scr_gpo_dsr, scr->gpo_dsr + 0); ++ iowrite16(tcpd->scr_gpo_dsr >> 16, scr->gpo_dsr + 1); ++ iowrite16(tcpd->scr_gpo_doecr, scr->gpo_doecr + 0); ++ iowrite16(tcpd->scr_gpo_doecr >> 16, scr->gpo_doecr + 1); ++} ++ ++static int tc6393_probe (struct device *dev) ++{ ++ struct platform_device* pdev = to_platform_device (dev); ++ struct tc6393_platform_data* tcpd = dev->platform_data; ++ struct tc6393* tc6393; ++ struct resource* iomem; ++ struct resource* rscr; ++ int retval; ++ int i; ++ ++ iomem = platform_get_resource (pdev, IORESOURCE_MEM, 0); ++ if (!iomem) ++ return -EINVAL; ++ ++ tc6393 = kzalloc (sizeof *tc6393, GFP_KERNEL); ++ if (!tc6393) { ++ retval = -ENOMEM; ++ goto err_kzalloc; ++ } ++ ++ dev_set_drvdata (dev, tc6393); ++ spin_lock_init (&tc6393->lock); ++ tc6393->dev = dev; ++ tc6393->iomem = iomem; ++ tc6393->irq = platform_get_irq (pdev, 0); ++ ++ rscr = &tc6393->rscr; ++ rscr->name = TMIO_NAME_CORE; ++ rscr->start = iomem->start; ++ rscr->end = iomem->start + 0xff; ++ rscr->flags = IORESOURCE_MEM; ++ ++ retval = request_resource (iomem, rscr); ++ if (retval) ++ goto err_request_scr; ++ ++ tc6393->scr = ioremap (rscr->start, rscr->end - rscr->start + 1); ++ if (!tc6393->scr) { ++ retval = -ENOMEM; ++ goto err_ioremap; ++ } ++ ++ tc6393_hw_init (tc6393); ++ ++ printk (KERN_INFO "Toshiba %s revision %d at 0x%08lx, irq %d\n", ++ TMIO_SOC_NAME, ioread8 (&tc6393->scr->revid), ++ iomem->start, tc6393->irq); ++ ++ if (tc6393->irq) ++ tc6393_attach_irq (tc6393); ++ ++ for (i = 0; i < tcpd->num_cells; i++) ++ tc6393_device_register (tc6393, tcpd->cell + i); ++ ++ return 0; ++ ++err_ioremap: ++ release_resource (rscr); ++err_request_scr: ++ kfree(tc6393); ++err_kzalloc: ++ release_resource (iomem); ++ return retval; ++} ++ ++static int tc6393_dev_remove (struct device *dev, void *data) ++{ ++ device_unregister (dev); ++ return 0; ++} ++ ++static int tc6393_remove (struct device *dev) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ ++ device_for_each_child (dev, tc6393, tc6393_dev_remove); ++ ++ if (tc6393->irq) ++ tc6393_detach_irq (tc6393); ++ ++ iounmap (tc6393->scr); ++ release_resource (&tc6393->rscr); ++ release_resource (tc6393->iomem); ++ kfree (tc6393); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int tc6393_suspend (struct device *dev, pm_message_t state) ++{ ++ struct tc6393_platform_data* tcpd = dev->platform_data; ++ tcpd->disable (dev); ++ return 0; ++} ++ ++static int tc6393_resume (struct device *dev) ++{ ++ struct tc6393* tc6393 = dev_get_drvdata (dev); ++ tc6393_hw_init (tc6393); ++ return 0; ++} ++#endif ++ ++static struct device_driver tc6393_device_driver = { ++ .name = TMIO_SOC_NAME, ++ .bus = &platform_bus_type, ++ .probe = tc6393_probe, ++ .remove = tc6393_remove, ++#ifdef CONFIG_PM ++ .suspend = tc6393_suspend, ++ .resume = tc6393_resume, ++#endif ++}; ++ ++/*--------------------------------------------------------------------------*/ ++ ++static int __init tc6393_init (void) ++{ ++ int retval = bus_register (&tc6393_bus_type); ++ if (retval) ++ return retval; ++ ++ return driver_register (&tc6393_device_driver); ++} ++ ++static void __exit tc6393_exit (void) ++{ ++ driver_unregister (&tc6393_device_driver); ++ bus_unregister (&tc6393_bus_type); ++} ++ ++module_init (tc6393_init); ++module_exit (tc6393_exit); ++ ++MODULE_DESCRIPTION ("TC6393 SoC bus driver"); ++MODULE_AUTHOR ("Chris Humbert, Dirk Opfer"); ++MODULE_LICENSE ("GPL"); +Index: git/arch/arm/common/Kconfig +=================================================================== +--- git.orig/arch/arm/common/Kconfig 2006-10-31 16:08:28.000000000 +0000 ++++ git/arch/arm/common/Kconfig 2006-11-07 22:13:09.000000000 +0000 +@@ -31,3 +31,6 @@ config SHARPSL_PM + + config SHARP_SCOOP + bool ++ ++config TOSHIBA_TC6393XB ++ bool +Index: git/arch/arm/mach-pxa/Kconfig +=================================================================== +--- git.orig/arch/arm/mach-pxa/Kconfig 2006-11-07 22:13:06.000000000 +0000 ++++ git/arch/arm/mach-pxa/ 2006-11-07 23:30:34.000000000 +0000 +@@ -128,6 +128,7 @@ config MACH_BORZOI + config MACH_TOSA + bool "Enable Sharp SL-6000x (Tosa) Support" + depends on PXA_SHARPSL_25x ++ select TOSHIBA_TC6393XB + + config PXA25x + bool +Index: git/arch/arm/common/Makefile +=================================================================== +--- git.orig/arch/arm/common/Makefile 2006-10-31 16:08:28.000000000 +0000 ++++ git/arch/arm/common/Makefile 2006-11-07 22:13:09.000000000 +0000 +@@ -17,3 +17,4 @@ obj-$(CONFIG_SHARPSL_PM) += sharpsl_pm.o + obj-$(CONFIG_SHARP_SCOOP) += scoop.o + obj-$(CONFIG_ARCH_IXP2000) += uengine.o + obj-$(CONFIG_ARCH_IXP23XX) += uengine.o ++obj-$(CONFIG_TOSHIBA_TC6393XB) += tc6393xb.o +Index: git/include/asm-arm/hardware/tmio.h +=================================================================== +--- git.orig/include/asm-arm/hardware/tmio.h 2006-11-07 22:13:09.000000000 +0000 ++++ git/include/asm-arm/hardware/tmio.h 2006-11-07 22:13:09.000000000 +0000 +@@ -91,6 +91,50 @@ struct tmio_device { + + /*--------------------------------------------------------------------------*/ + ++/* ++ * TC6393XB SoC ++ */ ++#ifdef CONFIG_TOSHIBA_TC6393XB ++#define TMIO_SOC_TC6393XB ++#define TMIO_SOC_NAME "TC6393XB" ++#define TMIO_NAME_BUS "tc6393-bus" ++#define TMIO_NAME_CORE "tc6393-core" ++#define TMIO_NAME_NAND "tc6393-nand" ++#define TMIO_NAME_SD "tc6393-sd" ++#define TMIO_NAME_OHCI "tc6393-ohci" ++#define TMIO_NAME_SERIAL "tc6393-serial" ++#define TMIO_NAME_LCD "tc6393-lcd" ++#define tmio_bus_type tc6393_bus_type ++ ++#define TC6393_GPIO(x) (1 << (x)) ++ ++extern struct bus_type tc6393_bus_type; ++ ++struct tc6393_platform_data { ++ u16 scr_pll2cr; /* PLL2 Control */ ++ u16 scr_ccr; /* Clock Control */ ++ u16 scr_mcr; /* Mode Control */ ++ u16 scr_gper; /* GP Enable */ ++ u32 scr_gpo_doecr; /* GPO Data OE Control */ ++ u32 scr_gpo_dsr; /* GPO Data Set */ ++ ++ /* cells to register as devices */ ++ struct tmio_cell* cell; ++ unsigned int num_cells; ++ ++ /* callbacks to enable and disable the TC6393XB's power and clock */ ++ void (*enable) (struct device *dev); ++ void (*disable) (struct device *dev); ++}; ++ ++u32 get_tc6393_gpio (struct device *dev); ++u32 set_tc6393_gpio (struct device *dev, u32 bits); ++u32 reset_tc6393_gpio (struct device *dev, u32 bits); ++ ++/*--------------------------------------------------------------------------*/ ++ ++#else + #error "no TMIO SoC configured" ++#endif + + #endif +Index: git/include/asm-arm/arch-pxa/irqs.h +=================================================================== +--- git.orig/include/asm-arm/arch-pxa/irqs.h 2006-10-31 16:09:33.000000000 +0000 ++++ git/include/asm-arm/arch-pxa/irqs.h 2006-11-07 22:13:09.000000000 +0000 +@@ -163,17 +163,27 @@ + #define IRQ_LOCOMO_SPI_OVRN (IRQ_BOARD_END + 20) + #define IRQ_LOCOMO_SPI_TEND (IRQ_BOARD_END + 21) + ++#define IRQ_TC6393_START (IRQ_BOARD_END) ++#define IRQ_TC6393_NAND (IRQ_BOARD_END + 0) ++#define IRQ_TC6393_SD (IRQ_BOARD_END + 1) ++#define IRQ_TC6393_OHCI (IRQ_BOARD_END + 2) ++#define IRQ_TC6393_SERIAL (IRQ_BOARD_END + 3) ++#define IRQ_TC6393_LCD (IRQ_BOARD_END + 4) ++ + /* + * Figure out the MAX IRQ number. + * + * If we have an SA1111, the max IRQ is S1_BVD1_STSCHG+1. + * If we have an LoCoMo, the max IRQ is IRQ_LOCOMO_SPI_TEND+1 ++ * If we have an TC6393XB, the max IRQ is IRQ_TC6393_LCD+1 + * Otherwise, we have the standard IRQs only. + */ + #ifdef CONFIG_SA1111 + #define NR_IRQS (IRQ_S1_BVD1_STSCHG + 1) + #elif defined(CONFIG_SHARP_LOCOMO) + #define NR_IRQS (IRQ_LOCOMO_SPI_TEND + 1) ++#elif defined(CONFIG_TOSHIBA_TC6393XB) ++#define NR_IRQS (IRQ_TC6393_LCD + 1) + #elif defined(CONFIG_ARCH_LUBBOCK) || \ + defined(CONFIG_MACH_LOGICPD_PXA270) || \ + defined(CONFIG_MACH_MAINSTONE) diff --git a/packages/linux/linux-rp-2.6.23/tosa-bluetooth-r8.patch b/packages/linux/linux-rp-2.6.23/tosa-bluetooth-r8.patch new file mode 100644 index 0000000000..7873cffef5 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-bluetooth-r8.patch @@ -0,0 +1,194 @@ +Index: linux-2.6.17/arch/arm/mach-pxa/Makefile +=================================================================== +--- linux-2.6.17.orig/arch/arm/mach-pxa/Makefile 2006-06-20 11:45:51.252467944 +0200 ++++ linux-2.6.17/arch/arm/mach-pxa/Makefile 2006-06-20 11:46:33.619027248 +0200 +@@ -16,7 +16,7 @@ + obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o + obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o + obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o sharpsl_pm.o poodle_pm.o +-obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o tosa_lcd.o ++obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o tosa_lcd.o tosa_bt.o + obj-$(CONFIG_MACH_EM_X270) += em-x270.o + obj-$(CONFIG_MACH_HX2750) += hx2750.o hx2750_test.o + +Index: linux-2.6.17/arch/arm/mach-pxa/tosa_bt.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/arch/arm/mach-pxa/tosa_bt.c 2006-06-20 11:46:08.107905528 +0200 +@@ -0,0 +1,128 @@ ++/* ++ * Bluetooth control code for Sharp SL-6000x (tosa) ++ * ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++#include <asm/hardware.h> ++ ++#include <asm/hardware/scoop.h> ++#include <asm/arch/tosa.h> ++#include <asm/arch/pxa-regs.h> ++ ++ ++static int tosa_bluetooth_power(int on) ++{ ++ ++ if (!on) { //off ++ ++ set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); ++ pxa_gpio_mode(GPIO42_BTRXD|GPIO_IN); ++ pxa_gpio_mode(GPIO43_BTTXD|GPIO_IN); ++ pxa_gpio_mode(GPIO44_BTCTS|GPIO_IN); ++ pxa_gpio_mode(GPIO45_BTRTS|GPIO_IN); ++ mdelay(10); // wait 10ms ++ reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); ++ reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); ++ reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_BT_LED); // turn off BT LED ++ ++ } else { // on ++ ++ reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); ++ set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); ++ pxa_gpio_mode(GPIO42_HWRXD_MD); ++ pxa_gpio_mode(GPIO43_HWTXD_MD); ++ pxa_gpio_mode(GPIO44_HWCTS_MD); ++ pxa_gpio_mode(GPIO45_HWRTS_MD); ++ ++ set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); ++ mdelay(20); // wait 20ms ++ reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_RESET); ++ set_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_BT_LED); // turn BT LED on ++ } ++ return 0; ++} ++ ++/* ++ * Support Routines ++ */ ++int __init tosa_bluetooth_probe(struct platform_device *dev) ++{ ++ int ret = 0; ++ pxa_gpio_mode(GPIO42_BTRXD|GPIO_IN); ++ pxa_gpio_mode(GPIO43_BTTXD|GPIO_IN); ++ pxa_gpio_mode(GPIO44_BTCTS|GPIO_IN); ++ pxa_gpio_mode(GPIO45_BTRTS|GPIO_IN); ++ set_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); ++ mdelay(5); ++ ++ if ( (GPLR(GPIO42_BTRXD) & GPIO_bit(GPIO42_BTRXD))==0 && ++ (GPLR(GPIO44_BTCTS) & GPIO_bit(GPIO44_BTCTS))==0) { ++ printk(KERN_INFO "No Bluetooth Device found!\n"); ++ ret = ENODEV; // no bluetooth ++ } else { ++ printk(KERN_INFO "Tosa Bluetooth Device found on ttyS3!\n"); ++ } ++ reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_BT_PWR_EN); ++ ++ tosa_bluetooth_power(1); // Power on ++ return ret; ++} ++ ++static int tosa_bluetooth_remove(struct platform_device *dev) ++{ ++ tosa_bluetooth_power(0); // Power off ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int tosa_bluetooth_suspend(struct platform_device *dev, pm_message_t state) ++{ ++ tosa_bluetooth_power(0); // Power off ++ return 0; ++} ++ ++static int tosa_bluetooth_resume(struct platform_device *dev) ++{ ++ tosa_bluetooth_power(1); // Power on ++ return 0; ++} ++#else ++#define tosa_bluetooth_suspend NULL ++#define tosa_bluetooth_resume NULL ++#endif ++ ++static struct platform_driver tosa_bluetooth_driver = { ++ .probe = tosa_bluetooth_probe, ++ .remove = tosa_bluetooth_remove, ++ .suspend = tosa_bluetooth_suspend, ++ .resume = tosa_bluetooth_resume, ++ .driver = { ++ .name = "tosa-bluetooth", ++ }, ++}; ++ ++int __init tosa_bluetooth_init(void) ++{ ++ return platform_driver_register(&tosa_bluetooth_driver); ++} ++ ++void __exit tosa_bluetooth_cleanup(void) ++{ ++ platform_driver_unregister(&tosa_bluetooth_driver); ++} ++ ++module_init(tosa_bluetooth_init); ++module_exit(tosa_bluetooth_cleanup); +Index: linux-2.6.17/arch/arm/mach-pxa/tosa.c +=================================================================== +--- linux-2.6.17.orig/arch/arm/mach-pxa/tosa.c 2006-06-20 11:45:51.254467640 +0200 ++++ linux-2.6.17/arch/arm/mach-pxa/tosa.c 2006-06-20 11:46:08.112904768 +0200 +@@ -288,7 +288,7 @@ + + static void tosa_tc6393_enable(struct device *dev) + { +- ++ printk("!!tosa_tc6393_enable!!\n"); + reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); + reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC6393_SUSPEND); + reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_TC6393_REST_IN); //#PCLR +@@ -303,7 +303,7 @@ + + static void tosa_tc6393_disable(struct device *dev) + { +- ++ printk("!!tosa_tc6393_disable!!\n"); + reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); + reset_scoop_gpio(&tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC6393_SUSPEND); + reset_scoop_gpio(&tosascoop_device.dev,TOSA_SCOOP_TC6393_REST_IN); //#PCLR +@@ -428,6 +428,17 @@ + }, + }; + ++/* ++ * Tosa Blueooth ++ */ ++static struct platform_device tosa_bluetooth_device = { ++ .name = "tosa-bluetooth", ++ .id = -1, ++ .dev = { ++ .parent = &tosascoop_jc_device.dev, ++ }, ++}; ++ + static struct platform_device *devices[] __initdata = { + &tosascoop_device, + &tosascoop_jc_device, +@@ -435,6 +446,7 @@ + &tosaled_device, + &tc6393_device, + &tosalcd_device, ++ &tosa_bluetooth_device, + }; + + static void tosa_poweroff(void) diff --git a/packages/linux/linux-rp-2.6.23/tosa-keyboard-r19.patch b/packages/linux/linux-rp-2.6.23/tosa-keyboard-r19.patch new file mode 100644 index 0000000000..948c27fdce --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-keyboard-r19.patch @@ -0,0 +1,514 @@ + drivers/input/keyboard/Kconfig | 12 - + drivers/input/keyboard/Makefile | 1 + drivers/input/keyboard/tosakbd.c | 467 +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 479 insertions(+), 1 deletion(-) + +Index: git/drivers/input/keyboard/Kconfig +=================================================================== +--- git.orig/drivers/input/keyboard/Kconfig 2006-10-31 16:08:57.000000000 +0000 ++++ git/drivers/input/keyboard/Kconfig 2006-11-07 22:13:10.000000000 +0000 +@@ -148,12 +148,22 @@ config KEYBOARD_SPITZ + depends on PXA_SHARPSL + default y + help +- Say Y here to enable the keyboard on the Sharp Zaurus SL-C1000, ++ Say Y here to enable the keyboard on the Sharp Zaurus SL-C1000, + SL-C3000 and Sl-C3100 series of PDAs. + + To compile this driver as a module, choose M here: the + module will be called spitzkbd. + ++config KEYBOARD_TOSA ++ tristate "Tosa keyboard" ++ depends on PXA_SHARPSL ++ default y ++ help ++ Say Y here to enable the keyboard on the Sharp Zaurus SL-6000x (Tosa) ++ ++ To compile this driver as a module, choose M here: the ++ module will be called tosakbd. ++ + config KEYBOARD_AMIGA + tristate "Amiga keyboard" + depends on AMIGA +Index: git/drivers/input/keyboard/Makefile +=================================================================== +--- git.orig/drivers/input/keyboard/Makefile 2006-10-31 16:08:57.000000000 +0000 ++++ git/drivers/input/keyboard/Makefile 2006-11-07 22:13:10.000000000 +0000 +@@ -17,3 +17,4 @@ obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkb + obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o + obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o + obj-$(CONFIG_KEYBOARD_ASIC3) += asic3_keys.o ++obj-$(CONFIG_KEYBOARD_TOSA) += tosakbd.o +Index: git/drivers/input/keyboard/tosakbd.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/input/keyboard/tosakbd.c 2006-11-07 23:27:19.000000000 +0000 +@@ -0,0 +1,467 @@ ++/* ++ * Keyboard driver for Sharp Tosa models (SL-6000x) ++ * ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * Based on xtkbd.c/locomkbd.c/corgikbd.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++#include <linux/init.h> ++#include <linux/input.h> ++#include <linux/interrupt.h> ++#include <linux/jiffies.h> ++#include <linux/module.h> ++#include <linux/slab.h> ++ ++#include <asm/arch/tosa.h> ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++ ++ ++#define TOSA_KEY_STROBE_NUM (11) ++#define TOSA_KEY_SENSE_NUM (7) ++ ++#define KEYMASK_ON (0x1<<0) ++#define KEYMASK_REC (0x1<<1) ++#define KEYMASK_SYNC (0x1<<2) ++ ++#define KB_ROWS 7 ++#define KB_COLS 11 ++#define KB_ROWMASK(r) (1 << (r)) ++#define SCANCODE(r,c) ( ((r)<<4) + (c) + 1 ) ++#define NR_SCANCODES (SCANCODE(KB_ROWS-1,KB_COLS)+1+1) ++ ++#define SCAN_INTERVAL (HZ/10) ++#define HP_SCAN_INTERVAL (150) /* ms */ ++#define HP_STABLE_COUNT 2 ++ ++#define TOSA_KEY_CALENDER KEY_F1 ++#define TOSA_KEY_ADDRESS KEY_F2 ++#define TOSA_KEY_FN KEY_F3 ++#define TOSA_KEY_CANCEL KEY_F4 ++#define TOSA_KEY_OFF KEY_SUSPEND ++#define TOSA_KEY_CENTER KEY_F5 ++#define TOSA_KEY_REC KEY_F6 ++#define TOSA_KEY_LIGHT KEY_F7 ++#define TOSA_KEY_RECORD KEY_F8 ++#define TOSA_KEY_HOME KEY_F9 ++#define TOSA_KEY_MAIL KEY_F10 ++#define TOSA_KEY_OK KEY_F11 ++#define TOSA_KEY_MENU KEY_F12 ++#define TOSA_KEY_SYNC KEY_F13 ++ ++#define GET_ROWS_STATUS(c) ((GPLR2 & TOSA_GPIO_ALL_SENSE_BIT) >> TOSA_GPIO_ALL_SENSE_RSHIFT) ++#define KB_DISCHARGE_DELAY 10 ++#define KB_ACTIVATE_DELAY 10 ++ ++ ++static unsigned char tosakbd_keycode[NR_SCANCODES] = { ++ 0, /* 0 */ ++ 0, KEY_W, 0, 0, 0, KEY_K, KEY_BACKSPACE, KEY_P, 0, 0, 0, TOSA_KEY_OFF, 0, 0, 0, 0, /*1 - 16*/ ++ KEY_Q, KEY_E, KEY_T, KEY_Y, 0, KEY_O, KEY_I, KEY_COMMA, 0, 0, 0, TOSA_KEY_RECORD, 0, 0, 0, 0, /*17 - 32*/ ++ KEY_A, KEY_D, KEY_G, KEY_U, 0, KEY_L, KEY_ENTER, KEY_DOT, 0, 0, 0, TOSA_KEY_SYNC, 0, 0, 0, 0, /*33 - 48*/ ++ KEY_Z, KEY_C, KEY_V, KEY_J, TOSA_KEY_ADDRESS, TOSA_KEY_CANCEL, TOSA_KEY_CENTER, TOSA_KEY_OK, KEY_LEFTSHIFT, 0 , 0,0 , 0, 0, 0, 0, /*49 - 64*/ ++ KEY_S, KEY_R, KEY_B, KEY_N, TOSA_KEY_CALENDER, TOSA_KEY_HOME, TOSA_KEY_REC, TOSA_KEY_LIGHT, 0, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, 0, /*65 - 80*/ ++ KEY_TAB, KEY_SLASH, KEY_H, KEY_M, TOSA_KEY_MENU, 0, KEY_UP, 0, 0, 0, TOSA_KEY_FN, 0, 0, 0, 0, 0, /*81 - 96*/ ++ KEY_X, KEY_F, KEY_SPACE, KEY_APOSTROPHE, TOSA_KEY_MAIL, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0, 0, /*97 - 109*/ ++}; ++ ++struct tosakbd { ++ unsigned char keycode[ARRAY_SIZE(tosakbd_keycode)]; ++ struct input_dev *input; ++ ++ spinlock_t lock; ++ struct timer_list timer; ++ struct timer_list hptimer; ++ ++ int hp_state; ++ int hp_count; ++ ++ unsigned int suspended; ++ unsigned long suspend_jiffies; ++}; ++ ++/* Helper functions for reading the keyboard matrix ++ * Note: We should really be using pxa_gpio_mode to alter GPDR but it ++ * requires a function call per GPIO bit which is excessive ++ * when we need to access 12 bits at once, multiple times. ++ * These functions must be called within local_irq_save()/local_irq_restore() ++ * or similar. ++ */ ++static inline void tosakbd_discharge_all(void) ++{ ++ /* STROBE All HiZ */ ++ GPCR1 = TOSA_GPIO_HIGH_STROBE_BIT; ++ GPDR1 &= ~TOSA_GPIO_HIGH_STROBE_BIT; ++ GPCR2 = TOSA_GPIO_LOW_STROBE_BIT; ++ GPDR2 &= ~TOSA_GPIO_LOW_STROBE_BIT; ++} ++ ++static inline void tosakbd_activate_all(void) ++{ ++ /* STROBE ALL -> High */ ++ GPSR1 = TOSA_GPIO_HIGH_STROBE_BIT; ++ GPDR1 |= TOSA_GPIO_HIGH_STROBE_BIT; ++ GPSR2 = TOSA_GPIO_LOW_STROBE_BIT; ++ GPDR2 |= TOSA_GPIO_LOW_STROBE_BIT; ++ ++ udelay(KB_DISCHARGE_DELAY); ++ ++ /* STATE CLEAR */ ++ GEDR2 |= TOSA_GPIO_ALL_SENSE_BIT; ++} ++ ++static inline void tosakbd_activate_col(int col) ++{ ++ if (col<=5) { ++ /* STROBE col -> High, not col -> HiZ */ ++ GPSR1 = TOSA_GPIO_STROBE_BIT(col); ++ GPDR1 = (GPDR1 & ~TOSA_GPIO_HIGH_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } else { ++ /* STROBE col -> High, not col -> HiZ */ ++ GPSR2 = TOSA_GPIO_STROBE_BIT(col); ++ GPDR2 = (GPDR2 & ~TOSA_GPIO_LOW_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } ++} ++ ++static inline void tosakbd_reset_col(int col) ++{ ++ if (col<=5) { ++ /* STROBE col -> Low */ ++ GPCR1 = TOSA_GPIO_STROBE_BIT(col); ++ /* STROBE col -> out, not col -> HiZ */ ++ GPDR1 = (GPDR1 & ~TOSA_GPIO_HIGH_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } else { ++ /* STROBE col -> Low */ ++ GPCR2 = TOSA_GPIO_STROBE_BIT(col); ++ /* STROBE col -> out, not col -> HiZ */ ++ GPDR2 = (GPDR2 & ~TOSA_GPIO_LOW_STROBE_BIT) | TOSA_GPIO_STROBE_BIT(col); ++ } ++} ++ ++/* ++ * Read the GPIOs for POWER, RECORD and SYNC ++ */ ++static int read_port_key_status_raw(void) ++{ ++ int val=0; ++ ++ /* Power key */ ++ if ((GPLR0 & GPIO_bit(TOSA_GPIO_ON_KEY))==0) ++ val |= KEYMASK_ON; ++ /* Record key */ ++ if ((GPLR0 & GPIO_bit(TOSA_GPIO_RECORD_BTN))==0) ++ val |= KEYMASK_REC; ++ /* Sync key */ ++ if ((GPLR0 & GPIO_bit(TOSA_GPIO_SYNC))==0) ++ val |= KEYMASK_SYNC; ++ return val; ++} ++ ++ ++/* ++ * The tosa keyboard only generates interrupts when a key is pressed. ++ * So when a key is pressed, we enable a timer. This timer scans the ++ * keyboard, and this is how we detect when the key is released. ++ */ ++ ++/* Scan the hardware keyboard and push any changes up through the input layer */ ++static void tosakbd_scankeyboard(struct tosakbd *tosakbd_data) ++{ ++ unsigned int row, col, rowd; ++ unsigned long flags; ++ unsigned int num_pressed = 0; ++ ++ if (tosakbd_data->suspended) ++ return; ++ ++ spin_lock_irqsave(&tosakbd_data->lock, flags); ++ ++ for (col = 0; col < KB_COLS; col++) { ++ /* ++ * Discharge the output driver capacitatance ++ * in the keyboard matrix. (Yes it is significant..) ++ */ ++ tosakbd_discharge_all(); ++ udelay(KB_DISCHARGE_DELAY); ++ ++ tosakbd_activate_col( col); ++ udelay(KB_ACTIVATE_DELAY); ++ ++ rowd = GET_ROWS_STATUS(col); ++ ++ for (row = 0; row < KB_ROWS; row++) { ++ unsigned int scancode, pressed; ++ scancode = SCANCODE(row, col); ++ pressed = rowd & KB_ROWMASK(row); ++ input_report_key(tosakbd_data->input, tosakbd_data->keycode[scancode], pressed); ++ if (pressed) ++ num_pressed++; ++ } ++ ++ tosakbd_reset_col(col); ++ } ++ ++ tosakbd_activate_all(); ++ ++ rowd = read_port_key_status_raw(); ++ ++ for (row = 0; row < 3; row++ ) { ++ unsigned int scancode, pressed; ++ scancode = SCANCODE(row, KB_COLS); ++ pressed = rowd & KB_ROWMASK(row); ++ input_report_key(tosakbd_data->input, tosakbd_data->keycode[scancode], pressed); ++ if (pressed) ++ num_pressed++; ++ ++ if (pressed && (tosakbd_data->keycode[scancode] == TOSA_KEY_OFF) ++ && time_after(jiffies, tosakbd_data->suspend_jiffies + msecs_to_jiffies(1000))) { ++ input_event(tosakbd_data->input, EV_PWR, TOSA_KEY_OFF, 1); ++ tosakbd_data->suspend_jiffies = jiffies; ++ } ++ } ++ ++ input_sync(tosakbd_data->input); ++ ++ /* if any keys are pressed, enable the timer */ ++ if (num_pressed) ++ mod_timer(&tosakbd_data->timer, jiffies + SCAN_INTERVAL); ++ ++ spin_unlock_irqrestore(&tosakbd_data->lock, flags); ++} ++ ++/* ++ * tosa keyboard interrupt handler. ++ */ ++static irqreturn_t tosakbd_interrupt(int irq, void *dev_id) ++{ ++ struct tosakbd *tosakbd_data = dev_id; ++ ++ if (!timer_pending(&tosakbd_data->timer)) ++ { ++ /** wait chattering delay **/ ++ udelay(20); ++ tosakbd_scankeyboard(tosakbd_data); ++ } ++ ++ return IRQ_HANDLED; ++} ++ ++/* ++ * tosa timer checking for released keys ++ */ ++static void tosakbd_timer_callback(unsigned long data) ++{ ++ struct tosakbd *tosakbd_data = (struct tosakbd *) data; ++ tosakbd_scankeyboard(tosakbd_data); ++} ++ ++/* ++ * The headphone generates an interrupt. ++ * We debounce the switche and pass them to the input system. ++ */ ++ ++static irqreturn_t tosakbd_hp_isr(int irq, void *dev_id) ++{ ++ struct tosakbd *tosakbd_data = dev_id; ++ ++ if (!timer_pending(&tosakbd_data->hptimer)) ++ mod_timer(&tosakbd_data->hptimer, jiffies + msecs_to_jiffies(HP_SCAN_INTERVAL)); ++ ++ return IRQ_HANDLED; ++} ++ ++static void tosakbd_hp_timer(unsigned long data) ++{ ++ struct tosakbd *tosakbd_data = (struct tosakbd *) data; ++ unsigned long state; ++ unsigned long flags; ++ ++ state = (GPLR(TOSA_GPIO_EAR_IN) & GPIO_bit(TOSA_GPIO_EAR_IN)); ++ if (state != tosakbd_data->hp_state) { ++ tosakbd_data->hp_count = 0; ++ tosakbd_data->hp_state = state; ++ } else if (tosakbd_data->hp_count < HP_STABLE_COUNT) { ++ tosakbd_data->hp_count++; ++ } ++ ++ if (tosakbd_data->hp_count >= HP_STABLE_COUNT) { ++ spin_lock_irqsave(&tosakbd_data->lock, flags); ++ ++ input_report_switch(tosakbd_data->input, SW_HEADPHONE_INSERT, ((GPLR(TOSA_GPIO_EAR_IN) & GPIO_bit(TOSA_GPIO_EAR_IN)) == 0)); ++ input_sync(tosakbd_data->input); ++ ++ spin_unlock_irqrestore(&tosakbd_data->lock, flags); ++ } else { ++ mod_timer(&tosakbd_data->hptimer, jiffies + msecs_to_jiffies(HP_SCAN_INTERVAL)); ++ } ++} ++ ++#ifdef CONFIG_PM ++static int tosakbd_suspend(struct platform_device *dev, pm_message_t state) ++{ ++ struct tosakbd *tosakbd = platform_get_drvdata(dev); ++ ++ tosakbd->suspended = 1; ++ ++ return 0; ++} ++ ++static int tosakbd_resume(struct platform_device *dev) ++{ ++ struct tosakbd *tosakbd = platform_get_drvdata(dev); ++ ++ /* Upon resume, ignore the suspend key for a short while */ ++ tosakbd->suspend_jiffies = jiffies; ++ tosakbd->suspended = 0; ++ ++ return 0; ++} ++#else ++#define tosakbd_suspend NULL ++#define tosakbd_resume NULL ++#endif ++ ++static int __init tosakbd_probe(struct platform_device *pdev) { ++ ++ int i; ++ struct tosakbd *tosakbd; ++ struct input_dev *input_dev; ++ ++ tosakbd = kzalloc(sizeof(struct tosakbd), GFP_KERNEL); ++ if (!tosakbd) ++ return -ENOMEM; ++ ++ input_dev = input_allocate_device(); ++ if (!input_dev) { ++ kfree(tosakbd); ++ return -ENOMEM; ++ } ++ ++ platform_set_drvdata(pdev,tosakbd); ++ ++ spin_lock_init(&tosakbd->lock); ++ ++ /* Init Keyboard rescan timer */ ++ init_timer(&tosakbd->timer); ++ tosakbd->timer.function = tosakbd_timer_callback; ++ tosakbd->timer.data = (unsigned long) tosakbd; ++ ++ /* Init Headphone Timer */ ++ init_timer(&tosakbd->hptimer); ++ tosakbd->hptimer.function = tosakbd_hp_timer; ++ tosakbd->hptimer.data = (unsigned long) tosakbd; ++ ++ tosakbd->suspend_jiffies = jiffies; ++ ++ tosakbd->input = input_dev; ++ ++ input_dev->private = tosakbd; ++ input_dev->name = "Tosa Keyboard"; ++ input_dev->phys = "tosakbd/input0"; ++ input_dev->cdev.dev = &pdev->dev; ++ ++ input_dev->id.bustype = BUS_HOST; ++ input_dev->id.vendor = 0x0001; ++ input_dev->id.product = 0x0001; ++ input_dev->id.version = 0x0100; ++ ++ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP) | BIT(EV_PWR) | BIT(EV_SW); ++ input_dev->keycode = tosakbd->keycode; ++ input_dev->keycodesize = sizeof(unsigned char); ++ input_dev->keycodemax = ARRAY_SIZE(tosakbd_keycode); ++ ++ memcpy(tosakbd->keycode, tosakbd_keycode, sizeof(tosakbd->keycode)); ++ for (i = 0; i < ARRAY_SIZE(tosakbd_keycode); i++) ++ set_bit(tosakbd->keycode[i], input_dev->keybit); ++ clear_bit(0, input_dev->keybit); ++ set_bit(SW_HEADPHONE_INSERT, input_dev->swbit); ++ ++ input_register_device(tosakbd->input); ++ ++ /* Setup sense interrupts - RisingEdge Detect, sense lines as inputs */ ++ for (i = 0; i < TOSA_KEY_SENSE_NUM; i++) { ++ pxa_gpio_mode( TOSA_GPIO_KEY_SENSE(i) | GPIO_IN); ++ if (request_irq(TOSA_IRQ_GPIO_KEY_SENSE(i), tosakbd_interrupt, ++ IRQF_DISABLED | IRQF_TRIGGER_RISING, "tosakbd", tosakbd)) { ++ printk("tosakbd: Can't get IRQ: %d !\n", i); ++ } ++ } ++ ++ /* Set Strobe lines as outputs - set high */ ++ for (i = 0; i < TOSA_KEY_STROBE_NUM; i++) { ++ pxa_gpio_mode( TOSA_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH); ++ } ++ ++ // Power&Rec Button ++ pxa_gpio_mode( TOSA_GPIO_ON_KEY | GPIO_IN); ++ pxa_gpio_mode( TOSA_GPIO_RECORD_BTN | GPIO_IN); ++ pxa_gpio_mode( TOSA_GPIO_SYNC | GPIO_IN); ++ pxa_gpio_mode( TOSA_GPIO_EAR_IN | GPIO_IN); ++ ++ if (request_irq(TOSA_IRQ_GPIO_ON_KEY, tosakbd_interrupt, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "On key", tosakbd) || ++ request_irq(TOSA_IRQ_GPIO_RECORD_BTN, tosakbd_interrupt, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "Record key", tosakbd) || ++ request_irq(TOSA_IRQ_GPIO_SYNC, tosakbd_interrupt, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "Sync key", tosakbd) || ++ request_irq(TOSA_IRQ_GPIO_EAR_IN, tosakbd_hp_isr, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "HP in", tosakbd)) { ++ printk("Could not allocate KEYBD IRQ!\n"); ++ } ++ ++ printk(KERN_INFO "input: Tosa Keyboard Registered\n"); ++ ++ return 0; ++} ++ ++static int tosakbd_remove(struct platform_device *dev) { ++ ++ int i; ++ struct tosakbd *tosakbd = platform_get_drvdata(dev); ++ ++ for (i = 0; i < TOSA_KEY_SENSE_NUM; i++) ++ free_irq(TOSA_IRQ_GPIO_KEY_SENSE(i),tosakbd); ++ ++ free_irq(TOSA_IRQ_GPIO_ON_KEY,tosakbd); ++ free_irq(TOSA_IRQ_GPIO_RECORD_BTN,tosakbd); ++ free_irq(TOSA_IRQ_GPIO_SYNC,tosakbd); ++ ++ del_timer_sync(&tosakbd->timer); ++ ++ input_unregister_device(tosakbd->input); ++ ++ kfree(tosakbd); ++ ++ return 0; ++} ++ ++static struct platform_driver tosakbd_driver = { ++ .probe = tosakbd_probe, ++ .remove = tosakbd_remove, ++ .suspend = tosakbd_suspend, ++ .resume = tosakbd_resume, ++ .driver = { ++ .name = "tosa-keyboard", ++ }, ++}; ++ ++static int __devinit tosakbd_init(void) ++{ ++ return platform_driver_register(&tosakbd_driver); ++} ++ ++static void __exit tosakbd_exit(void) ++{ ++ platform_driver_unregister(&tosakbd_driver); ++} ++ ++module_init(tosakbd_init); ++module_exit(tosakbd_exit); ++ ++MODULE_AUTHOR("Dirk Opfer <Dirk@Opfer-Online.de>"); ++MODULE_DESCRIPTION("Tosa Keyboard Driver"); ++MODULE_LICENSE("GPLv2"); diff --git a/packages/linux/linux-rp-2.6.23/tosa-lcdnoise-r1-fix-r0.patch b/packages/linux/linux-rp-2.6.23/tosa-lcdnoise-r1-fix-r0.patch new file mode 100644 index 0000000000..93a9c18720 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-lcdnoise-r1-fix-r0.patch @@ -0,0 +1,135 @@ +From eada869814636157956641ba1503f0d6cc04e2b7 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 17:43:51 +0400 +Subject: [PATCH] tosa-lcdnoise-r1.patch fixes + +--- + arch/arm/mach-pxa/tosa_lcd.c | 34 ++++++++++++++++++++++++++++++++++ + drivers/input/touchscreen/tosa_ts.c | 9 +-------- + include/asm-arm/arch-pxa/tosa.h | 5 +++++ + 3 files changed, 40 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa_lcd.c b/arch/arm/mach-pxa/tosa_lcd.c +index d52f63f..447ca86 100644 +--- a/arch/arm/mach-pxa/tosa_lcd.c ++++ b/arch/arm/mach-pxa/tosa_lcd.c +@@ -59,6 +59,8 @@ static int bl_intensity; + static struct ssp_dev tosa_nssp_dev; + static struct ssp_state tosa_nssp_state; + static spinlock_t tosa_nssp_lock; ++static int blanked; ++static unsigned long hsync_time; + + static unsigned short normal_i2c[] = { + DAC_BASE, +@@ -130,6 +132,17 @@ static void tosa_lcd_tg_init(struct device *dev) + pxa_nssp_output(TG_GPOSR,0x02); /* GPOS0=powercontrol, GPOS1=GPIO, GPOS2=TCTL */ + } + ++static unsigned long calc_hsync_time(const struct fb_videomode *mode) { ++ /* The 25 and 44 'magic numbers' are from Sharp's 2.4 patches */ ++ if (mode->yres == 640) { ++ return 25; ++ } ++ if (mode->yres == 320) { ++ return 44; ++ } ++ return 0; ++} ++ + static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode) + { + const int value = TG_REG0_COLOR | TG_REG0_UD | TG_REG0_LR; +@@ -154,6 +167,8 @@ static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode) + /* set common voltage */ + i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj); + ++ blanked = 0; ++ hsync_time = calc_hsync_time(mode); + } + + static void tosa_lcd_tg_off(struct device *dev) +@@ -172,6 +187,8 @@ static void tosa_lcd_tg_off(struct device *dev) + + /* L3V Off */ + reset_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); ++ ++ blanked = 1; + } + + static int tosa_detect_client(struct i2c_adapter* adapter, int address, int kind) { +@@ -238,6 +255,23 @@ static int tosa_detach_client(struct i2c_client* client) { + return 0; + } + ++unsigned long tosa_lcd_get_hsync_time(void) ++{ ++/* This method should eventually contain the correct algorithm for calculating ++ the hsync_time */ ++ if (blanked) ++ return 0; ++ else ++ return hsync_time; ++} ++ ++void tosa_lcd_wait_hsync(void) ++{ ++ /* Waits for a rising edge on the VGA line */ ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0); ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0); ++} ++ + static struct i2c_driver tosa_driver={ + .id = TOSA_LCD_I2C_DEVICEID, + .attach_adapter = tosa_attach_adapter, +diff --git a/drivers/input/touchscreen/tosa_ts.c b/drivers/input/touchscreen/tosa_ts.c +index bc733e9..134f8ce 100644 +--- a/drivers/input/touchscreen/tosa_ts.c ++++ b/drivers/input/touchscreen/tosa_ts.c +@@ -25,13 +25,6 @@ + #define CCNT_ON() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) + #define CCNT_OFF() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) + +-static inline void tosa_lcd_wait_hsync(void) +-{ +- /* Waits for a rising edge on the VGA line */ +- while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0); +- while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0); +-} +- + /* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait + * before sampling the Y axis of the touchscreen */ + void tosa_lcd_sync_on(int adcsel) { +@@ -54,7 +47,7 @@ void tosa_lcd_sync_on(int adcsel) { + } + } + +-void tosa_lcd_sync_off(void) { ++void tosa_lcd_sync_off(int adcsel) { + CCNT_OFF(); + } + +diff --git a/include/asm-arm/arch-pxa/tosa.h b/include/asm-arm/arch-pxa/tosa.h +index ce7322d..7f446fd 100644 +--- a/include/asm-arm/arch-pxa/tosa.h ++++ b/include/asm-arm/arch-pxa/tosa.h +@@ -1,6 +1,7 @@ + /* + * Hardware specific definitions for Sharp SL-C6000x series of PDAs + * ++ * Copyright (c) 2006 Wolfson Microelectronics PLC. + * Copyright (c) 2005 Dirk Opfer + * + * Based on Sharp's 2.4 kernel patches +@@ -187,4 +188,8 @@ + extern struct platform_device tosascoop_jc_device; + extern struct platform_device tosascoop_device; + extern struct platform_device tc6393_device; ++ ++unsigned long tosa_lcd_get_hsync_time(void); ++void tosa_lcd_wait_hsync(void); ++ + #endif /* _ASM_ARCH_TOSA_H_ */ +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.23/tosa-lcdnoise-r1.patch b/packages/linux/linux-rp-2.6.23/tosa-lcdnoise-r1.patch new file mode 100644 index 0000000000..21f3cf66b1 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-lcdnoise-r1.patch @@ -0,0 +1,158 @@ +From 564b757ba44b517ac6d693b94a177708bb5d3887 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 17:30:30 +0400 +Subject: [PATCH] tosa-lcdnoise-r1.patch + +--- + drivers/input/touchscreen/Kconfig | 13 +++++ + drivers/input/touchscreen/Makefile | 1 + + drivers/input/touchscreen/tosa_ts.c | 102 +++++++++++++++++++++++++++++++++++ + 3 files changed, 116 insertions(+), 0 deletions(-) + +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index 3ac01b4..6862e8f 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -219,6 +219,19 @@ config TOUCHSCREEN_USB_DMC_TSC10 + bool "DMC TSC-10/25 device support" if EMBEDDED + depends on TOUCHSCREEN_USB_COMPOSITE + ++config TOUCHSCREEN_TOSA ++ tristate "Sharp Tosa touchscreen driver" ++ depends on TOUCHSCREEN_WM97XX && MACH_TOSA ++ default n ++ help ++ Say Y here to enable the driver for the touchscreen on the ++ Sharp Tosa PDA. ++ depends on TOUCHSCREEN_WM97XX && MACH_TOSA ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called tosa_ts. ++ + config TOUCHSCREEN_TSC2101 + tristate "TI TSC2101 touchscreen input driver" + depends on MACH_HX2750 && INPUT && INPUT_TOUCHSCREEN +diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile +index f64d1a5..4fc0e17 100644 +--- a/drivers/input/touchscreen/Makefile ++++ b/drivers/input/touchscreen/Makefile +@@ -22,6 +22,7 @@ obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o + obj-$(CONFIG_TOUCHSCREEN_TSC2101) += tsc2101_ts.o + obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o + obj-$(CONFIG_TOUCHSCREEN_WM97XX_PXA) += pxa-wm97xx.o ++obj-$(CONFIG_TOUCHSCREEN_TOSA) += tosa_ts.o + + ifeq ($(CONFIG_TOUCHSCREEN_WM9713),y) + wm97xx-ts-objs += wm9713.o +diff --git a/drivers/input/touchscreen/tosa_ts.c b/drivers/input/touchscreen/tosa_ts.c +new file mode 100644 +index 0000000..bc733e9 +--- /dev/null ++++ b/drivers/input/touchscreen/tosa_ts.c +@@ -0,0 +1,102 @@ ++/* ++ * tosa_ts.c -- Touchscreen driver for Sharp SL-6000 (Tosa). ++ * ++ * Copyright 2006 Wolfson Microelectronics PLC. ++ * Author: Mike Arthur ++ * linux@wolfsonmicro.com ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 1st Sep 2006 Initial version. ++ * ++ */ ++ ++#include <linux/wm97xx.h> ++#include <asm/arch/tosa.h> ++#include <asm/arch/hardware.h> ++#include <asm/arch/pxa-regs.h> ++ ++/* Taken from the Sharp 2.4 kernel code */ ++#define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a)) ++#define CCNT_ON() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) ++#define CCNT_OFF() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) ++ ++static inline void tosa_lcd_wait_hsync(void) ++{ ++ /* Waits for a rising edge on the VGA line */ ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0); ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0); ++} ++ ++/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait ++ * before sampling the Y axis of the touchscreen */ ++void tosa_lcd_sync_on(int adcsel) { ++ unsigned long timer1 = 0, timer2 = 0, wait_time = 0; ++ if (adcsel == WM97XX_ADCSEL_Y) { ++ wait_time = tosa_lcd_get_hsync_time(); ++ CCNT_ON(); ++ ++ if (wait_time) { ++ /* wait for LCD rising edge */ ++ tosa_lcd_wait_hsync(); ++ /* get clock */ ++ CCNT(timer1); ++ CCNT(timer2); ++ ++ while ((timer2 - timer1) < wait_time) { ++ CCNT(timer2); ++ } ++ } ++ } ++} ++ ++void tosa_lcd_sync_off(void) { ++ CCNT_OFF(); ++} ++ ++static struct wm97xx_mach_ops tosa_mach_ops = { ++ .pre_sample = tosa_lcd_sync_on, ++ .post_sample = tosa_lcd_sync_off, ++}; ++ ++int tosa_ts_probe(struct device *dev) { ++ struct wm97xx *wm = dev->driver_data; ++ return wm97xx_register_mach_ops (wm, &tosa_mach_ops); ++} ++ ++ ++int tosa_ts_remove(struct device *dev) { ++ struct wm97xx *wm = dev->driver_data; ++ wm97xx_unregister_mach_ops (wm); ++ return 0; ++} ++ ++static struct device_driver tosa_ts_driver = { ++ .name = "wm97xx-touchscreen", ++ .bus = &wm97xx_bus_type, ++ .owner = THIS_MODULE, ++ .probe = tosa_ts_probe, ++ .remove = tosa_ts_remove, ++}; ++ ++static int __init tosa_ts_init(void) ++{ ++ return driver_register(&tosa_ts_driver); ++} ++ ++static void __exit tosa_ts_exit(void) ++{ ++ driver_unregister(&tosa_ts_driver); ++} ++ ++module_init(tosa_ts_init); ++module_exit(tosa_ts_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Mike Arthur, mike@mikearthur.co.uk, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("Sharp SL6000 Tosa Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.23/tosa-power-r18-fix-r0.patch b/packages/linux/linux-rp-2.6.23/tosa-power-r18-fix-r0.patch new file mode 100644 index 0000000000..8899ae270b --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-power-r18-fix-r0.patch @@ -0,0 +1,59 @@ +From 24813da9b0aac0e92635d7307837d89a9f4a1ee7 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 16:47:15 +0400 +Subject: [PATCH] tosa-power-r18.patch fixes + +--- + arch/arm/mach-pxa/tosa_pm.c | 9 +++++---- + 1 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa_pm.c b/arch/arm/mach-pxa/tosa_pm.c +index 1eab1af..2df75f0 100644 +--- a/arch/arm/mach-pxa/tosa_pm.c ++++ b/arch/arm/mach-pxa/tosa_pm.c +@@ -17,9 +17,9 @@ + #include <linux/interrupt.h> + #include <linux/platform_device.h> + #include <linux/pm.h> ++#include <linux/apm-emulation.h> + #include <linux/wm97xx.h> + +-#include <asm/apm.h> + #include <asm/irq.h> + #include <asm/mach-types.h> + #include <asm/hardware.h> +@@ -144,7 +144,7 @@ static int tosa_ac97_init(void) + pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD); + pxa_gpio_mode(GPIO20_DREQ0_MD); + +- pxa_set_cken(CKEN2_AC97, 1); ++ pxa_set_cken(CKEN_AC97, 1); + /* AC97 power on sequense */ + while ( 1 ) { + GCR = 0; +@@ -184,11 +184,12 @@ static int tosa_ac97_init(void) + pxa_gpio_mode(GPIO32_SDATA_IN1_AC97_MD); + ad_polling = 1; + printk("tosa_ac97_init\n"); ++ return 0; + } + + void tosa_ac97_exit(void) + { +- if (!(CKEN & CKEN2_AC97)) ++ if (!(CKEN & CKEN_AC97)) + return; + + // power down the whole chip +@@ -197,7 +198,7 @@ void tosa_ac97_exit(void) + // GCR &= ~(GCR_CDONE_IE | GCR_SDONE_IE | GCR_SECRDY_IEN | GCR_PRIRDY_IEN | GCR_SECRES_IEN | GCR_PRIRES_IEN); + // GSR = GSR; + // GCR = GCR_ACLINK_OFF; +- pxa_set_cken(CKEN2_AC97, 0); ++ pxa_set_cken(CKEN_AC97, 0); + /* switch back to irq driver */ + ad_polling = 0; + printk("tosa_ac97_exit\n"); +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.23/tosa-power-r18.patch b/packages/linux/linux-rp-2.6.23/tosa-power-r18.patch new file mode 100644 index 0000000000..ca703cb188 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-power-r18.patch @@ -0,0 +1,691 @@ +Index: linux-2.6.17/arch/arm/mach-pxa/Makefile +=================================================================== +--- linux-2.6.17.orig/arch/arm/mach-pxa/Makefile 2006-09-19 20:51:33.984424500 +0200 ++++ linux-2.6.17/arch/arm/mach-pxa/Makefile 2006-09-19 21:08:04.922354250 +0200 +@@ -16,7 +16,7 @@ obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o + obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o + obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o + obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o sharpsl_pm.o poodle_pm.o +-obj-$(CONFIG_MACH_TOSA) += tosa.o ++obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o + obj-$(CONFIG_MACH_EM_X270) += em-x270.o + obj-$(CONFIG_MACH_HX2750) += hx2750.o hx2750_test.o + +Index: linux-2.6.17/arch/arm/mach-pxa/tosa_pm.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/arch/arm/mach-pxa/tosa_pm.c 2006-09-19 21:08:34.476201250 +0200 +@@ -0,0 +1,661 @@ ++/* ++ * Battery and Power Management code for the Sharp SL-6000x ++ * ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/stat.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/delay.h> ++#include <linux/interrupt.h> ++#include <linux/platform_device.h> ++#include <linux/pm.h> ++#include <linux/wm97xx.h> ++ ++#include <asm/apm.h> ++#include <asm/irq.h> ++#include <asm/mach-types.h> ++#include <asm/hardware.h> ++#include <asm/hardware/scoop.h> ++#include <asm/hardware/tmio.h> ++ ++#include <asm/arch/sharpsl.h> ++#include <asm/arch/tosa.h> ++#include <asm/arch/pxa-regs.h> ++#include <sound/soc.h> ++#include <sound/ac97_codec.h> ++#include "sharpsl.h" ++ ++extern int tosa_bl_intensity(void); ++volatile static int ad_polling; ++static int tosa_pm_driver_probe(struct device *dev); ++static int tosa_pm_driver_remove(struct device *dev); ++static struct wm97xx *wm9712; ++ ++/************************************************************ ++ * AC97 functions ++ ************************************************************/ ++#define AC97_TIMEOUT_VAL 0x1000000 ++ ++#define AC97_MISC_MODEM_STAT 0x0056 ++#define AC97_GPIO_CONFIG 0x004C ++ ++static u16 tosa_ac97_read(unsigned short reg) ++{ ++ volatile u32 *reg_addr; ++ volatile int timeout; ++ unsigned short data; ++ ++ if (CAR & CAR_CAIP) { ++ printk(KERN_CRIT ": CAR_CAIP already set\n"); ++ return 0; ++ } ++ ++ if (reg == AC97_GPIO_STATUS) ++ reg_addr = &PMC_REG_BASE; ++ else ++ reg_addr = &PAC_REG_BASE; ++ ++ reg_addr += (reg >> 1); ++ ++ data=0; ++ GSR = GSR_CDONE | GSR_SDONE; ++ ++ data = *reg_addr; ++ timeout = 0; ++ ++ while(((GSR & GSR_SDONE)) == 0 && (timeout++ < AC97_TIMEOUT_VAL)); ++ ++ if ((timeout >= AC97_TIMEOUT_VAL)) { ++ GSR = GSR; ++ printk(KERN_CRIT ": AC97 is busy1.\n"); ++ return data; ++ } ++ ++ // actual read ++ GSR = GSR_CDONE | GSR_SDONE; ++ data = *reg_addr; ++ ++ timeout = 0; ++ while(((GSR & GSR_SDONE) == 0) && (timeout++<AC97_TIMEOUT_VAL)); ++ if ((timeout >= AC97_TIMEOUT_VAL)) { ++ GSR = GSR; ++ printk(KERN_CRIT ": AC97 is busy2.\n"); ++ return data; ++ } ++ ++ return data; ++} ++ ++static void tosa_ac97_write(unsigned short reg, unsigned short val) ++{ ++ volatile u32 *reg_addr; ++ volatile int timeout=0; ++ ++ if (CAR & CAR_CAIP) { ++ printk(KERN_CRIT ": CAR_CAIP already set\n"); ++ return; ++ } ++ ++ GSR = GSR_CDONE | GSR_SDONE; ++ if (reg == AC97_GPIO_STATUS) ++ reg_addr = &PMC_REG_BASE; ++ else ++ reg_addr = &PAC_REG_BASE; ++ ++ reg_addr += (reg >> 1); ++ ++ *reg_addr = val; ++ while(((GSR & GSR_CDONE) == 0) && (timeout++ < AC97_TIMEOUT_VAL)); ++ if (timeout >= AC97_TIMEOUT_VAL) { ++ printk(KERN_CRIT ": AC97 is busy.\n"); ++ } ++} ++ ++static void tosa_ac97_bit_clear(u8 reg, u16 val) ++{ ++ unsigned short dat = tosa_ac97_read(reg); ++ dat &= ~val; ++ tosa_ac97_write(reg, dat); ++} ++ ++static void tosa_ac97_bit_set(u8 reg, u16 val) ++{ ++ unsigned short dat = tosa_ac97_read(reg); ++ dat |= val; ++ tosa_ac97_write(reg, dat); ++} ++ ++ ++static int tosa_ac97_init(void) ++{ ++ int timeo; ++ ++ pxa_gpio_mode(GPIO31_SYNC_AC97_MD); ++ pxa_gpio_mode(GPIO30_SDATA_OUT_AC97_MD); ++ pxa_gpio_mode(GPIO28_BITCLK_AC97_MD); ++ pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD); ++ pxa_gpio_mode(GPIO20_DREQ0_MD); ++ ++ pxa_set_cken(CKEN2_AC97, 1); ++ /* AC97 power on sequense */ ++ while ( 1 ) { ++ GCR = 0; ++ udelay(100); ++ GCR |= GCR_COLD_RST; ++ udelay(5); ++ GCR |= GCR_WARM_RST; ++ udelay(5); ++ for ( timeo = 0x10000; timeo > 0; timeo-- ) { ++ if ( GSR & GSR_PCR ) break; ++ mdelay(5); ++ } ++ if( timeo > 0 ) break; ++ printk(KERN_WARNING "AC97 power on retry!!\n"); ++ } ++ ++ tosa_ac97_write(AC97_EXTENDED_STATUS, 1); ++ /* ++ * Setting AC97 GPIO ++ * i/o function ++ * GPIO1: input EAR_IN signal ++ * GPIO2: output IRQ signal ++ * GPIO3: output PENDOWN signal ++ * GPIO4: input MASK signal ++ * GPIO5: input DETECT MIC signal ++ */ ++ // AC97_GPIO_FUNC AC97_MISC_MODEM_STAT ++ ++ tosa_ac97_bit_clear(AC97_MISC_MODEM_STAT, ++ ((1<<2)|(1<<3)|(1<<4)|(1<<5))); ++ tosa_ac97_bit_clear(AC97_GPIO_CONFIG,(1<<2)|(1<<3)); ++ tosa_ac97_bit_set(AC97_GPIO_CONFIG, (1<<1)|(1<<4)|(1<<5)); ++ ++ tosa_ac97_write(AC97_WM97XX_DIGITISER2, 0xc009); ++ tosa_ac97_write(AC97_WM97XX_DIGITISER1, 0x0030 | WM97XX_DELAY(4)); ++ ++ pxa_gpio_mode(GPIO32_SDATA_IN1_AC97_MD); ++ ad_polling = 1; ++ printk("tosa_ac97_init\n"); ++} ++ ++void tosa_ac97_exit(void) ++{ ++ if (!(CKEN & CKEN2_AC97)) ++ return; ++ ++ // power down the whole chip ++ tosa_ac97_write(AC97_POWERDOWN, 0x7fff); ++ ++// GCR &= ~(GCR_CDONE_IE | GCR_SDONE_IE | GCR_SECRDY_IEN | GCR_PRIRDY_IEN | GCR_SECRES_IEN | GCR_PRIRES_IEN); ++// GSR = GSR; ++// GCR = GCR_ACLINK_OFF; ++ pxa_set_cken(CKEN2_AC97, 0); ++ /* switch back to irq driver */ ++ ad_polling = 0; ++ printk("tosa_ac97_exit\n"); ++} ++ ++int ac97_ad_input(u16 adcsel) ++{ ++ unsigned short val = 0; ++ unsigned long timeout; ++ ++ // prepare ++ tosa_ac97_read(AC97_WM97XX_DIGITISER_RD); ++ ++ if (adcsel & 0x8000) ++ adcsel = ((adcsel & 0x7fff) + 3) << 12; ++ ++ /* Conversion start */ ++ tosa_ac97_write(AC97_WM97XX_DIGITISER1, (adcsel | WM97XX_POLL | WM97XX_DELAY(4))); ++ timeout = 0x1000; ++ /* wait for POLL to go low */ ++ while ((tosa_ac97_read(AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(100); ++ timeout--; ++ } ++ ++ val = tosa_ac97_read(AC97_WM97XX_DIGITISER_RD); ++ ++ val &= 0xFFF ; ++ ++ return val; ++} ++ ++ ++int tosa_read_aux_adc(u16 adcsel) ++{ ++ if (ad_polling) ++ return (ac97_ad_input(adcsel)); ++ else ++ return (wm97xx_read_aux_adc(wm9712, adcsel)); ++} ++ ++static struct device_driver tosa_pm_driver = { ++ .name = "wm97xx-battery", ++ .bus = &wm97xx_bus_type, ++ .owner = THIS_MODULE, ++ .probe = tosa_pm_driver_probe, ++ .remove = tosa_pm_driver_remove, ++}; ++ ++#if 0 ++#define TOSA_TEMP_READ_WAIT_TIME (5) // 5msec [Fix] ++int tosa_read_battery(struct wm97xx* wm, int channel) ++{ ++ //return sprintf(buf, "%d\n", wm97xx_read_aux_adc(wm, input)); ++ ++ int wm_aux,i; ++ int value = 0; ++ int clear_mux; ++ ++ switch(channel) { ++ ++ case 0: // Main ++ ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT0_V_ON); ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT1_V_ON | TOSA_TC6393_BAT_SW_ON); ++ wm_aux = WM97XX_AUX_ID3; ++ break; ++ ++ case 1: // Jacket ++ ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT1_V_ON); ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT0_V_ON | TOSA_TC6393_BAT_SW_ON); ++ wm_aux = WM97XX_AUX_ID3; ++ break; ++ ++ case 2: // BU ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BU_CHRG_ON); ++ wm_aux = WM97XX_AUX_ID4; ++ break; ++ ++ case 3: // Main Temp ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT1_TH_ON); ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT0_TH_ON); ++ wm_aux = WM97XX_AUX_ID2; ++ break; ++ ++ case 4: // Jacket Temp ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT0_TH_ON); ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT1_TH_ON); ++ wm_aux = WM97XX_AUX_ID2; ++ break; ++ ++ default: ++ return -1; ++ } ++ ++ mdelay(TOSA_TEMP_READ_WAIT_TIME); ++ for(i=0;i<4;i++) ++ { ++ if (wm9712) ++ value += wm97xx_read_aux_adc(wm, wm_aux); ++ else ++ value += ac97_ad_input(wm, wm_aux); ++ } ++ ++ value>>=2; ++ // reset the multiplexer ++ clear_mux = TOSA_TC6393_BAT0_V_ON | TOSA_TC6393_BAT1_V_ON | TOSA_TC6393_BAT_SW_ON | TOSA_TC6393_BAT0_TH_ON | TOSA_TC6393_BAT1_TH_ON | TOSA_TC6393_BU_CHRG_ON; ++ ++ return value; ++ ++} ++#endif ++ ++/* BL 5-3 */ ++struct battery_thresh tosa_battery_levels_bl[] = { ++ { 1663, 100 }, ++ { 1605, 75 }, ++ { 1564, 50 }, ++ { 1510, 25 }, ++ { 1435, 5 }, ++ { 0, 0 }, ++}; ++ ++/* BL 2-0 */ ++struct battery_thresh tosa_battery_levels[] = { ++ { 1679, 100 }, ++ { 1617, 75 }, ++ { 1576, 50 }, ++ { 1530, 25 }, ++ { 1448, 5 }, ++ { 0, 0 }, ++}; ++ ++struct pm_devices { ++ const char * name; ++ struct bus_type *bus; ++ struct device_driver *driver; ++ struct device * dev; ++ int (*resume)(struct device *dev, void * data); // int (*resume)(struct device *dev); ++ int (*suspend)(struct device *dev, void * data);// int (*suspend)(struct device *dev, pm_message_t state); ++}; ++ ++/* Ugly ++ We need the following devices to measure the battery and control the charger: ++ Also we need access to these before we sleep and immediatly after we resume so we can't ++ control their pm via the kernel device manager. To access their pm functions we will backup ++ the suspend and resume handler and clear these pointers. ++ After that we can suspend and resume these devices. ++ ++ Don't change the order of this table!!!!! ++*/ ++static struct pm_devices dev_table[] = { ++ [0] = { ++ .name = TMIO_SOC_NAME, ++ .bus = &platform_bus_type, ++ }, ++}; ++ ++static int tosa_pm_driver_probe(struct device *dev) ++{ ++ wm9712 = dev->driver_data; ++ ad_polling = 0; ++ return 0; ++} ++ ++static int tosa_pm_driver_remove(struct device *dev) ++{ ++ wm9712 = NULL; ++ return 0; ++} ++ ++ ++static void tosa_charger_init(void) ++{ ++ int i; ++ ++ /* If this driver doesn't register, bad things will happen, Tosa won't boot, ++ and the world will possibly explode */ ++ i = driver_register(&tosa_pm_driver); ++ if (i < 0) ++ panic("Cannot register the tosa_pm driver on the wm97xx bus. Halting."); ++ ++ for(i=0;i<ARRAY_SIZE(dev_table);i++) ++ { ++ dev_table[i].driver = driver_find(dev_table[i].name, dev_table[i].bus); ++ if (dev_table[i].driver) ++ { ++ dev_table[i].resume = dev_table[i].driver->resume; ++ dev_table[i].suspend = dev_table[i].driver->suspend; ++ dev_table[i].driver->resume = NULL; ++ dev_table[i].driver->suspend = NULL; ++ } ++ } ++ ++ pxa_gpio_mode(TOSA_GPIO_AC_IN | GPIO_IN); ++ pxa_gpio_mode(TOSA_GPIO_BAT0_CRG | GPIO_IN); ++ pxa_gpio_mode(TOSA_GPIO_BAT1_CRG | GPIO_IN); ++ pxa_gpio_mode(TOSA_GPIO_BAT0_LOW | GPIO_IN); ++ pxa_gpio_mode(TOSA_GPIO_BAT1_LOW | GPIO_IN); ++ ++ pxa_gpio_mode(TOSA_GPIO_JACKET_DETECT | GPIO_IN); ++ pxa_gpio_mode(TOSA_GPIO_POWERON | GPIO_IN); ++ sharpsl_pm_pxa_init(); ++} ++ ++ ++static void tosa_measure_temp(int on) ++{ ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT0_TH_ON | TOSA_TC6393_BAT1_TH_ON); ++ ++ if (on) ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT1_TH_ON); ++ ++} ++ ++static void tosa_charge(int on) ++{ ++ if(on) ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_CHARGE_OFF); ++ else ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_CHARGE_OFF); ++} ++ ++static void tosa_discharge1(int on) ++{ ++} ++ ++static void tosa_discharge(int on) ++{ ++} ++ ++ ++static void tosa_presuspend(void) ++{ ++ int i; ++ unsigned long wakeup_mask; ++ ++ // put remaining devices into sleep ++ for(i=0;i<ARRAY_SIZE(dev_table);i++) ++ { ++ if(dev_table[i].suspend) ++ driver_for_each_device(dev_table[i].driver, NULL, ++ (void*)&PMSG_SUSPEND, dev_table[i].suspend); ++ } ++ ++ tosa_ac97_exit(); ++ ++ wakeup_mask = GPIO_bit(TOSA_GPIO_POWERON) | GPIO_bit(TOSA_GPIO_ON_KEY) | GPIO_bit(TOSA_GPIO_AC_IN); ++ ++ wakeup_mask |= GPIO_bit(TOSA_GPIO_BAT0_LOW); ++ PWER = wakeup_mask | PWER_RTC; ++ ++ PRER = wakeup_mask; ++ PFER = wakeup_mask; ++ ++ for (i = 0; i <=15; i++) { ++ if (PRER & PFER & GPIO_bit(i)) { ++ if (GPLR0 & GPIO_bit(i) ) ++ PRER &= ~GPIO_bit(i); ++ else ++ PFER &= ~GPIO_bit(i); ++ } ++ } ++ ++ /* Clear reset status */ ++ RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR; ++ ++ /* Stop 3.6MHz and drive HIGH to PCMCIA and CS */ ++ PCFR = PCFR_OPDE; ++ ++ /* Resume on keyboard power key */ ++ PGSR1 = (PGSR1 & ~TOSA_GPIO_LOW_STROBE_BIT); ++ PGSR2 = (PGSR2 & ~TOSA_GPIO_HIGH_STROBE_BIT); ++ ++ GPDR0 = 0xC3810940; ++ GPDR1 = 0xFCFFAB82; ++ GPDR2 = 0x000F501f; ++// write_scoop_reg(&tosascoop_device.dev,SCOOP_GPWR,0); ++// only debug ++reset_scoop_gpio(&tosascoop_jc_device.dev, TOSA_SCOOP_JC_NOTE_LED); ++} ++ ++void tosa_postsuspend(void) ++{ ++ int i; ++// only debug ++set_scoop_gpio(&tosascoop_jc_device.dev, TOSA_SCOOP_JC_NOTE_LED); ++ ++ for(i=ARRAY_SIZE(dev_table);i;i--) ++ { ++ if(dev_table[i-1].resume) ++ driver_for_each_device(dev_table[i-1].driver, NULL, ++ NULL, dev_table[i-1].resume); ++ } ++ tosa_ac97_init(); ++ PMCR = 0x01; ++} ++ ++void tosa_postresume(void) ++{ ++ tosa_ac97_exit(); ++} ++ ++/* ++ * Check what brought us out of the suspend. ++ * Return: 0 to sleep, otherwise wake ++ */ ++static int tosa_should_wakeup(unsigned int resume_on_alarm) ++{ ++ int is_resume = 0; ++ ++ dev_dbg(sharpsl_pm.dev, "GPLR0 = %x,%x\n", GPLR0, PEDR); ++ ++ if ((PEDR & GPIO_bit(TOSA_GPIO_AC_IN))) { ++ if (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) { ++ /* charge on */ ++ dev_dbg(sharpsl_pm.dev, "ac insert\n"); ++ sharpsl_pm.flags |= SHARPSL_DO_OFFLINE_CHRG; ++ } else { ++ /* charge off */ ++ dev_dbg(sharpsl_pm.dev, "ac remove\n"); ++ sharpsl_pm_led(SHARPSL_LED_OFF); ++ sharpsl_pm.machinfo->charge(0); ++ sharpsl_pm.charge_mode = CHRG_OFF; ++ } ++ } ++ ++ if ((PEDR & GPIO_bit(GPIO_bit(TOSA_GPIO_BAT0_CRG)))) ++ dev_dbg(sharpsl_pm.dev, "Charge full interrupt\n"); ++ ++ if (PEDR & GPIO_bit(TOSA_GPIO_POWERON)) ++ is_resume |= GPIO_bit(TOSA_GPIO_POWERON); ++ ++ if (PEDR & GPIO_bit(TOSA_GPIO_ON_KEY)) ++ is_resume |= GPIO_bit(TOSA_GPIO_ON_KEY); ++ ++ if (resume_on_alarm && (PEDR & PWER_RTC)) ++ is_resume |= PWER_RTC; ++ ++ return is_resume; ++} ++ ++static unsigned long tosa_charger_wakeup(void) ++{ ++// return ~GPLR0 & ( GPIO_bit(TOSA_GPIO_AC_IN) | GPIO_bit(TOSA_GPIO_POWERON) | GPIO_bit(TOSA_GPIO_ON_KEY) ); ++ return (~GPLR0 & ( GPIO_bit(TOSA_GPIO_POWERON) | GPIO_bit(TOSA_GPIO_ON_KEY) )) | (GPLR0 & GPIO_bit(TOSA_GPIO_AC_IN)); ++} ++ ++unsigned long tosa_read_bat(void) ++{ ++ unsigned long value; ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT0_V_ON | TOSA_TC6393_BAT1_V_ON | TOSA_TC6393_BAT_SW_ON); ++ mdelay(5); ++ value = tosa_read_aux_adc(WM97XX_AUX_ID3); ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BAT0_V_ON); ++ return value; ++} ++ ++unsigned long tosapm_read_devdata(int type) ++{ ++ switch(type) { ++ case SHARPSL_STATUS_ACIN: ++ return ((GPLR(TOSA_GPIO_AC_IN) & GPIO_bit(TOSA_GPIO_AC_IN)) == 0); ++ case SHARPSL_STATUS_LOCK: ++ return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock); ++ case SHARPSL_STATUS_CHRGFULL: ++ return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull); ++ case SHARPSL_STATUS_FATAL: ++ return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal); ++ case SHARPSL_ACIN_VOLT: ++ return 1000; // not used on tosa ++ case SHARPSL_BATT_TEMP: ++ return tosa_read_aux_adc(WM97XX_AUX_ID2); ++ case SHARPSL_BATT_VOLT: ++ return tosa_read_bat(); ++ default: ++ return tosa_read_bat(); ++ } ++} ++ ++static struct sharpsl_charger_machinfo tosa_pm_machinfo = { ++ .init = tosa_charger_init, ++ .exit = sharpsl_pm_pxa_remove, ++ .gpio_batlock = TOSA_GPIO_BAT_LOCKED, ++ .gpio_acin = TOSA_GPIO_AC_IN, ++ .gpio_batfull = TOSA_GPIO_BAT0_CRG, ++ .batfull_irq = 0, ++ .discharge = tosa_discharge, ++ .discharge1 = tosa_discharge1, ++ .charge = tosa_charge, ++ .measure_temp = tosa_measure_temp, ++ .presuspend = tosa_presuspend, ++ .postsuspend = tosa_postsuspend, ++ .postresume = tosa_postresume, ++ .read_devdata = tosapm_read_devdata, ++ .charger_wakeup = tosa_charger_wakeup, ++ .should_wakeup = tosa_should_wakeup, ++ .backlight_limit = corgibl_limit_intensity, ++ .backlight_get_status= tosa_bl_intensity, ++ .bat_levels = 6, ++ .bat_levels_noac = tosa_battery_levels, ++ .bat_levels_acin = tosa_battery_levels, ++ .bat_levels_noac_bl = tosa_battery_levels_bl, ++ .bat_levels_acin_bl = tosa_battery_levels_bl, ++ .charge_on_volt = 1200, // 2.9V TOSA_MAIN_BATTERY_ERR_THRESH voltage < 1200 -> error ++ .charge_on_temp = 3600, // -- TOSA_MAIN_BATTERY_EXIST_THRESH temp > 3600 -> error, no battery ++ .charge_acin_high = 1500, // not used default value ++ .charge_acin_low = 500, // not used default value ++ .fatal_acin_volt = 1572, // 3.8V ++ .fatal_noacin_volt= 1551, // 3.75V ++ .status_high_acin = 1564, // 3.78V ++ .status_low_acin = 1510, // 3.65V ++ .status_high_noac = 1564, // 3.78V ++ .status_low_noac = 1510, // 3.65V ++}; ++ ++static struct platform_device *tosapm_device; ++ ++static int __devinit tosapm_init(void) ++{ ++ int ret; ++ ++ tosapm_device = platform_device_alloc("sharpsl-pm", -1); ++ if (!tosapm_device) ++ return -ENOMEM; ++ ++ tosapm_device->dev.platform_data = &tosa_pm_machinfo; ++ ret = platform_device_add(tosapm_device); ++ ++ if (ret) ++ platform_device_put(tosapm_device); ++ ++ return ret; ++} ++ ++static void tosapm_exit(void) ++{ ++ int i; ++ ++ // restore the resume / suspend handler ++ for(i=0;i<ARRAY_SIZE(dev_table);i++) ++ { ++ if (dev_table[i].driver) ++ { ++ dev_table[i].driver->resume = dev_table[i].resume; ++ dev_table[i].driver->suspend = dev_table[i].suspend; ++ dev_table[i].resume = NULL; ++ dev_table[i].suspend = NULL; ++ put_driver(dev_table[i].driver); ++ } ++ } ++ ++ if (wm9712) ++ driver_unregister(&tosa_pm_driver); ++ ++ platform_device_unregister(tosapm_device); ++} ++ ++module_init(tosapm_init); ++module_exit(tosapm_exit); +Index: linux-2.6.17/arch/arm/mach-pxa/Kconfig +=================================================================== +--- linux-2.6.17.orig/arch/arm/mach-pxa/Kconfig 2006-09-19 20:51:40.160810500 +0200 ++++ linux-2.6.17/arch/arm/mach-pxa/Kconfig 2006-09-19 21:08:04.926354500 +0200 +@@ -110,6 +110,7 @@ config MACH_TOSA + bool "Enable Sharp SL-6000x (Tosa) Support" + depends PXA_SHARPSL_25x + select TOSHIBA_TC6393XB ++ select SHARPSL_PM + + config PXA25x + bool diff --git a/packages/linux/linux-rp-2.6.23/tosa-pxaac97-r6-fix-r0.patch b/packages/linux/linux-rp-2.6.23/tosa-pxaac97-r6-fix-r0.patch new file mode 100644 index 0000000000..9c18aae98d --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-pxaac97-r6-fix-r0.patch @@ -0,0 +1,29 @@ +From 005693333f4b3e0495bb80cc3cfd812e3e6f0a30 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 00:48:42 +0400 +Subject: [PATCH] tosa-pxaac97-r6.patch fixes + +--- + arch/arm/mach-pxa/tosa.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c +index 059fa07..61536d4 100644 +--- a/arch/arm/mach-pxa/tosa.c ++++ b/arch/arm/mach-pxa/tosa.c +@@ -310,10 +310,10 @@ static void __init tosa_init(void) + PMCR = 0x01; + + // AC97 Disable all IRQ's +- pxa_set_cken(CKEN2_AC97, 1); ++ pxa_set_cken(CKEN_AC97, 1); + GCR &= ~(GCR_CDONE_IE | GCR_SDONE_IE | GCR_SECRDY_IEN | GCR_PRIRDY_IEN | GCR_SECRES_IEN | GCR_PRIRES_IEN); + GSR = GSR; +- pxa_set_cken(CKEN2_AC97, 0); ++ pxa_set_cken(CKEN_AC97, 0); + + pxa_set_mci_info(&tosa_mci_platform_data); + pxa_set_udc_info(&udc_info); +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.23/tosa-tmio-lcd-r10-fix-r0.patch b/packages/linux/linux-rp-2.6.23/tosa-tmio-lcd-r10-fix-r0.patch new file mode 100644 index 0000000000..a2e2bee151 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-tmio-lcd-r10-fix-r0.patch @@ -0,0 +1,35 @@ +From bb3ed6577c592d86f0976a92978c9454bbdfbe59 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Fri, 19 Oct 2007 02:01:23 +0400 +Subject: [PATCH] tosa-tmio-lcd-r10.patch fixes + +--- + arch/arm/mach-pxa/tosa_lcd.c | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-pxa/tosa_lcd.c b/arch/arm/mach-pxa/tosa_lcd.c +index eeeee3e..d52f63f 100644 +--- a/arch/arm/mach-pxa/tosa_lcd.c ++++ b/arch/arm/mach-pxa/tosa_lcd.c +@@ -66,7 +66,7 @@ static unsigned short normal_i2c[] = { + }; + I2C_CLIENT_INSMOD; + +-static struct corgibl_machinfo tosa_bl_machinfo = { ++static struct generic_bl_info tosa_bl_machinfo = { + .max_intensity = 255, + .default_intensity = 68, + .limit_mask = 0x0b, +@@ -80,7 +80,8 @@ int tosa_bl_intensity(void) + + static void pxa_nssp_output(unsigned char reg, unsigned char data) + { +- unsigned long flag, dummy; ++ unsigned long flag; ++ u32 dummy; + u32 dat = ( ((reg << 5) & 0xe0) | (data & 0x1f) ); + spin_lock_irqsave(&tosa_nssp_lock, flag); + +-- +1.4.4.4 + diff --git a/packages/linux/linux-rp-2.6.23/tosa-tmio-lcd-r10.patch b/packages/linux/linux-rp-2.6.23/tosa-tmio-lcd-r10.patch new file mode 100644 index 0000000000..fe5c45d249 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/tosa-tmio-lcd-r10.patch @@ -0,0 +1,464 @@ + arch/arm/mach-pxa/Kconfig | 5 + arch/arm/mach-pxa/Makefile | 2 + arch/arm/mach-pxa/tosa.c | 49 +++++- + arch/arm/mach-pxa/tosa_lcd.c | 344 +++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 396 insertions(+), 4 deletions(-) + +Index: git/arch/arm/mach-pxa/Makefile +=================================================================== +--- git.orig/arch/arm/mach-pxa/Makefile 2006-11-07 22:13:10.000000000 +0000 ++++ git/arch/arm/mach-pxa/Makefile 2006-11-07 23:29:38.000000000 +0000 +@@ -17,7 +17,7 @@ obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o + obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o corgi_ssp.o corgi_lcd.o sharpsl_pm.o spitz_pm.o + obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o + obj-$(CONFIG_MACH_POODLE) += poodle.o corgi_ssp.o sharpsl_pm.o poodle_pm.o +-obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o ++obj-$(CONFIG_MACH_TOSA) += tosa.o sharpsl_pm.o tosa_pm.o tosa_lcd.o + obj-$(CONFIG_MACH_EM_X270) += em-x270.o + obj-$(CONFIG_MACH_HX2750) += hx2750.o hx2750_test.o + +Index: git/arch/arm/mach-pxa/tosa_lcd.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/arch/arm/mach-pxa/tosa_lcd.c 2006-11-07 23:29:25.000000000 +0000 +@@ -0,0 +1,344 @@ ++/* ++ * LCD / Backlight control code for Sharp SL-6000x (tosa) ++ * ++ * Copyright (c) 2005 Dirk Opfer ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/delay.h> ++#include <linux/platform_device.h> ++#include <linux/i2c.h> ++#include <linux/fb.h> ++ ++#include <asm/mach/sharpsl_param.h> ++#include <asm/hardware.h> ++#include <asm/hardware/scoop.h> ++#include <asm/hardware/tmio.h> ++#include <asm/arch/ssp.h> ++#include <asm/arch/sharpsl.h> ++#include <asm/arch/tosa.h> ++#include <asm/arch/pxa-regs.h> ++ ++#define DAC_BASE 0x4e ++#define DAC_CH1 0 ++#define DAC_CH2 1 ++ ++#define TG_REG0_VQV 0x0001 ++#define TG_REG0_COLOR 0x0002 ++#define TG_REG0_UD 0x0004 ++#define TG_REG0_LR 0x0008 ++#define COMADJ_DEFAULT 97 ++#define TOSA_LCD_I2C_DEVICEID 0x4711 // Fixme: new value ++ ++static void tosa_lcd_tg_init(struct device *dev); ++static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode); ++static void tosa_lcd_tg_off(struct device *dev); ++static void tosa_set_backlight(int intensity); ++ ++const static struct tmio_lcd_ops tosa_tc6393_lcd_ops = { ++ .init = tosa_lcd_tg_init, ++ .tg_on = tosa_lcd_tg_on, ++ .tg_off = tosa_lcd_tg_off, ++}; ++ ++static struct platform_device *tosabl_device; ++static struct i2c_driver tosa_driver; ++static struct i2c_client* tosa_i2c_dac; ++static int initialised; ++static int comadj; ++static int bl_intensity; ++static struct ssp_dev tosa_nssp_dev; ++static struct ssp_state tosa_nssp_state; ++static spinlock_t tosa_nssp_lock; ++ ++static unsigned short normal_i2c[] = { ++ DAC_BASE, ++ I2C_CLIENT_END ++}; ++I2C_CLIENT_INSMOD; ++ ++static struct corgibl_machinfo tosa_bl_machinfo = { ++ .max_intensity = 255, ++ .default_intensity = 68, ++ .limit_mask = 0x0b, ++ .set_bl_intensity = tosa_set_backlight, ++}; ++ ++int tosa_bl_intensity(void) ++{ ++ return bl_intensity; ++} ++ ++static void pxa_nssp_output(unsigned char reg, unsigned char data) ++{ ++ unsigned long flag, dummy; ++ u32 dat = ( ((reg << 5) & 0xe0) | (data & 0x1f) ); ++ spin_lock_irqsave(&tosa_nssp_lock, flag); ++ ++ ssp_config(&tosa_nssp_dev, (SSCR0_Motorola | (SSCR0_DSS & 0x07 )), 0, 0, SSCR0_SerClkDiv(128)); ++ ssp_enable(&tosa_nssp_dev); ++ ++ ssp_write_word(&tosa_nssp_dev,dat); ++ ++ /* Read null data back from device to prevent SSP overflow */ ++ ssp_read_word(&tosa_nssp_dev, &dummy); ++ ssp_disable(&tosa_nssp_dev); ++ spin_unlock_irqrestore(&tosa_nssp_lock, flag); ++ ++} ++ ++static void tosa_set_backlight(int intensity) ++{ ++ if (!tosa_i2c_dac) ++ return; ++ ++ bl_intensity = intensity; ++ /* SetBacklightDuty */ ++ i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH2, (unsigned char)intensity); ++ ++ /* SetBacklightVR */ ++ if (intensity) ++ set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BL_C20MA); ++ else ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_BL_C20MA); ++ ++ /* bl_enable GP04=1 otherwise GP04=0*/ ++ pxa_nssp_output(TG_GPODR2, intensity ? 0x01 : 0x00); ++} ++ ++static void tosa_lcd_tg_init(struct device *dev) ++{ ++ /* L3V On */ ++ set_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); ++ mdelay(60); ++ ++ /* TG On */ ++ reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_TG_ON); ++ mdelay(60); ++ ++ pxa_nssp_output(TG_TPOSCTL,0x00); /* delayed 0clk TCTL signal for VGA */ ++ pxa_nssp_output(TG_GPOSR,0x02); /* GPOS0=powercontrol, GPOS1=GPIO, GPOS2=TCTL */ ++} ++ ++static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode) ++{ ++ const int value = TG_REG0_COLOR | TG_REG0_UD | TG_REG0_LR; ++ pxa_nssp_output(TG_PNLCTL, value | (mode->yres == 320 ? 0 : TG_REG0_VQV)); ++ ++ /* TG LCD pannel power up */ ++ pxa_nssp_output(TG_PINICTL,0x4); ++ mdelay(50); ++ ++ /* TG LCD GVSS */ ++ pxa_nssp_output(TG_PINICTL,0x0); ++ ++ if (!initialised) ++ { ++ /* after the pannel is powered up the first time, we can access the i2c bus */ ++ /* so probe for the DAC */ ++ i2c_add_driver(&tosa_driver); ++ initialised = 1; ++ mdelay(50); ++ } ++ if (tosa_i2c_dac) ++ /* set common voltage */ ++ i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj); ++ ++} ++ ++static void tosa_lcd_tg_off(struct device *dev) ++{ ++ /* TG LCD VHSA off */ ++ pxa_nssp_output(TG_PINICTL,0x4); ++ mdelay(50); ++ ++ /* TG LCD signal off */ ++ pxa_nssp_output(TG_PINICTL,0x6); ++ mdelay(50); ++ ++ /* TG Off */ ++ set_tc6393_gpio(&tc6393_device.dev, TOSA_TC6393_TG_ON); ++ mdelay(100); ++ ++ /* L3V Off */ ++ reset_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); ++} ++ ++static int tosa_detect_client(struct i2c_adapter* adapter, int address, int kind) { ++ int err = 0; ++ ++ printk("Tosa-LCD: DAC detected address:0x%2.2x\n",address); ++ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA )) ++ goto ERROR0; ++ ++ if (!(tosa_i2c_dac = (struct i2c_client*)kzalloc(sizeof(*tosa_i2c_dac), GFP_KERNEL))) { ++ err = -ENOMEM; ++ goto ERROR0; ++ } ++ ++ //i2c_set_clientdata(tosa_i2c_dac, data); ++ tosa_i2c_dac->addr = address; ++ tosa_i2c_dac->adapter = adapter; ++ tosa_i2c_dac->driver = &tosa_driver; ++ tosa_i2c_dac->dev.parent = &tc6393_device.dev; ++ strcpy(tosa_i2c_dac->name, "tosa lcd"); ++ if ((err = i2c_attach_client(tosa_i2c_dac))) ++ goto ERROR3; ++ ++ /* Now i2c is ready, allocate the backlight device*/ ++ tosabl_device = platform_device_alloc("corgi-bl", -1); ++ if (!tosabl_device) { ++ err = -ENOMEM; ++ goto ERROR4; ++ } ++ ++ /* set parent device */ ++ tosabl_device->dev.parent = &tosa_i2c_dac->dev; ++ tosabl_device->dev.platform_data = &tosa_bl_machinfo; ++ ++ err = platform_device_add(tosabl_device); ++ ++ if (err) ++ platform_device_put(tosabl_device); ++ ++ /* set common voltage */ ++ i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj); ++ ++ return 0; ++ERROR4: ++ i2c_detach_client(tosa_i2c_dac); ++ERROR3: ++ kfree(tosa_i2c_dac); ++ERROR0: ++ return err; ++} ++ ++static int tosa_attach_adapter(struct i2c_adapter* adapter) { ++ return i2c_probe(adapter, &addr_data, &tosa_detect_client); ++} ++ ++static int tosa_detach_client(struct i2c_client* client) { ++ int err; ++ ++ if ((err = i2c_detach_client(client))) { ++ printk(KERN_ERR "tosa: Cannot deregister client\n"); ++ return err; ++ } ++ kfree(client); ++ return 0; ++} ++ ++static struct i2c_driver tosa_driver={ ++ .id = TOSA_LCD_I2C_DEVICEID, ++ .attach_adapter = tosa_attach_adapter, ++ .detach_client = tosa_detach_client, ++}; ++ ++static int __init tosa_lcd_probe(struct platform_device *pdev) ++{ ++ int ret; ++ spin_lock_init(&tosa_nssp_lock); ++ ++ if (!pdev->dev.platform_data) ++ return -EINVAL; ++ ++ /* Set Common Voltage */ ++ comadj = sharpsl_param.comadj == -1 ? COMADJ_DEFAULT : sharpsl_param.comadj; ++ ++ ret=ssp_init(&tosa_nssp_dev,2,0); ++ ++ /* initialize SSP */ ++ pxa_gpio_mode(GPIO83_NSSP_TX); ++ pxa_gpio_mode(GPIO81_NSSP_CLK_OUT); ++ pxa_gpio_mode(GPIO82_NSSP_FRM_OUT); ++ ++ if (ret) ++ printk(KERN_ERR "Unable to register NSSP handler!\n"); ++ else { ++ struct tmio_lcd_ops* *tmio_ops = pdev->dev.platform_data; ++ ssp_disable(&tosa_nssp_dev); ++ initialised = 0; ++ ++ /* Set the lcd functions */ ++ *tmio_ops = (struct tmio_lcd_ops*) &tosa_tc6393_lcd_ops; ++ } ++ ++ return ret; ++} ++ ++static int tosa_lcd_remove(struct platform_device *pdev) ++{ ++ /* delete the lcd functions */ ++ struct tmio_lcd_ops* *tmio_ops = pdev->dev.platform_data; ++ *tmio_ops = NULL; ++ ++ ssp_exit(&tosa_nssp_dev); ++ ++ if (tosa_i2c_dac) { ++ i2c_detach_client(tosa_i2c_dac); ++ kfree(tosa_i2c_dac); ++ } ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++ ++static int tosa_lcd_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ ssp_flush(&tosa_nssp_dev); ++ ssp_save_state(&tosa_nssp_dev,&tosa_nssp_state); ++ return 0; ++} ++ ++static int tosa_lcd_resume(struct platform_device *pdev) ++{ ++ printk("tosa_lcd_resume\n"); ++ ssp_restore_state(&tosa_nssp_dev,&tosa_nssp_state); ++ ssp_enable(&tosa_nssp_dev); ++ printk("tosa_lcd_resume ok\n"); ++ return 0; ++} ++#else ++ ++#define tosa_lcd_suspend NULL ++#define tosa_lcd_resume NULL ++ ++#endif ++ ++ ++static struct platform_driver tosalcd_driver = { ++ .probe = tosa_lcd_probe, ++ .remove = tosa_lcd_remove, ++ .suspend = tosa_lcd_suspend, ++ .resume = tosa_lcd_resume, ++ .driver = { ++ .name = "tosa-lcd", ++ }, ++}; ++ ++static int __init tosa_lcd_init(void) ++{ ++ return platform_driver_register(&tosalcd_driver); ++} ++ ++static void __exit tosa_lcd_cleanup (void) ++{ ++ platform_driver_unregister (&tosalcd_driver); ++} ++ ++device_initcall(tosa_lcd_init); ++module_exit (tosa_lcd_cleanup); ++ ++MODULE_DESCRIPTION ("Tosa LCD device"); ++MODULE_AUTHOR ("Dirk Opfer"); ++MODULE_LICENSE ("GPL v2"); +Index: git/arch/arm/mach-pxa/tosa.c +=================================================================== +--- git.orig/arch/arm/mach-pxa/tosa.c 2006-11-07 22:13:10.000000000 +0000 ++++ git/arch/arm/mach-pxa/tosa.c 2006-11-07 23:29:38.000000000 +0000 +@@ -24,6 +24,7 @@ + #include <linux/mtd/partitions.h> + #include <linux/pm.h> + #include <linux/delay.h> ++#include <linux/fb.h> + + #include <asm/setup.h> + #include <asm/memory.h> +@@ -345,7 +345,38 @@ static struct tmio_nand_platform_data to + .badblock_pattern = &tosa_tc6393_nand_bbt, + }; + +-extern struct tmio_lcd_platform_data tosa_tc6393_lcd_platform_data; ++static struct fb_videomode tosa_tc6393_lcd_mode[] = { ++ { ++ .xres = 480, ++ .yres = 640, ++ .pixclock = 0x002cdf00,/* PLL divisor */ ++ .left_margin = 0x004c, ++ .right_margin = 0x005b, ++ .upper_margin = 0x0001, ++ .lower_margin = 0x000d, ++ .hsync_len = 0x0002, ++ .vsync_len = 0x0001, ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++ .vmode = FB_VMODE_NONINTERLACED, ++ },{ ++ .xres = 240, ++ .yres = 320, ++ .pixclock = 0x00e7f203,/* PLL divisor */ ++ .left_margin = 0x0024, ++ .right_margin = 0x002f, ++ .upper_margin = 0x0001, ++ .lower_margin = 0x000d, ++ .hsync_len = 0x0002, ++ .vsync_len = 0x0001, ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++ .vmode = FB_VMODE_NONINTERLACED, ++}}; ++ ++struct tmio_lcd_platform_data tosa_tc6393_lcd_platform_data = { ++ .ops = NULL, ++ .modelist = tosa_tc6393_lcd_mode, ++ .num_modes = ARRAY_SIZE(tosa_tc6393_lcd_mode), ++}; + + static struct tmio_cell tosa_tc6393_cells[] = { + { +@@ -384,6 +415,19 @@ struct platform_device tc6393_device = { + .num_resources = ARRAY_SIZE(tc6393_resources), + .resource = tc6393_resources, + }; ++EXPORT_SYMBOL (tc6393_device); ++ ++/* ++ * Tosa LCD / Backlight stuff ++ */ ++static struct platform_device tosalcd_device = { ++ .name = "tosa-lcd", ++ .id = -1, ++ .dev = { ++ .parent = &tc6393_device.dev, ++ .platform_data = &tosa_tc6393_lcd_platform_data.ops, ++ }, ++}; + + static struct platform_device *devices[] __initdata = { + &tosascoop_device, +@@ -391,6 +435,7 @@ static struct platform_device *devices[] + &tosakbd_device, + &tosaled_device, + &tc6393_device, ++ &tosalcd_device, + }; + + static void tosa_poweroff(void) +Index: git/arch/arm/mach-pxa/Kconfig +=================================================================== +--- git.orig/arch/arm/mach-pxa/Kconfig 2006-11-07 22:13:10.000000000 +0000 ++++ git/arch/arm/mach-pxa/Kconfig 2006-11-07 22:13:10.000000000 +0000 +@@ -129,7 +129,10 @@ config MACH_TOSA + bool "Enable Sharp SL-6000x (Tosa) Support" + depends PXA_SHARPSL_25x + select TOSHIBA_TC6393XB +- select SHARPSL_PM ++ select I2C ++ select I2C_PXA ++ select SHARPSL_PM ++ select PXA_SSP + + config PXA25x + bool diff --git a/packages/linux/linux-rp-2.6.23/wm9712-reset-loop-r2.patch b/packages/linux/linux-rp-2.6.23/wm9712-reset-loop-r2.patch new file mode 100644 index 0000000000..78e81ea83a --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/wm9712-reset-loop-r2.patch @@ -0,0 +1,44 @@ + sound/soc/codecs/wm9712.c | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +Index: git/sound/soc/codecs/wm9712.c +=================================================================== +--- git.orig/sound/soc/codecs/wm9712.c 2006-11-07 22:10:01.000000000 +0000 ++++ git/sound/soc/codecs/wm9712.c 2006-11-07 22:11:50.000000000 +0000 +@@ -618,18 +618,26 @@ static int wm9712_dapm_event(struct snd_ + + static int wm9712_reset(struct snd_soc_codec *codec, int try_warm) + { +- if (try_warm && soc_ac97_ops.warm_reset) { +- soc_ac97_ops.warm_reset(codec->ac97); +- if (!(ac97_read(codec, 0) & 0x8000)) +- return 1; +- } ++ int retry = 3; + +- soc_ac97_ops.reset(codec->ac97); +- if (ac97_read(codec, 0) & 0x8000) +- goto err; +- return 0; ++ while (retry--) ++ { ++ if(try_warm && soc_ac97_ops.warm_reset) { ++ soc_ac97_ops.warm_reset(codec->ac97); ++ if(ac97_read(codec, 0) & 0x8000) ++ continue; ++ else ++ return 1; ++ } ++ ++ soc_ac97_ops.reset(codec->ac97); ++ if(ac97_read(codec, 0) & 0x8000) ++ continue; ++ else ++ return 0; ++ ++ } + +-err: + printk(KERN_ERR "WM9712 AC97 reset failed\n"); + return -EIO; + } diff --git a/packages/linux/linux-rp-2.6.23/wm9712-suspend-cold-res-r2.patch b/packages/linux/linux-rp-2.6.23/wm9712-suspend-cold-res-r2.patch new file mode 100644 index 0000000000..5179b47cc4 --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/wm9712-suspend-cold-res-r2.patch @@ -0,0 +1,16 @@ + sound/soc/codecs/wm9712.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: git/sound/soc/codecs/wm9712.c +=================================================================== +--- git.orig/sound/soc/codecs/wm9712.c 2006-11-07 21:57:34.000000000 +0000 ++++ git/sound/soc/codecs/wm9712.c 2006-11-07 21:59:30.000000000 +0000 +@@ -651,7 +651,7 @@ static int wm9712_soc_resume(struct plat + int i, ret; + u16 *cache = codec->reg_cache; + +- ret = wm9712_reset(codec, 1); ++ ret = wm9712_reset(codec, 0); + if (ret < 0){ + printk(KERN_ERR "could not reset AC97 codec\n"); + return ret; diff --git a/packages/linux/linux-rp-2.6.23/wm97xx-lcdnoise-r0.patch b/packages/linux/linux-rp-2.6.23/wm97xx-lcdnoise-r0.patch deleted file mode 100644 index 191de3af22..0000000000 --- a/packages/linux/linux-rp-2.6.23/wm97xx-lcdnoise-r0.patch +++ /dev/null @@ -1,208 +0,0 @@ -Index: linux-tosa/drivers/input/touchscreen/wm9712.c -=================================================================== ---- linux-tosa.orig/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:36.008543280 +0100 -+++ linux-tosa/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:50.923275896 +0100 -@@ -1,7 +1,7 @@ - /* - * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. - * -- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC. -+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. - * Author: Liam Girdwood - * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com - * Parts Copyright : Ian Molton <spyro@f2s.com> -@@ -13,6 +13,12 @@ - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * -+ * Revision history -+ * 4th Jul 2005 Initial version. -+ * 29th Aug 2006 Mike Arthur <mike@mikearthur.co.uk> -+ * Added fixes for Sharp SL-6000 (Tosa) LCD noise causing -+ * touchscreen interference. -+ * - */ - - #include <linux/module.h> -@@ -28,6 +34,10 @@ - #define WM9705_VERSION "0.60" - #define DEFAULT_PRESSURE 0xb0c0 - -+#define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a)) -+#define CCNT_ON() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) -+#define CCNT_OFF() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) -+ - /* - * Debug - */ -@@ -243,6 +253,36 @@ - return wm->dig[2] & WM9712_PDEN; - } - -+ -+#ifdef CONFIG_MACH_TOSA -+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait -+ * before sampling the Y axis of the touchscreen */ -+static inline void wm9712_lcd_sync_on(struct wm97xx* wm, int adcsel) { -+ unsigned long timer1 = 0, timer2 = 0, wait_time = 0; -+ if (adcsel == WM97XX_ADCSEL_Y) { -+ wait_time = wm97xx_calc_lcd_waittime(wm); -+ -+ CCNT_ON(); -+ -+ if (wait_time) { -+ /* wait for LCD rising edge */ -+ wm_machinfo->wait_hsync(); -+ /* get clock */ -+ CCNT(timer1); -+ CCNT(timer2); -+ -+ while ((timer2 - timer1) < wait_time) { -+ CCNT(timer2); -+ } -+ } -+ } -+} -+ -+static inline void wm9712_lcd_sync_off(void) { -+ CCNT_OFF(); -+} -+#endif -+ - /* - * Read a sample from the WM9712 adc in polling mode. - */ -@@ -260,6 +300,9 @@ - /* set up digitiser */ - if (adcsel & 0x8000) - adcsel = ((adcsel & 0x7fff) + 3) << 12; -+ #ifdef CONFIG_MACH_TOSA -+ wm9712_lcd_sync_on(wm, adcsel); -+ #endif - wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); - - /* wait 3 AC97 time slots + delay for conversion */ -@@ -282,6 +325,10 @@ - - *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); - -+ #ifdef CONFIG_MACH_TOSA -+ wm9712_lcd_sync_off(); -+ #endif -+ - /* check we have correct sample */ - if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { - dbg ("adc wrong sample, read %x got %x", adcsel, -@@ -303,11 +350,12 @@ - static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) - { - int rc; -- - if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) - return rc; -+ - if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) - return rc; -+ - if (pil && !five_wire) { - if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) - return rc; -Index: linux-tosa/drivers/input/touchscreen/wm97xx-core.c -=================================================================== ---- linux-tosa.orig/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:36.008543280 +0100 -+++ linux-tosa/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:50.924275744 +0100 -@@ -2,7 +2,7 @@ - * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 - * and WM9713 AC97 Codecs. - * -- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC. -+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. - * Author: Liam Girdwood - * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com - * Parts Copyright : Ian Molton <spyro@f2s.com> -@@ -67,6 +67,9 @@ - * GPIOs) and 2.6 power management. - * 29th Nov 2004 Added WM9713 support. - * 4th Jul 2005 Moved codec specific code out to seperate files. -+ * 29th Aug 2006 Mike Arthur <mike@mikearthur.co.uk> -+ * Added fixes for Sharp SL-6000 (Tosa) LCD noise causing -+ * touchscreen interference. - */ - - #include <linux/module.h> -@@ -94,6 +97,7 @@ - static DECLARE_MUTEX(gpio_sem); - static LIST_HEAD(wm97xx_misc_list); - static struct wm97xx* wm_codec = NULL; -+struct wm97xx_machinfo *wm_machinfo; - - /* - * WM97xx - enable/disable AUX ADC sysfs -@@ -832,6 +836,23 @@ - mdev->remove(wm_codec); - } - -+#ifdef CONFIG_MACH_TOSA -+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait -+ * before sampling the Y axis of the touchscreen */ -+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm) { -+ unsigned long hsync_time = wm_machinfo->get_hsync_time(); -+ return hsync_time; -+} -+ -+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo) { -+ wm_machinfo = machinfo; -+} -+ -+void wm97xx_unset_machinfo() { -+ wm_machinfo = NULL; -+} -+#endif -+ - static struct device_driver wm97xx_driver = { - .name = "ac97", - .bus = &ac97_bus_type, -@@ -861,6 +882,9 @@ - EXPORT_SYMBOL_GPL(wm97xx_reg_write); - EXPORT_SYMBOL_GPL(wm97xx_register_misc_dev); - EXPORT_SYMBOL_GPL(wm97xx_unregister_misc_dev); -+EXPORT_SYMBOL_GPL(wm97xx_calc_lcd_waittime); -+EXPORT_SYMBOL_GPL(wm97xx_set_machinfo); -+EXPORT_SYMBOL_GPL(wm97xx_unset_machinfo); - - module_init(wm97xx_init); - module_exit(wm97xx_exit); -Index: linux-tosa/include/linux/wm97xx.h -=================================================================== ---- linux-tosa.orig/include/linux/wm97xx.h 2006-08-29 16:52:36.008543280 +0100 -+++ linux-tosa/include/linux/wm97xx.h 2006-08-29 16:52:50.924275744 +0100 -@@ -207,6 +207,7 @@ - - struct wm97xx; - extern struct wm97xx_codec_drv wm97xx_codec; -+extern struct wm97xx_machinfo *wm_machinfo; - - /* - * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs -@@ -253,6 +254,11 @@ - struct list_head list; - }; - -+struct wm97xx_machinfo { -+ unsigned long (*get_hsync_time)(void); -+ void (*wait_hsync)(void); -+}; -+ - int wm97xx_register_misc_dev(struct wm97xx_misc_dev* mdev); - void wm97xx_unregister_misc_dev(struct wm97xx_misc_dev* mdev); - -@@ -281,4 +287,9 @@ - int wm97xx_acc_startup(struct wm97xx* wm); - void wm97xx_acc_shutdown(struct wm97xx* wm); - -+ -+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm); -+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo); -+void wm97xx_unset_machinfo(void); -+ - #endif diff --git a/packages/linux/linux-rp-2.6.23/wm97xx-lg13-r0-fix-r0.patch b/packages/linux/linux-rp-2.6.23/wm97xx-lg13-r0-fix-r0.patch new file mode 100644 index 0000000000..5ad0d8703d --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/wm97xx-lg13-r0-fix-r0.patch @@ -0,0 +1,128 @@ + drivers/input/power.c | 2 +- + drivers/input/touchscreen/Kconfig | 2 +- + drivers/input/touchscreen/wm97xx-core.c | 35 ++++++++++++++++--------------- + include/linux/wm97xx.h | 2 +- + 4 files changed, 21 insertions(+), 20 deletions(-) + +diff --git a/drivers/input/power.c b/drivers/input/power.c +index 4443e34..7aac875 100644 +--- a/drivers/input/power.c ++++ b/drivers/input/power.c +@@ -156,7 +156,7 @@ static void power_event(struct input_handle *handle, unsigned int type, + } + } + +-static struct input_handle *power_connect(struct input_handler *handler, ++static int power_connect(struct input_handler *handler, + struct input_dev *dev, + const struct input_device_id *id) + { +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index 6862e8f..9b532e9 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -247,7 +247,7 @@ config TOUCHSCREEN_TSC2101 + + config TOUCHSCREEN_WM97XX + tristate "Support for WM97xx AC97 touchscreen controllers" +- depends SND_AC97_BUS ++ depends AC97_BUS + + choice + prompt "WM97xx codec type" +diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c +index 9b2710e..d3ce3f3 100644 +--- a/drivers/input/touchscreen/wm97xx-core.c ++++ b/drivers/input/touchscreen/wm97xx-core.c +@@ -84,6 +84,7 @@ + #include <linux/bitops.h> + #include <linux/workqueue.h> + #include <linux/device.h> ++#include <linux/freezer.h> + #include <linux/wm97xx.h> + #include <asm/uaccess.h> + #include <asm/io.h> +@@ -241,14 +242,15 @@ WM97XX_STATUS_ATTR(gpio); + + static int wm97xx_sys_add(struct device *dev) + { ++ int err; + if (aux_sys) { +- device_create_file(dev, &dev_attr_aux1); +- device_create_file(dev, &dev_attr_aux2); +- device_create_file(dev, &dev_attr_aux3); +- device_create_file(dev, &dev_attr_aux4); ++ err = device_create_file(dev, &dev_attr_aux1); ++ err = device_create_file(dev, &dev_attr_aux2); ++ err = device_create_file(dev, &dev_attr_aux3); ++ err = device_create_file(dev, &dev_attr_aux4); + } + if (status_sys) +- device_create_file(dev, &dev_attr_gpio); ++ err = device_create_file(dev, &dev_attr_gpio); + return 0; + } + +@@ -366,12 +368,12 @@ void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, wm97xx_gpio_dir_t dir, + + /* + * Handle a pen down interrupt. +- */ +-static void wm97xx_pen_irq_worker(void *ptr) +-{ +- struct wm97xx *wm = (struct wm97xx *) ptr; +- +- /* do we need to enable the touch panel reader */ ++ */ ++static void wm97xx_pen_irq_worker(struct work_struct *work) ++{ ++ struct wm97xx *wm = container_of(work, struct wm97xx, pen_event_work); ++ ++ /* do we need to enable the touch panel reader */ + if (wm->id == WM9705_ID2) { + if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & WM97XX_PEN_DOWN) + wm->pen_is_down = 1; +@@ -411,9 +413,8 @@ static void wm97xx_pen_irq_worker(void *ptr) + * We have to disable the codec interrupt in the handler because it can + * take upto 1ms to clear the interrupt source. The interrupt is then enabled + * again in the slow handler when the source has been cleared. +- */ +-static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id, +- struct pt_regs *regs) ++ */ ++static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id) + { + struct wm97xx *wm = (struct wm97xx *) dev_id; + disable_irq(wm->pen_irq); +@@ -428,15 +429,15 @@ static int wm97xx_init_pen_irq(struct wm97xx *wm) + { + u16 reg; + +- INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker, wm); +- if ((wm->pen_irq_workq = ++ INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker); ++ if ((wm->pen_irq_workq = + create_singlethread_workqueue("kwm97pen")) == NULL) { + err("could not create pen irq work queue"); + wm->pen_irq = 0; + return -EINVAL; + } + +- if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, SA_SHIRQ, "wm97xx-pen", wm)) { ++ if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, IRQF_SHARED, "wm97xx-pen", wm)) { + err("could not register codec pen down interrupt, will poll for pen down"); + destroy_workqueue(wm->pen_irq_workq); + wm->pen_irq = 0; +diff --git a/include/linux/wm97xx.h b/include/linux/wm97xx.h +index b1c1740..a9bd57e 100644 +--- a/include/linux/wm97xx.h ++++ b/include/linux/wm97xx.h +@@ -243,7 +243,7 @@ struct wm97xx { + u16 dig_save[3]; /* saved during aux reading */ + struct wm97xx_codec_drv *codec; /* attached codec driver*/ + struct input_dev* input_dev; /* touchscreen input device */ +- ac97_t *ac97; /* ALSA codec access */ ++ struct snd_ac97 *ac97; /* ALSA codec access */ + struct device *dev; /* ALSA device */ + struct device *battery_dev; + struct device *touch_dev; diff --git a/packages/linux/linux-rp-2.6.23/wm97xx-lg13-r0.patch b/packages/linux/linux-rp-2.6.23/wm97xx-lg13-r0.patch new file mode 100644 index 0000000000..c918c5daff --- /dev/null +++ b/packages/linux/linux-rp-2.6.23/wm97xx-lg13-r0.patch @@ -0,0 +1,2899 @@ +Index: linux-2.6.17/drivers/input/touchscreen/Kconfig +=================================================================== +--- linux-2.6.17.orig/drivers/input/touchscreen/Kconfig 2006-09-19 20:35:35.060495500 +0200 ++++ linux-2.6.17/drivers/input/touchscreen/Kconfig 2006-09-19 20:36:47.965051750 +0200 +@@ -121,4 +121,57 @@ config TOUCHSCREEN_TSC2101 + To compile this driver as a module, choose M here: the + module will be called ads7846_ts. + ++config TOUCHSCREEN_WM97XX ++ tristate "Support for WM97xx AC97 touchscreen controllers" ++ depends SND_AC97_BUS ++ ++choice ++ prompt "WM97xx codec type" ++ ++config TOUCHSCREEN_WM9705 ++ bool "WM9705 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9705 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9705. ++ ++config TOUCHSCREEN_WM9712 ++ bool "WM9712 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9712 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9712. ++ ++config TOUCHSCREEN_WM9713 ++ bool "WM9713 Touchscreen interface support" ++ depends on TOUCHSCREEN_WM97XX ++ help ++ Say Y here if you have the wm9713 touchscreen. ++ ++ If unsure, say N. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called wm9713. ++ ++endchoice ++ ++config TOUCHSCREEN_WM97XX_PXA ++ tristate "WM97xx PXA accelerated touch" ++ depends on TOUCHSCREEN_WM97XX && ARCH_PXA ++ help ++ Say Y here for continuous mode touch on the PXA ++ ++ If unsure, say N ++ ++ To compile this driver as a module, choose M here: the ++ module will be called pxa-wm97xx ++ + endif +Index: linux-2.6.17/drivers/input/touchscreen/Makefile +=================================================================== +--- linux-2.6.17.orig/drivers/input/touchscreen/Makefile 2006-09-19 20:35:35.072496250 +0200 ++++ linux-2.6.17/drivers/input/touchscreen/Makefile 2006-09-19 20:37:40.540337500 +0200 +@@ -4,6 +4,8 @@ + + # Each configuration option enables a list of files. + ++wm97xx-ts-objs := wm97xx-core.o ++ + obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o + obj-$(CONFIG_TOUCHSCREEN_BITSY) += h3600_ts_input.o + obj-$(CONFIG_TOUCHSCREEN_CORGI) += corgi_ts.o +@@ -13,3 +15,16 @@ obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtou + obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o + obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o + obj-$(CONFIG_TOUCHSCREEN_TSC2101) += tsc2101_ts.o ++obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o ++obj-$(CONFIG_TOUCHSCREEN_WM97XX_PXA) += pxa-wm97xx.o ++ ++ifeq ($(CONFIG_TOUCHSCREEN_WM9713),y) ++wm97xx-ts-objs += wm9713.o ++endif ++ ++ifeq ($(CONFIG_TOUCHSCREEN_WM9712),y) ++wm97xx-ts-objs += wm9712.o ++endif ++ifeq ($(CONFIG_TOUCHSCREEN_WM9705),y) ++wm97xx-ts-objs += wm9705.o ++endif +Index: linux-2.6.17/drivers/input/touchscreen/pxa-wm97xx.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/pxa-wm97xx.c 2006-09-19 20:36:47.965051750 +0200 +@@ -0,0 +1,289 @@ ++/* ++ * pxa-wm97xx.c -- pxa-wm97xx Continuous Touch screen driver for ++ * Wolfson WM97xx AC97 Codecs. ++ * ++ * Copyright 2004 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Notes: ++ * This is a wm97xx extended touch driver to capture touch ++ * data in a continuous manner on the Intel XScale archictecture ++ * ++ * Features: ++ * - codecs supported:- WM9705, WM9712, WM9713 ++ * - processors supported:- Intel XScale PXA25x, PXA26x, PXA27x ++ * ++ * Revision history ++ * 18th Aug 2004 Initial version. ++ * 26th Jul 2005 Improved continous read back and added FIFO flushing. ++ * 06th Sep 2005 Mike Arthur <linux@wolfsonmicro.com> ++ * Moved to using the wm97xx bus ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/irq.h> ++#include <linux/wm97xx.h> ++#include <asm/io.h> ++#include <asm/arch/pxa-regs.h> ++ ++#define VERSION "0.13" ++ ++struct continuous { ++ u16 id; /* codec id */ ++ u8 code; /* continuous code */ ++ u8 reads; /* number of coord reads per read cycle */ ++ u32 speed; /* number of coords per second */ ++}; ++ ++#define WM_READS(sp) ((sp / HZ) + 1) ++ ++static const struct continuous cinfo[] = { ++ {WM9705_ID2, 0, WM_READS(94), 94}, ++ {WM9705_ID2, 1, WM_READS(188), 188}, ++ {WM9705_ID2, 2, WM_READS(375), 375}, ++ {WM9705_ID2, 3, WM_READS(750), 750}, ++ {WM9712_ID2, 0, WM_READS(94), 94}, ++ {WM9712_ID2, 1, WM_READS(188), 188}, ++ {WM9712_ID2, 2, WM_READS(375), 375}, ++ {WM9712_ID2, 3, WM_READS(750), 750}, ++ {WM9713_ID2, 0, WM_READS(94), 94}, ++ {WM9713_ID2, 1, WM_READS(120), 120}, ++ {WM9713_ID2, 2, WM_READS(154), 154}, ++ {WM9713_ID2, 3, WM_READS(188), 188}, ++}; ++ ++/* continuous speed index */ ++static int sp_idx = 0; ++static u16 last = 0, tries = 0; ++ ++/* ++ * Pen sampling frequency (Hz) in continuous mode. ++ */ ++static int cont_rate = 200; ++module_param(cont_rate, int, 0); ++MODULE_PARM_DESC(cont_rate, "Sampling rate in continuous mode (Hz)"); ++ ++/* ++ * Pen down detection. ++ * ++ * This driver can either poll or use an interrupt to indicate a pen down ++ * event. If the irq request fails then it will fall back to polling mode. ++ */ ++static int pen_int = 1; ++module_param(pen_int, int, 0); ++MODULE_PARM_DESC(pen_int, "Pen down detection (1 = interrupt, 0 = polling)"); ++ ++/* ++ * Pressure readback. ++ * ++ * Set to 1 to read back pen down pressure ++ */ ++static int pressure = 0; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Pressure readback (1 = pressure, 0 = no pressure)"); ++ ++/* ++ * AC97 touch data slot. ++ * ++ * Touch screen readback data ac97 slot ++ */ ++static int ac97_touch_slot = 5; ++module_param(ac97_touch_slot, int, 0); ++MODULE_PARM_DESC(ac97_touch_slot, "Touch screen data slot AC97 number"); ++ ++ ++/* flush AC97 slot 5 FIFO on pxa machines */ ++#ifdef CONFIG_PXA27x ++void wm97xx_acc_pen_up (struct wm97xx* wm) ++{ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ ++ while (MISR & (1 << 2)) ++ MODR; ++} ++#else ++void wm97xx_acc_pen_up (struct wm97xx* wm) ++{ ++ int count = 16; ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ ++ while (count < 16) { ++ MODR; ++ count--; ++ } ++} ++#endif ++ ++int wm97xx_acc_pen_down (struct wm97xx* wm) ++{ ++ u16 x, y, p = 0x100 | WM97XX_ADCSEL_PRES; ++ int reads = 0; ++ ++ /* data is never immediately available after pen down irq */ ++ set_current_state(TASK_INTERRUPTIBLE); ++ schedule_timeout(1); ++ ++ if (tries > 5){ ++ tries = 0; ++ return RC_PENUP; ++ } ++ ++ x = MODR; ++ if (x == last) { ++ tries++; ++ return RC_AGAIN; ++ } ++ last = x; ++ do { ++ if (reads) ++ x= MODR; ++ y= MODR; ++ if (pressure) ++ p = MODR; ++ ++ /* are samples valid */ ++ if ((x & 0x7000) != WM97XX_ADCSEL_X || ++ (y & 0x7000) != WM97XX_ADCSEL_Y || ++ (p & 0x7000) != WM97XX_ADCSEL_PRES) ++ goto up; ++ ++ /* coordinate is good */ ++ tries = 0; ++ //printk("x %x y %x p %x\n", x,y,p); ++ input_report_abs (wm->input_dev, ABS_X, x & 0xfff); ++ input_report_abs (wm->input_dev, ABS_Y, y & 0xfff); ++ input_report_abs (wm->input_dev, ABS_PRESSURE, p & 0xfff); ++ input_sync (wm->input_dev); ++ reads++; ++ } while (reads < cinfo[sp_idx].reads); ++up: ++ return RC_PENDOWN | RC_AGAIN; ++} ++ ++int wm97xx_acc_startup(struct wm97xx* wm) ++{ ++ int idx = 0; ++ ++ /* check we have a codec */ ++ if (wm->ac97 == NULL) ++ return -ENODEV; ++ ++ /* Go you big red fire engine */ ++ for (idx = 0; idx < ARRAY_SIZE(cinfo); idx++) { ++ if (wm->id != cinfo[idx].id) ++ continue; ++ sp_idx = idx; ++ if (cont_rate <= cinfo[idx].speed) ++ break; ++ } ++ wm->acc_rate = cinfo[sp_idx].code; ++ wm->acc_slot = ac97_touch_slot; ++ printk(KERN_INFO "pxa2xx accelerated touchscreen driver, %d samples (sec)\n", ++ cinfo[sp_idx].speed); ++ ++ /* codec specific irq config */ ++ if (pen_int) { ++ switch (wm->id) { ++ case WM9705_ID2: ++ wm->pen_irq = IRQ_GPIO(4); ++ set_irq_type(IRQ_GPIO(4), IRQT_BOTHEDGE); ++ break; ++ case WM9712_ID2: ++ case WM9713_ID2: ++ /* enable pen down interrupt */ ++ /* use PEN_DOWN GPIO 13 to assert IRQ on GPIO line 2 */ ++ wm->pen_irq = MAINSTONE_AC97_IRQ; ++ wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, ++ WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_STICKY, WM97XX_GPIO_WAKE); ++ wm97xx_config_gpio(wm, WM97XX_GPIO_2, WM97XX_GPIO_OUT, ++ WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_NOTSTICKY, WM97XX_GPIO_NOWAKE); ++ break; ++ default: ++ printk(KERN_WARNING "pen down irq not supported on this device\n"); ++ pen_int = 0; ++ break; ++ } ++ } ++ ++ return 0; ++} ++ ++void wm97xx_acc_shutdown(struct wm97xx* wm) ++{ ++ /* codec specific deconfig */ ++ if (pen_int) { ++ switch (wm->id & 0xffff) { ++ case WM9705_ID2: ++ wm->pen_irq = 0; ++ break; ++ case WM9712_ID2: ++ case WM9713_ID2: ++ /* disable interrupt */ ++ wm->pen_irq = 0; ++ break; ++ } ++ } ++} ++ ++static struct wm97xx_mach_ops pxa_mach_ops = { ++ .acc_enabled = 1, ++ .acc_pen_up = wm97xx_acc_pen_up, ++ .acc_pen_down = wm97xx_acc_pen_down, ++ .acc_startup = wm97xx_acc_startup, ++ .acc_shutdown = wm97xx_acc_shutdown, ++}; ++ ++int pxa_wm97xx_probe(struct device *dev) ++{ ++ struct wm97xx *wm = dev->driver_data; ++ return wm97xx_register_mach_ops (wm, &pxa_mach_ops); ++} ++ ++int pxa_wm97xx_remove(struct device *dev) ++{ ++ struct wm97xx *wm = dev->driver_data; ++ wm97xx_unregister_mach_ops (wm); ++ return 0; ++} ++ ++static struct device_driver pxa_wm97xx_driver = { ++ .name = "wm97xx-touchscreen", ++ .bus = &wm97xx_bus_type, ++ .owner = THIS_MODULE, ++ .probe = pxa_wm97xx_probe, ++ .remove = pxa_wm97xx_remove ++}; ++ ++static int __init pxa_wm97xx_init(void) ++{ ++ return driver_register(&pxa_wm97xx_driver); ++} ++ ++static void __exit pxa_wm97xx_exit(void) ++{ ++ driver_unregister(&pxa_wm97xx_driver); ++} ++ ++module_init(pxa_wm97xx_init); ++module_exit(pxa_wm97xx_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood <liam.girdwood@wolfsonmicro.com>"); ++MODULE_DESCRIPTION("wm97xx continuous touch driver for pxa2xx"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm9705.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm9705.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,360 @@ ++/* ++ * wm9705.c -- Codec driver for Wolfson WM9705 AC97 Codec. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9705_VERSION "0.62" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 4; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Pen detect comparator threshold. ++ * ++ * 0 to Vmid in 15 steps, 0 = use zero power comparator with Vmid threshold ++ * i.e. 1 = Vmid/15 threshold ++ * 15 = Vmid/1 threshold ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down events. ++ */ ++static int pdd = 8; ++module_param(pdd, int, 0); ++MODULE_PARM_DESC(pdd, "Set pen detect comparator threshold"); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9705 ++ */ ++static void init_wm9705_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0, dig2 = WM97XX_RPR; ++ ++ /* ++ * mute VIDEO and AUX as they share X and Y touchscreen ++ * inputs on the WM9705 ++ */ ++ wm97xx_reg_write(wm, AC97_AUX, 0x8000); ++ wm97xx_reg_write(wm, AC97_VIDEO, 0x8000); ++ ++ /* touchpanel pressure current*/ ++ if (pil == 2) { ++ dig2 |= WM9705_PIL; ++ dbg("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ dbg("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* polling mode sample settling delay */ ++ if (delay!=4) { ++ if (delay < 0 || delay > 15) { ++ dbg("supplied delay out of range."); ++ delay = 4; ++ } ++ } ++ dig1 &= 0xff0f; ++ dig1 |= WM97XX_DELAY(delay); ++ dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ ++ /* WM9705 pdd */ ++ dig2 |= (pdd & 0x000f); ++ dbg("setting pdd to Vmid/%d", 1 - (pdd & 0x000f)); ++ ++ /* mask */ ++ dig2 |= ((mask & 0x3) << 4); ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++} ++ ++static int wm9705_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ switch(cmd) { ++ case WM97XX_DIG_START: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig[2] & ~WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9705_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9705_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9705 adc in polling mode. ++ */ ++static int wm9705_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = ((adcsel & 0x7fff) + 3) << 12; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay (delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSEL_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Sample the WM9705 touchscreen in polling mode ++ */ ++static int wm9705_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ if (pil) { ++ if ((rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9705 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9705_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2; ++ int ret = 0; ++ ++ dig1 = wm->dig[1]; ++ dig2 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | ++ WM97XX_DELAY_MASK | WM97XX_SLT_MASK); ++ dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | ++ WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | ++ WM97XX_RATE (wm->acc_rate); ++ if (pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ dig2 |= WM9705_PDEN; ++ } else { ++ dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); ++ dig2 &= ~WM9705_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++ return ret; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9705_ID2, ++ .name = "wm9705", ++ .poll_sample = wm9705_poll_sample, ++ .poll_touch = wm9705_poll_touch, ++ .acc_enable = wm9705_acc_enable, ++ .digitiser_ioctl = wm9705_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9705 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm9712.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm9712.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,464 @@ ++/* ++ * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 4th Jul 2005 Initial version. ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9712_VERSION "0.61" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set internal pull up for pen detect. ++ * ++ * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) ++ * i.e. pull up resistance = 64k Ohms / rpu. ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down event. ++ */ ++static int rpu = 3; ++module_param(rpu, int, 0); ++MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 3; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Set five_wire = 1 to use a 5 wire touchscreen. ++ * ++ * NOTE: Five wire mode does not allow for readback of pressure. ++ */ ++static int five_wire; ++module_param(five_wire, int, 0); ++MODULE_PARM_DESC(five_wire, "Set to '1' to use 5-wire touchscreen."); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * Coordinate Polling Enable. ++ * ++ * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together ++ * for every poll. ++ */ ++static int coord = 0; ++module_param(coord, int, 0); ++MODULE_PARM_DESC(coord, "Polling coordinate mode"); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9712 ++ */ ++static void init_wm9712_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0; ++ u16 dig2 = WM97XX_RPR | WM9712_RPU(1); ++ ++ /* WM9712 rpu */ ++ if (rpu) { ++ dig2 &= 0xffc0; ++ dig2 |= WM9712_RPU(rpu); ++ dbg("setting pen detect pull-up to %d Ohms",64000 / rpu); ++ } ++ ++ /* touchpanel pressure current*/ ++ if (pil == 2) { ++ dig2 |= WM9712_PIL; ++ dbg("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ dbg("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* WM9712 five wire */ ++ if (five_wire) { ++ dig2 |= WM9712_45W; ++ dbg("setting 5-wire touchscreen mode."); ++ } ++ ++ /* polling mode sample settling delay */ ++ if (delay < 0 || delay > 15) { ++ dbg("supplied delay out of range."); ++ delay = 4; ++ } ++ dig1 &= 0xff0f; ++ dig1 |= WM97XX_DELAY(delay); ++ dbg("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ ++ /* mask */ ++ dig2 |= ((mask & 0x3) << 6); ++ if (mask) { ++ u16 reg; ++ /* Set GPIO4 as Mask Pin*/ ++ reg = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, reg | WM97XX_GPIO_4); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, reg | WM97XX_GPIO_4); ++ } ++ ++ /* wait - coord mode */ ++ if(coord) ++ dig2 |= WM9712_WAIT; ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++} ++ ++static int wm9712_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ u16 dig2 = wm->dig[2]; ++ ++ switch(cmd) { ++ case WM97XX_DIG_START: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2 & ~WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9712_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9712_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9712 adc in polling mode. ++ */ ++static int wm9712_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = ((adcsel & 0x7fff) + 3) << 12; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay (delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSEL_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Read a coord from the WM9712 adc in polling mode. ++ */ ++static int wm9712_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, ++ WM97XX_COO | WM97XX_POLL | WM97XX_DELAY(delay)); ++ ++ /* wait 3 AC97 time slots + delay for conversion and read x */ ++ poll_delay(delay); ++ data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ /* read back y data */ ++ data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (pil) ++ data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ else ++ data->p = DEFAULT_PRESSURE; ++ ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ /* check we have correct sample */ ++ if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) ++ goto err; ++ if(pil && !(data->p & WM97XX_ADCSEL_PRES)) ++ goto err; ++ ++ if (!(data->x & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ return RC_VALID; ++err: ++ return RC_PENUP; ++} ++ ++/* ++ * Sample the WM9712 touchscreen in polling mode ++ */ ++static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if(coord) { ++ if((rc = wm9712_poll_coord(wm, data)) != RC_VALID) ++ return rc; ++ } else { ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ ++ if (pil && !five_wire) { ++ if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ } ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9712 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9712_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2; ++ int ret = 0; ++ ++ dig1 = wm->dig[1]; ++ dig2 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | ++ WM97XX_DELAY_MASK | WM97XX_SLT_MASK); ++ dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | ++ WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | ++ WM97XX_RATE (wm->acc_rate); ++ if (pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ dig2 |= WM9712_PDEN; ++ } else { ++ dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); ++ dig2 &= ~WM9712_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); ++ wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); ++ return 0; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9712_ID2, ++ .name = "wm9712", ++ .poll_sample = wm9712_poll_sample, ++ .poll_touch = wm9712_poll_touch, ++ .acc_enable = wm9712_acc_enable, ++ .digitiser_ioctl = wm9712_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9712 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm9713.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm9713.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,461 @@ ++/* ++ * wm9713.c -- Codec touch driver for Wolfson WM9713 AC97 Codec. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Revision history ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added pre and post sample calls. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/input.h> ++#include <linux/delay.h> ++#include <linux/bitops.h> ++#include <linux/wm97xx.h> ++ ++#define TS_NAME "wm97xx" ++#define WM9713_VERSION "0.53" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* ++ * Module parameters ++ */ ++ ++/* ++ * Set internal pull up for pen detect. ++ * ++ * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) ++ * i.e. pull up resistance = 64k Ohms / rpu. ++ * ++ * Adjust this value if you are having problems with pen detect not ++ * detecting any down event. ++ */ ++static int rpu = 1; ++module_param(rpu, int, 0); ++MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); ++ ++/* ++ * Set current used for pressure measurement. ++ * ++ * Set pil = 2 to use 400uA ++ * pil = 1 to use 200uA and ++ * pil = 0 to disable pressure measurement. ++ * ++ * This is used to increase the range of values returned by the adc ++ * when measureing touchpanel pressure. ++ */ ++static int pil = 0; ++module_param(pil, int, 0); ++MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); ++ ++/* ++ * Set threshold for pressure measurement. ++ * ++ * Pen down pressure below threshold is ignored. ++ */ ++static int pressure = DEFAULT_PRESSURE & 0xfff; ++module_param(pressure, int, 0); ++MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); ++ ++/* ++ * Set adc sample delay. ++ * ++ * For accurate touchpanel measurements, some settling time may be ++ * required between the switch matrix applying a voltage across the ++ * touchpanel plate and the ADC sampling the signal. ++ * ++ * This delay can be set by setting delay = n, where n is the array ++ * position of the delay in the array delay_table below. ++ * Long delays > 1ms are supported for completeness, but are not ++ * recommended. ++ */ ++static int delay = 4; ++module_param(delay, int, 0); ++MODULE_PARM_DESC(delay, "Set adc sample delay."); ++ ++/* ++ * Set adc mask function. ++ * ++ * Sources of glitch noise, such as signals driving an LCD display, may feed ++ * through to the touch screen plates and affect measurement accuracy. In ++ * order to minimise this, a signal may be applied to the MASK pin to delay or ++ * synchronise the sampling. ++ * ++ * 0 = No delay or sync ++ * 1 = High on pin stops conversions ++ * 2 = Edge triggered, edge on pin delays conversion by delay param (above) ++ * 3 = Edge triggered, edge on pin starts conversion after delay param ++ */ ++static int mask = 0; ++module_param(mask, int, 0); ++MODULE_PARM_DESC(mask, "Set adc mask function."); ++ ++/* ++ * Coordinate Polling Enable. ++ * ++ * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together ++ * for every poll. ++ */ ++static int coord = 1; ++module_param(coord, int, 0); ++MODULE_PARM_DESC(coord, "Polling coordinate mode"); ++ ++/* ++ * ADC sample delay times in uS ++ */ ++static const int delay_table[] = { ++ 21, // 1 AC97 Link frames ++ 42, // 2 ++ 84, // 4 ++ 167, // 8 ++ 333, // 16 ++ 667, // 32 ++ 1000, // 48 ++ 1333, // 64 ++ 2000, // 96 ++ 2667, // 128 ++ 3333, // 160 ++ 4000, // 192 ++ 4667, // 224 ++ 5333, // 256 ++ 6000, // 288 ++ 0 // No delay, switch matrix always on ++}; ++ ++/* ++ * Delay after issuing a POLL command. ++ * ++ * The delay is 3 AC97 link frames + the touchpanel settling delay ++ */ ++static inline void poll_delay(int d) ++{ ++ udelay (3 * AC97_LINK_FRAME + delay_table [d]); ++} ++ ++/* ++ * set up the physical settings of the WM9713 ++ */ ++static void init_wm9713_phy(struct wm97xx* wm) ++{ ++ u16 dig1 = 0, dig2, dig3; ++ ++ /* default values */ ++ dig2 = WM97XX_DELAY(4) | WM97XX_SLT(5); ++ dig3= WM9712_RPU(1); ++ ++ /* rpu */ ++ if (rpu) { ++ dig3 &= 0xffc0; ++ dig3 |= WM9712_RPU(rpu); ++ info("setting pen detect pull-up to %d Ohms",64000 / rpu); ++ } ++ ++ /* touchpanel pressure */ ++ if (pil == 2) { ++ dig3 |= WM9712_PIL; ++ info("setting pressure measurement current to 400uA."); ++ } else if (pil) ++ info ("setting pressure measurement current to 200uA."); ++ if(!pil) ++ pressure = 0; ++ ++ /* sample settling delay */ ++ if (delay < 0 || delay > 15) { ++ info ("supplied delay out of range."); ++ delay = 4; ++ info("setting adc sample delay to %d u Secs.", delay_table[delay]); ++ } ++ dig2 &= 0xff0f; ++ dig2 |= WM97XX_DELAY(delay); ++ ++ /* mask */ ++ dig3 |= ((mask & 0x3) << 4); ++ if(coord) ++ dig3 |= WM9713_WAIT; ++ ++ wm->misc = wm97xx_reg_read(wm, 0x5a); ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, 0x0); ++} ++ ++static int wm9713_digitiser_ioctl(struct wm97xx* wm, int cmd) ++{ ++ u16 val = 0; ++ ++ switch(cmd){ ++ case WM97XX_DIG_START: ++ val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, val & 0x7fff); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] | WM97XX_PRP_DET_DIG); ++ wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ ++ break; ++ case WM97XX_DIG_STOP: ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] & ~WM97XX_PRP_DET_DIG); ++ val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, val | 0x8000); ++ break; ++ case WM97XX_AUX_PREPARE: ++ memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, 0); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, 0); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, WM97XX_PRP_DET_DIG); ++ break; ++ case WM97XX_DIG_RESTORE: ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig_save[0]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig_save[1]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig_save[2]); ++ break; ++ case WM97XX_PHY_INIT: ++ init_wm9713_phy(wm); ++ break; ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static inline int is_pden (struct wm97xx* wm) ++{ ++ return wm->dig[2] & WM9713_PDEN; ++} ++ ++/* ++ * Read a sample from the WM9713 adc in polling mode. ++ */ ++static int wm9713_poll_sample (struct wm97xx* wm, int adcsel, int *sample) ++{ ++ u16 dig1; ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ if (adcsel & 0x8000) ++ adcsel = 1 << ((adcsel & 0x7fff) + 3); ++ ++ dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(adcsel); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | adcsel |WM9713_POLL); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay(delay); ++ ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ *sample =wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(adcsel); ++ ++ /* check we have correct sample */ ++ if ((*sample & WM97XX_ADCSRC_MASK) != ffs(adcsel >> 1) << 12) { ++ dbg ("adc wrong sample, read %x got %x", adcsel, ++ *sample & WM97XX_ADCSRC_MASK); ++ return RC_PENUP; ++ } ++ ++ if (!(*sample & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ ++ return RC_VALID; ++} ++ ++/* ++ * Read a coordinate from the WM9713 adc in polling mode. ++ */ ++static int wm9713_poll_coord (struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ u16 dig1; ++ int timeout = 5 * delay; ++ ++ if (!wm->pen_probably_down) { ++ u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (!(data & WM97XX_PEN_DOWN)) ++ return RC_PENUP; ++ wm->pen_probably_down = 1; ++ } ++ ++ /* set up digitiser */ ++ dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ if(pil) ++ dig1 |= WM97XX_ADCSEL_PRES; ++ ++ if (wm->mach_ops && wm->mach_ops->pre_sample) ++ wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | WM9713_POLL | WM9713_COO); ++ ++ /* wait 3 AC97 time slots + delay for conversion */ ++ poll_delay(delay); ++ data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ /* wait for POLL to go low */ ++ while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && timeout) { ++ udelay(AC97_LINK_FRAME); ++ timeout--; ++ } ++ ++ if (timeout <= 0) { ++ /* If PDEN is set, we can get a timeout when pen goes up */ ++ if (is_pden(wm)) ++ wm->pen_probably_down = 0; ++ else ++ dbg ("adc sample timeout"); ++ return RC_PENUP; ++ } ++ ++ /* read back data */ ++ data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ if (pil) ++ data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); ++ else ++ data->p = DEFAULT_PRESSURE; ++ ++ if (wm->mach_ops && wm->mach_ops->post_sample) ++ wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); ++ ++ /* check we have correct sample */ ++ if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) ++ goto err; ++ if(pil && !(data->p & WM97XX_ADCSEL_PRES)) ++ goto err; ++ ++ if (!(data->x & WM97XX_PEN_DOWN)) { ++ wm->pen_probably_down = 0; ++ return RC_PENUP; ++ } ++ return RC_VALID; ++err: ++ return RC_PENUP; ++} ++ ++/* ++ * Sample the WM9713 touchscreen in polling mode ++ */ ++static int wm9713_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) ++{ ++ int rc; ++ ++ if(coord) { ++ if((rc = wm9713_poll_coord(wm, data)) != RC_VALID) ++ return rc; ++ } else { ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_X, &data->x)) != RC_VALID) ++ return rc; ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_Y, &data->y)) != RC_VALID) ++ return rc; ++ if (pil) { ++ if ((rc = wm9713_poll_sample(wm, WM9713_ADCSEL_PRES, &data->p)) != RC_VALID) ++ return rc; ++ } else ++ data->p = DEFAULT_PRESSURE; ++ } ++ return RC_VALID; ++} ++ ++/* ++ * Enable WM9713 continuous mode, i.e. touch data is streamed across an AC97 slot ++ */ ++static int wm9713_acc_enable (struct wm97xx* wm, int enable) ++{ ++ u16 dig1, dig2, dig3; ++ int ret = 0; ++ ++ dig1 = wm->dig[0]; ++ dig2 = wm->dig[1]; ++ dig3 = wm->dig[2]; ++ ++ if (enable) { ++ /* continous mode */ ++ if (wm->mach_ops->acc_startup && ++ (ret = wm->mach_ops->acc_startup(wm)) < 0) ++ return ret; ++ ++ dig1 &= ~WM9713_ADCSEL_MASK; ++ dig1 |= WM9713_CTC | WM9713_COO | WM9713_ADCSEL_X | WM9713_ADCSEL_Y; ++ if (pil) ++ dig1 |= WM9713_ADCSEL_PRES; ++ dig2 &= ~(WM97XX_DELAY_MASK | WM97XX_SLT_MASK | WM97XX_CM_RATE_MASK); ++ dig2 |= WM97XX_SLEN | WM97XX_DELAY (delay) | ++ WM97XX_SLT (wm->acc_slot) | WM97XX_RATE (wm->acc_rate); ++ dig3 |= WM9713_PDEN; ++ } else { ++ dig1 &= ~(WM9713_CTC | WM9713_COO); ++ dig2 &= ~WM97XX_SLEN; ++ dig3 &= ~WM9713_PDEN; ++ if (wm->mach_ops->acc_shutdown) ++ wm->mach_ops->acc_shutdown(wm); ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); ++ return ret; ++} ++ ++struct wm97xx_codec_drv wm97xx_codec = { ++ .id = WM9713_ID2, ++ .name = "wm9713", ++ .poll_sample = wm9713_poll_sample, ++ .poll_touch = wm9713_poll_touch, ++ .acc_enable = wm9713_acc_enable, ++ .digitiser_ioctl = wm9713_digitiser_ioctl, ++}; ++ ++EXPORT_SYMBOL_GPL(wm97xx_codec); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM9713 Touch Screen Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/drivers/input/touchscreen/wm97xx-core.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/drivers/input/touchscreen/wm97xx-core.c 2006-09-19 20:36:47.969052000 +0200 +@@ -0,0 +1,912 @@ ++/* ++ * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 ++ * and WM9713 AC97 Codecs. ++ * ++ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. ++ * Author: Liam Girdwood ++ * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com ++ * Parts Copyright : Ian Molton <spyro@f2s.com> ++ * Andrew Zabolotny <zap@homelink.ru> ++ * Russell King <rmk@arm.linux.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Notes: ++ * ++ * Features: ++ * - supports WM9705, WM9712, WM9713 ++ * - polling mode ++ * - continuous mode (arch-dependent) ++ * - adjustable rpu/dpp settings ++ * - adjustable pressure current ++ * - adjustable sample settle delay ++ * - 4 and 5 wire touchscreens (5 wire is WM9712 only) ++ * - pen down detection ++ * - battery monitor ++ * - sample AUX adc's ++ * - power management ++ * - codec GPIO ++ * - codec event notification ++ * Todo ++ * - Support for async sampling control for noisy LCD's. ++ * ++ * Revision history ++ * 7th May 2003 Initial version. ++ * 6th June 2003 Added non module support and AC97 registration. ++ * 18th June 2003 Added AUX adc sampling. ++ * 23rd June 2003 Did some minimal reformatting, fixed a couple of ++ * codec_mutexing bugs and noted a race to fix. ++ * 24th June 2003 Added power management and fixed race condition. ++ * 10th July 2003 Changed to a misc device. ++ * 31st July 2003 Moved TS_EVENT and TS_CAL to wm97xx.h ++ * 8th Aug 2003 Added option for read() calling wm97xx_sample_touch() ++ * because some ac97_read/ac_97_write call schedule() ++ * 7th Nov 2003 Added Input touch event interface, stanley.cai@intel.com ++ * 13th Nov 2003 Removed h3600 touch interface, added interrupt based ++ * pen down notification and implemented continous mode ++ * on XScale arch. ++ * 16th Nov 2003 Ian Molton <spyro@f2s.com> ++ * Modified so that it suits the new 2.6 driver model. ++ * 25th Jan 2004 Andrew Zabolotny <zap@homelink.ru> ++ * Implemented IRQ-driven pen down detection, implemented ++ * the private API meant to be exposed to platform-specific ++ * drivers, reorganized the driver so that it supports ++ * an arbitrary number of devices. ++ * 1st Feb 2004 Moved continuous mode handling to a separate ++ * architecture-dependent file. For now only PXA ++ * built-in AC97 controller is supported (pxa-ac97-wm97xx.c). ++ * 11th Feb 2004 Reduced CPU usage by keeping a cached copy of both ++ * digitizer registers instead of reading them every time. ++ * A reorganization of the whole code for better ++ * error handling. ++ * 17th Apr 2004 Added BMON support. ++ * 17th Nov 2004 Added codec GPIO, codec event handling (real and virtual ++ * GPIOs) and 2.6 power management. ++ * 29th Nov 2004 Added WM9713 support. ++ * 4th Jul 2005 Moved codec specific code out to seperate files. ++ * 6th Sep 2006 Mike Arthur <linux@wolfsonmicro.com> ++ * Added bus interface. ++ */ ++ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++#include <linux/string.h> ++#include <linux/proc_fs.h> ++#include <linux/pm.h> ++#include <linux/interrupt.h> ++#include <linux/bitops.h> ++#include <linux/workqueue.h> ++#include <linux/device.h> ++#include <linux/wm97xx.h> ++#include <asm/uaccess.h> ++#include <asm/io.h> ++ ++#define TS_NAME "wm97xx" ++#define WM_CORE_VERSION "0.63" ++#define DEFAULT_PRESSURE 0xb0c0 ++ ++/* ++ * WM97xx - enable/disable AUX ADC sysfs ++ */ ++static int aux_sys = 1; ++module_param(aux_sys, int, 0); ++MODULE_PARM_DESC(aux_sys, "enable AUX ADC sysfs entries"); ++ ++/* ++ * WM97xx - enable/disable codec status sysfs ++ */ ++static int status_sys = 1; ++module_param(status_sys, int, 0); ++MODULE_PARM_DESC(status_sys, "enable codec status sysfs entries"); ++ ++/* ++ * Touchscreen absolute values ++ * ++ * These parameters are used to help the input layer discard out of ++ * range readings and reduce jitter etc. ++ * ++ * o min, max:- indicate the min and max values your touch screen returns ++ * o fuzz:- use a higher number to reduce jitter ++ * ++ * The default values correspond to Mainstone II in QVGA mode ++ * ++ * Please read ++ * Documentation/input/input-programming.txt for more details. ++ */ ++ ++static int abs_x[3] = {350,3900,5}; ++module_param_array(abs_x, int, NULL, 0); ++MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); ++ ++static int abs_y[3] = {320,3750,40}; ++module_param_array(abs_y, int, NULL, 0); ++MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); ++ ++static int abs_p[3] = {0,150,4}; ++module_param_array(abs_p, int, NULL, 0); ++MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz"); ++ ++/* ++ * Debug ++ */ ++#if 0 ++#define dbg(format, arg...) printk(KERN_DEBUG TS_NAME ": " format "\n" , ## arg) ++#else ++#define dbg(format, arg...) ++#endif ++#define err(format, arg...) printk(KERN_ERR TS_NAME ": " format "\n" , ## arg) ++#define info(format, arg...) printk(KERN_INFO TS_NAME ": " format "\n" , ## arg) ++#define warn(format, arg...) printk(KERN_WARNING TS_NAME ": " format "\n" , ## arg) ++ ++/* codec AC97 IO access */ ++int wm97xx_reg_read(struct wm97xx *wm, u16 reg) ++{ ++ if (wm->ac97) ++ return wm->ac97->bus->ops->read(wm->ac97, reg); ++ else ++ return -1; ++} ++ ++void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val) ++{ ++ /* cache digitiser registers */ ++ if(reg >= AC97_WM9713_DIG1 && reg <= AC97_WM9713_DIG3) ++ wm->dig[(reg - AC97_WM9713_DIG1) >> 1] = val; ++ ++ /* cache gpio regs */ ++ if(reg >= AC97_GPIO_CFG && reg <= AC97_MISC_AFE) ++ wm->gpio[(reg - AC97_GPIO_CFG) >> 1] = val; ++ ++ /* wm9713 irq reg */ ++ if(reg == 0x5a) ++ wm->misc = val; ++ ++ if (wm->ac97) ++ wm->ac97->bus->ops->write(wm->ac97, reg, val); ++} ++ ++ ++/** ++ * wm97xx_read_aux_adc - Read the aux adc. ++ * @wm: wm97xx device. ++ * @adcsel: codec ADC to be read ++ * ++ * Reads the selected AUX ADC. ++ */ ++ ++int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel) ++{ ++ int power_adc = 0, auxval; ++ u16 power = 0; ++ ++ /* get codec */ ++ mutex_lock(&wm->codec_mutex); ++ ++ /* When the touchscreen is not in use, we may have to power up the AUX ADC ++ * before we can use sample the AUX inputs-> ++ */ ++ if (wm->id == WM9713_ID2 && ++ (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) { ++ power_adc = 1; ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff); ++ } ++ ++ /* Prepare the codec for AUX reading */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_AUX_PREPARE); ++ ++ /* Turn polling mode on to read AUX ADC */ ++ wm->pen_probably_down = 1; ++ wm->codec->poll_sample(wm, adcsel, &auxval); ++ ++ if (power_adc) ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000); ++ ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_RESTORE); ++ ++ wm->pen_probably_down = 0; ++ ++ mutex_unlock(&wm->codec_mutex); ++ return auxval & 0xfff; ++} ++ ++#define WM97XX_AUX_ATTR(name,input) \ ++static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf) \ ++{ \ ++ struct wm97xx *wm = (struct wm97xx*)dev->driver_data; \ ++ return sprintf(buf, "%d\n", wm97xx_read_aux_adc(wm, input)); \ ++} \ ++static DEVICE_ATTR(name, 0444, name##_show, NULL) ++ ++WM97XX_AUX_ATTR(aux1, WM97XX_AUX_ID1); ++WM97XX_AUX_ATTR(aux2, WM97XX_AUX_ID2); ++WM97XX_AUX_ATTR(aux3, WM97XX_AUX_ID3); ++WM97XX_AUX_ATTR(aux4, WM97XX_AUX_ID4); ++ ++#define WM97XX_STATUS_ATTR(name) \ ++static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf) \ ++{ \ ++ struct wm97xx *wm = (struct wm97xx*)dev->driver_data; \ ++ return sprintf(buf, "%d\n", wm97xx_reg_read(wm, AC97_GPIO_STATUS)); \ ++} \ ++static DEVICE_ATTR(name, 0444, name##_show, NULL) ++ ++WM97XX_STATUS_ATTR(gpio); ++ ++static int wm97xx_sys_add(struct device *dev) ++{ ++ if (aux_sys) { ++ device_create_file(dev, &dev_attr_aux1); ++ device_create_file(dev, &dev_attr_aux2); ++ device_create_file(dev, &dev_attr_aux3); ++ device_create_file(dev, &dev_attr_aux4); ++ } ++ if (status_sys) ++ device_create_file(dev, &dev_attr_gpio); ++ return 0; ++} ++ ++static void wm97xx_sys_remove(struct device *dev) ++{ ++ if (status_sys) ++ device_remove_file(dev, &dev_attr_gpio); ++ if (aux_sys) { ++ device_remove_file(dev, &dev_attr_aux1); ++ device_remove_file(dev, &dev_attr_aux2); ++ device_remove_file(dev, &dev_attr_aux3); ++ device_remove_file(dev, &dev_attr_aux4); ++ } ++} ++ ++/** ++ * wm97xx_get_gpio - Get the status of a codec GPIO. ++ * @wm: wm97xx device. ++ * @gpio: gpio ++ * ++ * Get the status of a codec GPIO pin ++ */ ++ ++wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio) ++{ ++ u16 status; ++ wm97xx_gpio_status_t ret; ++ ++ mutex_lock(&wm->codec_mutex); ++ status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ ++ if (status & gpio) ++ ret = WM97XX_GPIO_HIGH; ++ else ++ ret = WM97XX_GPIO_LOW; ++ ++ mutex_unlock(&wm->codec_mutex); ++ return ret; ++} ++ ++/** ++ * wm97xx_set_gpio - Set the status of a codec GPIO. ++ * @wm: wm97xx device. ++ * @gpio: gpio ++ * ++ * ++ * Set the status of a codec GPIO pin ++ */ ++ ++void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_status_t status) ++{ ++ u16 reg; ++ ++ mutex_lock(&wm->codec_mutex); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ ++ if (status & WM97XX_GPIO_HIGH) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ if (wm->id == WM9712_ID2) ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg << 1); ++ else ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg); ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++/* ++ * Codec GPIO pin configuration, this set's pin direction, polarity, ++ * stickyness and wake up. ++ */ ++void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, wm97xx_gpio_dir_t dir, ++ wm97xx_gpio_pol_t pol, wm97xx_gpio_sticky_t sticky, ++ wm97xx_gpio_wake_t wake) ++{ ++ u16 reg; ++ ++ mutex_lock(&wm->codec_mutex); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ ++ if (pol == WM97XX_GPIO_POL_HIGH) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_STICKY); ++ ++ if (sticky == WM97XX_GPIO_STICKY) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); ++ ++ if (wake == WM97XX_GPIO_WAKE) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, reg); ++ reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ ++ if (dir == WM97XX_GPIO_IN) ++ reg |= gpio; ++ else ++ reg &= ~gpio; ++ ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, reg); ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++/* ++ * Handle a pen down interrupt. ++ */ ++static void wm97xx_pen_irq_worker(void *ptr) ++{ ++ struct wm97xx *wm = (struct wm97xx *) ptr; ++ ++ /* do we need to enable the touch panel reader */ ++ if (wm->id == WM9705_ID2) { ++ if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & WM97XX_PEN_DOWN) ++ wm->pen_is_down = 1; ++ else ++ wm->pen_is_down = 0; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } else { ++ u16 status, pol; ++ mutex_lock(&wm->codec_mutex); ++ status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ pol = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ ++ if (WM97XX_GPIO_13 & pol & status) { ++ wm->pen_is_down = 1; ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol & ~WM97XX_GPIO_13); ++ } else { ++ wm->pen_is_down = 0; ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol | WM97XX_GPIO_13); ++ } ++ ++ if (wm->id == WM9712_ID2) ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, (status & ~WM97XX_GPIO_13) << 1); ++ else ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, status & ~WM97XX_GPIO_13); ++ mutex_unlock(&wm->codec_mutex); ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } ++ ++ if (!wm->pen_is_down && wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->mach_ops->acc_pen_up(wm); ++ enable_irq(wm->pen_irq); ++} ++ ++/* ++ * Codec PENDOWN irq handler ++ * ++ * We have to disable the codec interrupt in the handler because it can ++ * take upto 1ms to clear the interrupt source. The interrupt is then enabled ++ * again in the slow handler when the source has been cleared. ++ */ ++static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id, ++ struct pt_regs *regs) ++{ ++ struct wm97xx *wm = (struct wm97xx *) dev_id; ++ disable_irq(wm->pen_irq); ++ queue_work(wm->pen_irq_workq, &wm->pen_event_work); ++ return IRQ_HANDLED; ++} ++ ++/* ++ * initialise pen IRQ handler and workqueue ++ */ ++static int wm97xx_init_pen_irq(struct wm97xx *wm) ++{ ++ u16 reg; ++ ++ INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker, wm); ++ if ((wm->pen_irq_workq = ++ create_singlethread_workqueue("kwm97pen")) == NULL) { ++ err("could not create pen irq work queue"); ++ wm->pen_irq = 0; ++ return -EINVAL; ++ } ++ ++ if (request_irq (wm->pen_irq, wm97xx_pen_interrupt, SA_SHIRQ, "wm97xx-pen", wm)) { ++ err("could not register codec pen down interrupt, will poll for pen down"); ++ destroy_workqueue(wm->pen_irq_workq); ++ wm->pen_irq = 0; ++ return -EINVAL; ++ } ++ ++ /* enable PEN down on wm9712/13 */ ++ if (wm->id != WM9705_ID2) { ++ reg = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, reg & 0xfffb); ++ reg = wm97xx_reg_read(wm, 0x5a); ++ wm97xx_reg_write(wm, 0x5a, reg & ~0x0001); ++ } ++ ++ return 0; ++} ++ ++/* Private struct for communication between struct wm97xx_tshread ++ * and wm97xx_read_samples */ ++struct ts_state { ++ int sleep_time; ++ int min_sleep_time; ++}; ++ ++static int wm97xx_read_samples(struct wm97xx *wm, struct ts_state *state) ++{ ++ struct wm97xx_data data; ++ int rc; ++ ++ mutex_lock(&wm->codec_mutex); ++ ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ rc = wm->mach_ops->acc_pen_down(wm); ++ else ++ rc = wm->codec->poll_touch(wm, &data); ++ ++ if (rc & RC_PENUP) { ++ if (wm->pen_is_down) { ++ wm->pen_is_down = 0; ++ dbg("pen up"); ++ input_report_abs(wm->input_dev, ABS_PRESSURE, 0); ++ input_sync(wm->input_dev); ++ } else if (!(rc & RC_AGAIN)) { ++ /* We need high frequency updates only while pen is down, ++ * the user never will be able to touch screen faster than ++ * a few times per second... On the other hand, when the ++ * user is actively working with the touchscreen we don't ++ * want to lose the quick response. So we will slowly ++ * increase sleep time after the pen is up and quicky ++ * restore it to ~one task switch when pen is down again. ++ */ ++ if (state->sleep_time < HZ / 10) ++ state->sleep_time++; ++ } ++ ++ } else if (rc & RC_VALID) { ++ dbg("pen down: x=%x:%d, y=%x:%d, pressure=%x:%d\n", ++ data.x >> 12, data.x & 0xfff, data.y >> 12, ++ data.y & 0xfff, data.p >> 12, data.p & 0xfff); ++ input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff); ++ input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff); ++ input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff); ++ input_sync(wm->input_dev); ++ wm->pen_is_down = 1; ++ state->sleep_time = state->min_sleep_time; ++ } else if (rc & RC_PENDOWN) { ++ dbg("pen down"); ++ wm->pen_is_down = 1; ++ state->sleep_time = state->min_sleep_time; ++ } ++ ++ mutex_unlock(&wm->codec_mutex); ++ return rc; ++} ++ ++/* ++* The touchscreen sample reader thread. ++*/ ++static int wm97xx_ts_read(void *data) ++{ ++ int rc; ++ struct ts_state state; ++ struct wm97xx *wm = (struct wm97xx *) data; ++ ++ /* set up thread context */ ++ wm->ts_task = current; ++ daemonize("kwm97xxts"); ++ ++ if (wm->codec == NULL) { ++ wm->ts_task = NULL; ++ printk(KERN_ERR "codec is NULL, bailing\n"); ++ } ++ ++ complete(&wm->ts_init); ++ wm->pen_is_down = 0; ++ state.min_sleep_time = HZ >= 100 ? HZ / 100 : 1; ++ if (state.min_sleep_time < 1) ++ state.min_sleep_time = 1; ++ state.sleep_time = state.min_sleep_time; ++ ++ /* touch reader loop */ ++ while (wm->ts_task) { ++ do { ++ try_to_freeze(); ++ rc = wm97xx_read_samples(wm, &state); ++ } while (rc & RC_AGAIN); ++ if (!wm->pen_is_down && wm->pen_irq) { ++ /* Nice, we don't have to poll for pen down event */ ++ wait_event_interruptible(wm->pen_irq_wait, wm->pen_is_down); ++ } else { ++ set_task_state(current, TASK_INTERRUPTIBLE); ++ schedule_timeout(state.sleep_time); ++ } ++ } ++ complete_and_exit(&wm->ts_exit, 0); ++} ++ ++/** ++ * wm97xx_ts_input_open - Open the touch screen input device. ++ * @idev: Input device to be opened. ++ * ++ * Called by the input sub system to open a wm97xx touchscreen device. ++ * Starts the touchscreen thread and touch digitiser. ++ */ ++static int wm97xx_ts_input_open(struct input_dev *idev) ++{ ++ int ret = 0; ++ struct wm97xx *wm = (struct wm97xx *) idev->private; ++ ++ mutex_lock(&wm->codec_mutex); ++ /* first time opened ? */ ++ if (wm->ts_use_count++ == 0) { ++ /* start touchscreen thread */ ++ init_completion(&wm->ts_init); ++ init_completion(&wm->ts_exit); ++ ret = kernel_thread(wm97xx_ts_read, wm, CLONE_KERNEL); ++ ++ if (ret >= 0) { ++ wait_for_completion(&wm->ts_init); ++ if (wm->ts_task == NULL) ++ ret = -EINVAL; ++ } else { ++ mutex_unlock(&wm->codec_mutex); ++ return ret; ++ } ++ ++ /* start digitiser */ ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->codec->acc_enable(wm, 1); ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_START); ++ ++ /* init pen down/up irq handling */ ++ if (wm->pen_irq) { ++ wm97xx_init_pen_irq(wm); ++ ++ if (wm->pen_irq == 0) { ++ /* we failed to get an irq for pen down events, ++ * so we resort to polling. kickstart the reader */ ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ } ++ } ++ } ++ ++ mutex_unlock(&wm->codec_mutex); ++ return 0; ++} ++ ++/** ++ * wm97xx_ts_input_close - Close the touch screen input device. ++ * @idev: Input device to be closed. ++ * ++ * Called by the input sub system to close a wm97xx touchscreen device. ++ * Kills the touchscreen thread and stops the touch digitiser. ++ */ ++ ++static void wm97xx_ts_input_close(struct input_dev *idev) ++{ ++ struct wm97xx *wm = (struct wm97xx *) idev->private; ++ ++ mutex_lock(&wm->codec_mutex); ++ if (--wm->ts_use_count == 0) { ++ /* destroy workqueues and free irqs */ ++ if (wm->pen_irq) { ++ free_irq(wm->pen_irq, wm); ++ destroy_workqueue(wm->pen_irq_workq); ++ } ++ ++ /* kill thread */ ++ if (wm->ts_task) { ++ wm->ts_task = NULL; ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ wait_for_completion(&wm->ts_exit); ++ wm->pen_is_down = 0; ++ } ++ ++ /* stop digitiser */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_DIG_STOP); ++ if (wm->mach_ops && wm->mach_ops->acc_enabled) ++ wm->codec->acc_enable(wm, 0); ++ } ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++static int wm97xx_bus_match(struct device *dev, struct device_driver *drv) ++{ ++ return !(strcmp(dev->bus_id,drv->name)); ++} ++ ++/* ++ * The AC97 audio driver will do all the Codec suspend and resume ++ * tasks. This is just for anything machine specific or extra. ++ */ ++static int wm97xx_bus_suspend(struct device *dev, pm_message_t state) ++{ ++ int ret = 0; ++ ++ if (dev->driver && dev->driver->suspend) ++ ret = dev->driver->suspend(dev, state); ++ ++ return ret; ++} ++ ++static int wm97xx_bus_resume(struct device *dev) ++{ ++ int ret = 0; ++ ++ if (dev->driver && dev->driver->resume) ++ ret = dev->driver->resume(dev); ++ ++ return ret; ++} ++ ++struct bus_type wm97xx_bus_type = { ++ .name = "wm97xx", ++ .match = wm97xx_bus_match, ++ .suspend = wm97xx_bus_suspend, ++ .resume = wm97xx_bus_resume, ++}; ++ ++static void wm97xx_release(struct device *dev) ++{ ++ kfree(dev); ++} ++ ++static int wm97xx_probe(struct device *dev) ++{ ++ struct wm97xx* wm; ++ int ret = 0, id = 0; ++ ++ if (!(wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL))) ++ return -ENOMEM; ++ mutex_init(&wm->codec_mutex); ++ ++ init_waitqueue_head(&wm->pen_irq_wait); ++ wm->dev = dev; ++ dev->driver_data = wm; ++ wm->ac97 = to_ac97_t(dev); ++ ++ /* check that we have a supported codec */ ++ if ((id = wm97xx_reg_read(wm, AC97_VENDOR_ID1)) != WM97XX_ID1) { ++ err("could not find a wm97xx, found a %x instead\n", id); ++ kfree(wm); ++ return -ENODEV; ++ } ++ ++ wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2); ++ if(wm->id != wm97xx_codec.id) { ++ err("could not find a the selected codec, please build for wm97%2x", wm->id & 0xff); ++ kfree(wm); ++ return -ENODEV; ++ } ++ ++ if((wm->input_dev = input_allocate_device()) == NULL) { ++ kfree(wm); ++ return -ENOMEM; ++ } ++ ++ /* set up touch configuration */ ++ info("detected a wm97%2x codec", wm->id & 0xff); ++ wm->input_dev->name = "wm97xx touchscreen"; ++ wm->input_dev->open = wm97xx_ts_input_open; ++ wm->input_dev->close = wm97xx_ts_input_close; ++ set_bit(EV_ABS, wm->input_dev->evbit); ++ set_bit(ABS_X, wm->input_dev->absbit); ++ set_bit(ABS_Y, wm->input_dev->absbit); ++ set_bit(ABS_PRESSURE, wm->input_dev->absbit); ++ wm->input_dev->absmax[ABS_X] = abs_x[1]; ++ wm->input_dev->absmax[ABS_Y] = abs_y[1]; ++ wm->input_dev->absmax[ABS_PRESSURE] = abs_p[1]; ++ wm->input_dev->absmin[ABS_X] = abs_x[0]; ++ wm->input_dev->absmin[ABS_Y] = abs_y[0]; ++ wm->input_dev->absmin[ABS_PRESSURE] = abs_p[0]; ++ wm->input_dev->absfuzz[ABS_X] = abs_x[2]; ++ wm->input_dev->absfuzz[ABS_Y] = abs_y[2]; ++ wm->input_dev->absfuzz[ABS_PRESSURE] = abs_p[2]; ++ wm->input_dev->private = wm; ++ wm->codec = &wm97xx_codec; ++ if((ret = input_register_device(wm->input_dev)) < 0) { ++ kfree(wm); ++ return -ENOMEM; ++ } ++ ++ if(aux_sys) ++ wm97xx_sys_add(dev); ++ ++ /* set up physical characteristics */ ++ wm->codec->digitiser_ioctl(wm, WM97XX_PHY_INIT); ++ ++ /* load gpio cache */ ++ wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); ++ wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); ++ wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); ++ wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); ++ wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); ++ wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); ++ ++ /* register our battery device */ ++ if (!(wm->battery_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { ++ ret = -ENOMEM; ++ goto batt_err; ++ } ++ wm->battery_dev->bus = &wm97xx_bus_type; ++ strcpy(wm->battery_dev->bus_id,"wm97xx-battery"); ++ wm->battery_dev->driver_data = wm; ++ wm->battery_dev->parent = dev; ++ wm->battery_dev->release = wm97xx_release; ++ if((ret = device_register(wm->battery_dev)) < 0) ++ goto batt_reg_err; ++ ++ /* register our extended touch device (for machine specific extensions) */ ++ if (!(wm->touch_dev = kzalloc(sizeof(struct device), GFP_KERNEL))) { ++ ret = -ENOMEM; ++ goto touch_err; ++ } ++ wm->touch_dev->bus = &wm97xx_bus_type; ++ strcpy(wm->touch_dev->bus_id,"wm97xx-touchscreen"); ++ wm->touch_dev->driver_data = wm; ++ wm->touch_dev->parent = dev; ++ wm->touch_dev->release = wm97xx_release; ++ if((ret = device_register(wm->touch_dev)) < 0) ++ goto touch_reg_err; ++ ++ return ret; ++ ++touch_reg_err: ++ kfree(wm->touch_dev); ++touch_err: ++ device_unregister(wm->battery_dev); ++batt_reg_err: ++ kfree(wm->battery_dev); ++batt_err: ++ input_unregister_device(wm->input_dev); ++ kfree(wm); ++ return ret; ++} ++ ++static int wm97xx_remove(struct device *dev) ++{ ++ struct wm97xx *wm = dev_get_drvdata(dev); ++ ++ /* Stop touch reader thread */ ++ if (wm->ts_task) { ++ wm->ts_task = NULL; ++ wm->pen_is_down = 1; ++ wake_up_interruptible(&wm->pen_irq_wait); ++ wait_for_completion(&wm->ts_exit); ++ } ++ device_unregister(wm->battery_dev); ++ device_unregister(wm->touch_dev); ++ input_unregister_device(wm->input_dev); ++ ++ if(aux_sys) ++ wm97xx_sys_remove(dev); ++ ++ kfree(wm); ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++int wm97xx_resume(struct device* dev) ++{ ++ struct wm97xx *wm = dev_get_drvdata(dev); ++ ++ /* restore digitiser and gpio's */ ++ if(wm->id == WM9713_ID2) { ++ wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]); ++ wm97xx_reg_write(wm, 0x5a, wm->misc); ++ if(wm->ts_use_count) { ++ u16 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff; ++ wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); ++ } ++ } ++ ++ wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]); ++ wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2]); ++ ++ wm97xx_reg_write(wm, AC97_GPIO_CFG, wm->gpio[0]); ++ wm97xx_reg_write(wm, AC97_GPIO_POLARITY, wm->gpio[1]); ++ wm97xx_reg_write(wm, AC97_GPIO_STICKY, wm->gpio[2]); ++ wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, wm->gpio[3]); ++ wm97xx_reg_write(wm, AC97_GPIO_STATUS, wm->gpio[4]); ++ wm97xx_reg_write(wm, AC97_MISC_AFE, wm->gpio[5]); ++ ++ return 0; ++} ++ ++#else ++#define wm97xx_resume NULL ++#endif ++ ++int wm97xx_register_mach_ops(struct wm97xx *wm, struct wm97xx_mach_ops *mach_ops) ++{ ++ mutex_lock(&wm->codec_mutex); ++ if(wm->mach_ops) { ++ mutex_unlock(&wm->codec_mutex); ++ return -EINVAL; ++ } ++ wm->mach_ops = mach_ops; ++ mutex_unlock(&wm->codec_mutex); ++ return 0; ++} ++ ++void wm97xx_unregister_mach_ops(struct wm97xx *wm) ++{ ++ mutex_lock(&wm->codec_mutex); ++ wm->mach_ops = NULL; ++ mutex_unlock(&wm->codec_mutex); ++} ++ ++static struct device_driver wm97xx_driver = { ++ .name = "ac97", ++ .bus = &ac97_bus_type, ++ .owner = THIS_MODULE, ++ .probe = wm97xx_probe, ++ .remove = wm97xx_remove, ++ .resume = wm97xx_resume, ++}; ++ ++static int __init wm97xx_init(void) ++{ ++ int ret; ++ ++ info("version %s liam.girdwood@wolfsonmicro.com", WM_CORE_VERSION); ++ if((ret = bus_register(&wm97xx_bus_type)) < 0) ++ return ret; ++ return driver_register(&wm97xx_driver); ++} ++ ++static void __exit wm97xx_exit(void) ++{ ++ driver_unregister(&wm97xx_driver); ++ bus_unregister(&wm97xx_bus_type); ++} ++ ++EXPORT_SYMBOL_GPL(wm97xx_get_gpio); ++EXPORT_SYMBOL_GPL(wm97xx_set_gpio); ++EXPORT_SYMBOL_GPL(wm97xx_config_gpio); ++EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc); ++EXPORT_SYMBOL_GPL(wm97xx_reg_read); ++EXPORT_SYMBOL_GPL(wm97xx_reg_write); ++EXPORT_SYMBOL_GPL(wm97xx_bus_type); ++EXPORT_SYMBOL_GPL(wm97xx_register_mach_ops); ++EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops); ++ ++module_init(wm97xx_init); ++module_exit(wm97xx_exit); ++ ++/* Module information */ ++MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); ++MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver"); ++MODULE_LICENSE("GPL"); +Index: linux-2.6.17/include/linux/wm97xx.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.17/include/linux/wm97xx.h 2006-09-19 20:36:47.973052250 +0200 +@@ -0,0 +1,291 @@ ++ ++/* ++ * Register bits and API for Wolfson WM97xx series of codecs ++ */ ++ ++#ifndef _LINUX_WM97XX_H ++#define _LINUX_WM97XX_H ++ ++#include <sound/driver.h> ++#include <sound/core.h> ++#include <sound/pcm.h> ++#include <sound/ac97_codec.h> ++#include <sound/initval.h> ++#include <linux/types.h> ++#include <linux/list.h> ++#include <linux/input.h> /* Input device layer */ ++ ++/* ++ * WM97xx AC97 Touchscreen registers ++ */ ++#define AC97_WM97XX_DIGITISER1 0x76 ++#define AC97_WM97XX_DIGITISER2 0x78 ++#define AC97_WM97XX_DIGITISER_RD 0x7a ++#define AC97_WM9713_DIG1 0x74 ++#define AC97_WM9713_DIG2 AC97_WM97XX_DIGITISER1 ++#define AC97_WM9713_DIG3 AC97_WM97XX_DIGITISER2 ++ ++/* ++ * WM97xx register bits ++ */ ++#define WM97XX_POLL 0x8000 /* initiate a polling measurement */ ++#define WM97XX_ADCSEL_X 0x1000 /* x coord measurement */ ++#define WM97XX_ADCSEL_Y 0x2000 /* y coord measurement */ ++#define WM97XX_ADCSEL_PRES 0x3000 /* pressure measurement */ ++#define WM97XX_ADCSEL_MASK 0x7000 ++#define WM97XX_COO 0x0800 /* enable coordinate mode */ ++#define WM97XX_CTC 0x0400 /* enable continuous mode */ ++#define WM97XX_CM_RATE_93 0x0000 /* 93.75Hz continuous rate */ ++#define WM97XX_CM_RATE_187 0x0100 /* 187.5Hz continuous rate */ ++#define WM97XX_CM_RATE_375 0x0200 /* 375Hz continuous rate */ ++#define WM97XX_CM_RATE_750 0x0300 /* 750Hz continuous rate */ ++#define WM97XX_CM_RATE_8K 0x00f0 /* 8kHz continuous rate */ ++#define WM97XX_CM_RATE_12K 0x01f0 /* 12kHz continuous rate */ ++#define WM97XX_CM_RATE_24K 0x02f0 /* 24kHz continuous rate */ ++#define WM97XX_CM_RATE_48K 0x03f0 /* 48kHz continuous rate */ ++#define WM97XX_CM_RATE_MASK 0x03f0 ++#define WM97XX_RATE(i) (((i & 3) << 8) | ((i & 4) ? 0xf0 : 0)) ++#define WM97XX_DELAY(i) ((i << 4) & 0x00f0) /* sample delay times */ ++#define WM97XX_DELAY_MASK 0x00f0 ++#define WM97XX_SLEN 0x0008 /* slot read back enable */ ++#define WM97XX_SLT(i) ((i - 5) & 0x7) /* touchpanel slot selection (5-11) */ ++#define WM97XX_SLT_MASK 0x0007 ++#define WM97XX_PRP_DETW 0x4000 /* pen detect on, digitiser off, wake up */ ++#define WM97XX_PRP_DET 0x8000 /* pen detect on, digitiser off, no wake up */ ++#define WM97XX_PRP_DET_DIG 0xc000 /* pen detect on, digitiser on */ ++#define WM97XX_RPR 0x2000 /* wake up on pen down */ ++#define WM97XX_PEN_DOWN 0x8000 /* pen is down */ ++#define WM97XX_ADCSRC_MASK 0x7000 /* ADC source mask */ ++ ++#define WM97XX_AUX_ID1 0x8001 ++#define WM97XX_AUX_ID2 0x8002 ++#define WM97XX_AUX_ID3 0x8003 ++#define WM97XX_AUX_ID4 0x8004 ++ ++ ++/* WM9712 Bits */ ++#define WM9712_45W 0x1000 /* set for 5-wire touchscreen */ ++#define WM9712_PDEN 0x0800 /* measure only when pen down */ ++#define WM9712_WAIT 0x0200 /* wait until adc is read before next sample */ ++#define WM9712_PIL 0x0100 /* current used for pressure measurement. set 400uA else 200uA */ ++#define WM9712_MASK_HI 0x0040 /* hi on mask pin (47) stops conversions */ ++#define WM9712_MASK_EDGE 0x0080 /* rising/falling edge on pin delays sample */ ++#define WM9712_MASK_SYNC 0x00c0 /* rising/falling edge on mask initiates sample */ ++#define WM9712_RPU(i) (i&0x3f) /* internal pull up on pen detect (64k / rpu) */ ++#define WM9712_PD(i) (0x1 << i) /* power management */ ++ ++/* WM9712 Registers */ ++#define AC97_WM9712_POWER 0x24 ++#define AC97_WM9712_REV 0x58 ++ ++/* WM9705 Bits */ ++#define WM9705_PDEN 0x1000 /* measure only when pen is down */ ++#define WM9705_PINV 0x0800 /* inverts sense of pen down output */ ++#define WM9705_BSEN 0x0400 /* BUSY flag enable, pin47 is 1 when busy */ ++#define WM9705_BINV 0x0200 /* invert BUSY (pin47) output */ ++#define WM9705_WAIT 0x0100 /* wait until adc is read before next sample */ ++#define WM9705_PIL 0x0080 /* current used for pressure measurement. set 400uA else 200uA */ ++#define WM9705_PHIZ 0x0040 /* set PHONE and PCBEEP inputs to high impedance */ ++#define WM9705_MASK_HI 0x0010 /* hi on mask stops conversions */ ++#define WM9705_MASK_EDGE 0x0020 /* rising/falling edge on pin delays sample */ ++#define WM9705_MASK_SYNC 0x0030 /* rising/falling edge on mask initiates sample */ ++#define WM9705_PDD(i) (i & 0x000f) /* pen detect comparator threshold */ ++ ++ ++/* WM9713 Bits */ ++#define WM9713_PDPOL 0x0400 /* Pen down polarity */ ++#define WM9713_POLL 0x0200 /* initiate a polling measurement */ ++#define WM9713_CTC 0x0100 /* enable continuous mode */ ++#define WM9713_ADCSEL_X 0x0002 /* X measurement */ ++#define WM9713_ADCSEL_Y 0x0004 /* Y measurement */ ++#define WM9713_ADCSEL_PRES 0x0008 /* Pressure measurement */ ++#define WM9713_COO 0x0001 /* enable coordinate mode */ ++#define WM9713_PDEN 0x0800 /* measure only when pen down */ ++#define WM9713_ADCSEL_MASK 0x00fe /* ADC selection mask */ ++#define WM9713_WAIT 0x0200 /* coordinate wait */ ++ ++/* AUX ADC ID's */ ++#define TS_COMP1 0x0 ++#define TS_COMP2 0x1 ++#define TS_BMON 0x2 ++#define TS_WIPER 0x3 ++ ++/* ID numbers */ ++#define WM97XX_ID1 0x574d ++#define WM9712_ID2 0x4c12 ++#define WM9705_ID2 0x4c05 ++#define WM9713_ID2 0x4c13 ++ ++/* Codec GPIO's */ ++#define WM97XX_MAX_GPIO 16 ++#define WM97XX_GPIO_1 (1 << 1) ++#define WM97XX_GPIO_2 (1 << 2) ++#define WM97XX_GPIO_3 (1 << 3) ++#define WM97XX_GPIO_4 (1 << 4) ++#define WM97XX_GPIO_5 (1 << 5) ++#define WM97XX_GPIO_6 (1 << 6) ++#define WM97XX_GPIO_7 (1 << 7) ++#define WM97XX_GPIO_8 (1 << 8) ++#define WM97XX_GPIO_9 (1 << 9) ++#define WM97XX_GPIO_10 (1 << 10) ++#define WM97XX_GPIO_11 (1 << 11) ++#define WM97XX_GPIO_12 (1 << 12) ++#define WM97XX_GPIO_13 (1 << 13) ++#define WM97XX_GPIO_14 (1 << 14) ++#define WM97XX_GPIO_15 (1 << 15) ++ ++ ++#define AC97_LINK_FRAME 21 /* time in uS for AC97 link frame */ ++ ++ ++/*---------------- Return codes from sample reading functions ---------------*/ ++ ++/* More data is available; call the sample gathering function again */ ++#define RC_AGAIN 0x00000001 ++/* The returned sample is valid */ ++#define RC_VALID 0x00000002 ++/* The pen is up (the first RC_VALID without RC_PENUP means pen is down) */ ++#define RC_PENUP 0x00000004 ++/* The pen is down (RC_VALID implies RC_PENDOWN, but sometimes it is helpful ++ to tell the handler that the pen is down but we don't know yet his coords, ++ so the handler should not sleep or wait for pendown irq) */ ++#define RC_PENDOWN 0x00000008 ++ ++/* The wm97xx driver provides a private API for writing platform-specific ++ * drivers. ++ */ ++ ++/* The structure used to return arch specific sampled data into */ ++struct wm97xx_data { ++ int x; ++ int y; ++ int p; ++}; ++ ++/* Codec GPIO status ++ */ ++typedef enum { ++ WM97XX_GPIO_HIGH, ++ WM97XX_GPIO_LOW ++} wm97xx_gpio_status_t; ++ ++/* Codec GPIO direction ++ */ ++typedef enum { ++ WM97XX_GPIO_IN, ++ WM97XX_GPIO_OUT ++} wm97xx_gpio_dir_t; ++ ++/* Codec GPIO polarity ++ */ ++typedef enum { ++ WM97XX_GPIO_POL_HIGH, ++ WM97XX_GPIO_POL_LOW ++} wm97xx_gpio_pol_t; ++ ++/* Codec GPIO sticky ++ */ ++typedef enum { ++ WM97XX_GPIO_STICKY, ++ WM97XX_GPIO_NOTSTICKY ++} wm97xx_gpio_sticky_t; ++ ++/* Codec GPIO wake ++ */ ++typedef enum { ++ WM97XX_GPIO_WAKE, ++ WM97XX_GPIO_NOWAKE ++} wm97xx_gpio_wake_t; ++ ++ ++/* ++ * Digitiser ioctl commands ++ */ ++#define WM97XX_DIG_START 0x1 ++#define WM97XX_DIG_STOP 0x2 ++#define WM97XX_PHY_INIT 0x3 ++#define WM97XX_AUX_PREPARE 0x4 ++#define WM97XX_DIG_RESTORE 0x5 ++ ++struct wm97xx; ++extern struct wm97xx_codec_drv wm97xx_codec; ++ ++/* ++ * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs ++ */ ++struct wm97xx_codec_drv { ++ u16 id; ++ char *name; ++ int (*poll_sample) (struct wm97xx *, int adcsel, int *sample); /* read 1 sample */ ++ int (*poll_touch) (struct wm97xx *, struct wm97xx_data *); /* read X,Y,[P] in poll */ ++ int (*digitiser_ioctl) (struct wm97xx *, int cmd); ++ int (*acc_enable) (struct wm97xx *, int enable); ++}; ++ ++ ++/* Machine specific and accelerated touch operations */ ++struct wm97xx_mach_ops { ++ ++ /* accelerated touch readback - coords are transmited on AC97 link */ ++ int acc_enabled; ++ void (*acc_pen_up) (struct wm97xx *); ++ int (*acc_pen_down) (struct wm97xx *); ++ int (*acc_startup) (struct wm97xx *); ++ void (*acc_shutdown) (struct wm97xx *); ++ ++ /* pre and post sample - can be used to minimise any analog noise */ ++ void (*pre_sample) (int); /* function to run before sampling */ ++ void (*post_sample) (int); /* function to run after sampling */ ++}; ++ ++struct wm97xx { ++ u16 dig[3], id, gpio[6], misc; /* Cached codec registers */ ++ u16 dig_save[3]; /* saved during aux reading */ ++ struct wm97xx_codec_drv *codec; /* attached codec driver*/ ++ struct input_dev* input_dev; /* touchscreen input device */ ++ ac97_t *ac97; /* ALSA codec access */ ++ struct device *dev; /* ALSA device */ ++ struct device *battery_dev; ++ struct device *touch_dev; ++ struct wm97xx_mach_ops *mach_ops; ++ struct mutex codec_mutex; ++ struct completion ts_init; ++ struct completion ts_exit; ++ struct task_struct *ts_task; ++ unsigned int pen_irq; /* Pen IRQ number in use */ ++ wait_queue_head_t pen_irq_wait; /* Pen IRQ wait queue */ ++ struct workqueue_struct *pen_irq_workq; ++ struct work_struct pen_event_work; ++ u16 acc_slot; /* AC97 slot used for acc touch data */ ++ u16 acc_rate; /* acc touch data rate */ ++ unsigned int ts_use_count; ++ unsigned pen_is_down:1; /* Pen is down */ ++ unsigned aux_waiting:1; /* aux measurement waiting */ ++ unsigned pen_probably_down:1; /* used in polling mode */ ++}; ++ ++/* Codec GPIO access (not supported on WM9705) ++ * This can be used to set/get codec GPIO and Virtual GPIO status. ++ */ ++wm97xx_gpio_status_t wm97xx_get_gpio(struct wm97xx *wm, u32 gpio); ++void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_status_t status); ++void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, ++ wm97xx_gpio_dir_t dir, ++ wm97xx_gpio_pol_t pol, ++ wm97xx_gpio_sticky_t sticky, ++ wm97xx_gpio_wake_t wake); ++ ++/* codec AC97 IO access */ ++int wm97xx_reg_read(struct wm97xx *wm, u16 reg); ++void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val); ++ ++/* aux adc readback */ ++int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel); ++ ++/* machine ops */ ++int wm97xx_register_mach_ops(struct wm97xx *, struct wm97xx_mach_ops *); ++void wm97xx_unregister_mach_ops(struct wm97xx *); ++ ++extern struct bus_type wm97xx_bus_type; ++#endif diff --git a/packages/linux/linux-rp_2.6.17.bb b/packages/linux/linux-rp_2.6.17.bb index 211c5a43cf..329cd01217 100644 --- a/packages/linux/linux-rp_2.6.17.bb +++ b/packages/linux/linux-rp_2.6.17.bb @@ -1,6 +1,6 @@ require linux-rp.inc -PR = "r35" +PR = "r37" # Handy URLs # git://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git \ diff --git a/packages/linux/linux-rp_2.6.22.bb b/packages/linux/linux-rp_2.6.22.bb index 50ee894ee9..939e630624 100644 --- a/packages/linux/linux-rp_2.6.22.bb +++ b/packages/linux/linux-rp_2.6.22.bb @@ -87,29 +87,33 @@ SRC_URI_append_collie = "\ # ${DOSRC}/collie/collie-pm-r1.patch;patch=1 \ " +#- ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \ +#- file://tmio-ohci-r6.patch;patch=1 \ +# wm97xx-lg13-r0.patch;patch=1 was adapted from $(DOSRC) to apply cleanly SRC_URI_append_tosa = "\ - ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \ ${CHSRC}/tmio-core-r4.patch;patch=1 \ file://tmio-tc6393-r8.patch;patch=1 \ - file://tmio-nand-r7.patch;patch=1 \ - file://tmio-ohci-r6.patch;patch=1 \ + file://tmio-nand-r8.patch;patch=1 \ ${CHSRC}/tmio-fb-r6.patch;patch=1 \ - file://tosa-keyboard-r18.patch;patch=1 \ + file://tmio-fb-r6-fix-r0.patch;patch=1 \ + file://tosa-keyboard-r19.patch;patch=1 \ ${DOSRC}/tosa-pxaac97-r6.patch;patch=1 \ + file://tosa-pxaac97-r6-fix-r0.patch;patch=1 \ ${DOSRC}/tosa-tmio-r6.patch;patch=1 \ - ${DOSRC}/tosa-power-r17.patch;patch=1 \ + ${DOSRC}/tosa-power-r18.patch;patch=1 \ + file://tosa-power-r18-fix-r0.patch;patch=1 \ file://tosa-tmio-lcd-r10.patch;patch=1 \ + file://tosa-tmio-lcd-r10-fix-r0.patch;patch=1 \ ${DOSRC}/tosa-bluetooth-r8.patch;patch=1 \ - ${DOSRC}/wm97xx-lg7-r0.patch;patch=1 \ + file://wm97xx-lg13-r0.patch;patch=1 \ + file://wm97xx-lg13-r0-fix-r0.patch;patch=1 \ file://wm9712-suspend-cold-res-r2.patch;patch=1 \ file://sharpsl-pm-postresume-r1.patch;patch=1 \ - ${DOSRC}/wm97xx-dig-restore-r0.patch;patch=1 \ - ${DOSRC}/wm97xx-miscdevs-resume-r0.patch;patch=1 \ file://wm9712-reset-loop-r2.patch;patch=1 \ file://tosa-lcdnoise-r1.patch;patch=1 \ - file://wm97xx-lcdnoise-r0.patch;patch=1 " + file://tosa-lcdnoise-r1-fix-r0.patch;patch=1 " # ${DOSRC}/tosa-asoc-r1.patch;patch=1 " -SRC_URI_append_htcuniversal ="file://htcuni-acx.patch;patch=1;status=external" +SRC_URI_append_htcuniversal = "file://htcuni-acx.patch;patch=1;status=external" S = "${WORKDIR}/linux-2.6.22" diff --git a/packages/linux/linux-rp_2.6.23.bb b/packages/linux/linux-rp_2.6.23.bb index 6dd46e16cb..ab0fe13805 100644 --- a/packages/linux/linux-rp_2.6.23.bb +++ b/packages/linux/linux-rp_2.6.23.bb @@ -1,6 +1,6 @@ require linux-rp.inc -PR = "r3" +PR = "r5" DEFAULT_PREFERENCE_qemuarm = "-1" DEFAULT_PREFERENCE_qemux86 = "-1" @@ -93,27 +93,35 @@ SRC_URI_append_collie = "\ # ${DOSRC}/collie/collie-pm-r1.patch;patch=1 \ " + +# wm97xx-lg13-r0.patch, tosa-power-r18.patch and tosa-bluetooth-r8.patch +# were adapted from $(DOSRC) to apply cleanly +# FIXME: +#- ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \ +#- file://tmio-ohci-r6.patch;patch=1 \ SRC_URI_append_tosa = "\ - ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \ ${CHSRC}/tmio-core-r4.patch;patch=1 \ file://tmio-tc6393-r8.patch;patch=1 \ - file://tmio-nand-r7.patch;patch=1 \ - file://tmio-ohci-r6.patch;patch=1 \ + file://tmio-nand-r8.patch;patch=1 \ ${CHSRC}/tmio-fb-r6.patch;patch=1 \ - file://tosa-keyboard-r18.patch;patch=1 \ + file://tmio-fb-r6-fix-r0.patch;patch=1 \ + file://tosa-keyboard-r19.patch;patch=1 \ ${DOSRC}/tosa-pxaac97-r6.patch;patch=1 \ + file://tosa-pxaac97-r6-fix-r0.patch;patch=1 \ ${DOSRC}/tosa-tmio-r6.patch;patch=1 \ - ${DOSRC}/tosa-power-r17.patch;patch=1 \ + file://tosa-power-r18.patch;patch=1 \ + file://tosa-power-r18-fix-r0.patch;patch=1 \ file://tosa-tmio-lcd-r10.patch;patch=1 \ - ${DOSRC}/tosa-bluetooth-r8.patch;patch=1 \ - ${DOSRC}/wm97xx-lg7-r0.patch;patch=1 \ + file://tosa-tmio-lcd-r10-fix-r0.patch;patch=1 \ + file://tosa-bluetooth-r8.patch;patch=1 \ + file://wm97xx-lg13-r0.patch;patch=1 \ + file://wm97xx-lg13-r0-fix-r0.patch;patch=1 \ file://wm9712-suspend-cold-res-r2.patch;patch=1 \ file://sharpsl-pm-postresume-r1.patch;patch=1 \ - ${DOSRC}/wm97xx-dig-restore-r0.patch;patch=1 \ - ${DOSRC}/wm97xx-miscdevs-resume-r0.patch;patch=1 \ file://wm9712-reset-loop-r2.patch;patch=1 \ file://tosa-lcdnoise-r1.patch;patch=1 \ - file://wm97xx-lcdnoise-r0.patch;patch=1 " + file://tosa-lcdnoise-r1-fix-r0.patch;patch=1 \ + " # ${DOSRC}/tosa-asoc-r1.patch;patch=1 " SRC_URI_append_htcuniversal ="\ diff --git a/packages/linux/linux/vmware/.mtn2git_empty b/packages/linux/linux/vmware/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/linux/vmware/.mtn2git_empty diff --git a/packages/linux/linux/vmware/defconfig b/packages/linux/linux/vmware/defconfig new file mode 100644 index 0000000000..08396faef8 --- /dev/null +++ b/packages/linux/linux/vmware/defconfig @@ -0,0 +1,1242 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.16 +# Sun Mar 26 17:18:35 2006 +# +CONFIG_X86_32=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION_AUTO=y +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_UID16=y +CONFIG_VM86=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_CC_ALIGN_FUNCTIONS=0 +CONFIG_CC_ALIGN_LABELS=0 +CONFIG_CC_ALIGN_LOOPS=0 +CONFIG_CC_ALIGN_JUMPS=0 +CONFIG_SLAB=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_OBSOLETE_MODPARM=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y + +# +# Block layer +# +# CONFIG_LBD is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +CONFIG_M586=y +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MGEODEGX1 is not set +# CONFIG_MGEODE_LX is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +CONFIG_X86_GENERIC=y +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_F00F_BUG=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_ALIGNMENT_16=y +CONFIG_X86_INTEL_USERCOPY=y +# CONFIG_HPET_TIMER is not set +# CONFIG_SMP is not set +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set +# CONFIG_X86_UP_APIC is not set +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=y +# CONFIG_TOSHIBA is not set +# CONFIG_I8K is not set +# CONFIG_X86_REBOOTFIXUPS is not set +# CONFIG_MICROCODE is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_CPUID is not set + +# +# Firmware Drivers +# +# CONFIG_EDD is not set +# CONFIG_DELL_RBU is not set +# CONFIG_DCDBAS is not set +CONFIG_NOHIGHMEM=y +# CONFIG_HIGHMEM4G is not set +# CONFIG_HIGHMEM64G is not set +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_3G_OPT is not set +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_SPARSEMEM_STATIC=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +# CONFIG_REGPARM is not set +CONFIG_SECCOMP=y +CONFIG_HZ_100=y +# CONFIG_HZ_250 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=100 +# CONFIG_KEXEC is not set +CONFIG_PHYSICAL_START=0x100000 +CONFIG_DOUBLEFAULT=y + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +CONFIG_PM_LEGACY=y +# CONFIG_PM_DEBUG is not set +# CONFIG_SOFTWARE_SUSPEND is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +CONFIG_ACPI_VIDEO=m +# CONFIG_ACPI_HOTKEY is not set +CONFIG_ACPI_FAN=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_THERMAL=y +# CONFIG_ACPI_ASUS is not set +# CONFIG_ACPI_IBM is not set +# CONFIG_ACPI_TOSHIBA is not set +CONFIG_ACPI_BLACKLIST_YEAR=0 +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y +# CONFIG_ACPI_CONTAINER is not set + +# +# APM (Advanced Power Management) BIOS Support +# +# CONFIG_APM is not set + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCIEPORTBUS is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_ISA_DMA_API=y +CONFIG_ISA=y +# CONFIG_EISA is not set +# CONFIG_MCA is not set +# CONFIG_SCx200 is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +# CONFIG_PCCARD is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=y +CONFIG_BINFMT_MISC=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_BIC=y +# CONFIG_IPV6 is not set +# CONFIG_NETFILTER is not set + +# +# DCCP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_DCCP is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set + +# +# TIPC Configuration (EXPERIMENTAL) +# +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +# CONFIG_IEEE80211 is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y + +# +# Connector - unified userspace <-> kernelspace linker +# +# CONFIG_CONNECTOR is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +# CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set +# CONFIG_PNPACPI is not set + +# +# Block devices +# +CONFIG_BLK_DEV_FD=y +# CONFIG_BLK_DEV_XD is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SX8 is not set +# CONFIG_BLK_DEV_UB is not set +# CONFIG_BLK_DEV_RAM is not set +CONFIG_BLK_DEV_RAM_COUNT=16 +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_IDEDISK is not set +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_IDEPNP is not set +# CONFIG_BLK_DEV_IDEPCI is not set +# CONFIG_IDE_ARM is not set +# CONFIG_IDE_CHIPSETS is not set +# CONFIG_BLK_DEV_IDEDMA is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=y +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +# CONFIG_SCSI_SAS_ATTRS is not set + +# +# SCSI low-level drivers +# +# CONFIG_ISCSI_TCP is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_7000FASST is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_IN2000 is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_SATA is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GDTH is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_NCR53C406A is not set +CONFIG_SCSI_SYM53C8XX_2=y +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set +# CONFIG_SCSI_QLOGIC_FC is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_FC is not set +# CONFIG_SCSI_LPFC is not set +# CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set +# CONFIG_SCSI_ULTRASTOR is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_SPI=y +# CONFIG_FUSION_FC is not set +# CONFIG_FUSION_SAS is not set +CONFIG_FUSION_MAX_SGE=128 +# CONFIG_FUSION_CTL is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_NET_SB1000 is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +# CONFIG_PHYLIB is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNGEM is not set +# CONFIG_CASSINI is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set + +# +# Tulip family network device support +# +# CONFIG_NET_TULIP is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +CONFIG_NET_PCI=y +CONFIG_PCNET32=y +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set +# CONFIG_B44 is not set +# CONFIG_FORCEDETH is not set +# CONFIG_CS89x0 is not set +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +# CONFIG_E100 is not set +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +# CONFIG_8139CP is not set +# CONFIG_8139TOO is not set +# CONFIG_SIS900 is not set +# CONFIG_EPIC100 is not set +# CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set +# CONFIG_VIA_RHINE is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SIS190 is not set +# CONFIG_SKGE is not set +# CONFIG_SKY2 is not set +# CONFIG_SK98LIN is not set +# CONFIG_VIA_VELOCITY is not set +# CONFIG_TIGON3 is not set +# CONFIG_BNX2 is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_CHELSIO_T1 is not set +# CONFIG_IXGB is not set +# CONFIG_S2IO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NET_FC is not set +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +# CONFIG_SERIAL_JSM is not set +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 + +# +# IPMI +# +# CONFIG_IPMI_HANDLER is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_HW_RANDOM is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_GEN_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set +# CONFIG_MWAVE is not set +# CONFIG_CS5535_GPIO is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_HPET is not set +# CONFIG_HANGCHECK_TIMER is not set + +# +# TPM devices +# +# CONFIG_TCG_TPM is not set +# CONFIG_TELCLOCK is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_VID is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Misc devices +# +# CONFIG_IBM_ASM is not set + +# +# Multimedia Capabilities Port drivers +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=y +CONFIG_FB_VESA=y +CONFIG_VIDEO_SELECT=y +# CONFIG_FB_HGA is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I810 is not set +# CONFIG_FB_INTEL is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON_OLD is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_CYBLA is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_GEODE is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +CONFIG_FONTS=y +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_10x18 is not set + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=y +# CONFIG_USB_EHCI_SPLIT_ISO is not set +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_OHCI_HCD is not set +CONFIG_USB_UHCI_HCD=y +# CONFIG_USB_SL811_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_ACECAD is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_MTOUCH is not set +# CONFIG_USB_ITMTOUCH is not set +# CONFIG_USB_EGALAX is not set +# CONFIG_USB_YEALINK is not set +# CONFIG_USB_XPAD is not set +# CONFIG_USB_ATI_REMOTE is not set +# CONFIG_USB_ATI_REMOTE2 is not set +# CONFIG_USB_KEYSPAN_REMOTE is not set +# CONFIG_USB_APPLETOUCH is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB Multimedia devices +# +# CONFIG_USB_DABUSB is not set + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_MON is not set + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGETKIT is not set +# CONFIG_USB_PHIDGETSERVO is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TEST is not set + +# +# USB DSL modem support +# + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +# CONFIG_MMC is not set + +# +# InfiniBand support +# +# CONFIG_INFINIBAND is not set + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# +# CONFIG_EDAC is not set + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_MINIX_FS=y +CONFIG_ROMFS_FS=y +CONFIG_INOTIFY=y +# CONFIG_QUOTA is not set +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=y +CONFIG_FUSE_FS=y + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +CONFIG_UDF_FS=y +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +# CONFIG_RELAYFS_FS is not set +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_CRAMFS=y +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_SMB_FS is not set +# CONFIG_CIFS is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Instrumentation Support +# +# CONFIG_PROFILING is not set +# CONFIG_KPROBES is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_DEBUG_KERNEL is not set +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_EARLY_PRINTK=y + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Hardware crypto devices +# + +# +# Library routines +# +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC32=y +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_KTIME_SCALAR=y + +CONFIG_CMDLINE="root=/dev/sda1" diff --git a/packages/linux/linux_2.6.23.bb b/packages/linux/linux_2.6.23.bb index e042c7248b..5584b8a6d4 100644 --- a/packages/linux/linux_2.6.23.bb +++ b/packages/linux/linux_2.6.23.bb @@ -6,7 +6,7 @@ DEFAULT_PREFERENCE_cm-x270 = "1" DEFAULT_PREFERENCE_mpc8313e-rdb = "1" DEFAULT_PREFERENCE_mpc8323e-rdb = "1" -PR = "r2" +PR = "r3" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.23.tar.bz2 \ file://binutils-buildid-arm.patch;patch=1 \ diff --git a/packages/lua/lua-gtk2_0.3.bb b/packages/lua/lua-gtk2_0.3.bb index 35e564ae96..3abca0e88a 100644 --- a/packages/lua/lua-gtk2_0.3.bb +++ b/packages/lua/lua-gtk2_0.3.bb @@ -12,7 +12,7 @@ SRC_URI = "http://luaforge.net/frs/download.php/989/${P}.tar.gz \ FILES_${PN} = "${datadir}/lua ${libdir}/lua50" -CFLAGS_append = " -I '${S}/build-linux' -I src -DLINUX -I${STAGING_INCDIR} -L${STAGING_LIBDIR} -L${STAGING_LIBDIR}/../../${BUILD_SYS}/lib" +CFLAGS_append = " -I '${S}/build-linux' -I src -DLINUX -I${STAGING_INCDIR} -L${STAGING_LIBDIR} -L${STAGING_LIBDIR_NATIVE}" do_compile () { oe_runmake PREFIX='${prefix}' HGCC='${BUILD_CC}' LIBDIR='${STAGING_LIBDIR}' ODIR='build-linux/' CFLAGS='${CFLAGS}' diff --git a/packages/madwifi/madwifi-ng_r2826-20071105.bb b/packages/madwifi/madwifi-ng_r2826-20071105.bb new file mode 100644 index 0000000000..5a8bb116a3 --- /dev/null +++ b/packages/madwifi/madwifi-ng_r2826-20071105.bb @@ -0,0 +1,13 @@ +# Bitbake recipe for the madwifi-ng driver + +DEFAULT_PREFERENCE = "-1" +DEFAULT_PREFERENCE_mpc8323e-rdb = "1" + +# Disable stripping of kernel modules, since this action strips too +# much out, and the resulting module won't load. +INHIBIT_PACKAGE_STRIP = "1" + +require madwifi-ng_r.inc + +# PR set after the include, to override what's set in the included file. +PR = "r1" diff --git a/packages/modphp/modphp5.inc b/packages/modphp/modphp5.inc index b4bdd15f5b..202cacc75b 100644 --- a/packages/modphp/modphp5.inc +++ b/packages/modphp/modphp5.inc @@ -29,14 +29,14 @@ EXTRA_OECONF = "--with-apxs2=${STAGING_BINDIR_NATIVE}/apxs \ --disable-simplexml \ --disable-libxml \ --disable-dom \ - --with-zlib --with-zlib-dir=${STAGING_LIBDIR}/.. \ + --with-zlib --with-zlib-dir=${STAGING_DIR_NATIVE}${layout_exec_prefix} \ --with-config-file-path=/etc/php/apache2-php5" -# --with-libxml-dir=${STAGING_DIR}/${BUILD_SYS}/ \ +# --with-libxml-dir=${STAGING_DIR_NATIVE}${layout_exec_prefix} \ # to get postgres support, add it to the DEPENDS above # and uncomment this line. similar for mysql -#EXTRA_OECONF += " --with-pgsql=${STAGING_LIBDIR}/.." +#EXTRA_OECONF += " --with-pgsql=${STAGING_DIR_HOST}${layout_exec_prefix}" acpaths = "" @@ -45,7 +45,7 @@ acpaths = "" # which breaks everything... # do_configure() { - export PHP_LIBXML_DIR=${STAGING_DIR}/${BUILD_SYS} + export PHP_LIBXML_DIR=${STAGING_DIR_NATIVE}${layout_exec_prefix} oe_runconf } diff --git a/packages/mozilla/minimo_cvs.bb b/packages/mozilla/minimo_cvs.bb index 5f1ae3e996..b94dff2ab1 100644 --- a/packages/mozilla/minimo_cvs.bb +++ b/packages/mozilla/minimo_cvs.bb @@ -35,7 +35,7 @@ export ac_cv_prog_HOST_CC="${BUILD_CC}" export ac_cv_prog_HOST_CFLAGS="${BUILD_CFLAGS}" export ac_cv_prog_HOST_CXX="${BUILD_CXX}" export ac_cv_prog_HOST_CXXFLAGS="${BUILD_CXXFLAGS}" -export HOST_LIBIDL_CONFIG = "${STAGING_DIR}/${BUILD_SYS}/bin/libIDL-config-2" +export HOST_LIBIDL_CONFIG = "${STAGING_BINDIR_NATIVE}/libIDL-config-2" mozdir="${libdir}/mozilla-minimo" diff --git a/packages/mplayer/files/motion-comp-pld.patch b/packages/mplayer/files/motion-comp-pld.patch new file mode 100644 index 0000000000..6d4160c7bb --- /dev/null +++ b/packages/mplayer/files/motion-comp-pld.patch @@ -0,0 +1,163 @@ +Index: MPlayer-1.0rc2/libmpeg2/motion_comp_arm_s.S +=================================================================== +--- MPlayer-1.0rc2.orig/libmpeg2/motion_comp_arm_s.S 2007-11-02 14:16:50.000000000 +0000 ++++ MPlayer-1.0rc2/libmpeg2/motion_comp_arm_s.S 2007-11-02 14:23:53.000000000 +0000 +@@ -18,6 +18,14 @@ + @ along with this program; if not, write to the Free Software + @ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + ++#if defined(__ARM_ARCH_5__) || \ ++ defined(__ARM_ARCH_5T__) || \ ++ defined(__ARM_ARCH_5TE__) ++#define PLD(code...) code ++#else ++#define PLD(code...) ++#endif ++ + .text + + @ ---------------------------------------------------------------- +@@ -25,7 +33,7 @@ + .global MC_put_o_16_arm + MC_put_o_16_arm: + @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) +- pld [r1] ++ PLD ( pld [r1] ) + stmfd sp!, {r4-r11, lr} @ R14 is also called LR + and r4, r1, #3 + adr r5, MC_put_o_16_arm_align_jt +@@ -35,7 +43,7 @@ + MC_put_o_16_arm_align0: + ldmia r1, {r4-r7} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + stmia r0, {r4-r7} + subs r3, r3, #1 + add r0, r0, r2 +@@ -46,7 +54,7 @@ + ldmia r1, {r4-r8} + add r1, r1, r2 + mov r9, r4, lsr #(\shift) +- pld [r1] ++ PLD ( pld [r1] ) + mov r10, r5, lsr #(\shift) + orr r9, r9, r5, lsl #(32-\shift) + mov r11, r6, lsr #(\shift) +@@ -85,7 +93,7 @@ + .global MC_put_o_8_arm + MC_put_o_8_arm: + @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) +- pld [r1] ++ PLD ( pld [r1] ) + stmfd sp!, {r4-r10, lr} @ R14 is also called LR + and r4, r1, #3 + adr r5, MC_put_o_8_arm_align_jt +@@ -94,7 +102,7 @@ + MC_put_o_8_arm_align0: + ldmia r1, {r4-r5} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + stmia r0, {r4-r5} + add r0, r0, r2 + subs r3, r3, #1 +@@ -105,7 +113,7 @@ + ldmia r1, {r4-r6} + add r1, r1, r2 + mov r9, r4, lsr #(\shift) +- pld [r1] ++ PLD ( pld [r1] ) + mov r10, r5, lsr #(\shift) + orr r9, r9, r5, lsl #(32-\shift) + orr r10, r10, r6, lsl #(32-\shift) +@@ -154,7 +162,7 @@ + .global MC_put_x_16_arm + MC_put_x_16_arm: + @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) +- pld [r1] ++ PLD ( pld [r1] ) + stmfd sp!, {r4-r11,lr} @ R14 is also called LR + and r4, r1, #3 + adr r5, MC_put_x_16_arm_align_jt +@@ -179,7 +187,7 @@ + MC_put_x_16_arm_align0: + ldmia r1, {r4-r8} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + AVG_PW r7, r8 + AVG_PW r6, r7 + AVG_PW r5, r6 +@@ -193,7 +201,7 @@ + and r1, r1, #0xFFFFFFFC + 1: ldmia r1, {r4-r8} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + ADJ_ALIGN_QW 8, r4, r5, r6, r7, r8 + AVG_PW r7, r8 + AVG_PW r6, r7 +@@ -208,7 +216,7 @@ + and r1, r1, #0xFFFFFFFC + 1: ldmia r1, {r4-r8} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + ADJ_ALIGN_QW 16, r4, r5, r6, r7, r8 + AVG_PW r7, r8 + AVG_PW r6, r7 +@@ -223,7 +231,7 @@ + and r1, r1, #0xFFFFFFFC + 1: ldmia r1, {r4-r8} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + ADJ_ALIGN_QW 24, r4, r5, r6, r7, r8 + AVG_PW r7, r8 + AVG_PW r6, r7 +@@ -246,7 +254,7 @@ + .global MC_put_x_8_arm + MC_put_x_8_arm: + @@ void func(uint8_t * dest, const uint8_t * ref, int stride, int height) +- pld [r1] ++ PLD ( pld [r1] ) + stmfd sp!, {r4-r11,lr} @ R14 is also called LR + and r4, r1, #3 + adr r5, MC_put_x_8_arm_align_jt +@@ -267,7 +275,7 @@ + MC_put_x_8_arm_align0: + ldmia r1, {r4-r6} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + AVG_PW r5, r6 + AVG_PW r4, r5 + stmia r0, {r5-r6} +@@ -279,7 +287,7 @@ + and r1, r1, #0xFFFFFFFC + 1: ldmia r1, {r4-r6} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + ADJ_ALIGN_DW 8, r4, r5, r6 + AVG_PW r5, r6 + AVG_PW r4, r5 +@@ -292,7 +300,7 @@ + and r1, r1, #0xFFFFFFFC + 1: ldmia r1, {r4-r6} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + ADJ_ALIGN_DW 16, r4, r5, r6 + AVG_PW r5, r6 + AVG_PW r4, r5 +@@ -305,7 +313,7 @@ + and r1, r1, #0xFFFFFFFC + 1: ldmia r1, {r4-r6} + add r1, r1, r2 +- pld [r1] ++ PLD ( pld [r1] ) + ADJ_ALIGN_DW 24, r4, r5, r6 + AVG_PW r5, r6 + AVG_PW r4, r5 diff --git a/packages/mplayer/mplayer_0.0+1.0rc2.bb b/packages/mplayer/mplayer_0.0+1.0rc2.bb new file mode 100644 index 0000000000..d963ac03cf --- /dev/null +++ b/packages/mplayer/mplayer_0.0+1.0rc2.bb @@ -0,0 +1,209 @@ +DESCRIPTION = "Open Source multimedia player." +SECTION = "multimedia" +PRIORITY = "optional" +HOMEPAGE = "http://www.mplayerhq.hu/" +DEPENDS = "virtual/libsdl xsp libmad zlib libpng jpeg liba52 freetype fontconfig alsa-lib lzo ncurses lame libxv virtual/libx11" +DEPENDS_append_c7x0 = " libw100 " +DEPENDS_append_hx4700 = " libw100 " + +RDEPENDS = "mplayer-common" +LICENSE = "GPL" +SRC_URI = "http://www1.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc2.tar.bz2 \ + file://vo_w100.c \ + file://vo_w100_api.h \ + file://vo_w100_fb.h \ + file://vo_pxa.c \ + file://vo_pxa.h \ + file://simple_idct_armv5te.S \ + file://Makefile-codec-cfg.patch;patch=1 \ + file://w100-configure-svn.patch;patch=1 \ + file://w100-video_out.patch;patch=1 \ + file://w100-mplayer.patch;patch= \ + file://pld-onlyarm5.patch;patch=1 \ + file://makefile-nostrip-svn.patch;patch=1 \ + file://mplayer-imageon-svn.patch;patch=1 \ + file://imageon-video_out.patch;patch=1 \ + file://pxa_configure.patch;patch=1 \ + file://pxa-video_out.patch;patch=1 \ + file://motion-comp-pld.patch;patch=1 " + +# This is required for the collie machine only as all stacks in that +# machine seem to be set to executable by the toolchain. If someone +# discovers this is more general than please make this more general +# ie. for all armv4 machines. +SRC_URI_append_collie = "file://disable-executable-stack-test.patch;patch=1" + +PACKAGE_ARCH_collie = "collie" +PACKAGE_ARCH_c7x0 = "c7x0" +PACKAGE_ARCH_hx4700 = "hx4700" + +RCONFLICTS_${PN} = "mplayer-atty" +RREPLACES_${PN} = "mplayer-atty" + +PR = "r6" + +PARALLEL_MAKE = "" + +S = "${WORKDIR}/MPlayer-1.0rc2" + +PACKAGES =+ "mencoder" + +FILES_${PN} = "${bindir}/mplayer ${libdir}" +FILES_mencoder = "${bindir}/mencoder" + +inherit autotools pkgconfig + +EXTRA_OECONF = " \ + --prefix=/usr \ + --mandir=${mandir} \ + --target=${TARGET_SYS} \ + \ + --enable-mencoder \ + --disable-gui \ + --enable-largefiles \ + --disable-linux-devfs \ + --disable-lirc \ + --disable-lircc \ + --disable-joystick \ + --disable-vm \ + --disable-xf86keysym \ + --disable-tv \ + --disable-tv-v4l2 \ + --disable-tv-bsdbt848 \ + --enable-rtc \ + --enable-network \ + --disable-winsock2 \ + --disable-smb \ + --disable-live \ + --disable-dvdnav \ + --disable-dvdread \ + --disable-libdvdcss-internal \ + --disable-dvdread-internal \ + --disable-cdparanoia \ + --enable-freetype \ + --disable-unrarlib \ + --disable-menu \ + --enable-sortsub \ + --disable-fribidi \ + --disable-enca \ + --disable-macosx \ + --disable-macosx-finder-support \ + --disable-macosx-bundle \ + --disable-ftp \ + --disable-vstream \ + \ + --disable-gif \ + --enable-png \ + --enable-jpeg \ + --disable-libcdio \ + --disable-liblzo \ + --disable-qtx \ + --disable-xanim \ + --disable-real \ + --disable-xvid \ + --disable-x264 \ + \ + --disable-libavutil_so \ + --disable-libavcodec_so \ + --disable-libavformat_so \ + --disable-libpostproc_so \ + \ + --enable-tremor-low \ + \ + --disable-speex \ + --disable-theora \ + --disable-faac \ + --disable-ladspa \ + --disable-libdv \ + --enable-mad \ + --disable-toolame \ + --disable-twolame \ + --disable-xmms \ + --disable-mp3lib \ + --enable-libmpeg2 \ + --disable-musepack \ + \ + --disable-gl \ + --disable-vesa \ + --disable-svga \ + --enable-sdl \ + --disable-aa \ + --disable-caca \ + --disable-ggi \ + --disable-ggiwmh \ + --disable-directx \ + --disable-dxr2 \ + --disable-dxr3 \ + --disable-dvb \ + --disable-dvbhead \ + --disable-mga \ + --disable-xmga \ + --enable-xv \ + --disable-xvmc \ + --disable-vm \ + --disable-xinerama \ + --enable-x11 \ + --enable-fbdev \ + --disable-mlib \ + --disable-3dfx \ + --disable-tdfxfb \ + --disable-s3fb \ + --disable-directfb \ + --disable-zr \ + --disable-bl \ + --disable-tdfxvid \ + --disable-tga \ + --disable-pnm \ + --disable-md5sum \ + \ + --enable-alsa \ + --enable-ossaudio \ + --disable-arts \ + --disable-esd \ + --disable-polyp \ + --disable-jack \ + --disable-openal \ + --disable-nas \ + --disable-sgiaudio \ + --disable-sunaudio \ + --disable-win32waveout \ + --enable-select \ + \ + " + +EXTRA_OECONF_append_arm = " --disable-decoder=vorbis_decoder \ + --disable-encoder=vorbis_encoder" +EXTRA_OECONF_append_c7x0 = " --enable-imageon " +EXTRA_OECONF_append_hx4700 = " --enable-imageon " + +#build with support for the iwmmxt instruction and pxa270fb overlay support (pxa270 and up) +#not every iwmmxt machine has the lcd connected to pxafb, but building the module doesn't hurt +MY_ARCH := "${PACKAGE_ARCH}" +PACKAGE_ARCH = "${@base_contains('MACHINE_FEATURES', 'iwmmxt', 'iwmmxt', '${MY_ARCH}',d)}" + +MY_TARGET_CC_ARCH := "${TARGET_CC_ARCH}" +TARGET_CC_ARCH = "${@base_contains('MACHINE_FEATURES', 'iwmmxt', '-march=iwmmxt -mtune=iwmmxt', '${MY_TARGET_CC_ARCH}',d)}" + +EXTRA_OECONF_append = " ${@base_contains('MACHINE_FEATURES', 'iwmmxt', '--enable-pxa --enable-iwmmxt', '',d)} " +EXTRA_OECONF_append = " ${@base_contains('MACHINE_FEATURES', 'x86', '--enable-runtime-cpudetection', '',d)} " + +do_configure() { + cp ${WORKDIR}/vo_w100.c ${S}/libvo + cp ${WORKDIR}/vo_w100_api.h ${S}/libvo + cp ${WORKDIR}/vo_w100_fb.h ${S}/libvo + cp ${WORKDIR}/vo_pxa.c ${S}/libvo + cp ${WORKDIR}/vo_pxa.h ${S}/libvo + cp ${WORKDIR}/simple_idct_armv5te.S ${S}/libavcodec/armv4l/ + + sed -i 's|/usr/include|${STAGING_INCDIR}|g' ${S}/configure + sed -i 's|/usr/lib|${STAGING_LIBDIR}|g' ${S}/configure + sed -i 's|/usr/\S*include[\w/]*||g' ${S}/configure + sed -i 's|/usr/\S*lib[\w/]*||g' ${S}/configure + + ./configure ${EXTRA_OECONF} +} + +do_compile () { + oe_runmake +} + diff --git a/packages/mplayer/mplayer_svn.bb b/packages/mplayer/mplayer_svn.bb index e481247970..04035098fa 100644 --- a/packages/mplayer/mplayer_svn.bb +++ b/packages/mplayer/mplayer_svn.bb @@ -39,7 +39,7 @@ PACKAGE_ARCH_hx4700 = "hx4700" RCONFLICTS_${PN} = "mplayer-atty" RREPLACES_${PN} = "mplayer-atty" -PV = "0.0+1.0rc1+svnr${SRCREV}" +PV = "0.0+1.0rc2+svnr${SRCREV}" PR = "r5" DEFAULT_PREFERENCE = "-1" diff --git a/packages/netatalk/netatalk_2.0.3.bb b/packages/netatalk/netatalk_2.0.3.bb index 74cfd84042..5fd7255fed 100644 --- a/packages/netatalk/netatalk_2.0.3.bb +++ b/packages/netatalk/netatalk_2.0.3.bb @@ -1,4 +1,3 @@ -DESCRIPTION = "Appletalk protocol suite" SECTION = "net" PR = "r0" LICENSE = "GPL" @@ -31,7 +30,7 @@ do_configure () { --disable-static \ --with-pam \ --mandir=${mandir} - cp ${STAGING_DIR}/${BUILD_SYS}/bin/${TARGET_SYS}-libtool ./${TARGET_SYS}-libtool + cp ${STAGING_BINDIR_NATIVE}/${TARGET_SYS}-libtool ./${TARGET_SYS}-libtool } do_install_append() { diff --git a/packages/notecase/notecase-1.6.9/.mtn2git_empty b/packages/notecase/notecase-1.6.9/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/notecase/notecase-1.6.9/.mtn2git_empty diff --git a/packages/notecase/notecase-1.6.9/no-hardcoded-cxx.patch b/packages/notecase/notecase-1.6.9/no-hardcoded-cxx.patch new file mode 100644 index 0000000000..7b54e6232d --- /dev/null +++ b/packages/notecase/notecase-1.6.9/no-hardcoded-cxx.patch @@ -0,0 +1,38 @@ +--- tmp/Makefile 2007-05-08 12:25:10.000000000 +0200 ++++ Makefile 2007-11-03 10:46:51.000000000 +0100 +@@ -131,7 +131,7 @@ + ifdef WINDIR + LD=$(QL) $(CXX) $(DEBUG) $(PROFILE) $(LDFLAGS) -L$(OBJ) -lz + else +- LD=$(QL) $(CXX) $(DEBUG) $(PROFILE) $(LDFLAGS) -ldl ++ NLD=$(QL) $(CXX) $(DEBUG) $(PROFILE) $(LOPTIMIZE) -ldl -export-dynamic $(LOPTIMIZE) + endif + + # +@@ -190,7 +190,7 @@ + LIBS += hildon-libs hildon-fm libosso + endif + +-GTKCFLAGS=`pkg-config --cflags $(LIBS)` -I/target/include -I/sw/include ++GTKCFLAGS=`pkg-config --cflags $(LIBS)` + GTKLIBS=`pkg-config --libs $(LIBS)` + + # +@@ -201,7 +201,7 @@ + $(LD) $(OBJS) -o $(BIN)/notecase$(EXE) $(FLAGS) $(LDFLAGS) $(GTKLIBS) + else + notecase$(EXE): updatesrc $(OBJS) +- $(LD) $(OBJS) -o $(BIN)/notecase$(EXE) $(FLAGS) $(LDFLAGS) $(GTKLIBS) > /dev/null ++ $(NLD) $(OBJS) -o $(BIN)/notecase$(EXE) $(FLAGS) $(LDFLAGS) $(GTKLIBS) + endif + + # +@@ -421,7 +421,7 @@ + $(CC) $(FLAGS) -c $(GUIPATH)/DocActionFinishDel.cpp -o $(OBJ)/DocActionFinishDel.o $(GTKCFLAGS) + + $(OBJ)/libz.a: +- @cd ./src/lib/zlib/; $(MAKE); cp ./libz.a ../../../$(OBJ)/ ++ @cd ./src/lib/zlib/; cp ./libz.a ../../../$(OBJ)/ + + $(OBJ)/ShortcutsList.o: $(GUIPATH)/ShortcutsList.cpp $(GUIPATH)/ShortcutsList.h + $(CC) $(FLAGS) -c $(GUIPATH)/ShortcutsList.cpp -o $(OBJ)/ShortcutsList.o $(GTKCFLAGS) diff --git a/packages/notecase/notecase.inc b/packages/notecase/notecase.inc new file mode 100644 index 0000000000..951930d27b --- /dev/null +++ b/packages/notecase/notecase.inc @@ -0,0 +1,13 @@ +DESCRIPTION = "Hierarchical note manager (aka. outliner)" +AUTHOR = "Miroslav Rajcic <miroslav.rajcic@inet.hr>" +HOMEPAGE = "http://notecase.sourceforge.net/" +SECTION = "x11/utils" +LICENSE = "BSD" +DEPENDS = "zlib gtk+ gnome-vfs" + +SRC_URI = "${SOURCEFORGE_MIRROR}/${PN}/${P}_src.tar.gz \ + file://no-hardcoded-cxx.patch;patch=1" + +do_compile_prepend() { + cp ${STAGING_LIBDIR}/libz.a ${S}/src/lib/zlib/ +} diff --git a/packages/notecase/notecase_1.2.6.bb b/packages/notecase/notecase_1.2.6.bb index 7a38480f22..7cd2cd7987 100644 --- a/packages/notecase/notecase_1.2.6.bb +++ b/packages/notecase/notecase_1.2.6.bb @@ -1,17 +1,4 @@ -DESCRIPTION = "NoteCase is a hierarchical note manager (aka. outliner)." " -LICENSE = "BSD" - -DEPENDS = "zlib gtk+ gnome-vfs" - -SRC_URI = "${SOURCEFORGE_MIRROR}/${PN}/${P}_src.tar.gz \ - file://no-hardcoded-cxx.patch;patch=1" - -inherit pkgconfig - -do_compile_prepend() { - cp ${STAGING_LIBDIR}/libz.a ${S}/src/lib/zlib/ -} - +require notecase.inc do_install() { install -d ${D}${bindir} diff --git a/packages/notecase/notecase_1.6.9.bb b/packages/notecase/notecase_1.6.9.bb new file mode 100644 index 0000000000..73ea27b7db --- /dev/null +++ b/packages/notecase/notecase_1.6.9.bb @@ -0,0 +1,17 @@ +require notecase.inc + +PR = "r1" + +do_install() { + install -d ${D}${bindir} + install -d ${D}${datadir}/applications + install -d ${D}${datadir}/doc + install -d ${D}${datadir}/doc/notecase + install -d ${D}${datadir}/icons + install -m 644 ${S}/docs/notecase.desktop ${D}${datadir}/applications + install -m 644 ${S}/docs/help.ncd ${D}${datadir}/doc/notecase/help.ncd + install -m 644 ${S}/res/notecase.xpm ${D}${datadir}/icons/notecase.xpm + install -m 755 ${S}/bin/notecase ${D}${bindir}/ +} + +FILES_${PN} += "${datadir}" diff --git a/packages/obsolete/dbus/dbus_0.34.bb b/packages/obsolete/dbus/dbus_0.34.bb index 2a9989fe3b..442cb191ea 100644 --- a/packages/obsolete/dbus/dbus_0.34.bb +++ b/packages/obsolete/dbus/dbus_0.34.bb @@ -9,6 +9,6 @@ FILES_${PN} += "${bindir}/dbus-daemon" FILES_${PN}-dev += "${bindir}/dbus-binding-tool" do_configure_prepend() { - install -m 0644 ${STAGING_DIR}/${BUILD_SYS}/share/dbus/dbus-bus-introspect.xml ${S}/tools/ - install -m 0644 ${STAGING_DIR}/${BUILD_SYS}/share/dbus/dbus-glib-bindings.h ${S}/tools/ + install -m 0644 ${STAGING_DATADIR_NATIVE}/dbus/dbus-bus-introspect.xml ${S}/tools/ + install -m 0644 ${STAGING_DATADIR_NATIVE}/dbus/dbus-glib-bindings.h ${S}/tools/ } diff --git a/packages/obsolete/dbus/dbus_0.50.bb b/packages/obsolete/dbus/dbus_0.50.bb index 2a9989fe3b..442cb191ea 100644 --- a/packages/obsolete/dbus/dbus_0.50.bb +++ b/packages/obsolete/dbus/dbus_0.50.bb @@ -9,6 +9,6 @@ FILES_${PN} += "${bindir}/dbus-daemon" FILES_${PN}-dev += "${bindir}/dbus-binding-tool" do_configure_prepend() { - install -m 0644 ${STAGING_DIR}/${BUILD_SYS}/share/dbus/dbus-bus-introspect.xml ${S}/tools/ - install -m 0644 ${STAGING_DIR}/${BUILD_SYS}/share/dbus/dbus-glib-bindings.h ${S}/tools/ + install -m 0644 ${STAGING_DATADIR_NATIVE}/dbus/dbus-bus-introspect.xml ${S}/tools/ + install -m 0644 ${STAGING_DATADIR_NATIVE}/dbus/dbus-glib-bindings.h ${S}/tools/ } diff --git a/packages/omniorb/omniorb-native_4.0.7.bb b/packages/omniorb/omniorb-native_4.0.7.bb index b8a2e40395..1df6236aea 100644 --- a/packages/omniorb/omniorb-native_4.0.7.bb +++ b/packages/omniorb/omniorb-native_4.0.7.bb @@ -14,5 +14,5 @@ do_compile () { # Ugly hack so libtool does not find native libs when building cross packages # We really only build this package for omniidl anyway do_stage_append() { - rm -f ${STAGING_DIR}/${BUILD_SYS}/lib/libomni* + rm -f ${STAGING_LIBDIR_NATIVE}/libomni* } diff --git a/packages/openmoko2/neod_svn.bb b/packages/openmoko2/neod_svn.bb index 7e662de73a..8a2e354349 100644 --- a/packages/openmoko2/neod_svn.bb +++ b/packages/openmoko2/neod_svn.bb @@ -1,14 +1,14 @@ DESCRIPTION = "Simple Neo1973 Daemon for Button Handling and Power Management" SECTION = "openmoko/daemons" DEPENDS = "gtk+ pulseaudio" -RDEPENDS = "gpe-scap xrandr alsa-utils-amixer apm" +RDEPENDS = "gpe-scap xrandr alsa-utils-amixer apm dbus" PV = "0.1.0+svnr${SRCREV}" -PR = "r4" +PR = "r5" inherit openmoko2 gconf -SRC_URI += "file://htc.patch;patch=1 \ - file://ipaq.patch;patch=1" +SRC_URI += "file://htc.patch;patch=1;maxrev=3348 \ + file://ipaq.patch;patch=1;maxrev=3348" EXTRA_OECONF_fic-gta01 = "--with-platform=neo1973" EXTRA_OECONF_fic-gta02 = "--with-platform=neo1973" diff --git a/packages/openmoko2/openmoko-browser2/.mtn2git_empty b/packages/openmoko2/openmoko-browser2/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/openmoko2/openmoko-browser2/.mtn2git_empty diff --git a/packages/openmoko2/openmoko-browser2/fingerscroll.diff b/packages/openmoko2/openmoko-browser2/fingerscroll.diff new file mode 100644 index 0000000000..89f79496a0 --- /dev/null +++ b/packages/openmoko2/openmoko-browser2/fingerscroll.diff @@ -0,0 +1,13 @@ +Index: src/current-page.c +=================================================================== +--- openmoko-browser2/src/current-page.c (revision 3249) ++++ openmoko-browser2/src/current-page.c (working copy) +@@ -129,7 +129,7 @@ + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), data->currentClose, 8); + + +- data->currentFingerScroll = gtk_scrolled_window_new (NULL, NULL); //moko_finger_scroll_new (); ++ data->currentFingerScroll = moko_finger_scroll_new (); + gtk_box_pack_start (box, data->currentFingerScroll, TRUE, TRUE, 0); + } + diff --git a/packages/openmoko2/openmoko-browser2_svn.bb b/packages/openmoko2/openmoko-browser2_svn.bb index 431e40769c..b9c7efed02 100644 --- a/packages/openmoko2/openmoko-browser2_svn.bb +++ b/packages/openmoko2/openmoko-browser2_svn.bb @@ -5,3 +5,7 @@ PV = "0.0.1+svnr${SRCREV}" PR = "r1" inherit openmoko2 + +#SRC_URI += "file://fingerscroll.diff;patch=1" + + diff --git a/packages/openmoko2/openmoko-icon-theme-standard2-qvga_svn.bb b/packages/openmoko2/openmoko-icon-theme-standard2-qvga_svn.bb index 11e02ee56c..a02e05c1d2 100644 --- a/packages/openmoko2/openmoko-icon-theme-standard2-qvga_svn.bb +++ b/packages/openmoko2/openmoko-icon-theme-standard2-qvga_svn.bb @@ -1,7 +1,8 @@ DESCRIPTION = "Standard Gtk+ icon theme for the OpenMoko framework, QVGA edition" SECTION = "openmoko/base" +DEPENDS = "imagemagick-native librsvg-native" PV = "0.1.0+svnr${SRCREV}" -PR = "r1" +PR = "r2" inherit openmoko2 diff --git a/packages/openmoko2/openmoko-worldclock2_svn.bb b/packages/openmoko2/openmoko-worldclock2_svn.bb index 8fc6f11f57..5857dde982 100644 --- a/packages/openmoko2/openmoko-worldclock2_svn.bb +++ b/packages/openmoko2/openmoko-worldclock2_svn.bb @@ -1,6 +1,6 @@ DESCRIPTION = "A World-Clock for OpenMoko" SECTION = "openmoko/tools" -DEPENDS = "libmokoui2 openmoko-dates2" +DEPENDS = "libmokoui2 libjana" PV = "0.1.0+svnr${SRCREV}" inherit openmoko2 diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_1.2.2.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_1.2.3.bb index 0c6b505d8c..0c6b505d8c 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_1.2.2.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_1.2.3.bb diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_cvs.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_cvs.bb index 3cb7f8551e..8923861dd6 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_cvs.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default-landscape_cvs.bb @@ -2,8 +2,7 @@ DESCRIPTION = "Skin for opie-mediaplayer2" SECTION = "opie/multimedia" PRIORITY = "optional" LICENSE = "GPL" -# Remove the dash below when 1.2.1 changes in PV -PV = "1.2.2+cvs-${SRCDATE}" +PV = "1.2.2+cvs${SRCDATE}" APPNAME = "opieplayer2" RPROVIDES = "opie-mediaplayer2-skin" diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_1.2.2.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_1.2.3.bb index e0b8efe4dc..e0b8efe4dc 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_1.2.2.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_1.2.3.bb diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_cvs.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_cvs.bb index b2e826ae59..9546a6450e 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_cvs.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-default_cvs.bb @@ -2,8 +2,7 @@ DESCRIPTION = "Skin for opie-mediaplayer2" SECTION = "opie/multimedia" PRIORITY = "optional" LICENSE = "GPL" -# Remove the dash below when 1.2.1 changes in PV -PV = "1.2.2+cvs-${SRCDATE}" +PV = "1.2.2+cvs${SRCDATE}" APPNAME = "opieplayer2" RPROVIDES = "opie-mediaplayer2-skin" diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_1.2.2.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_1.2.3.bb index a40604c041..a40604c041 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_1.2.2.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_1.2.3.bb diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_cvs.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_cvs.bb index d091f50903..6ffde10a57 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_cvs.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-pod_cvs.bb @@ -2,8 +2,7 @@ DESCRIPTION = "Skin for opie-mediaplayer2" SECTION = "opie/multimedia" PRIORITY = "optional" LICENSE = "GPL" -# Remove the dash below when 1.2.1 changes in PV -PV = "1.2.2+cvs-${SRCDATE}" +PV = "1.2.2+cvs${SRCDATE}" APPNAME = "opieplayer2" RPROVIDES = "opie-mediaplayer2-skin" diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_1.2.2.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_1.2.3.bb index 7a6715e5cf..7a6715e5cf 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_1.2.2.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_1.2.3.bb diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_cvs.bb b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_cvs.bb index ca44bfc3af..3d0eba2089 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_cvs.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2-skin-techno_cvs.bb @@ -2,8 +2,7 @@ DESCRIPTION = "Skin for opie-mediaplayer2" SECTION = "opie/multimedia" PRIORITY = "optional" LICENSE = "GPL" -# Remove the dash below when 1.2.1 changes in PV -PV = "1.2.2+cvs-${SRCDATE}" +PV = "1.2.2+cvs${SRCDATE}" APPNAME = "opieplayer2" RPROVIDES = "opie-mediaplayer2-skin" diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2_1.2.2.bb b/packages/opie-mediaplayer2/opie-mediaplayer2_1.2.3.bb index 2e6c7ec517..2e6c7ec517 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2_1.2.2.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2_1.2.3.bb diff --git a/packages/opie-mediaplayer2/opie-mediaplayer2_cvs.bb b/packages/opie-mediaplayer2/opie-mediaplayer2_cvs.bb index 2badc15abd..b080b3ce92 100644 --- a/packages/opie-mediaplayer2/opie-mediaplayer2_cvs.bb +++ b/packages/opie-mediaplayer2/opie-mediaplayer2_cvs.bb @@ -1,7 +1,6 @@ require ${PN}.inc -# Remove the dash below when 1.2.1 changes in PV -PV = "1.2.2+cvs-${SRCDATE}" +PV = "${OPIE_CVS_PV}" SRC_URI = "${HANDHELDS_CVS};module=opie/noncore/multimedia/opieplayer2 \ ${HANDHELDS_CVS};module=opie/pics \ diff --git a/packages/opie-notes/opie-notes.inc b/packages/opie-notes/opie-notes.inc index 413a992df3..b3a9d44769 100644 --- a/packages/opie-notes/opie-notes.inc +++ b/packages/opie-notes/opie-notes.inc @@ -5,10 +5,6 @@ LICENSE = "GPL" APPNAME = "opie-notes" APPTYPE = "binary" -SRC_URI = "${HANDHELDS_CVS};module=opie/core/pim/notes \ - ${HANDHELDS_CVS};module=opie/pics \ - ${HANDHELDS_CVS};module=opie/apps" - S = "${WORKDIR}/notes" inherit opie diff --git a/packages/opie-notes/opie-notes_0.4.bb b/packages/opie-notes/opie-notes_0.4.bb deleted file mode 100644 index de1b8f2a43..0000000000 --- a/packages/opie-notes/opie-notes_0.4.bb +++ /dev/null @@ -1,7 +0,0 @@ -require ${PN}.inc - -SRCDATE = "20051027" - -SRC_URI = "${HANDHELDS_CVS};module=opie/core/pim/notes \ - ${HANDHELDS_CVS};module=opie/pics \ - ${HANDHELDS_CVS};module=opie/apps" diff --git a/packages/opie-notes/opie-notes_1.2.3.bb b/packages/opie-notes/opie-notes_1.2.3.bb new file mode 100644 index 0000000000..89ed98e583 --- /dev/null +++ b/packages/opie-notes/opie-notes_1.2.3.bb @@ -0,0 +1,5 @@ +require ${PN}.inc + +SRC_URI = "${HANDHELDS_CVS};tag=${TAG};module=opie/core/pim/notes \ + ${HANDHELDS_CVS};tag=${TAG};module=opie/pics \ + ${HANDHELDS_CVS};tag=${TAG};module=opie/apps" diff --git a/packages/opie-notes/opie-notes_cvs.bb b/packages/opie-notes/opie-notes_cvs.bb index 6b293d2876..0bb7c33bbf 100644 --- a/packages/opie-notes/opie-notes_cvs.bb +++ b/packages/opie-notes/opie-notes_cvs.bb @@ -1,3 +1,7 @@ require ${PN}.inc -PV = "0.3+cvs${SRCDATE}" +PV = "${OPIE_CVS_PV}" + +SRC_URI = "${HANDHELDS_CVS};module=opie/core/pim/notes \ + ${HANDHELDS_CVS};module=opie/pics \ + ${HANDHELDS_CVS};module=opie/apps" diff --git a/packages/perl/perl_5.8.8.bb b/packages/perl/perl_5.8.8.bb index a3873d99fb..328b4fb5df 100644 --- a/packages/perl/perl_5.8.8.bb +++ b/packages/perl/perl_5.8.8.bb @@ -41,7 +41,7 @@ SRC_URI = "ftp://ftp.funet.fi/pub/CPAN/src/perl-${PV}.tar.gz \ HOSTPERL = "${STAGING_BINDIR_NATIVE}/perl${PV}" # Where to find .so files - use the -native versions not those from the target build -export PERLHOSTLIB = "${STAGING_DIR}/${BUILD_SYS}/lib/perl/${PV}/" +export PERLHOSTLIB = "${STAGING_LIBDIR_NATIVE}/perl/${PV}/" do_configure() { # Make hostperl in build directory be the native perl @@ -138,12 +138,12 @@ do_install() { } do_stage() { install -d ${STAGING_DIR}/${HOST_SYS}/perl \ - ${STAGING_DIR}/${BUILD_SYS}/lib/perl/${PV} \ + ${STAGING_LIBDIR_NATIVE}/perl/${PV} \ ${STAGING_LIBDIR}/perl/${PV}/CORE # target config, used by cpan.bbclass to extract version information install config.sh ${STAGING_DIR}/${HOST_SYS}/perl/ # target configuration, used by native perl when cross-compiling - install lib/Config_heavy.pl ${STAGING_DIR}/${BUILD_SYS}/lib/perl/${PV}/Config_heavy-target.pl + install lib/Config_heavy.pl ${STAGING_LIBDIR_NATIVE}/perl/${PV}/Config_heavy-target.pl # perl shared library headers for i in av.h embed.h gv.h keywords.h op.h perlio.h pp.h regexp.h \ uconfig.h XSUB.h cc_runtime.h embedvar.h handy.h opnames.h \ diff --git a/packages/pkgconfig/pkgconfig.inc b/packages/pkgconfig/pkgconfig.inc index ed9e7e69af..a246c8750f 100644 --- a/packages/pkgconfig/pkgconfig.inc +++ b/packages/pkgconfig/pkgconfig.inc @@ -21,5 +21,5 @@ do_configure_prepend () { } do_stage_prepend() { - install -d -m 0755 ${STAGING_DATADIR}/pkgconfig + install -d -m 0755 ${STAGING_LIBDIR}/pkgconfig } diff --git a/packages/powertop/powertop_1.9.bb b/packages/powertop/powertop_1.9.bb new file mode 100644 index 0000000000..ab84161ddc --- /dev/null +++ b/packages/powertop/powertop_1.9.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "PowerTOP, a tool that helps you find what software is using the most power." +HOMEPAGE = "http://www.linuxpowertop.org/" +LICENSE = "GPLv2" +DEPENDS = "ncurses" + +SRC_URI = "http://www.linuxpowertop.org/download/powertop-${PV}.tar.gz" + +CFLAGS += "${LDFLAGS}" + +do_configure() { + # We do not build ncurses with wide char support + sed -i -e "s/lncursesw/lncurses/" ${S}/Makefile +} + +do_install() { + oe_runmake install DESTDIR=${D} +} diff --git a/packages/prboom/prboom_2.2.6.bb b/packages/prboom/prboom_2.2.6.bb index f20aae2b64..a54616db71 100644 --- a/packages/prboom/prboom_2.2.6.bb +++ b/packages/prboom/prboom_2.2.6.bb @@ -11,7 +11,7 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/prboom/prboom-${PV}.tar.gz \ inherit autotools -EXTRA_OECONF = " --without-x --disable-sdltest --with-sdl-exec-prefix=${STAGING_DIR}/${BUILD_SYS} " +EXTRA_OECONF = "--without-x --disable-sdltest --with-sdl-exec-prefix=${STAGING_DIR_NATIVE}${layout_exec_prefix}" do_configure() { gnu-configize diff --git a/packages/prboom/prboom_2.3.1.bb b/packages/prboom/prboom_2.3.1.bb index 88d1f6a183..7af6048bcd 100644 --- a/packages/prboom/prboom_2.3.1.bb +++ b/packages/prboom/prboom_2.3.1.bb @@ -16,7 +16,7 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/prboom/prboom-${PV}.tar.gz \ inherit autotools -EXTRA_OECONF = " --without-x --disable-sdltest --with-sdl-exec-prefix=${STAGING_DIR}/${BUILD_SYS} " +EXTRA_OECONF = "--without-x --disable-sdltest --with-sdl-exec-prefix=${STAGING_DIR_NATIVE}${layout_exec_prefix}" do_configure() { gnu-configize diff --git a/packages/python/python-native_2.5.1.bb b/packages/python/python-native_2.5.1.bb index a64a4f96c8..ea6e257043 100644 --- a/packages/python/python-native_2.5.1.bb +++ b/packages/python/python-native_2.5.1.bb @@ -17,8 +17,8 @@ S = "${WORKDIR}/Python-${PV}" inherit autotools native -prefix = "${STAGING_DIR}/${BUILD_SYS}" -exec_prefix = "${STAGING_DIR}/${BUILD_SYS}" +prefix = "${STAGING_DIR_NATIVE}/${layout_prefix}" +exec_prefix = "${STAGING_DIR_NATIVE}/${layout_exec_prefix}" EXTRA_OECONF = "--with-threads --with-pymalloc --with-cyclic-gc \ --without-cxx --with-signal-module --with-wctype-functions" @@ -30,5 +30,5 @@ EXTRA_OEMAKE = 'BUILD_SYS="" HOST_SYS=""' #} do_stage_append() { - install -m 0755 Parser/pgen ${STAGING_DIR}/${BUILD_SYS}/bin/ + install -m 0755 Parser/pgen ${STAGING_BINDIR_NATIVE}/ } diff --git a/packages/python/python-sip_4.7.bb b/packages/python/python-sip_4.7.bb index 2978edd54f..61fcc32986 100644 --- a/packages/python/python-sip_4.7.bb +++ b/packages/python/python-sip_4.7.bb @@ -30,7 +30,7 @@ do_configure_prepend() { } do_stage() { - install -d ${STAGING_DIR}/${BUILD_SYS}/lib/${PYTHON_DIR}/site-packages/ + install -d ${STAGING_LIBDIR_NATIVE}/${PYTHON_DIR}/site-packages/ # sipconfig.py sipdistutils.py install -m 0644 sip.h ${STAGING_INCDIR}/sip.h } diff --git a/packages/python/python24-native_2.4.0.bb b/packages/python/python24-native_2.4.0.bb index 5e948965ad..15b2b4c0fe 100644 --- a/packages/python/python24-native_2.4.0.bb +++ b/packages/python/python24-native_2.4.0.bb @@ -16,8 +16,8 @@ S = "${WORKDIR}/Python-2.4" inherit autotools native -prefix = "${STAGING_DIR}/${BUILD_SYS}" -exec_prefix = "${STAGING_DIR}/${BUILD_SYS}" +prefix = "${STAGING_DIR_NATIVE}${layout_prefix}" +exec_prefix = "${STAGING_DIR_NATIVE}${layout_exec_prefix}" EXTRA_OECONF = "--with-threads --with-pymalloc --with-cyclic-gc \ --without-cxx --with-signal-module --with-wctype-functions" @@ -30,6 +30,6 @@ do_configure() { do_stage_append() { # install pgen for later usage with non-native builds - install Parser/pgen ${STAGING_DIR}/${BUILD_SYS}/bin/ + install Parser/pgen ${STAGING_BINDIR_NATIVE}/ } diff --git a/packages/qemu/qemu-native.inc b/packages/qemu/qemu-native.inc index f97e031f73..a20f5056b5 100644 --- a/packages/qemu/qemu-native.inc +++ b/packages/qemu/qemu-native.inc @@ -1,5 +1,4 @@ FILESPATH =. "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/qemu-${PV}:" -# prefix = "${STAGING_DIR}/${BUILD_SYS}" DEPENDS = "libsdl-native zlib-native" require qemu-gcc3-check.inc diff --git a/packages/qemu/qemu-native_20070613.bb b/packages/qemu/qemu-native_20070613.bb index 88c944a308..d440d560e8 100644 --- a/packages/qemu/qemu-native_20070613.bb +++ b/packages/qemu/qemu-native_20070613.bb @@ -1,7 +1,7 @@ require qemu_${PV}.bb inherit native DEPENDS = "zlib-native" -prefix = "${STAGING_DIR}/${BUILD_SYS}" +prefix = "${STAGING_DIR_NATIVE}/${layout_prefix}" require qemu-gcc3-check.inc diff --git a/packages/qte/qte-mt_2.3.10.bb b/packages/qte/qte-mt_2.3.10.bb index 0af996559e..cb908aeca0 100644 --- a/packages/qte/qte-mt_2.3.10.bb +++ b/packages/qte/qte-mt_2.3.10.bb @@ -4,3 +4,5 @@ PR = "r24" EXTRA_OECONF += "-thread" PACKAGE_ARCH = "${MACHINE_ARCH}" + +DEFAULT_PREFERENCE = "1" diff --git a/packages/subversion/subversion_1.3.1.bb b/packages/subversion/subversion_1.3.1.bb index 775fed148f..1e40cd7a55 100644 --- a/packages/subversion/subversion_1.3.1.bb +++ b/packages/subversion/subversion_1.3.1.bb @@ -9,7 +9,7 @@ SRC_URI = "http://subversion.tigris.org/downloads/${P}.tar.bz2 \ file://disable-revision-install.patch;patch=1 \ file://apr-regex.patch;patch=1" -EXTRA_OECONF = "--with-neon=${STAGING_DIR}/${BUILD_SYS} \ +EXTRA_OECONF = "--with-neon=${STAGING_DIR_NATIVE}${layout_exec_prefix} \ --without-berkeley-db --without-apxs --without-apache \ --without-swig --with-apr=${STAGING_BINDIR_CROSS} \ --with-apr-util=${STAGING_BINDIR_CROSS}" diff --git a/packages/swig/swig_1.3.31.bb b/packages/swig/swig_1.3.31.bb index c8f595be07..8a8138c21c 100644 --- a/packages/swig/swig_1.3.31.bb +++ b/packages/swig/swig_1.3.31.bb @@ -8,7 +8,7 @@ S = "${WORKDIR}/swig-${PV}" inherit autotools -EXTRA_OECONF = "--with-python=${STAGING_BINDIR_NATIVE} --with-swiglibdir=${STAGING_DIR}/${BUILD_SYS}/swig" +EXTRA_OECONF = "--with-python=${STAGING_BINDIR_NATIVE} --with-swiglibdir=${STAGING_DIR_NATIVE}/swig" do_configure() { oe_runconf diff --git a/packages/syslog-ng/syslog-ng_2.0.5.bb b/packages/syslog-ng/syslog-ng_2.0.5.bb new file mode 100644 index 0000000000..2db95969df --- /dev/null +++ b/packages/syslog-ng/syslog-ng_2.0.5.bb @@ -0,0 +1,34 @@ +DESCRIPTION = "Alternative system logger daemon" +DEPENDS = "libol flex eventlog" +PR = "r1" + +SRC_URI = "http://www.balabit.com/downloads/files/syslog-ng/sources/stable/src/${P}.tar.gz \ + file://syslog-ng.conf \ + file://initscript" + +S = "${WORKDIR}/${PN}-${PV}" + +inherit autotools update-rc.d + +EXTRA_OECONF = "--with-libol=${STAGING_BINDIR_CROSS}/" + +do_install_append() { + install -d ${D}/${sysconfdir}/${PN} + install ${WORKDIR}/syslog-ng.conf ${D}${sysconfdir}/syslog-ng.conf + install -d ${D}/${sysconfdir}/init.d + install -m 755 ${WORKDIR}/initscript ${D}/${sysconfdir}/init.d/syslog-ng +} + +pkg_postinst() { + update-rc.d -f syslog remove +} + +pkg_postrm() { + update-rc.d syslog add 5 +} + +CONFFILES_${PN} = "${sysconfdir}/syslog-ng.conf" + +INITSCRIPT_NAME = "syslog-ng" +#INITSCRIPT_PARAMS = "defaults 05" +INITSCRIPT_PARAMS = "remove" diff --git a/packages/tasks/task-base.bb b/packages/tasks/task-base.bb index 7a541d1f2b..412254d944 100644 --- a/packages/tasks/task-base.bb +++ b/packages/tasks/task-base.bb @@ -1,5 +1,5 @@ DESCRIPTION = "Merge machine and distro options to create a basic machine task/package" -PR = "r43" +PR = "r44" inherit task diff --git a/packages/tasks/task-native-sdk.bb b/packages/tasks/task-native-sdk.bb index b164363612..d27a855c9d 100644 --- a/packages/tasks/task-native-sdk.bb +++ b/packages/tasks/task-native-sdk.bb @@ -4,6 +4,7 @@ DEPENDS = "gcc binutils make patch patchutils diffstat diffutils automake flex b RDEPENDS = "gcc-symlinks g++-symlinks binutils-symlinks make libc6-dev \ flex flex-dev bison gawk sed grep autoconf automake make \ patch patchutils diffstat diffutils libgcc-s-dev libstdc++-dev" +PR = "r1" ALLOW_EMPTY = "1" PACKAGES = "${PN}" diff --git a/packages/tasks/task-openmoko.bb b/packages/tasks/task-openmoko.bb index 2df8c6c293..26b12fb795 100644 --- a/packages/tasks/task-openmoko.bb +++ b/packages/tasks/task-openmoko.bb @@ -2,7 +2,7 @@ DESCRIPTION = "OpenMoko: Tasks for the OpenMoko Linux Distribution" SECTION = "openmoko/base" LICENSE = "MIT" PROVIDES = "task-openmoko-everything" -PR = "r66" +PR = "r67" inherit task diff --git a/packages/telepathy/telepathy-idle_0.1.2.bb b/packages/telepathy/telepathy-idle_0.1.2.bb new file mode 100644 index 0000000000..d152e31a21 --- /dev/null +++ b/packages/telepathy/telepathy-idle_0.1.2.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "IRC connection manager for Telepathy" +HOMEPAGE = "http://telepathy.freedesktop.org/wiki/" +DEPENDS = "glib-2.0 dbus telepathy-glib openssl" +LICENSE = "LGPL" + +SRC_URI = "http://telepathy.freedesktop.org/releases/${PN}/${P}.tar.gz" + +inherit autotools pkgconfig + +FILES_${PN} += "${datadir}/telepathy \ + ${datadir}/dbus-1" diff --git a/packages/telepathy/telepathy-inspector/.mtn2git_empty b/packages/telepathy/telepathy-inspector/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/telepathy/telepathy-inspector/.mtn2git_empty diff --git a/packages/telepathy/telepathy-inspector/scons-workaround.patch b/packages/telepathy/telepathy-inspector/scons-workaround.patch new file mode 100644 index 0000000000..ac3c37cb9c --- /dev/null +++ b/packages/telepathy/telepathy-inspector/scons-workaround.patch @@ -0,0 +1,12 @@ +Index: telepathy-inspector-0.5.0/SConstruct +=================================================================== +--- telepathy-inspector-0.5.0.orig/SConstruct 2007-10-31 10:49:00.000000000 +0100 ++++ telepathy-inspector-0.5.0/SConstruct 2007-10-31 10:49:10.000000000 +0100 +@@ -4,6 +4,7 @@ + SConsignFile() + + env = Environment(ENV = os.environ) ++env['CC'] = os.environ['CC'] + + # Variables + diff --git a/packages/telepathy/telepathy-inspector_0.5.0.bb b/packages/telepathy/telepathy-inspector_0.5.0.bb new file mode 100644 index 0000000000..069430775a --- /dev/null +++ b/packages/telepathy/telepathy-inspector_0.5.0.bb @@ -0,0 +1,11 @@ +DESCRIPTION = "debugging tool for Telepathy developers" +DEPENDS = "glib-2.0 gtk+ libglade dbus-glib" +LICENSE = "LGPL" + +SRC_URI = "${SOURCEFORGE_MIRROR}/tapioca-voip/telepathy-inspector-0.5.0.tar.gz \ + file://scons-workaround.patch;patch=1" + +inherit scons + +FILES_${PN} += "${datadir}/telepathy \ + ${datadir}/dbus-1" diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-83xx-optimizations.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-83xx-optimizations.patch new file mode 100644 index 0000000000..fe85228771 --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-83xx-optimizations.patch @@ -0,0 +1,89 @@ +diff --exclude CVS -uNr u-boot-1.1.6/cpu/mpc83xx/cpu_init.c u-boot-1.1.6.modified/cpu/mpc83xx/cpu_init.c +--- u-boot-1.1.6/cpu/mpc83xx/cpu_init.c 2007-04-10 17:43:16.000000000 -0400 ++++ u-boot-1.1.6.modified/cpu/mpc83xx/cpu_init.c 2007-04-10 17:31:51.000000000 -0400 +@@ -66,10 +66,30 @@ + memset ((void *) gd, 0, sizeof (gd_t)); + + /* system performance tweaking */ ++ /* System Priority Configuration Register (SPCR) */ ++#ifdef CFG_SPCR_PCIHPE ++ /* PCI highest priority enable */ ++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_PCIHPE) | (CFG_SPCR_PCIHPE << SPCR_PCIHPE_SHIFT); ++#endif + +-#ifdef CFG_ACR_PIPE_DEP +- /* Arbiter pipeline depth */ +- im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) | (3 << ACR_PIPE_DEP_SHIFT); ++#ifdef CFG_SPCR_PCIPR ++ /* PCI bridge CSB request priority */ ++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_PCIPR) | (CFG_SPCR_PCIPR << SPCR_PCIPR_SHIFT); ++#endif ++ ++#ifdef CFG_SPCR_OPT ++ /* Optimize transactions between CSB and other devices */ ++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_OPT) | (CFG_SPCR_OPT << SPCR_OPT_SHIFT); ++#endif ++ ++#ifdef CFG_SPCR_TBEN ++ /* e300 time base unit enable */ ++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TBEN) | (CFG_SPCR_TBEN << SPCR_TBEN_SHIFT); ++#endif ++ ++#ifdef CFG_SPCR_COREPR ++ /* e300 core CSB request priority */ ++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_COREPR) | (CFG_SPCR_COREPR << SPCR_COREPR_SHIFT); + #endif + + #ifdef CFG_SPCR_TSEC1EP +@@ -82,6 +102,7 @@ + im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) | (3 << SPCR_TSEC2EP_SHIFT); + #endif + ++ /* System Clock Control Register (SCCR) */ + #ifdef CFG_SCCR_TSEC1CM + /* TSEC1 clock mode */ + im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) | (1 << SCCR_TSEC1CM_SHIFT); +@@ -91,6 +112,12 @@ + im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) | (1 << SCCR_TSEC2CM_SHIFT); + #endif + ++ /* Arbiter Control Register (ACR) */ ++#ifdef CFG_ACR_PIPE_DEP ++ /* Arbiter pipeline depth */ ++ im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) | (3 << ACR_PIPE_DEP_SHIFT); ++#endif ++ + #ifdef CFG_ACR_RPTCNT + /* Arbiter repeat count */ + im->arbiter.acr = ((im->arbiter.acr & ~(ACR_RPTCNT)) | (3 << ACR_RPTCNT_SHIFT)); +diff --exclude CVS -uNr u-boot-1.1.6/include/configs/MPC8323ERDB.h u-boot-1.1.6.modified/include/configs/MPC8323ERDB.h +--- u-boot-1.1.6/include/configs/MPC8323ERDB.h 2007-04-10 17:43:16.000000000 -0400 ++++ u-boot-1.1.6.modified/include/configs/MPC8323ERDB.h 2007-04-10 17:32:03.000000000 -0400 +@@ -63,6 +63,16 @@ + HRCWH_BIG_ENDIAN |\ + HRCWH_LALE_NORMAL) + ++/* System performance */ ++#define CFG_ACR_PIPE_DEP 3 /* Arbiter pipeline depth (0-3) */ ++#define CFG_ACR_RPTCNT 3 /* Arbiter repeat count (0-7) */ ++#define CFG_SPCR_PCIHPE 0 /* (0-1) PCI highest priority enable */ ++#define CFG_SPCR_PCIPR 0 /* (0-3) PCI bridge CSB request priority */ ++#define CFG_SPCR_OPT 1 /* (0-1) Optimize transactions between CSB and the SEC and QUICC Engine block */ ++#define CFG_SPCR_TBEN 1 /* (0-1) e300 time base unit enable */ ++#define CFG_SPCR_COREPR 0 /* (0-3) e300 core CSB request priority */ ++ ++ + /* + * System IO Config + */ +diff --exclude CVS -uNr u-boot-1.1.6/include/mpc83xx.h u-boot-1.1.6.modified/include/mpc83xx.h +--- u-boot-1.1.6/include/mpc83xx.h 2007-04-10 17:43:16.000000000 -0400 ++++ u-boot-1.1.6.modified/include/mpc83xx.h 2007-04-10 17:32:15.000000000 -0400 +@@ -91,6 +91,7 @@ + #define SPCR_PCIPR 0x03000000 /* PCI bridge system bus request priority */ + #define SPCR_PCIPR_SHIFT (31-7) + #define SPCR_OPT 0x00800000 /* Optimize */ ++#define SPCR_OPT_SHIFT (31-8) + #define SPCR_TBEN 0x00400000 /* E300 PowerPC core time base unit enable */ + #define SPCR_TBEN_SHIFT (31-9) + #define SPCR_COREPR 0x00300000 /* E300 PowerPC Core system bus request priority */ diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Add-support-for-the-MPC832XEMDS-board.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Add-support-for-the-MPC832XEMDS-board.patch new file mode 100644 index 0000000000..5018cd3434 --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Add-support-for-the-MPC832XEMDS-board.patch @@ -0,0 +1,1809 @@ +fe298a1bbd7b9526ca1139da8977e1a076c4e176 +diff --git a/Makefile b/Makefile +index d2534ab..d172411 100644 +--- a/Makefile ++++ b/Makefile +@@ -1621,6 +1621,30 @@ MPC8360EMDS_SLAVE_config: unconfig + MPC8349ITX_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349itx + ++MPC832XEMDS_config \ ++MPC832XEMDS_HOST_33_config \ ++MPC832XEMDS_HOST_66_config \ ++MPC832XEMDS_SLAVE_config: unconfig ++ @echo "" >include/config.h ; \ ++ if [ "$(findstring _HOST_,$@)" ] ; then \ ++ echo -n "... PCI HOST " ; \ ++ echo "#define CONFIG_PCI" >>include/config.h ; \ ++ fi ; \ ++ if [ "$(findstring _SLAVE_,$@)" ] ; then \ ++ echo "...PCI SLAVE 66M" ; \ ++ echo "#define CONFIG_PCI" >>include/config.h ; \ ++ echo "#define CONFIG_PCISLAVE" >>include/config.h ; \ ++ fi ; \ ++ if [ "$(findstring _33_,$@)" ] ; then \ ++ echo -n "...33M ..." ; \ ++ echo "#define PCI_33M" >>include/config.h ; \ ++ fi ; \ ++ if [ "$(findstring _66_,$@)" ] ; then \ ++ echo -n "...66M..." ; \ ++ echo "#define PCI_66M" >>include/config.h ; \ ++ fi ; ++ @$(MKCONFIG) -a MPC832XEMDS ppc mpc83xx mpc832xemds ++ + ######################################################################### + ## MPC85xx Systems + ######################################################################### +diff --git a/board/mpc832xemds/Makefile b/board/mpc832xemds/Makefile +new file mode 100644 +index 0000000..5ec7a87 +--- /dev/null ++++ b/board/mpc832xemds/Makefile +@@ -0,0 +1,50 @@ ++# ++# (C) Copyright 2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++include $(TOPDIR)/config.mk ++ ++LIB = $(obj)lib$(BOARD).a ++ ++COBJS := $(BOARD).o pci.o ++ ++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS)) ++SOBJS := $(addprefix $(obj),$(SOBJS)) ++ ++$(LIB): $(obj).depend $(OBJS) ++ $(AR) $(ARFLAGS) $@ $(OBJS) ++ ++clean: ++ rm -f $(SOBJS) $(OBJS) ++ ++distclean: clean ++ rm -f $(LIB) core *.bak .depend ++ ++######################################################################### ++ ++# defines $(obj).depend target ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +diff --git a/board/mpc832xemds/config.mk b/board/mpc832xemds/config.mk +new file mode 100644 +index 0000000..6c3eca7 +--- /dev/null ++++ b/board/mpc832xemds/config.mk +@@ -0,0 +1,28 @@ ++# ++# (C) Copyright 2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++# ++# MPC832XEMDS ++# ++ ++TEXT_BASE = 0xFE000000 +diff --git a/board/mpc832xemds/mpc832xemds.c b/board/mpc832xemds/mpc832xemds.c +new file mode 100644 +index 0000000..772da67 +--- /dev/null ++++ b/board/mpc832xemds/mpc832xemds.c +@@ -0,0 +1,176 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ */ ++ ++#include <common.h> ++#include <ioports.h> ++#include <mpc83xx.h> ++#include <i2c.h> ++#include <spd.h> ++#include <miiphy.h> ++#include <command.h> ++#if defined(CONFIG_PCI) ++#include <pci.h> ++#endif ++#if defined(CONFIG_SPD_EEPROM) ++#include <spd_sdram.h> ++#else ++#include <asm/mmu.h> ++#endif ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ ++const qe_iop_conf_t qe_iop_conf_tab[] = { ++ /* ETH3 */ ++ {1, 0, 1, 0, 1}, /* TxD0 */ ++ {1, 1, 1, 0, 1}, /* TxD1 */ ++ {1, 2, 1, 0, 1}, /* TxD2 */ ++ {1, 3, 1, 0, 1}, /* TxD3 */ ++ {1, 9, 1, 0, 1}, /* TxER */ ++ {1, 12, 1, 0, 1}, /* TxEN */ ++ {3, 24, 2, 0, 1}, /* TxCLK->CLK10 */ ++ ++ {1, 4, 2, 0, 1}, /* RxD0 */ ++ {1, 5, 2, 0, 1}, /* RxD1 */ ++ {1, 6, 2, 0, 1}, /* RxD2 */ ++ {1, 7, 2, 0, 1}, /* RxD3 */ ++ {1, 8, 2, 0, 1}, /* RxER */ ++ {1, 10, 2, 0, 1}, /* RxDV */ ++ {0, 13, 2, 0, 1}, /* RxCLK->CLK9 */ ++ {1, 11, 2, 0, 1}, /* COL */ ++ {1, 13, 2, 0, 1}, /* CRS */ ++ ++ /* ETH4 */ ++ {1, 18, 1, 0, 1}, /* TxD0 */ ++ {1, 19, 1, 0, 1}, /* TxD1 */ ++ {1, 20, 1, 0, 1}, /* TxD2 */ ++ {1, 21, 1, 0, 1}, /* TxD3 */ ++ {1, 27, 1, 0, 1}, /* TxER */ ++ {1, 30, 1, 0, 1}, /* TxEN */ ++ {3, 6, 2, 0, 1}, /* TxCLK->CLK8 */ ++ ++ {1, 22, 2, 0, 1}, /* RxD0 */ ++ {1, 23, 2, 0, 1}, /* RxD1 */ ++ {1, 24, 2, 0, 1}, /* RxD2 */ ++ {1, 25, 2, 0, 1}, /* RxD3 */ ++ {1, 26, 1, 0, 1}, /* RxER */ ++ {1, 28, 2, 0, 1}, /* Rx_DV */ ++ {3, 31, 2, 0, 1}, /* RxCLK->CLK7 */ ++ {1, 29, 2, 0, 1}, /* COL */ ++ {1, 31, 2, 0, 1}, /* CRS */ ++ ++ {3, 4, 3, 0, 2}, /* MDIO */ ++ {3, 5, 1, 0, 2}, /* MDC */ ++ ++ {0, 0, 0, 0, QE_IOP_TAB_END}, /* END of table */ ++}; ++ ++int board_early_init_f(void) ++{ ++ volatile u8 *bcsr = (volatile u8 *)CFG_BCSR; ++ ++ /* Enable flash write */ ++ bcsr[9] &= ~0x08; ++ ++ return 0; ++} ++ ++int fixed_sdram(void); ++ ++long int initdram(int board_type) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 msize = 0; ++ ++ if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) ++ return -1; ++ ++ /* DDR SDRAM - Main SODIMM */ ++ im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR; ++ ++ msize = fixed_sdram(); ++ ++ puts("\n DDR RAM: "); ++ ++ /* return total bus SDRAM size(bytes) -- DDR */ ++ return (msize * 1024 * 1024); ++} ++ ++/************************************************************************* ++ * fixed sdram init -- doesn't use serial presence detect. ++ ************************************************************************/ ++int fixed_sdram(void) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 msize = 0; ++ u32 ddr_size; ++ u32 ddr_size_log2; ++ ++ msize = CFG_DDR_SIZE; ++ for (ddr_size = msize << 20, ddr_size_log2 = 0; ++ (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) { ++ if (ddr_size & 1) { ++ return -1; ++ } ++ } ++ im->sysconf.ddrlaw[0].ar = ++ LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE); ++#if (CFG_DDR_SIZE != 128) ++#warning Currenly any ddr size other than 128 is not supported ++#endif ++ im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL; ++ im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS; ++ im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG; ++ im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0; ++ im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; ++ im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; ++ im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3; ++ im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG; ++ im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2; ++ im->ddr.sdram_mode = CFG_DDR_MODE; ++ im->ddr.sdram_mode2 = CFG_DDR_MODE2; ++ im->ddr.sdram_interval = CFG_DDR_INTERVAL; ++ __asm__ __volatile__ ("sync"); ++ udelay(200); ++ ++ im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; ++ __asm__ __volatile__ ("sync"); ++ return msize; ++} ++ ++int checkboard(void) ++{ ++ puts("Board: Freescale MPC832XEMDS\n"); ++ return 0; ++} ++ ++#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) ++void ++ft_board_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++#ifdef CONFIG_PCI ++ ft_pci_setup(blob, bd); ++#endif ++ ft_cpu_setup(blob, bd); ++ ++ p = ft_get_prop(blob, "/memory/reg", &len); ++ if (p != NULL) { ++ *p++ = cpu_to_be32(bd->bi_memstart); ++ *p = cpu_to_be32(bd->bi_memsize); ++ } ++} ++#endif +diff --git a/board/mpc832xemds/pci.c b/board/mpc832xemds/pci.c +new file mode 100644 +index 0000000..09f3ac3 +--- /dev/null ++++ b/board/mpc832xemds/pci.c +@@ -0,0 +1,313 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ */ ++ ++/* ++ * PCI Configuration space access support for MPC83xx PCI Bridge ++ */ ++#include <asm/mmu.h> ++#include <asm/io.h> ++#include <common.h> ++#include <pci.h> ++#include <i2c.h> ++ ++#include <asm/fsl_i2c.h> ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#if defined(CONFIG_PCI) ++#define PCI_FUNCTION_CONFIG 0x44 ++#define PCI_FUNCTION_CFG_LOCK 0x20 ++ ++/* ++ * Initialize PCI Devices, report devices found ++ */ ++#ifndef CONFIG_PCI_PNP ++static struct pci_config_table pci_mpc83xxemds_config_table[] = { ++ { ++ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, ++ pci_cfgfunc_config_device, ++ {PCI_ENET0_IOADDR, ++ PCI_ENET0_MEMADDR, ++ PCI_COMMON_MEMORY | PCI_COMMAND_MASTER} ++ }, ++ {} ++} ++#endif ++static struct pci_controller hose[] = { ++ { ++#ifndef CONFIG_PCI_PNP ++ config_table:pci_mpc83xxemds_config_table, ++#endif ++ }, ++}; ++ ++/********************************************************************** ++ * pci_init_board() ++ *********************************************************************/ ++void pci_init_board(void) ++#ifdef CONFIG_PCISLAVE ++{ ++ u16 reg16; ++ volatile immap_t *immr; ++ volatile law83xx_t *pci_law; ++ volatile pot83xx_t *pci_pot; ++ volatile pcictrl83xx_t *pci_ctrl; ++ volatile pciconf83xx_t *pci_conf; ++ ++ immr = (immap_t *) CFG_IMMR; ++ pci_law = immr->sysconf.pcilaw; ++ pci_pot = immr->ios.pot; ++ pci_ctrl = immr->pci_ctrl; ++ pci_conf = immr->pci_conf; ++ /* ++ * Configure PCI Inbound Translation Windows ++ */ ++ pci_ctrl[0].pitar0 = 0x0; ++ pci_ctrl[0].pibar0 = 0x0; ++ pci_ctrl[0].piwar0 = PIWAR_EN | PIWAR_RTT_SNOOP | ++ PIWAR_WTT_SNOOP | PIWAR_IWS_4K; ++ ++ pci_ctrl[0].pitar1 = 0x0; ++ pci_ctrl[0].pibar1 = 0x0; ++ pci_ctrl[0].piebar1 = 0x0; ++ pci_ctrl[0].piwar1 &= ~PIWAR_EN; ++ ++ pci_ctrl[0].pitar2 = 0x0; ++ pci_ctrl[0].pibar2 = 0x0; ++ pci_ctrl[0].piebar2 = 0x0; ++ pci_ctrl[0].piwar2 &= ~PIWAR_EN; ++ ++ hose[0].first_busno = 0; ++ hose[0].last_busno = 0xff; ++ pci_setup_indirect(&hose[0], ++ (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304)); ++ reg16 = 0xff; ++ ++ pci_hose_read_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_COMMAND, ®16); ++ reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MEMORY; ++ pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_COMMAND, reg16); ++ ++ /* ++ * Clear non-reserved bits in status register. ++ */ ++ pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_STATUS, 0xffff); ++ pci_hose_write_config_byte(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_LATENCY_TIMER, 0x80); ++ ++ /* ++ * Unlock configuration lock in PCI function configuration register. ++ */ ++ pci_hose_read_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_FUNCTION_CONFIG, ®16); ++ reg16 &= ~(PCI_FUNCTION_CFG_LOCK); ++ pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_FUNCTION_CONFIG, reg16); ++ ++ printf("Enabled PCI 32bit Agent Mode\n"); ++} ++#else ++{ ++ volatile immap_t *immr; ++ volatile clk83xx_t *clk; ++ volatile law83xx_t *pci_law; ++ volatile pot83xx_t *pci_pot; ++ volatile pcictrl83xx_t *pci_ctrl; ++ volatile pciconf83xx_t *pci_conf; ++ ++ u8 val8, orig_i2c_bus; ++ u16 reg16; ++ u32 val32; ++ u32 dev; ++ ++ immr = (immap_t *) CFG_IMMR; ++ clk = (clk83xx_t *) & immr->clk; ++ pci_law = immr->sysconf.pcilaw; ++ pci_pot = immr->ios.pot; ++ pci_ctrl = immr->pci_ctrl; ++ pci_conf = immr->pci_conf; ++ /* ++ * Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode ++ */ ++ val32 = clk->occr; ++ udelay(2000); ++#if defined(PCI_66M) ++ clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2; ++ printf("PCI clock is 66MHz\n"); ++#elif defined(PCI_33M) ++ clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2 | ++ OCCR_PCICD0 | OCCR_PCICD1 | OCCR_PCICD2 | OCCR_PCICR; ++ printf("PCI clock is 33MHz\n"); ++#else ++ clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2; ++ printf("PCI clock is 66MHz\n"); ++#endif ++ udelay(2000); ++ ++ /* ++ * Configure PCI Local Access Windows ++ */ ++ pci_law[0].bar = CFG_PCI_MEM_PHYS & LAWBAR_BAR; ++ pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_512M; ++ ++ pci_law[1].bar = CFG_PCI_IO_PHYS & LAWBAR_BAR; ++ pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_1M; ++ ++ /* ++ * Configure PCI Outbound Translation Windows ++ */ ++ ++ /* PCI mem space - prefetch */ ++ pci_pot[0].potar = (CFG_PCI_MEM_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[0].pobar = (CFG_PCI_MEM_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[0].pocmr = ++ POCMR_EN | POCMR_SE | (POCMR_CM_256M & POCMR_CM_MASK); ++ ++ /* PCI mmio - non-prefetch mem space */ ++ pci_pot[1].potar = (CFG_PCI_MMIO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[1].pobar = (CFG_PCI_MMIO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[1].pocmr = POCMR_EN | (POCMR_CM_256M & POCMR_CM_MASK); ++ ++ /* PCI IO space */ ++ pci_pot[2].potar = (CFG_PCI_IO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[2].pobar = (CFG_PCI_IO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[2].pocmr = POCMR_EN | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK); ++ ++ /* ++ * Configure PCI Inbound Translation Windows ++ */ ++ pci_ctrl[0].pitar1 = (CFG_PCI_SLV_MEM_LOCAL >> 12) & PITAR_TA_MASK; ++ pci_ctrl[0].pibar1 = (CFG_PCI_SLV_MEM_BUS >> 12) & PIBAR_MASK; ++ pci_ctrl[0].piebar1 = 0x0; ++ pci_ctrl[0].piwar1 = ++ PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | ++ PIWAR_IWS_2G; ++ ++ /* ++ * Assign PIB PMC slot to desired PCI bus ++ */ ++ ++ /* Switch temporarily to I2C bus #2 */ ++ orig_i2c_bus = i2c_get_bus_num(); ++ i2c_set_bus_num(1); ++ ++ val8 = 0; ++ i2c_write(0x23, 0x6, 1, &val8, 1); ++ i2c_write(0x23, 0x7, 1, &val8, 1); ++ val8 = 0xff; ++ i2c_write(0x23, 0x2, 1, &val8, 1); ++ i2c_write(0x23, 0x3, 1, &val8, 1); ++ ++ val8 = 0; ++ i2c_write(0x26, 0x6, 1, &val8, 1); ++ val8 = 0x34; ++ i2c_write(0x26, 0x7, 1, &val8, 1); ++ ++ val8 = 0xf9; /* PMC2, PMC3 slot to PCI bus */ ++ i2c_write(0x26, 0x2, 1, &val8, 1); ++ val8 = 0xff; ++ i2c_write(0x26, 0x3, 1, &val8, 1); ++ ++ val8 = 0; ++ i2c_write(0x27, 0x6, 1, &val8, 1); ++ i2c_write(0x27, 0x7, 1, &val8, 1); ++ val8 = 0xff; ++ i2c_write(0x27, 0x2, 1, &val8, 1); ++ val8 = 0xef; ++ i2c_write(0x27, 0x3, 1, &val8, 1); ++ asm("eieio"); ++ ++ /* Reset to original I2C bus */ ++ i2c_set_bus_num(orig_i2c_bus); ++ ++ /* ++ * Release PCI RST Output signal ++ */ ++ udelay(2000); ++ pci_ctrl[0].gcr = 1; ++ udelay(2000); ++ ++ hose[0].first_busno = 0; ++ hose[0].last_busno = 0xff; ++ ++ /* PCI memory prefetch space */ ++ pci_set_region(hose[0].regions + 0, ++ CFG_PCI_MEM_BASE, ++ CFG_PCI_MEM_PHYS, ++ CFG_PCI_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH); ++ ++ /* PCI memory space */ ++ pci_set_region(hose[0].regions + 1, ++ CFG_PCI_MMIO_BASE, ++ CFG_PCI_MMIO_PHYS, CFG_PCI_MMIO_SIZE, PCI_REGION_MEM); ++ ++ /* PCI IO space */ ++ pci_set_region(hose[0].regions + 2, ++ CFG_PCI_IO_BASE, ++ CFG_PCI_IO_PHYS, CFG_PCI_IO_SIZE, PCI_REGION_IO); ++ ++ /* System memory space */ ++ pci_set_region(hose[0].regions + 3, ++ CFG_PCI_SLV_MEM_LOCAL, ++ CFG_PCI_SLV_MEM_BUS, ++ CFG_PCI_SLV_MEM_SIZE, ++ PCI_REGION_MEM | PCI_REGION_MEMORY); ++ ++ hose[0].region_count = 4; ++ ++ pci_setup_indirect(&hose[0], ++ (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304)); ++ ++ pci_register_hose(hose); ++ ++ /* ++ * Write command register ++ */ ++ reg16 = 0xff; ++ dev = PCI_BDF(0, 0, 0); ++ pci_hose_read_config_word(&hose[0], dev, PCI_COMMAND, ®16); ++ reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; ++ pci_hose_write_config_word(&hose[0], dev, PCI_COMMAND, reg16); ++ ++ /* ++ * Clear non-reserved bits in status register. ++ */ ++ pci_hose_write_config_word(&hose[0], dev, PCI_STATUS, 0xffff); ++ pci_hose_write_config_byte(&hose[0], dev, PCI_LATENCY_TIMER, 0x80); ++ pci_hose_write_config_byte(&hose[0], dev, PCI_CACHE_LINE_SIZE, 0x08); ++ ++ printf("PCI 32bit bus on PMC2 & PMC3\n"); ++ ++ /* ++ * Hose scan. ++ */ ++ hose->last_busno = pci_hose_scan(hose); ++} ++#endif /* CONFIG_PCISLAVE */ ++ ++#ifdef CONFIG_OF_FLAT_TREE ++void ++ft_pci_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++ p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len); ++ if (p != NULL) { ++ p[0] = hose[0].first_busno; ++ p[1] = hose[0].last_busno; ++ } ++} ++#endif /* CONFIG_OF_FLAT_TREE */ ++#endif /* CONFIG_PCI */ +diff --git a/board/mpc832xemds/u-boot.lds b/board/mpc832xemds/u-boot.lds +new file mode 100644 +index 0000000..937c87a +--- /dev/null ++++ b/board/mpc832xemds/u-boot.lds +@@ -0,0 +1,123 @@ ++/* ++ * (C) Copyright 2006 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++OUTPUT_ARCH(powerpc) ++SECTIONS ++{ ++ /* Read-only sections, merged into text segment: */ ++ . = + SIZEOF_HEADERS; ++ .interp : { *(.interp) } ++ .hash : { *(.hash) } ++ .dynsym : { *(.dynsym) } ++ .dynstr : { *(.dynstr) } ++ .rel.text : { *(.rel.text) } ++ .rela.text : { *(.rela.text) } ++ .rel.data : { *(.rel.data) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } ++ .rel.got : { *(.rel.got) } ++ .rela.got : { *(.rela.got) } ++ .rel.ctors : { *(.rel.ctors) } ++ .rela.ctors : { *(.rela.ctors) } ++ .rel.dtors : { *(.rel.dtors) } ++ .rela.dtors : { *(.rela.dtors) } ++ .rel.bss : { *(.rel.bss) } ++ .rela.bss : { *(.rela.bss) } ++ .rel.plt : { *(.rel.plt) } ++ .rela.plt : { *(.rela.plt) } ++ .init : { *(.init) } ++ .plt : { *(.plt) } ++ .text : ++ { ++ cpu/mpc83xx/start.o (.text) ++ *(.text) ++ *(.fixup) ++ *(.got1) ++ . = ALIGN(16); ++ *(.rodata) ++ *(.rodata1) ++ *(.rodata.str1.4) ++ *(.eh_frame) ++ } ++ .fini : { *(.fini) } =0 ++ .ctors : { *(.ctors) } ++ .dtors : { *(.dtors) } ++ ++ /* Read-write section, merged into data segment: */ ++ . = (. + 0x0FFF) & 0xFFFFF000; ++ _erotext = .; ++ PROVIDE (erotext = .); ++ .reloc : ++ { ++ *(.got) ++ _GOT2_TABLE_ = .; ++ *(.got2) ++ _FIXUP_TABLE_ = .; ++ *(.fixup) ++ } ++ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; ++ __fixup_entries = (. - _FIXUP_TABLE_) >> 2; ++ ++ .data : ++ { ++ *(.data) ++ *(.data1) ++ *(.sdata) ++ *(.sdata2) ++ *(.dynamic) ++ CONSTRUCTORS ++ } ++ _edata = .; ++ PROVIDE (edata = .); ++ ++ . = .; ++ __u_boot_cmd_start = .; ++ .u_boot_cmd : { *(.u_boot_cmd) } ++ __u_boot_cmd_end = .; ++ ++ ++ . = .; ++ __start___ex_table = .; ++ __ex_table : { *(__ex_table) } ++ __stop___ex_table = .; ++ ++ . = ALIGN(4096); ++ __init_begin = .; ++ .text.init : { *(.text.init) } ++ .data.init : { *(.data.init) } ++ . = ALIGN(4096); ++ __init_end = .; ++ ++ __bss_start = .; ++ .bss : ++ { ++ *(.sbss) *(.scommon) ++ *(.dynbss) ++ *(.bss) ++ *(COMMON) ++ } ++ _end = . ; ++ PROVIDE (end = .); ++} ++ENTRY(_start) +diff --git a/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c +index 1b51078..bc61219 100644 +--- a/cpu/mpc83xx/cpu.c ++++ b/cpu/mpc83xx/cpu.c +@@ -92,6 +92,22 @@ int checkcpu(void) + case SPR_8360_REV12: + puts("MPC8360, "); + break; ++ case SPR_8323E_REV10: ++ case SPR_8323E_REV11: ++ puts("MPC8323E, "); ++ break; ++ case SPR_8323_REV10: ++ case SPR_8323_REV11: ++ puts("MPC8323, "); ++ break; ++ case SPR_8321E_REV10: ++ case SPR_8321E_REV11: ++ puts("MPC8321E, "); ++ break; ++ case SPR_8321_REV10: ++ case SPR_8321_REV11: ++ puts("MPC8321, "); ++ break; + default: + puts("Rev: Unknown\n"); + return -1; /* Not sure what this is */ +diff --git a/cpu/mpc83xx/cpu_init.c b/cpu/mpc83xx/cpu_init.c +index 7574fab..eb256e5 100644 +--- a/cpu/mpc83xx/cpu_init.c ++++ b/cpu/mpc83xx/cpu_init.c +@@ -119,6 +119,11 @@ void cpu_init_f (volatile immap_t * im) + #ifdef CFG_SICRL + im->sysconf.sicrl = CFG_SICRL; + #endif ++ /* DDR control driver register */ ++#ifdef CFG_DDRCDR ++ im->sysconf.ddrcdr = CFG_DDRCDR; ++#endif ++ + #ifdef CONFIG_QE + /* Config QE ioports */ + config_qe_ioports(); +diff --git a/cpu/mpc83xx/speed.c b/cpu/mpc83xx/speed.c +index 40ba6b0..9fd1bf1 100644 +--- a/cpu/mpc83xx/speed.c ++++ b/cpu/mpc83xx/speed.c +@@ -107,15 +107,19 @@ int get_clocks(void) + #endif + u32 core_clk; + u32 i2c1_clk; ++#if !defined(CONFIG_MPC832X) + u32 i2c2_clk; ++#endif + u32 enc_clk; + u32 lbiu_clk; + u32 lclk_clk; + u32 ddr_clk; +-#if defined (CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) ++ u32 ddr_sec_clk; ++#endif ++#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + u32 qepmf; + u32 qepdf; +- u32 ddr_sec_clk; + u32 qe_clk; + u32 brg_clk; + #endif +@@ -227,10 +231,12 @@ int get_clocks(void) + return -9; + } + #endif +-#if defined (CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + i2c1_clk = csb_clk; + #endif ++#if !defined(CONFIG_MPC832X) + i2c2_clk = csb_clk; /* i2c-2 clk is equal to csb clk */ ++#endif + + switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) { + case 0: +@@ -249,12 +255,9 @@ int get_clocks(void) + /* unkown SCCR_ENCCM value */ + return -6; + } +-#if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360) ++ + lbiu_clk = csb_clk * + (1 + ((im->reset.rcwl & HRCWL_LBIUCM) >> HRCWL_LBIUCM_SHIFT)); +-#else +-#error Unknown MPC83xx chip +-#endif + lcrr = (im->lbus.lcrr & LCRR_CLKDIV) >> LCRR_CLKDIV_SHIFT; + switch (lcrr) { + case 2: +@@ -266,17 +269,14 @@ int get_clocks(void) + /* unknown lcrr */ + return -10; + } +-#if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360) ++ + ddr_clk = csb_clk * + (1 + ((im->reset.rcwl & HRCWL_DDRCM) >> HRCWL_DDRCM_SHIFT)); + corepll = (im->reset.rcwl & HRCWL_COREPLL) >> HRCWL_COREPLL_SHIFT; +-#if defined (CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) + ddr_sec_clk = csb_clk * (1 + + ((im->reset.rcwl & HRCWL_LBIUCM) >> HRCWL_LBIUCM_SHIFT)); + #endif +-#else +-#error Unknown MPC83xx chip +-#endif + + corecnf_tab_index = ((corepll & 0x1F) << 2) | ((corepll & 0x60) >> 5); + if (corecnf_tab_index > (sizeof(corecnf_tab) / sizeof(corecnf_t))) { +@@ -306,7 +306,7 @@ int get_clocks(void) + return -12; + } + +-#if defined (CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + qepmf = (im->reset.rcwl & HRCWL_CEPMF) >> HRCWL_CEPMF_SHIFT; + qepdf = (im->reset.rcwl & HRCWL_CEPDF) >> HRCWL_CEPDF_SHIFT; + qe_clk = (pci_sync_in * qepmf) / (1 + qepdf); +@@ -322,13 +322,17 @@ int get_clocks(void) + #endif + gd->core_clk = core_clk; + gd->i2c1_clk = i2c1_clk; ++#if !defined(CONFIG_MPC832X) + gd->i2c2_clk = i2c2_clk; ++#endif + gd->enc_clk = enc_clk; + gd->lbiu_clk = lbiu_clk; + gd->lclk_clk = lclk_clk; + gd->ddr_clk = ddr_clk; +-#if defined (CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) + gd->ddr_sec_clk = ddr_sec_clk; ++#endif ++#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + gd->qe_clk = qe_clk; + gd->brg_clk = brg_clk; + #endif +@@ -352,18 +356,21 @@ int print_clock_conf(void) + printf("Clock configuration:\n"); + printf(" Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000); + printf(" Core: %4d MHz\n", gd->core_clk / 1000000); +-#if defined (CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + printf(" QE: %4d MHz\n", gd->qe_clk / 1000000); ++ printf(" BRG: %4d MHz\n", gd->brg_clk / 1000000); + #endif + printf(" Local Bus Controller:%4d MHz\n", gd->lbiu_clk / 1000000); + printf(" Local Bus: %4d MHz\n", gd->lclk_clk / 1000000); + printf(" DDR: %4d MHz\n", gd->ddr_clk / 1000000); +-#if defined (CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) + printf(" DDR Secondary: %4d MHz\n", gd->ddr_sec_clk / 1000000); + #endif + printf(" SEC: %4d MHz\n", gd->enc_clk / 1000000); + printf(" I2C1: %4d MHz\n", gd->i2c1_clk / 1000000); ++#if !defined(CONFIG_MPC832X) + printf(" I2C2: %4d MHz\n", gd->i2c2_clk / 1000000); ++#endif + #if defined(CONFIG_MPC8349) + printf(" TSEC1: %4d MHz\n", gd->tsec1_clk / 1000000); + printf(" TSEC2: %4d MHz\n", gd->tsec2_clk / 1000000); +diff --git a/drivers/qe/qe.h b/drivers/qe/qe.h +index f7f8ed0..0bcd0a9 100644 +--- a/drivers/qe/qe.h ++++ b/drivers/qe/qe.h +@@ -30,7 +30,7 @@ + #define UCC_MAX_NUM 8 + + #define QE_DATAONLY_BASE (uint)(128) +-#define QE_DATAONLY_SIZE ((uint)(0xc000) - QE_DATAONLY_BASE) ++#define QE_DATAONLY_SIZE (QE_MURAM_SIZE - QE_DATAONLY_BASE) + + /* QE threads SNUM + */ +diff --git a/drivers/qe/uec.c b/drivers/qe/uec.c +index c44a5be..aea455b 100644 +--- a/drivers/qe/uec.c ++++ b/drivers/qe/uec.c +@@ -432,7 +432,12 @@ static int init_phy(struct eth_device *dev) + } + memset(mii_info, 0, sizeof(*mii_info)); + +- mii_info->speed = SPEED_1000; ++ if (uec->uec_info->uf_info.eth_type == GIGA_ETH) { ++ mii_info->speed = SPEED_1000; ++ } else { ++ mii_info->speed = SPEED_100; ++ } ++ + mii_info->duplex = DUPLEX_FULL; + mii_info->pause = 0; + mii_info->link = 1; +@@ -508,7 +513,8 @@ static void adjust_link(struct eth_device *dev) + } + + if (mii_info->speed != uec->oldspeed) { +- switch (mii_info->speed) { ++ if (uec->uec_info->uf_info.eth_type == GIGA_ETH) { ++ switch (mii_info->speed) { + case 1000: + break; + case 100: +@@ -531,6 +537,7 @@ static void adjust_link(struct eth_device *dev) + printf("%s: Ack,Speed(%d)is illegal\n", + dev->name, mii_info->speed); + break; ++ } + } + + printf("%s: Speed %dBT\n", dev->name, mii_info->speed); +diff --git a/include/asm-ppc/e300.h b/include/asm-ppc/e300.h +index 79dcae4..ff9512f 100644 +--- a/include/asm-ppc/e300.h ++++ b/include/asm-ppc/e300.h +@@ -15,6 +15,11 @@ + #define PVR_8360_REV10 (PVR_83xx | 0x0020) + #define PVR_8360_REV11 (PVR_83xx | 0x0020) + ++#if defined(CONFIG_MPC832X) ++#undef PVR_83xx ++#define PVR_83xx 0x80840000 ++#endif ++ + /* + * Hardware Implementation-Dependent Register 0 (HID0) + */ +diff --git a/include/asm-ppc/immap_83xx.h b/include/asm-ppc/immap_83xx.h +index 67b035c..77a079f 100644 +--- a/include/asm-ppc/immap_83xx.h ++++ b/include/asm-ppc/immap_83xx.h +@@ -60,7 +60,10 @@ typedef struct sysconf83xx { + u32 spcr; /* System Priority Configuration Register */ + u32 sicrl; /* System I/O Configuration Register Low */ + u32 sicrh; /* System I/O Configuration Register High */ +- u8 res6[0xE4]; ++ u8 res6[0x0C]; ++ u32 ddrcdr; /* DDR Control Driver Register */ ++ u32 ddrdsr; /* DDR Debug Status Register */ ++ u8 res7[0xD0]; + } sysconf83xx_t; + + /* +@@ -274,25 +277,35 @@ typedef struct ddr83xx { + ddr_cs_bnds_t csbnds[4];/* Chip Select x Memory Bounds */ + u8 res0[0x60]; + u32 cs_config[4]; /* Chip Select x Configuration */ +- u8 res1[0x78]; ++ u8 res1[0x70]; ++ u32 timing_cfg_3; /* SDRAM Timing Configuration 3 */ ++ u32 timing_cfg_0; /* SDRAM Timing Configuration 0 */ + u32 timing_cfg_1; /* SDRAM Timing Configuration 1 */ + u32 timing_cfg_2; /* SDRAM Timing Configuration 2 */ + u32 sdram_cfg; /* SDRAM Control Configuration */ +- u8 res2[4]; ++ u32 sdram_cfg2; /* SDRAM Control Configuration 2 */ + u32 sdram_mode; /* SDRAM Mode Configuration */ +- u8 res3[8]; ++ u32 sdram_mode2; /* SDRAM Mode Configuration 2 */ ++ u32 sdram_md_cntl; /* SDRAM Mode Control */ + u32 sdram_interval; /* SDRAM Interval Configuration */ +- u8 res9[8]; +- u32 sdram_clk_cntl; +- u8 res4[0xCCC]; ++ u32 ddr_data_init; /* SDRAM Data Initialization */ ++ u8 res2[4]; ++ u32 sdram_clk_cntl; /* SDRAM Clock Control */ ++ u8 res3[0x14]; ++ u32 ddr_init_addr; /* DDR training initialization address */ ++ u32 ddr_init_ext_addr; /* DDR training initialization extended address */ ++ u8 res4[0xAA8]; ++ u32 ddr_ip_rev1; /* DDR IP block revision 1 */ ++ u32 ddr_ip_rev2; /* DDR IP block revision 2 */ ++ u8 res5[0x200]; + u32 data_err_inject_hi; /* Memory Data Path Error Injection Mask High */ + u32 data_err_inject_lo; /* Memory Data Path Error Injection Mask Low */ + u32 ecc_err_inject; /* Memory Data Path Error Injection Mask ECC */ +- u8 res5[0x14]; ++ u8 res6[0x14]; + u32 capture_data_hi; /* Memory Data Path Read Capture High */ + u32 capture_data_lo; /* Memory Data Path Read Capture Low */ + u32 capture_ecc; /* Memory Data Path Read Capture ECC */ +- u8 res6[0x14]; ++ u8 res7[0x14]; + u32 err_detect; /* Memory Error Detect */ + u32 err_disable; /* Memory Error Disable */ + u32 err_int_en; /* Memory Error Interrupt Enable */ +@@ -300,9 +313,9 @@ typedef struct ddr83xx { + u32 capture_address; /* Memory Error Address Capture */ + u32 capture_ext_address;/* Memory Error Extended Address Capture */ + u32 err_sbe; /* Memory Single-Bit ECC Error Management */ +- u8 res7[0xA4]; ++ u8 res8[0xA4]; + u32 debug_reg; +- u8 res8[0xFC]; ++ u8 res9[0xFC]; + } ddr83xx_t; + + /* +@@ -607,6 +620,43 @@ typedef struct immap { + u8 res10[0xC0000]; + u8 qe[0x100000]; /* QE block */ + } immap_t; ++ ++#elif defined(CONFIG_MPC832X) ++typedef struct immap { ++ sysconf83xx_t sysconf; /* System configuration */ ++ wdt83xx_t wdt; /* Watch Dog Timer (WDT) Registers */ ++ rtclk83xx_t rtc; /* Real Time Clock Module Registers */ ++ rtclk83xx_t pit; /* Periodic Interval Timer */ ++ gtm83xx_t gtm[2]; /* Global Timers Module */ ++ ipic83xx_t ipic; /* Integrated Programmable Interrupt Controller */ ++ arbiter83xx_t arbiter; /* System Arbiter Registers */ ++ reset83xx_t reset; /* Reset Module */ ++ clk83xx_t clk; /* System Clock Module */ ++ pmc83xx_t pmc; /* Power Management Control Module */ ++ qepi83xx_t qepi; /* QE Ports Interrupts Registers */ ++ u8 res0[0x300]; ++ u8 dll_ddr[0x100]; ++ u8 dll_lbc[0x100]; ++ u8 res1[0x200]; ++ qepio83xx_t qepio; /* QE Parallel I/O ports */ ++ u8 res2[0x800]; ++ ddr83xx_t ddr; /* DDR Memory Controller Memory */ ++ fsl_i2c_t i2c[2]; /* I2C Controllers */ ++ u8 res3[0x1300]; ++ duart83xx_t duart[2]; /* DUART */ ++ u8 res4[0x900]; ++ lbus83xx_t lbus; /* Local Bus Controller Registers */ ++ u8 res5[0x2000]; ++ dma83xx_t dma; /* DMA */ ++ pciconf83xx_t pci_conf[1]; /* PCI Software Configuration Registers */ ++ u8 res6[128]; ++ ios83xx_t ios; /* Sequencer (IOS) */ ++ pcictrl83xx_t pci_ctrl[1]; /* PCI Controller Control and Status Registers */ ++ u8 res7[0x27A00]; ++ security83xx_t security; ++ u8 res8[0xC0000]; ++ u8 qe[0x100000]; /* QE block */ ++} immap_t; + #endif + + #endif /* __IMMAP_83xx__ */ +diff --git a/include/asm-ppc/immap_qe.h b/include/asm-ppc/immap_qe.h +index f385032..950b949 100644 +--- a/include/asm-ppc/immap_qe.h ++++ b/include/asm-ppc/immap_qe.h +@@ -547,4 +547,10 @@ typedef struct qe_immap { + + extern qe_map_t *qe_immr; + ++#if defined(CONFIG_MPC8360) ++#define QE_MURAM_SIZE 0xc000UL ++#elif defined(CONFIG_MPC832X) ++#define QE_MURAM_SIZE 0x4000UL ++#endif ++ + #endif /* __IMMAP_QE_H__ */ +diff --git a/include/configs/MPC832XEMDS.h b/include/configs/MPC832XEMDS.h +new file mode 100644 +index 0000000..b8bf00f +--- /dev/null ++++ b/include/configs/MPC832XEMDS.h +@@ -0,0 +1,629 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++#undef DEBUG ++ ++/* ++ * High Level Configuration Options ++ */ ++#define CONFIG_E300 1 /* E300 family */ ++#define CONFIG_QE 1 /* Has QE */ ++#define CONFIG_MPC83XX 1 /* MPC83xx family */ ++#define CONFIG_MPC832X 1 /* MPC832x CPU specific */ ++#define CONFIG_MPC832XEMDS 1 /* MPC832XEMDS board specific */ ++ ++/* ++ * System Clock Setup ++ */ ++#ifdef CONFIG_PCISLAVE ++#define CONFIG_83XX_PCICLK 66000000 /* in HZ */ ++#else ++#define CONFIG_83XX_CLKIN 66000000 /* in Hz */ ++#endif ++ ++#ifndef CONFIG_SYS_CLK_FREQ ++#define CONFIG_SYS_CLK_FREQ 66000000 ++#endif ++ ++/* ++ * Hardware Reset Configuration Word ++ */ ++#define CFG_HRCW_LOW (\ ++ HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\ ++ HRCWL_DDR_TO_SCB_CLK_2X1 |\ ++ HRCWL_VCO_1X2 |\ ++ HRCWL_CSB_TO_CLKIN_2X1 |\ ++ HRCWL_CORE_TO_CSB_2X1 |\ ++ HRCWL_CE_PLL_VCO_DIV_2 |\ ++ HRCWL_CE_PLL_DIV_1X1 |\ ++ HRCWL_CE_TO_PLL_1X3) ++ ++#ifdef CONFIG_PCISLAVE ++#define CFG_HRCW_HIGH (\ ++ HRCWH_PCI_AGENT |\ ++ HRCWH_PCI1_ARBITER_DISABLE |\ ++ HRCWH_CORE_ENABLE |\ ++ HRCWH_FROM_0XFFF00100 |\ ++ HRCWH_BOOTSEQ_DISABLE |\ ++ HRCWH_SW_WATCHDOG_DISABLE |\ ++ HRCWH_ROM_LOC_LOCAL_16BIT |\ ++ HRCWH_BIG_ENDIAN |\ ++ HRCWH_LALE_NORMAL) ++#else ++#define CFG_HRCW_HIGH (\ ++ HRCWH_PCI_HOST |\ ++ HRCWH_PCI1_ARBITER_ENABLE |\ ++ HRCWH_CORE_ENABLE |\ ++ HRCWH_FROM_0X00000100 |\ ++ HRCWH_BOOTSEQ_DISABLE |\ ++ HRCWH_SW_WATCHDOG_DISABLE |\ ++ HRCWH_ROM_LOC_LOCAL_16BIT |\ ++ HRCWH_BIG_ENDIAN |\ ++ HRCWH_LALE_NORMAL) ++#endif ++ ++/* ++ * System IO Config ++ */ ++#define CFG_SICRL 0x00000000 ++ ++#define CONFIG_BOARD_EARLY_INIT_F /* call board_pre_init */ ++ ++/* ++ * IMMR new address ++ */ ++#define CFG_IMMR 0xE0000000 ++ ++/* ++ * DDR Setup ++ */ ++#define CFG_DDR_BASE 0x00000000 /* DDR is system memory */ ++#define CFG_SDRAM_BASE CFG_DDR_BASE ++#define CFG_DDR_SDRAM_BASE CFG_DDR_BASE ++#define CFG_DDRCDR 0x73000002 /* DDR II voltage is 1.8V */ ++ ++#undef CONFIG_SPD_EEPROM ++#if defined(CONFIG_SPD_EEPROM) ++/* Determine DDR configuration from I2C interface ++ */ ++#define SPD_EEPROM_ADDRESS 0x51 /* DDR SODIMM */ ++#else ++/* Manually set up DDR parameters ++ */ ++#define CFG_DDR_SIZE 128 /* MB */ ++#define CFG_DDR_CS0_CONFIG 0x80840102 ++#define CFG_DDR_TIMING_0 0x00220802 ++#define CFG_DDR_TIMING_1 0x3935d322 ++#define CFG_DDR_TIMING_2 0x0f9048ca ++#define CFG_DDR_TIMING_3 0x00000000 ++#define CFG_DDR_CLK_CNTL 0x02000000 ++#define CFG_DDR_MODE 0x44400232 ++#define CFG_DDR_MODE2 0x8000c000 ++#define CFG_DDR_INTERVAL 0x03200064 ++#define CFG_DDR_CS0_BNDS 0x00000007 ++#define CFG_DDR_SDRAM_CFG 0x43080000 ++#define CFG_DDR_SDRAM_CFG2 0x00401000 ++#endif ++ ++/* ++ * Memory test ++ */ ++#undef CFG_DRAM_TEST /* memory test, takes time */ ++#define CFG_MEMTEST_START 0x00000000 /* memtest region */ ++#define CFG_MEMTEST_END 0x00100000 ++ ++/* ++ * The reserved memory ++ */ ++#define CFG_MONITOR_BASE TEXT_BASE /* start of monitor */ ++ ++#if (CFG_MONITOR_BASE < CFG_FLASH_BASE) ++#define CFG_RAMBOOT ++#else ++#undef CFG_RAMBOOT ++#endif ++ ++#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */ ++#define CFG_MALLOC_LEN (128 * 1024) /* Reserved for malloc */ ++ ++/* ++ * Initial RAM Base Address Setup ++ */ ++#define CFG_INIT_RAM_LOCK 1 ++#define CFG_INIT_RAM_ADDR 0xE6000000 /* Initial RAM address */ ++#define CFG_INIT_RAM_END 0x1000 /* End of used area in RAM */ ++#define CFG_GBL_DATA_SIZE 0x100 /* num bytes initial data */ ++#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) ++ ++/* ++ * Local Bus Configuration & Clock Setup ++ */ ++#define CFG_LCRR (LCRR_DBYP | LCRR_CLKDIV_2) ++#define CFG_LBC_LBCR 0x00000000 ++ ++/* ++ * FLASH on the Local Bus ++ */ ++#define CFG_FLASH_CFI /* use the Common Flash Interface */ ++#define CFG_FLASH_CFI_DRIVER /* use the CFI driver */ ++#define CFG_FLASH_BASE 0xFE000000 /* FLASH base address */ ++#define CFG_FLASH_SIZE 16 /* FLASH size is 16M */ ++ ++#define CFG_LBLAWBAR0_PRELIM CFG_FLASH_BASE /* Window base at flash base */ ++#define CFG_LBLAWAR0_PRELIM 0x80000018 /* 32MB window size */ ++ ++#define CFG_BR0_PRELIM (CFG_FLASH_BASE | /* Flash Base address */ \ ++ (2 << BR_PS_SHIFT) | /* 16 bit port size */ \ ++ BR_V) /* valid */ ++#define CFG_OR0_PRELIM 0xfe006ff7 /* 16MB Flash size */ ++ ++#define CFG_MAX_FLASH_BANKS 1 /* number of banks */ ++#define CFG_MAX_FLASH_SECT 128 /* sectors per device */ ++ ++#undef CFG_FLASH_CHECKSUM ++ ++/* ++ * BCSR on the Local Bus ++ */ ++#define CFG_BCSR 0xF8000000 ++#define CFG_LBLAWBAR1_PRELIM CFG_BCSR /* Access window base at BCSR base */ ++#define CFG_LBLAWAR1_PRELIM 0x8000000E /* Access window size 32K */ ++ ++#define CFG_BR1_PRELIM (CFG_BCSR|0x00000801) /* Port size=8bit, MSEL=GPCM */ ++#define CFG_OR1_PRELIM 0xFFFFE9f7 /* length 32K */ ++ ++/* ++ * SDRAM on the Local Bus ++ */ ++#undef CFG_LB_SDRAM /* The board has not SRDAM on local bus */ ++ ++#ifdef CFG_LB_SDRAM ++#define CFG_LBC_SDRAM_BASE 0xF0000000 /* SDRAM base address */ ++#define CFG_LBC_SDRAM_SIZE 64 /* LBC SDRAM is 64MB */ ++ ++#define CFG_LBLAWBAR2_PRELIM CFG_LBC_SDRAM_BASE ++#define CFG_LBLAWAR2_PRELIM 0x80000019 /* 64MB */ ++ ++/*local bus BR2, OR2 definition for SDRAM if soldered on the EPB board */ ++/* ++ * Base Register 2 and Option Register 2 configure SDRAM. ++ * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000. ++ * ++ * For BR2, need: ++ * Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0 ++ * port size = 32-bits = BR2[19:20] = 11 ++ * no parity checking = BR2[21:22] = 00 ++ * SDRAM for MSEL = BR2[24:26] = 011 ++ * Valid = BR[31] = 1 ++ * ++ * 0 4 8 12 16 20 24 28 ++ * 1111 0000 0000 0000 0001 1000 0110 0001 = f0001861 ++ * ++ * CFG_LBC_SDRAM_BASE should be masked and OR'ed into ++ * the top 17 bits of BR2. ++ */ ++ ++#define CFG_BR2_PRELIM 0xf0001861 /*Port size=32bit, MSEL=SDRAM */ ++ ++/* ++ * The SDRAM size in MB, CFG_LBC_SDRAM_SIZE, is 64. ++ * ++ * For OR2, need: ++ * 64MB mask for AM, OR2[0:7] = 1111 1100 ++ * XAM, OR2[17:18] = 11 ++ * 9 columns OR2[19-21] = 010 ++ * 13 rows OR2[23-25] = 100 ++ * EAD set for extra time OR[31] = 1 ++ * ++ * 0 4 8 12 16 20 24 28 ++ * 1111 1100 0000 0000 0110 1001 0000 0001 = fc006901 ++ */ ++ ++#define CFG_OR2_PRELIM 0xfc006901 ++ ++#define CFG_LBC_LSRT 0x32000000 /* LB sdram refresh timer, about 6us */ ++#define CFG_LBC_MRTPR 0x20000000 /* LB refresh timer prescal, 266MHz/32 */ ++ ++/* ++ * LSDMR masks ++ */ ++#define CFG_LBC_LSDMR_OP_NORMAL (0 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ARFRSH (1 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_SRFRSH (2 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_MRW (3 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PCHALL (5 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ACTBNK (6 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4)) ++ ++#define CFG_LBC_LSDMR_COMMON 0x0063b723 ++ ++/* ++ * SDRAM Controller configuration sequence. ++ */ ++#define CFG_LBC_LSDMR_1 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_PCHALL) ++#define CFG_LBC_LSDMR_2 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_3 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_4 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_MRW) ++#define CFG_LBC_LSDMR_5 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_NORMAL) ++ ++#endif ++ ++/* ++ * Windows to access PIB via local bus ++ */ ++#define CFG_LBLAWBAR3_PRELIM 0xf8008000 /* windows base 0xf8008000 */ ++#define CFG_LBLAWAR3_PRELIM 0x8000000f /* windows size 64KB */ ++ ++/* ++ * CS2 on Local Bus, to PIB ++ */ ++#define CFG_BR2_PRELIM 0xf8008801 /* CS2 base address at 0xf8008000 */ ++#define CFG_OR2_PRELIM 0xffffe9f7 /* size 32KB, port size 8bit, GPCM */ ++ ++/* ++ * CS3 on Local Bus, to PIB ++ */ ++#define CFG_BR3_PRELIM 0xf8010801 /* CS3 base address at 0xf8010000 */ ++#define CFG_OR3_PRELIM 0xffffe9f7 /* size 32KB, port size 8bit, GPCM */ ++ ++/* ++ * Serial Port ++ */ ++#define CONFIG_CONS_INDEX 1 ++#undef CONFIG_SERIAL_SOFTWARE_FIFO ++#define CFG_NS16550 ++#define CFG_NS16550_SERIAL ++#define CFG_NS16550_REG_SIZE 1 ++#define CFG_NS16550_CLK get_bus_freq(0) ++ ++#define CFG_BAUDRATE_TABLE \ ++ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200} ++ ++#define CFG_NS16550_COM1 (CFG_IMMR+0x4500) ++#define CFG_NS16550_COM2 (CFG_IMMR+0x4600) ++ ++/* Use the HUSH parser */ ++#define CFG_HUSH_PARSER ++#ifdef CFG_HUSH_PARSER ++#define CFG_PROMPT_HUSH_PS2 "> " ++#endif ++ ++/* pass open firmware flat tree */ ++#define CONFIG_OF_FLAT_TREE 1 ++#define CONFIG_OF_BOARD_SETUP 1 ++ ++/* maximum size of the flat tree (8K) */ ++#define OF_FLAT_TREE_MAX_SIZE 8192 ++ ++#define OF_CPU "PowerPC,8323@0" ++#define OF_SOC "soc8323@e0000000" ++#define OF_TBCLK (bd->bi_busfreq / 4) ++#define OF_STDOUT_PATH "/soc8323@e0000000/serial@4500" ++ ++/* I2C */ ++#define CONFIG_HARD_I2C /* I2C with hardware support */ ++#undef CONFIG_SOFT_I2C /* I2C bit-banged */ ++#define CONFIG_FSL_I2C ++#define CFG_I2C_SPEED 400000 /* I2C speed and slave address */ ++#define CFG_I2C_SLAVE 0x7F ++#define CFG_I2C_NOPROBES {0x51} /* Don't probe these addrs */ ++#define CFG_I2C_OFFSET 0x3000 ++ ++/* ++ * Config on-board RTC ++ */ ++#define CONFIG_RTC_DS1374 /* use ds1374 rtc via i2c */ ++#define CFG_I2C_RTC_ADDR 0x68 /* at address 0x68 */ ++ ++/* ++ * General PCI ++ * Addresses are mapped 1-1. ++ */ ++#define CFG_PCI_MEM_BASE 0x80000000 ++#define CFG_PCI_MEM_PHYS CFG_PCI_MEM_BASE ++#define CFG_PCI_MEM_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI_MMIO_BASE 0x90000000 ++#define CFG_PCI_MMIO_PHYS CFG_PCI_MMIO_BASE ++#define CFG_PCI_MMIO_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI_IO_BASE 0xE0300000 ++#define CFG_PCI_IO_PHYS 0xE0300000 ++#define CFG_PCI_IO_SIZE 0x100000 /* 1M */ ++ ++#define CFG_PCI_SLV_MEM_LOCAL CFG_SDRAM_BASE ++#define CFG_PCI_SLV_MEM_BUS 0x00000000 ++#define CFG_PCI_SLV_MEM_SIZE 0x80000000 ++ ++ ++#ifdef CONFIG_PCI ++ ++#define CONFIG_NET_MULTI ++#define CONFIG_PCI_PNP /* do pci plug-and-play */ ++ ++#undef CONFIG_EEPRO100 ++#undef CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */ ++#define CFG_PCI_SUBSYS_VENDORID 0x1957 /* Freescale */ ++ ++#endif /* CONFIG_PCI */ ++ ++ ++#ifndef CONFIG_NET_MULTI ++#define CONFIG_NET_MULTI 1 ++#endif ++ ++/* ++ * QE UEC ethernet configuration ++ */ ++#define CONFIG_UEC_ETH ++#define CONFIG_ETHPRIME "Freescale GETH" ++ ++#define CONFIG_UEC_ETH1 /* ETH3 */ ++ ++#ifdef CONFIG_UEC_ETH1 ++#define CFG_UEC1_UCC_NUM 2 /* UCC3 */ ++#define CFG_UEC1_RX_CLK QE_CLK9 ++#define CFG_UEC1_TX_CLK QE_CLK10 ++#define CFG_UEC1_ETH_TYPE FAST_ETH ++#define CFG_UEC1_PHY_ADDR 3 ++#define CFG_UEC1_INTERFACE_MODE ENET_100_MII ++#endif ++ ++#define CONFIG_UEC_ETH2 /* ETH4 */ ++ ++#ifdef CONFIG_UEC_ETH2 ++#define CFG_UEC2_UCC_NUM 3 /* UCC4 */ ++#define CFG_UEC2_RX_CLK QE_CLK7 ++#define CFG_UEC2_TX_CLK QE_CLK8 ++#define CFG_UEC2_ETH_TYPE FAST_ETH ++#define CFG_UEC2_PHY_ADDR 4 ++#define CFG_UEC2_INTERFACE_MODE ENET_100_MII ++#endif ++ ++/* ++ * Environment ++ */ ++#ifndef CFG_RAMBOOT ++ #define CFG_ENV_IS_IN_FLASH 1 ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE + 0x40000) ++ #define CFG_ENV_SECT_SIZE 0x40000 /* 256K(one sector) for env */ ++ #define CFG_ENV_SIZE 0x2000 ++#else ++ #define CFG_NO_FLASH 1 /* Flash is not usable now */ ++ #define CFG_ENV_IS_NOWHERE 1 /* Store ENV in memory only */ ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE - 0x1000) ++ #define CFG_ENV_SIZE 0x2000 ++#endif ++ ++#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */ ++#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */ ++ ++#if defined(CFG_RAMBOOT) ++#if defined(CONFIG_PCI) ++#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_PCI \ ++ | CFG_CMD_I2C) \ ++ & \ ++ ~(CFG_CMD_ENV \ ++ | CFG_CMD_LOADS)) ++#else ++#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C) \ ++ & \ ++ ~(CFG_CMD_ENV \ ++ | CFG_CMD_LOADS)) ++#endif ++#else ++#if defined(CONFIG_PCI) ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ ++ | CFG_CMD_PCI \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C) ++#else ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C ) ++#endif ++#endif ++ ++#include <cmd_confdefs.h> ++ ++#undef CONFIG_WATCHDOG /* watchdog disabled */ ++ ++/* ++ * Miscellaneous configurable options ++ */ ++#define CFG_LONGHELP /* undef to save memory */ ++#define CFG_LOAD_ADDR 0x2000000 /* default load address */ ++#define CFG_PROMPT "=> " /* Monitor Command Prompt */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++ #define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ ++#else ++ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ++#endif ++ ++#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ ++#define CFG_MAXARGS 16 /* max number of command args */ ++#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ ++#define CFG_HZ 1000 /* decrementer freq: 1ms ticks */ ++ ++/* ++ * For booting Linux, the board info and command line data ++ * have to be in the first 8 MB of memory, since this is ++ * the maximum mapped by the Linux kernel during initialization. ++ */ ++#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */ ++ ++/* ++ * Core HID Setup ++ */ ++#define CFG_HID0_INIT 0x000000000 ++#define CFG_HID0_FINAL HID0_ENABLE_MACHINE_CHECK ++#define CFG_HID2 HID2_HBE ++ ++/* ++ * Cache Config ++ */ ++#define CFG_DCACHE_SIZE 16384 ++#define CFG_CACHELINE_SIZE 32 ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CACHELINE_SHIFT 5 /*log base 2 of the above value */ ++#endif ++ ++/* ++ * MMU Setup ++ */ ++ ++/* DDR: cache cacheable */ ++#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT0L CFG_IBAT0L ++#define CFG_DBAT0U CFG_IBAT0U ++ ++/* IMMRBAR & PCI IO: cache-inhibit and guarded */ ++#define CFG_IBAT1L (CFG_IMMR | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT1U (CFG_IMMR | BATU_BL_4M | BATU_VS | BATU_VP) ++#define CFG_DBAT1L CFG_IBAT1L ++#define CFG_DBAT1U CFG_IBAT1U ++ ++/* BCSR: cache-inhibit and guarded */ ++#define CFG_IBAT2L (CFG_BCSR | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT2U (CFG_BCSR | BATU_BL_128K | BATU_VS | BATU_VP) ++#define CFG_DBAT2L CFG_IBAT2L ++#define CFG_DBAT2U CFG_IBAT2U ++ ++/* FLASH: icache cacheable, but dcache-inhibit and guarded */ ++#define CFG_IBAT3L (CFG_FLASH_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT3U (CFG_FLASH_BASE | BATU_BL_32M | BATU_VS | BATU_VP) ++#define CFG_DBAT3L (CFG_FLASH_BASE | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT3U CFG_IBAT3U ++ ++#define CFG_IBAT4L (0) ++#define CFG_IBAT4U (0) ++#define CFG_DBAT4L CFG_IBAT4L ++#define CFG_DBAT4U CFG_IBAT4U ++ ++/* Stack in dcache: cacheable, no memory coherence */ ++#define CFG_IBAT5L (CFG_INIT_RAM_ADDR | BATL_PP_10) ++#define CFG_IBAT5U (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP) ++#define CFG_DBAT5L CFG_IBAT5L ++#define CFG_DBAT5U CFG_IBAT5U ++ ++#ifdef CONFIG_PCI ++/* PCI MEM space: cacheable */ ++#define CFG_IBAT6L (CFG_PCI_MEM_PHYS | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT6U (CFG_PCI_MEM_PHYS | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT6L CFG_IBAT6L ++#define CFG_DBAT6U CFG_IBAT6U ++/* PCI MMIO space: cache-inhibit and guarded */ ++#define CFG_IBAT7L (CFG_PCI_MMIO_PHYS | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT7U (CFG_PCI_MMIO_PHYS | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT7L CFG_IBAT7L ++#define CFG_DBAT7U CFG_IBAT7U ++#else ++#define CFG_IBAT6L (0) ++#define CFG_IBAT6U (0) ++#define CFG_IBAT7L (0) ++#define CFG_IBAT7U (0) ++#define CFG_DBAT6L CFG_IBAT6L ++#define CFG_DBAT6U CFG_IBAT6U ++#define CFG_DBAT7L CFG_IBAT7L ++#define CFG_DBAT7U CFG_IBAT7U ++#endif ++ ++/* ++ * Internal Definitions ++ * ++ * Boot Flags ++ */ ++#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ ++#define BOOTFLAG_WARM 0x02 /* Software reboot */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CONFIG_KGDB_BAUDRATE 230400 /* speed of kgdb serial port */ ++#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ ++#endif ++ ++/* ++ * Environment Configuration ++ */ ++ ++#define CONFIG_ENV_OVERWRITE ++ ++#if defined(CONFIG_UEC_ETH) ++#define CONFIG_ETHADDR 00:04:9f:ef:03:01 ++#define CONFIG_HAS_ETH1 ++#define CONFIG_ETH1ADDR 00:04:9f:ef:03:02 ++#endif ++ ++#define CONFIG_BAUDRATE 115200 ++ ++#define CONFIG_LOADADDR 200000 /* default location for tftp and bootm */ ++ ++#define CONFIG_BOOTDELAY 6 /* -1 disables auto-boot */ ++#undef CONFIG_BOOTARGS /* the boot command will set bootargs */ ++ ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ "netdev=eth0\0" \ ++ "consoledev=ttyS0\0" \ ++ "ramdiskaddr=1000000\0" \ ++ "ramdiskfile=ramfs.83xx\0" \ ++ "fdtaddr=400000\0" \ ++ "fdtfile=mpc832xemds.dtb\0" \ ++ "" ++ ++#define CONFIG_NFSBOOTCOMMAND \ ++ "setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=$serverip:$rootpath " \ ++ "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr - $fdtaddr" ++ ++#define CONFIG_RAMBOOTCOMMAND \ ++ "setenv bootargs root=/dev/ram rw " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $ramdiskaddr $ramdiskfile;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr $ramdiskaddr $fdtaddr" ++ ++ ++#define CONFIG_BOOTCOMMAND CONFIG_NFSBOOTCOMMAND ++ ++#endif /* __CONFIG_H */ +diff --git a/include/mpc83xx.h b/include/mpc83xx.h +index 504b6a9..52e4369 100644 +--- a/include/mpc83xx.h ++++ b/include/mpc83xx.h +@@ -75,6 +75,15 @@ + #define SPR_8360E_REV12 0x80480012 + #define SPR_8360_REV12 0x80490012 + ++#define SPR_8323E_REV10 0x80620010 ++#define SPR_8323_REV10 0x80630010 ++#define SPR_8321E_REV10 0x80660010 ++#define SPR_8321_REV10 0x80670010 ++#define SPR_8323E_REV11 0x80620011 ++#define SPR_8323_REV11 0x80630011 ++#define SPR_8321E_REV11 0x80660011 ++#define SPR_8321_REV11 0x80670011 ++ + /* SPCR - System Priority Configuration Register + */ + #define SPCR_PCIHPE 0x10000000 /* PCI Highest Priority Enable */ +@@ -167,6 +176,14 @@ + #define SICRH_UC1EOBI 0x00000004 + #define SICRH_UC2E1OBI 0x00000002 + #define SICRH_UC2E2OBI 0x00000001 ++ ++#elif defined(CONFIG_MPC832X) ++/* SICRL bits - MPC832X specific */ ++#define SICRL_LDP_LCS_A 0x80000000 ++#define SICRL_IRQ_CKS 0x20000000 ++#define SICRL_PCI_MSRC 0x10000000 ++#define SICRL_URT_CTPR 0x06000000 ++#define SICRL_IRQ_CTPR 0x00C00000 + #endif + + /* SWCRR - System Watchdog Control Register +@@ -270,7 +287,7 @@ + #define HRCWL_CORE_TO_CSB_2_5X1 0x00050000 + #define HRCWL_CORE_TO_CSB_3X1 0x00060000 + +-#if defined(CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + #define HRCWL_CEVCOD 0x000000C0 + #define HRCWL_CEVCOD_SHIFT 6 + #define HRCWL_CE_PLL_VCO_DIV_4 0x00000000 +@@ -718,7 +735,7 @@ + #define BR_MS_UPMA 0x00000080 /* UPMA */ + #define BR_MS_UPMB 0x000000A0 /* UPMB */ + #define BR_MS_UPMC 0x000000C0 /* UPMC */ +-#if defined(CONFIG_MPC8360) ++#if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832X) + #define BR_ATOM 0x0000000C + #define BR_ATOM_SHIFT 2 + #endif diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Add-the-MPC832XEMDS-board-readme.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Add-the-MPC832XEMDS-board-readme.patch new file mode 100644 index 0000000000..b5e2a87b16 --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Add-the-MPC832XEMDS-board-readme.patch @@ -0,0 +1,131 @@ +657bdd350516722e4d73329caf37aae694f7eaaa +diff --git a/doc/README.mpc832xemds b/doc/README.mpc832xemds +new file mode 100644 +index 0000000..00c3af1 +--- /dev/null ++++ b/doc/README.mpc832xemds +@@ -0,0 +1,124 @@ ++Freescale MPC832XEMDS Board ++----------------------------------------- ++1. Board Switches and Jumpers ++1.0 There are five Dual-In-Line Packages(DIP) Switches on MPC832XE SYS board ++ For some reason, the HW designers describe the switch settings ++ in terms of 0 and 1, and then map that to physical switches where ++ the label "On" refers to logic 0 and "Off" is logic 1. ++ ++ Switch bits are numbered 1 through, like, 4 6 8 or 10, but the ++ bits may contribute to signals that are numbered based at 0, ++ and some of those signals may be high-bit-number-0 too. Heed ++ well the names and labels and do not get confused. ++ ++ "Off" == 1 ++ "On" == 0 ++ ++ SW3 is switch 18 as silk-screened onto the board. ++ SW4[8] is the bit labled 8 on Switch 4. ++ SW5[1:6] refers to bits labeled 1 through 6 in order on switch 5. ++ SW6[7:1] refers to bits labeled 7 through 1 in order on switch 6. ++ SW7[1:8]= 0000_0001 refers to bits labeled 1 through 6 is set as "On" ++ and bits labeled 8 is set as "Off". ++ ++1.1 For the MPC832XEMDS PROTO Board ++ ++ First, make sure the board default setting is consistent with the ++ document shipped with your board. Then apply the following setting: ++ SW3[1-8]= 0000_1000 (core PLL setting, core enable) ++ SW4[1-8]= 0001_0010 (Flash boot on local bus, system PLL setting) ++ SW5[1-8]= 0010_0110 (Boot from high end) ++ SW6[1-8]= 0011_0100 (Flash boot on 16 bit local bus) ++ SW7[1-8]= 1000_0011 (QE PLL setting) ++ ++ ENET3/4 MII mode settings: ++ J1 1-2 (ETH3_TXER) ++ J2 2-3 (MII mode) ++ J3 2-3 (MII mode) ++ J4 2-3 (ADSL clockOscillator) ++ J5 1-2 (ETH4_TXER) ++ J6 2-3 (ClockOscillator) ++ JP1 removed (don't force PORESET) ++ JP2 mounted (ETH4/2 MII) ++ JP3 mounted (ETH3 MII) ++ JP4 mounted (HRCW from BCSR) ++ ++ ENET3/4 RMII mode settings: ++ J1 1-2 (ETH3_TXER) ++ J2 1-2 (RMII mode) ++ J3 1-2 (RMII mode) ++ J4 2-3 (ADSL clockOscillator) ++ J5 1-2 (ETH4_TXER) ++ J6 2-3 (ClockOscillator) ++ JP1 removed (don't force PORESET) ++ JP2 removed (ETH4/2 RMII) ++ JP3 removed (ETH3 RMII) ++ JP4 removed (HRCW from FLASH) ++ ++ on board Oscillator: 66M ++ ++ ++2. Memory Map ++ ++2.1 The memory map should look pretty much like this: ++ ++ 0x0000_0000 0x7fff_ffff DDR 2G ++ 0x8000_0000 0x8fff_ffff PCI MEM prefetch 256M ++ 0x9000_0000 0x9fff_ffff PCI MEM non-prefetch 256M ++ 0xc000_0000 0xdfff_ffff Empty 512M ++ 0xe000_0000 0xe01f_ffff Int Mem Reg Space 2M ++ 0xe020_0000 0xe02f_ffff Empty 1M ++ 0xe030_0000 0xe03f_ffff PCI IO 1M ++ 0xe040_0000 0xefff_ffff Empty 252M ++ 0xf400_0000 0xf7ff_ffff Empty 64M ++ 0xf800_0000 0xf800_7fff BCSR on CS1 32K ++ 0xf800_8000 0xf800_ffff PIB CS2 32K ++ 0xf801_0000 0xf801_7fff PIB CS3 32K ++ 0xfe00_0000 0xfeff_ffff FLASH on CS0 16M ++ ++ ++3. Definitions ++ ++3.1 Explanation of NEW definitions in: ++ ++ include/configs/MPC832XEMDS.h ++ ++ CONFIG_MPC83XX MPC83XX family for MPC8349, MPC8360 and MPC832X ++ CONFIG_MPC832X MPC832X specific ++ CONFIG_MPC832XEMDS MPC832XEMDS board specific ++ ++4. Compilation ++ ++ Assuming you're using BASH shell: ++ ++ export CROSS_COMPILE=your-cross-compile-prefix ++ cd u-boot ++ make distclean ++ make MPC832XEMDS_config ++ make ++ ++ MPC832X support PCI 33MHz and PCI 66MHz, to make u-boot support PCI: ++ ++ 1)Make sure the DIP SW support PCI mode ++ as described in Section 1.1. ++ ++ 2)To Make U-Boot image support PCI 33MHz, use ++ Make MPC832XEMDS_HOST_33_config ++ ++ 3)To Make U-Boot image support PCI 66MHz, use ++ Make MPC832XEMDS_HOST_66_config ++ ++5. Downloading and Flashing Images ++ ++5.0 Download over network: ++ ++ tftp 20000 u-boot.bin ++ ++5.1 Reflash U-boot Image using U-boot ++ ++ If your current u-boot sets $filesize automatically: ++ ++ protect off fe000000 +$filesize ++ erase fe000000 +$filesize ++ cp.b 20000 fe000000 $filesize ++ diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Added-MPC8323E-RDB-board-support-2.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Added-MPC8323E-RDB-board-support-2.patch new file mode 100644 index 0000000000..23a9717e74 --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Added-MPC8323E-RDB-board-support-2.patch @@ -0,0 +1,1221 @@ +7a328e85f4ff0b6c074a7fdb302e6e6f6f36e7f2 +diff --git a/Makefile b/Makefile +index d172411..73014fd 100644 +--- a/Makefile ++++ b/Makefile +@@ -1645,6 +1645,12 @@ MPC832XEMDS_SLAVE_config: unconfig + fi ; + @$(MKCONFIG) -a MPC832XEMDS ppc mpc83xx mpc832xemds + ++MPC8323ERDB_config: unconfig ++ @echo "" >include/config.h ; \ ++ echo -n "... PCI HOST " ; \ ++ echo "#define CONFIG_PCI" >>include/config.h ; ++ @$(MKCONFIG) -a MPC8323ERDB ppc mpc83xx mpc8323erdb ++ + ######################################################################### + ## MPC85xx Systems + ######################################################################### +diff --git a/board/mpc8323erdb/Makefile b/board/mpc8323erdb/Makefile +new file mode 100644 +index 0000000..5ec7a87 +--- /dev/null ++++ b/board/mpc8323erdb/Makefile +@@ -0,0 +1,50 @@ ++# ++# (C) Copyright 2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++include $(TOPDIR)/config.mk ++ ++LIB = $(obj)lib$(BOARD).a ++ ++COBJS := $(BOARD).o pci.o ++ ++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS)) ++SOBJS := $(addprefix $(obj),$(SOBJS)) ++ ++$(LIB): $(obj).depend $(OBJS) ++ $(AR) $(ARFLAGS) $@ $(OBJS) ++ ++clean: ++ rm -f $(SOBJS) $(OBJS) ++ ++distclean: clean ++ rm -f $(LIB) core *.bak .depend ++ ++######################################################################### ++ ++# defines $(obj).depend target ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +diff --git a/board/mpc8323erdb/config.mk b/board/mpc8323erdb/config.mk +new file mode 100644 +index 0000000..fe0d37d +--- /dev/null ++++ b/board/mpc8323erdb/config.mk +@@ -0,0 +1,28 @@ ++# ++# (C) Copyright 2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++# ++# MPC8323ERDB ++# ++ ++TEXT_BASE = 0xFE000000 +diff --git a/board/mpc8323erdb/mpc8323erdb.c b/board/mpc8323erdb/mpc8323erdb.c +new file mode 100644 +index 0000000..239adbb +--- /dev/null ++++ b/board/mpc8323erdb/mpc8323erdb.c +@@ -0,0 +1,169 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Michael Barkowski <michael.barkowski@freescale.com> ++ * Based on mpc832xmds file by Dave Liu <daveliu@freescale.com> ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ */ ++ ++#include <common.h> ++#include <ioports.h> ++#include <mpc83xx.h> ++#include <i2c.h> ++#include <spd.h> ++#include <miiphy.h> ++#include <command.h> ++#if defined(CONFIG_PCI) ++#include <pci.h> ++#endif ++#if defined(CONFIG_SPD_EEPROM) ++#include <spd_sdram.h> ++#else ++#include <asm/mmu.h> ++#endif ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ ++const qe_iop_conf_t qe_iop_conf_tab[] = { ++ /* UCC3 */ ++ {1, 0, 1, 0, 1}, /* TxD0 */ ++ {1, 1, 1, 0, 1}, /* TxD1 */ ++ {1, 2, 1, 0, 1}, /* TxD2 */ ++ {1, 3, 1, 0, 1}, /* TxD3 */ ++ {1, 9, 1, 0, 1}, /* TxER */ ++ {1, 12, 1, 0, 1}, /* TxEN */ ++ {3, 24, 2, 0, 1}, /* TxCLK->CLK10 */ ++ ++ {1, 4, 2, 0, 1}, /* RxD0 */ ++ {1, 5, 2, 0, 1}, /* RxD1 */ ++ {1, 6, 2, 0, 1}, /* RxD2 */ ++ {1, 7, 2, 0, 1}, /* RxD3 */ ++ {1, 8, 2, 0, 1}, /* RxER */ ++ {1, 10, 2, 0, 1}, /* RxDV */ ++ {0, 13, 2, 0, 1}, /* RxCLK->CLK9 */ ++ {1, 11, 2, 0, 1}, /* COL */ ++ {1, 13, 2, 0, 1}, /* CRS */ ++ ++ /* UCC2 */ ++ {0, 18, 1, 0, 1}, /* TxD0 */ ++ {0, 19, 1, 0, 1}, /* TxD1 */ ++ {0, 20, 1, 0, 1}, /* TxD2 */ ++ {0, 21, 1, 0, 1}, /* TxD3 */ ++ {0, 27, 1, 0, 1}, /* TxER */ ++ {0, 30, 1, 0, 1}, /* TxEN */ ++ {3, 23, 2, 0, 1}, /* TxCLK->CLK3 */ ++ ++ {0, 22, 2, 0, 1}, /* RxD0 */ ++ {0, 23, 2, 0, 1}, /* RxD1 */ ++ {0, 24, 2, 0, 1}, /* RxD2 */ ++ {0, 25, 2, 0, 1}, /* RxD3 */ ++ {0, 26, 1, 0, 1}, /* RxER */ ++ {0, 28, 2, 0, 1}, /* Rx_DV */ ++ {3, 21, 2, 0, 1}, /* RxCLK->CLK16 */ ++ {0, 29, 2, 0, 1}, /* COL */ ++ {0, 31, 2, 0, 1}, /* CRS */ ++ ++ {3, 4, 3, 0, 2}, /* MDIO */ ++ {3, 5, 1, 0, 2}, /* MDC */ ++ ++ {0, 0, 0, 0, QE_IOP_TAB_END}, /* END of table */ ++}; ++ ++int board_early_init_f(void) ++{ ++ return 0; ++} ++ ++int fixed_sdram(void); ++ ++long int initdram(int board_type) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 msize = 0; ++ ++ if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) ++ return -1; ++ ++ /* DDR SDRAM - Main SODIMM */ ++ im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR; ++ ++ msize = fixed_sdram(); ++ ++ puts("\n DDR RAM: "); ++ ++ /* return total bus SDRAM size(bytes) -- DDR */ ++ return (msize * 1024 * 1024); ++} ++ ++/************************************************************************* ++ * fixed sdram init -- doesn't use serial presence detect. ++ ************************************************************************/ ++int fixed_sdram(void) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 msize = 0; ++ u32 ddr_size; ++ u32 ddr_size_log2; ++ ++ msize = CFG_DDR_SIZE; ++ for (ddr_size = msize << 20, ddr_size_log2 = 0; ++ (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) { ++ if (ddr_size & 1) { ++ return -1; ++ } ++ } ++ im->sysconf.ddrlaw[0].ar = ++ LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE); ++ im->ddr.sdram_clk_cntl = CFG_DDR_CLK_CNTL; ++ im->ddr.csbnds[0].csbnds = CFG_DDR_CS0_BNDS; ++ im->ddr.cs_config[0] = CFG_DDR_CS0_CONFIG; ++ im->ddr.timing_cfg_0 = CFG_DDR_TIMING_0; ++ im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; ++ im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; ++ im->ddr.timing_cfg_3 = CFG_DDR_TIMING_3; ++ im->ddr.sdram_cfg = CFG_DDR_SDRAM_CFG; ++ im->ddr.sdram_cfg2 = CFG_DDR_SDRAM_CFG2; ++ im->ddr.sdram_mode = CFG_DDR_MODE; ++ im->ddr.sdram_mode2 = CFG_DDR_MODE2; ++ im->ddr.sdram_interval = CFG_DDR_INTERVAL; ++ __asm__ __volatile__ ("sync"); ++ udelay(200); ++ ++ im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; ++ __asm__ __volatile__ ("sync"); ++ return msize; ++} ++ ++int checkboard(void) ++{ ++ puts("Board: Freescale MPC8323ERDB\n"); ++ return 0; ++} ++ ++#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) ++void ++ft_board_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++#ifdef CONFIG_PCI ++ ft_pci_setup(blob, bd); ++#endif ++ ft_cpu_setup(blob, bd); ++ ++ p = ft_get_prop(blob, "/memory/reg", &len); ++ if (p != NULL) { ++ *p++ = cpu_to_be32(bd->bi_memstart); ++ *p = cpu_to_be32(bd->bi_memsize); ++ } ++} ++#endif +diff --git a/board/mpc8323erdb/pci.c b/board/mpc8323erdb/pci.c +new file mode 100644 +index 0000000..2e942d2 +--- /dev/null ++++ b/board/mpc8323erdb/pci.c +@@ -0,0 +1,208 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Michael Barkowski <michael.barkowski@freescale.com> ++ * Based on mpc832xemds/pci.c by Dave Liu. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ */ ++ ++/* ++ * PCI Configuration space access support for MPC83xx PCI Bridge ++ */ ++#include <asm/mmu.h> ++#include <asm/io.h> ++#include <common.h> ++#include <pci.h> ++#include <i2c.h> ++ ++#include <asm/fsl_i2c.h> ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#if defined(CONFIG_PCI) ++#define PCI_FUNCTION_CONFIG 0x44 ++#define PCI_FUNCTION_CFG_LOCK 0x20 ++ ++/* ++ * Initialize PCI Devices, report devices found ++ */ ++#ifndef CONFIG_PCI_PNP ++static struct pci_config_table pci_mpc8323erdb_config_table[] = { ++ { ++ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, ++ pci_cfgfunc_config_device, ++ {PCI_ENET0_IOADDR, ++ PCI_ENET0_MEMADDR, ++ PCI_COMMON_MEMORY | PCI_COMMAND_MASTER} ++ }, ++ {} ++} ++#endif ++static struct pci_controller hose[] = { ++ { ++#ifndef CONFIG_PCI_PNP ++ config_table:pci_mpc8323erdb_config_table, ++#endif ++ }, ++}; ++ ++/********************************************************************** ++ * pci_init_board() ++ *********************************************************************/ ++void pci_init_board(void) ++{ ++ volatile immap_t *immr; ++ volatile clk83xx_t *clk; ++ volatile law83xx_t *pci_law; ++ volatile pot83xx_t *pci_pot; ++ volatile pcictrl83xx_t *pci_ctrl; ++ volatile pciconf83xx_t *pci_conf; ++ ++ u8 val8; ++ u16 reg16; ++ u32 val32; ++ u32 dev; ++ ++ immr = (immap_t *) CFG_IMMR; ++ clk = (clk83xx_t *) & immr->clk; ++ pci_law = immr->sysconf.pcilaw; ++ pci_pot = immr->ios.pot; ++ pci_ctrl = immr->pci_ctrl; ++ pci_conf = immr->pci_conf; ++ /* ++ * Enable PCI output signals ++ */ ++ val32 = clk->occr; ++ udelay(2000); ++ /* if pin /CFG_CLKIN_DIV=1, PCI clock = clkin = 66MHz; ++ if pin /CFG_CLKIN_DIV=0, PCI clock = clkin/2 = 33MHz; */ ++ clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2; ++ if (clk->spmr & SPMR_CKID) ++ printf("PCI clock is 33MHz\n"); ++ else ++ printf("PCI clock is 66MHz\n"); ++ udelay(2000); ++ ++ /* ++ * Configure PCI Local Access Windows ++ */ ++ pci_law[0].bar = CFG_PCI_MEM_PHYS & LAWBAR_BAR; ++ pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_512M; ++ ++ pci_law[1].bar = CFG_PCI_IO_PHYS & LAWBAR_BAR; ++ pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_1M; ++ ++ /* ++ * Configure PCI Outbound Translation Windows ++ */ ++ ++ /* PCI mem space - prefetch */ ++ pci_pot[0].potar = (CFG_PCI_MEM_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[0].pobar = (CFG_PCI_MEM_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[0].pocmr = ++ POCMR_EN | POCMR_SE | (POCMR_CM_256M & POCMR_CM_MASK); ++ ++ /* PCI mmio - non-prefetch mem space */ ++ pci_pot[1].potar = (CFG_PCI_MMIO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[1].pobar = (CFG_PCI_MMIO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[1].pocmr = POCMR_EN | (POCMR_CM_256M & POCMR_CM_MASK); ++ ++ /* PCI IO space */ ++ pci_pot[2].potar = (CFG_PCI_IO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[2].pobar = (CFG_PCI_IO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[2].pocmr = POCMR_EN | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK); ++ ++ /* ++ * Configure PCI Inbound Translation Windows ++ */ ++ pci_ctrl[0].pitar1 = (CFG_PCI_SLV_MEM_LOCAL >> 12) & PITAR_TA_MASK; ++ pci_ctrl[0].pibar1 = (CFG_PCI_SLV_MEM_BUS >> 12) & PIBAR_MASK; ++ pci_ctrl[0].piebar1 = 0x0; ++ pci_ctrl[0].piwar1 = ++ PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | ++ PIWAR_IWS_2G; ++ ++ /* ++ * Release PCI RST Output signal ++ */ ++ udelay(2000); ++ pci_ctrl[0].gcr = 1; ++ udelay(2000); ++ ++ hose[0].first_busno = 0; ++ hose[0].last_busno = 0xff; ++ ++ /* PCI memory prefetch space */ ++ pci_set_region(hose[0].regions + 0, ++ CFG_PCI_MEM_BASE, ++ CFG_PCI_MEM_PHYS, ++ CFG_PCI_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH); ++ ++ /* PCI memory space */ ++ pci_set_region(hose[0].regions + 1, ++ CFG_PCI_MMIO_BASE, ++ CFG_PCI_MMIO_PHYS, CFG_PCI_MMIO_SIZE, PCI_REGION_MEM); ++ ++ /* PCI IO space */ ++ pci_set_region(hose[0].regions + 2, ++ CFG_PCI_IO_BASE, ++ CFG_PCI_IO_PHYS, CFG_PCI_IO_SIZE, PCI_REGION_IO); ++ ++ /* System memory space */ ++ pci_set_region(hose[0].regions + 3, ++ CFG_PCI_SLV_MEM_LOCAL, ++ CFG_PCI_SLV_MEM_BUS, ++ CFG_PCI_SLV_MEM_SIZE, ++ PCI_REGION_MEM | PCI_REGION_MEMORY); ++ ++ hose[0].region_count = 4; ++ ++ pci_setup_indirect(&hose[0], ++ (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304)); ++ ++ pci_register_hose(hose); ++ ++ /* ++ * Write command register ++ */ ++ reg16 = 0xff; ++ dev = PCI_BDF(0, 0, 0); ++ pci_hose_read_config_word(&hose[0], dev, PCI_COMMAND, ®16); ++ reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; ++ pci_hose_write_config_word(&hose[0], dev, PCI_COMMAND, reg16); ++ ++ /* ++ * Clear non-reserved bits in status register. ++ */ ++ pci_hose_write_config_word(&hose[0], dev, PCI_STATUS, 0xffff); ++ pci_hose_write_config_byte(&hose[0], dev, PCI_LATENCY_TIMER, 0x80); ++ pci_hose_write_config_byte(&hose[0], dev, PCI_CACHE_LINE_SIZE, 0x08); ++ ++ /* ++ * Hose scan. ++ */ ++ hose->last_busno = pci_hose_scan(hose); ++} ++ ++#ifdef CONFIG_OF_FLAT_TREE ++void ++ft_pci_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++ p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len); ++ if (p != NULL) { ++ p[0] = hose[0].first_busno; ++ p[1] = hose[0].last_busno; ++ } ++} ++#endif /* CONFIG_OF_FLAT_TREE */ ++#endif /* CONFIG_PCI */ +diff --git a/board/mpc8323erdb/u-boot.lds b/board/mpc8323erdb/u-boot.lds +new file mode 100644 +index 0000000..937c87a +--- /dev/null ++++ b/board/mpc8323erdb/u-boot.lds +@@ -0,0 +1,123 @@ ++/* ++ * (C) Copyright 2006 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++OUTPUT_ARCH(powerpc) ++SECTIONS ++{ ++ /* Read-only sections, merged into text segment: */ ++ . = + SIZEOF_HEADERS; ++ .interp : { *(.interp) } ++ .hash : { *(.hash) } ++ .dynsym : { *(.dynsym) } ++ .dynstr : { *(.dynstr) } ++ .rel.text : { *(.rel.text) } ++ .rela.text : { *(.rela.text) } ++ .rel.data : { *(.rel.data) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } ++ .rel.got : { *(.rel.got) } ++ .rela.got : { *(.rela.got) } ++ .rel.ctors : { *(.rel.ctors) } ++ .rela.ctors : { *(.rela.ctors) } ++ .rel.dtors : { *(.rel.dtors) } ++ .rela.dtors : { *(.rela.dtors) } ++ .rel.bss : { *(.rel.bss) } ++ .rela.bss : { *(.rela.bss) } ++ .rel.plt : { *(.rel.plt) } ++ .rela.plt : { *(.rela.plt) } ++ .init : { *(.init) } ++ .plt : { *(.plt) } ++ .text : ++ { ++ cpu/mpc83xx/start.o (.text) ++ *(.text) ++ *(.fixup) ++ *(.got1) ++ . = ALIGN(16); ++ *(.rodata) ++ *(.rodata1) ++ *(.rodata.str1.4) ++ *(.eh_frame) ++ } ++ .fini : { *(.fini) } =0 ++ .ctors : { *(.ctors) } ++ .dtors : { *(.dtors) } ++ ++ /* Read-write section, merged into data segment: */ ++ . = (. + 0x0FFF) & 0xFFFFF000; ++ _erotext = .; ++ PROVIDE (erotext = .); ++ .reloc : ++ { ++ *(.got) ++ _GOT2_TABLE_ = .; ++ *(.got2) ++ _FIXUP_TABLE_ = .; ++ *(.fixup) ++ } ++ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; ++ __fixup_entries = (. - _FIXUP_TABLE_) >> 2; ++ ++ .data : ++ { ++ *(.data) ++ *(.data1) ++ *(.sdata) ++ *(.sdata2) ++ *(.dynamic) ++ CONSTRUCTORS ++ } ++ _edata = .; ++ PROVIDE (edata = .); ++ ++ . = .; ++ __u_boot_cmd_start = .; ++ .u_boot_cmd : { *(.u_boot_cmd) } ++ __u_boot_cmd_end = .; ++ ++ ++ . = .; ++ __start___ex_table = .; ++ __ex_table : { *(__ex_table) } ++ __stop___ex_table = .; ++ ++ . = ALIGN(4096); ++ __init_begin = .; ++ .text.init : { *(.text.init) } ++ .data.init : { *(.data.init) } ++ . = ALIGN(4096); ++ __init_end = .; ++ ++ __bss_start = .; ++ .bss : ++ { ++ *(.sbss) *(.scommon) ++ *(.dynbss) ++ *(.bss) ++ *(COMMON) ++ } ++ _end = . ; ++ PROVIDE (end = .); ++} ++ENTRY(_start) +diff --git a/include/configs/MPC8323ERDB.h b/include/configs/MPC8323ERDB.h +new file mode 100644 +index 0000000..ebbc7b0 +--- /dev/null ++++ b/include/configs/MPC8323ERDB.h +@@ -0,0 +1,589 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++#undef DEBUG ++ ++/* ++ * High Level Configuration Options ++ */ ++#define CONFIG_E300 1 /* E300 family */ ++#define CONFIG_QE 1 /* Has QE */ ++#define CONFIG_MPC83XX 1 /* MPC83xx family */ ++#define CONFIG_MPC832X 1 /* MPC832x CPU specific */ ++ ++/* ++ * System Clock Setup ++ */ ++#define CONFIG_83XX_CLKIN 66666667 /* in Hz */ ++ ++#ifndef CONFIG_SYS_CLK_FREQ ++#define CONFIG_SYS_CLK_FREQ 66666667 ++#endif ++ ++/* ++ * Hardware Reset Configuration Word ++ */ ++#define CFG_HRCW_LOW (\ ++ HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\ ++ HRCWL_DDR_TO_SCB_CLK_2X1 |\ ++ HRCWL_VCO_1X2 |\ ++ HRCWL_CSB_TO_CLKIN_2X1 |\ ++ HRCWL_CORE_TO_CSB_2_5X1 |\ ++ HRCWL_CE_PLL_VCO_DIV_2 |\ ++ HRCWL_CE_PLL_DIV_1X1 |\ ++ HRCWL_CE_TO_PLL_1X3) ++ ++#define CFG_HRCW_HIGH (\ ++ HRCWH_PCI_HOST |\ ++ HRCWH_PCI1_ARBITER_ENABLE |\ ++ HRCWH_CORE_ENABLE |\ ++ HRCWH_FROM_0X00000100 |\ ++ HRCWH_BOOTSEQ_DISABLE |\ ++ HRCWH_SW_WATCHDOG_DISABLE |\ ++ HRCWH_ROM_LOC_LOCAL_16BIT |\ ++ HRCWH_BIG_ENDIAN |\ ++ HRCWH_LALE_NORMAL) ++ ++/* ++ * System IO Config ++ */ ++#define CFG_SICRL 0x00000000 ++ ++#define CONFIG_BOARD_EARLY_INIT_F /* call board_pre_init */ ++ ++/* ++ * IMMR new address ++ */ ++#define CFG_IMMR 0xE0000000 ++ ++/* ++ * DDR Setup ++ */ ++#define CFG_DDR_BASE 0x00000000 /* DDR is system memory */ ++#define CFG_SDRAM_BASE CFG_DDR_BASE ++#define CFG_DDR_SDRAM_BASE CFG_DDR_BASE ++#define CFG_DDRCDR 0x73000002 /* DDR II voltage is 1.8V */ ++ ++#undef CONFIG_SPD_EEPROM ++#if defined(CONFIG_SPD_EEPROM) ++/* Determine DDR configuration from I2C interface ++ */ ++#define SPD_EEPROM_ADDRESS 0x51 /* DDR SODIMM */ ++#else ++/* Manually set up DDR parameters ++ */ ++#define CFG_DDR_SIZE 64 /* MB */ ++#define CFG_DDR_CS0_CONFIG 0x80840101 ++#define CFG_DDR_TIMING_0 0x00220802 ++#define CFG_DDR_TIMING_1 0x3935d322 ++#define CFG_DDR_TIMING_2 0x0f9048ca ++#define CFG_DDR_TIMING_3 0x00000000 ++#define CFG_DDR_CLK_CNTL 0x02000000 ++#define CFG_DDR_MODE 0x44400232 ++#define CFG_DDR_MODE2 0x8000c000 ++#define CFG_DDR_INTERVAL 0x03200064 ++#define CFG_DDR_CS0_BNDS 0x00000003 ++#define CFG_DDR_SDRAM_CFG 0x43080000 ++#define CFG_DDR_SDRAM_CFG2 0x00401000 ++#endif ++ ++/* ++ * Memory test ++ */ ++#undef CFG_DRAM_TEST /* memory test, takes time */ ++#define CFG_MEMTEST_START 0x00030000 /* memtest region */ ++#define CFG_MEMTEST_END 0x03f00000 ++ ++/* ++ * The reserved memory ++ */ ++#define CFG_MONITOR_BASE TEXT_BASE /* start of monitor */ ++ ++#if (CFG_MONITOR_BASE < CFG_FLASH_BASE) ++#define CFG_RAMBOOT ++#else ++#undef CFG_RAMBOOT ++#endif ++ ++#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */ ++#define CFG_MALLOC_LEN (128 * 1024) /* Reserved for malloc */ ++ ++/* ++ * Initial RAM Base Address Setup ++ */ ++#define CFG_INIT_RAM_LOCK 1 ++#define CFG_INIT_RAM_ADDR 0xE6000000 /* Initial RAM address */ ++#define CFG_INIT_RAM_END 0x1000 /* End of used area in RAM */ ++#define CFG_GBL_DATA_SIZE 0x100 /* num bytes initial data */ ++#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) ++ ++/* ++ * Local Bus Configuration & Clock Setup ++ */ ++#define CFG_LCRR (LCRR_DBYP | LCRR_CLKDIV_2) ++#define CFG_LBC_LBCR 0x00000000 ++ ++/* ++ * FLASH on the Local Bus ++ */ ++#define CFG_FLASH_CFI /* use the Common Flash Interface */ ++#define CFG_FLASH_CFI_DRIVER /* use the CFI driver */ ++#define CFG_FLASH_BASE 0xFE000000 /* FLASH base address */ ++#define CFG_FLASH_SIZE 16 /* FLASH size is 16M */ ++ ++#define CFG_LBLAWBAR0_PRELIM CFG_FLASH_BASE /* Window base at flash base */ ++#define CFG_LBLAWAR0_PRELIM 0x80000018 /* 32MB window size */ ++ ++#define CFG_BR0_PRELIM (CFG_FLASH_BASE | /* Flash Base address */ \ ++ (2 << BR_PS_SHIFT) | /* 16 bit port size */ \ ++ BR_V) /* valid */ ++#define CFG_OR0_PRELIM 0xfe006ff7 /* 16MB Flash size */ ++ ++#define CFG_MAX_FLASH_BANKS 1 /* number of banks */ ++#define CFG_MAX_FLASH_SECT 128 /* sectors per device */ ++ ++#undef CFG_FLASH_CHECKSUM ++ ++/* ++ * SDRAM on the Local Bus ++ */ ++#undef CFG_LB_SDRAM /* The board has not SRDAM on local bus */ ++ ++#ifdef CFG_LB_SDRAM ++#define CFG_LBC_SDRAM_BASE 0xF0000000 /* SDRAM base address */ ++#define CFG_LBC_SDRAM_SIZE 64 /* LBC SDRAM is 64MB */ ++ ++#define CFG_LBLAWBAR2_PRELIM CFG_LBC_SDRAM_BASE ++#define CFG_LBLAWAR2_PRELIM 0x80000019 /* 64MB */ ++ ++/*local bus BR2, OR2 definition for SDRAM if soldered on the EPB board */ ++/* ++ * Base Register 2 and Option Register 2 configure SDRAM. ++ * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000. ++ * ++ * For BR2, need: ++ * Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0 ++ * port size = 32-bits = BR2[19:20] = 11 ++ * no parity checking = BR2[21:22] = 00 ++ * SDRAM for MSEL = BR2[24:26] = 011 ++ * Valid = BR[31] = 1 ++ * ++ * 0 4 8 12 16 20 24 28 ++ * 1111 0000 0000 0000 0001 1000 0110 0001 = f0001861 ++ * ++ * CFG_LBC_SDRAM_BASE should be masked and OR'ed into ++ * the top 17 bits of BR2. ++ */ ++ ++#define CFG_BR2_PRELIM 0xf0001861 /*Port size=32bit, MSEL=SDRAM */ ++ ++/* ++ * The SDRAM size in MB, CFG_LBC_SDRAM_SIZE, is 64. ++ * ++ * For OR2, need: ++ * 64MB mask for AM, OR2[0:7] = 1111 1100 ++ * XAM, OR2[17:18] = 11 ++ * 9 columns OR2[19-21] = 010 ++ * 13 rows OR2[23-25] = 100 ++ * EAD set for extra time OR[31] = 1 ++ * ++ * 0 4 8 12 16 20 24 28 ++ * 1111 1100 0000 0000 0110 1001 0000 0001 = fc006901 ++ */ ++ ++#define CFG_OR2_PRELIM 0xfc006901 ++ ++#define CFG_LBC_LSRT 0x32000000 /* LB sdram refresh timer, about 6us */ ++#define CFG_LBC_MRTPR 0x20000000 /* LB refresh timer prescal, 266MHz/32 */ ++ ++/* ++ * LSDMR masks ++ */ ++#define CFG_LBC_LSDMR_OP_NORMAL (0 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ARFRSH (1 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_SRFRSH (2 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_MRW (3 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PCHALL (5 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ACTBNK (6 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4)) ++ ++#define CFG_LBC_LSDMR_COMMON 0x0063b723 ++ ++/* ++ * SDRAM Controller configuration sequence. ++ */ ++#define CFG_LBC_LSDMR_1 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_PCHALL) ++#define CFG_LBC_LSDMR_2 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_3 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_4 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_MRW) ++#define CFG_LBC_LSDMR_5 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_NORMAL) ++ ++#endif ++ ++/* ++ * Windows to access PIB via local bus ++ */ ++#define CFG_LBLAWBAR3_PRELIM 0xf8008000 /* windows base 0xf8008000 */ ++#define CFG_LBLAWAR3_PRELIM 0x8000000f /* windows size 64KB */ ++ ++/* ++ * Serial Port ++ */ ++#define CONFIG_CONS_INDEX 1 ++#undef CONFIG_SERIAL_SOFTWARE_FIFO ++#define CFG_NS16550 ++#define CFG_NS16550_SERIAL ++#define CFG_NS16550_REG_SIZE 1 ++#define CFG_NS16550_CLK get_bus_freq(0) ++ ++#define CFG_BAUDRATE_TABLE \ ++ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200} ++ ++#define CFG_NS16550_COM1 (CFG_IMMR+0x4500) ++#define CFG_NS16550_COM2 (CFG_IMMR+0x4600) ++ ++/* Use the HUSH parser */ ++#define CFG_HUSH_PARSER ++#ifdef CFG_HUSH_PARSER ++#define CFG_PROMPT_HUSH_PS2 "> " ++#endif ++ ++/* pass open firmware flat tree */ ++#define CONFIG_OF_FLAT_TREE 1 ++#define CONFIG_OF_BOARD_SETUP 1 ++ ++/* maximum size of the flat tree (8K) */ ++#define OF_FLAT_TREE_MAX_SIZE 8192 ++ ++#define OF_CPU "PowerPC,8323@0" ++#define OF_SOC "soc8323@e0000000" ++#define OF_TBCLK (bd->bi_busfreq / 4) ++#define OF_STDOUT_PATH "/soc8323@e0000000/serial@4500" ++ ++/* I2C */ ++#define CONFIG_HARD_I2C /* I2C with hardware support */ ++#undef CONFIG_SOFT_I2C /* I2C bit-banged */ ++#define CONFIG_FSL_I2C ++#define CFG_I2C_SPEED 400000 /* I2C speed and slave address */ ++#define CFG_I2C_SLAVE 0x7F ++#define CFG_I2C_NOPROBES {0x51} /* Don't probe these addrs */ ++#define CFG_I2C_OFFSET 0x3000 ++ ++/* ++ * Config on-board RTC ++ */ ++#define CONFIG_RTC_DS1374 /* use ds1374 rtc via i2c */ ++#define CFG_I2C_RTC_ADDR 0x68 /* at address 0x68 */ ++ ++/* ++ * General PCI ++ * Addresses are mapped 1-1. ++ */ ++#define CFG_PCI_MEM_BASE 0x80000000 ++#define CFG_PCI_MEM_PHYS CFG_PCI_MEM_BASE ++#define CFG_PCI_MEM_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI_MMIO_BASE 0x90000000 ++#define CFG_PCI_MMIO_PHYS CFG_PCI_MMIO_BASE ++#define CFG_PCI_MMIO_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI_IO_BASE 0xd0000000 ++#define CFG_PCI_IO_PHYS CFG_PCI_IO_BASE ++#define CFG_PCI_IO_SIZE 0x04000000 /* 64M */ ++ ++#define CFG_PCI_SLV_MEM_LOCAL CFG_SDRAM_BASE ++#define CFG_PCI_SLV_MEM_BUS 0x00000000 ++#define CFG_PCI_SLV_MEM_SIZE 0x80000000 ++ ++ ++#ifdef CONFIG_PCI ++ ++#define CONFIG_NET_MULTI ++#define CONFIG_PCI_PNP /* do pci plug-and-play */ ++ ++#undef CONFIG_EEPRO100 ++#undef CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */ ++#define CFG_PCI_SUBSYS_VENDORID 0x1957 /* Freescale */ ++ ++#endif /* CONFIG_PCI */ ++ ++ ++#ifndef CONFIG_NET_MULTI ++#define CONFIG_NET_MULTI 1 ++#endif ++ ++/* ++ * QE UEC ethernet configuration ++ */ ++#define CONFIG_UEC_ETH ++#define CONFIG_ETHPRIME "Freescale GETH" ++ ++#define CONFIG_UEC_ETH1 /* ETH3 */ ++ ++#ifdef CONFIG_UEC_ETH1 ++#define CFG_UEC1_UCC_NUM 2 /* UCC3 */ ++#define CFG_UEC1_RX_CLK QE_CLK9 ++#define CFG_UEC1_TX_CLK QE_CLK10 ++#define CFG_UEC1_ETH_TYPE FAST_ETH ++#define CFG_UEC1_PHY_ADDR 4 ++#define CFG_UEC1_INTERFACE_MODE ENET_100_MII ++#endif ++ ++#define CONFIG_UEC_ETH2 /* ETH4 */ ++ ++#ifdef CONFIG_UEC_ETH2 ++#define CFG_UEC2_UCC_NUM 1 /* UCC2 */ ++#define CFG_UEC2_RX_CLK QE_CLK16 ++#define CFG_UEC2_TX_CLK QE_CLK3 ++#define CFG_UEC2_ETH_TYPE FAST_ETH ++#define CFG_UEC2_PHY_ADDR 0 ++#define CFG_UEC2_INTERFACE_MODE ENET_100_MII ++#endif ++ ++/* ++ * Environment ++ */ ++#ifndef CFG_RAMBOOT ++ #define CFG_ENV_IS_IN_FLASH 1 ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE + 0x40000) ++ #define CFG_ENV_SECT_SIZE 0x40000 /* 256K(one sector) for env */ ++ #define CFG_ENV_SIZE 0x2000 ++#else ++ #define CFG_NO_FLASH 1 /* Flash is not usable now */ ++ #define CFG_ENV_IS_NOWHERE 1 /* Store ENV in memory only */ ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE - 0x1000) ++ #define CFG_ENV_SIZE 0x2000 ++#endif ++ ++#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */ ++#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */ ++ ++#if defined(CFG_RAMBOOT) ++#if defined(CONFIG_PCI) ++#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_PCI \ ++ | CFG_CMD_I2C) \ ++ & \ ++ ~(CFG_CMD_ENV \ ++ | CFG_CMD_LOADS)) ++#else ++#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C) \ ++ & \ ++ ~(CFG_CMD_ENV \ ++ | CFG_CMD_LOADS)) ++#endif ++#else ++#if defined(CONFIG_PCI) ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ ++ | CFG_CMD_PCI \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C) ++#else ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C ) ++#endif ++#endif ++ ++#include <cmd_confdefs.h> ++ ++#undef CONFIG_WATCHDOG /* watchdog disabled */ ++ ++/* ++ * Miscellaneous configurable options ++ */ ++#define CFG_LONGHELP /* undef to save memory */ ++#define CFG_LOAD_ADDR 0x2000000 /* default load address */ ++#define CFG_PROMPT "=> " /* Monitor Command Prompt */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++ #define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ ++#else ++ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ++#endif ++ ++#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ ++#define CFG_MAXARGS 16 /* max number of command args */ ++#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ ++#define CFG_HZ 1000 /* decrementer freq: 1ms ticks */ ++ ++/* ++ * For booting Linux, the board info and command line data ++ * have to be in the first 8 MB of memory, since this is ++ * the maximum mapped by the Linux kernel during initialization. ++ */ ++#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */ ++ ++/* ++ * Core HID Setup ++ */ ++#define CFG_HID0_INIT 0x000000000 ++#define CFG_HID0_FINAL HID0_ENABLE_MACHINE_CHECK ++#define CFG_HID2 HID2_HBE ++ ++/* ++ * Cache Config ++ */ ++#define CFG_DCACHE_SIZE 16384 ++#define CFG_CACHELINE_SIZE 32 ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CACHELINE_SHIFT 5 /*log base 2 of the above value */ ++#endif ++ ++/* ++ * MMU Setup ++ */ ++ ++/* DDR: cache cacheable */ ++#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT0L CFG_IBAT0L ++#define CFG_DBAT0U CFG_IBAT0U ++ ++/* IMMRBAR & PCI IO: cache-inhibit and guarded */ ++#define CFG_IBAT1L (CFG_IMMR | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT1U (CFG_IMMR | BATU_BL_4M | BATU_VS | BATU_VP) ++#define CFG_DBAT1L CFG_IBAT1L ++#define CFG_DBAT1U CFG_IBAT1U ++ ++/* FLASH: icache cacheable, but dcache-inhibit and guarded */ ++#define CFG_IBAT2L (CFG_FLASH_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT2U (CFG_FLASH_BASE | BATU_BL_32M | BATU_VS | BATU_VP) ++#define CFG_DBAT2L (CFG_FLASH_BASE | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT2U CFG_IBAT2U ++ ++#define CFG_IBAT3L (0) ++#define CFG_IBAT3U (0) ++#define CFG_DBAT3L CFG_IBAT3L ++#define CFG_DBAT3U CFG_IBAT3U ++ ++/* Stack in dcache: cacheable, no memory coherence */ ++#define CFG_IBAT4L (CFG_INIT_RAM_ADDR | BATL_PP_10) ++#define CFG_IBAT4U (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP) ++#define CFG_DBAT4L CFG_IBAT4L ++#define CFG_DBAT4U CFG_IBAT4U ++ ++#ifdef CONFIG_PCI ++/* PCI MEM space: cacheable */ ++#define CFG_IBAT5L (CFG_PCI_MEM_PHYS | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT5U (CFG_PCI_MEM_PHYS | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT5L CFG_IBAT5L ++#define CFG_DBAT5U CFG_IBAT5U ++/* PCI MMIO space: cache-inhibit and guarded */ ++#define CFG_IBAT6L (CFG_PCI_MMIO_PHYS | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT6U (CFG_PCI_MMIO_PHYS | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT6L CFG_IBAT6L ++#define CFG_DBAT6U CFG_IBAT6U ++#else ++#define CFG_IBAT5L (0) ++#define CFG_IBAT5U (0) ++#define CFG_IBAT6L (0) ++#define CFG_IBAT6U (0) ++#define CFG_DBAT5L CFG_IBAT5L ++#define CFG_DBAT5U CFG_IBAT5U ++#define CFG_DBAT6L CFG_IBAT6L ++#define CFG_DBAT6U CFG_IBAT6U ++#endif ++ ++/* Nothing in BAT7 */ ++#define CFG_IBAT7L (0) ++#define CFG_IBAT7U (0) ++#define CFG_DBAT7L CFG_IBAT7L ++#define CFG_DBAT7U CFG_IBAT7U ++ ++/* ++ * Internal Definitions ++ * ++ * Boot Flags ++ */ ++#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ ++#define BOOTFLAG_WARM 0x02 /* Software reboot */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CONFIG_KGDB_BAUDRATE 230400 /* speed of kgdb serial port */ ++#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ ++#endif ++ ++/* ++ * Environment Configuration ++ */ ++ ++#define CONFIG_ENV_OVERWRITE ++ ++#if defined(CONFIG_UEC_ETH) ++#define CONFIG_ETHADDR 00:04:9f:ef:03:01 ++#define CONFIG_HAS_ETH1 ++#define CONFIG_ETH1ADDR 00:04:9f:ef:03:02 ++#endif ++ ++#define CONFIG_BAUDRATE 115200 ++ ++#define CONFIG_LOADADDR 200000 /* default location for tftp and bootm */ ++ ++#define CONFIG_BOOTDELAY 6 /* -1 disables auto-boot */ ++#undef CONFIG_BOOTARGS /* the boot command will set bootargs */ ++ ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ "netdev=eth0\0" \ ++ "consoledev=ttyS0\0" \ ++ "bootfile=uImage\0" \ ++ "ramdiskaddr=1000000\0" \ ++ "ramdiskfile=rootfs.ext2.gz.uboot\0" \ ++ "fdtaddr=400000\0" \ ++ "fdtfile=mpc832x_rdb.dtb\0" \ ++ "" ++ ++#define CONFIG_NFSBOOTCOMMAND \ ++ "setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=$serverip:$rootpath " \ ++ "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr - $fdtaddr" ++ ++#define CONFIG_RAMBOOTCOMMAND \ ++ "setenv bootargs root=/dev/ram rw " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $ramdiskaddr $ramdiskfile;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr $ramdiskaddr $fdtaddr" ++ ++ ++#define CONFIG_BOOTCOMMAND CONFIG_RAMBOOTCOMMAND ++ ++#endif /* __CONFIG_H */ diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Fix-the-UEC-driver-bug-of-QE.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Fix-the-UEC-driver-bug-of-QE.patch new file mode 100644 index 0000000000..ad2ff243e8 --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-Fix-the-UEC-driver-bug-of-QE.patch @@ -0,0 +1,62 @@ +21fb83dfa2dcba7982eeb54f4ca7bc1056582c1e +diff --git a/drivers/qe/uec.c b/drivers/qe/uec.c +index f640c81..c44a5be 100644 +--- a/drivers/qe/uec.c ++++ b/drivers/qe/uec.c +@@ -1122,7 +1122,7 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len) + uec_private_t *uec; + ucc_fast_private_t *uccf; + volatile qe_bd_t *bd; +- volatile u16 status; ++ u16 status; + int i; + int result = 0; + +@@ -1131,7 +1131,7 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len) + bd = uec->txBd; + + /* Find an empty TxBD */ +- for (i = 0; BD_STATUS(bd) & TxBD_READY; i++) { ++ for (i = 0; bd->status & TxBD_READY; i++) { + if (i > 0x100000) { + printf("%s: tx buffer not ready\n", dev->name); + return result; +@@ -1150,13 +1150,11 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len) + ucc_fast_transmit_on_demand(uccf); + + /* Wait for buffer to be transmitted */ +- status = BD_STATUS(bd); +- for (i = 0; status & TxBD_READY; i++) { ++ for (i = 0; bd->status & TxBD_READY; i++) { + if (i > 0x100000) { + printf("%s: tx error\n", dev->name); + return result; + } +- status = BD_STATUS(bd); + } + + /* Ok, the buffer be transimitted */ +@@ -1171,12 +1169,12 @@ static int uec_recv(struct eth_device* dev) + { + uec_private_t *uec = dev->priv; + volatile qe_bd_t *bd; +- volatile u16 status; ++ u16 status; + u16 len; + u8 *data; + + bd = uec->rxBd; +- status = BD_STATUS(bd); ++ status = bd->status; + + while (!(status & RxBD_EMPTY)) { + if (!(status & RxBD_ERROR)) { +@@ -1190,7 +1188,7 @@ static int uec_recv(struct eth_device* dev) + BD_LENGTH_SET(bd, 0); + BD_STATUS_SET(bd, status | RxBD_EMPTY); + BD_ADVANCE(bd, status, uec->p_rx_bd_ring); +- status = BD_STATUS(bd); ++ status = bd->status; + } + uec->rxBd = bd; + diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-UEC-remove-udelay.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-UEC-remove-udelay.patch new file mode 100644 index 0000000000..9e2829bd3e --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-UEC-remove-udelay.patch @@ -0,0 +1,15 @@ +123b7d94ab4fa50a62aa9c0c0202d4e2c99a14c8 +diff --git a/drivers/qe/uec.c b/drivers/qe/uec.c +index aea455b..a327a34 100644 +--- a/drivers/qe/uec.c ++++ b/drivers/qe/uec.c +@@ -567,9 +567,6 @@ static void phy_change(struct eth_device *dev) + + uec_regs = uec->uec_regs; + +- /* Delay 5s to give the PHY a chance to change the register state */ +- udelay(5000000); +- + /* Update the link, speed, duplex */ + result = uec->mii_info->phyinfo->read_status(uec->mii_info); + diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch new file mode 100644 index 0000000000..5f3e1f7aaa --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch @@ -0,0 +1,32020 @@ +This patch, when applied against the external pristine +tarball u-boot-1.1.6.tar.bz2, makes the u-boot code match the git tree +with sha1 dd520bf314c7add4183c5191692180f576f96b60, +in the repository http://opensource.freescale.com/pub/scm/u-boot-83xx.git. +This git tag is identified for this code baseline: u-boot-1.1.6-fsl-1 + +The patch includes support changes for mpc8349itx, mpc8349emds, and mpc8360emds +as well as many other changes as of November 30, 2006. + +diff -Naupr u-boot-1.1.6/board/amcc/yellowstone/yellowstone.c u-boot-1.1.6-fsl-1/board/amcc/yellowstone/yellowstone.c +--- u-boot-1.1.6/board/amcc/yellowstone/yellowstone.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/amcc/yellowstone/yellowstone.c 2006-11-30 12:34:13.000000000 -0600 +@@ -552,3 +552,9 @@ void hw_watchdog_reset(void) + + } + #endif ++ ++void board_reset(void) ++{ ++ /* give reset to BCSR */ ++ *(unsigned char *)(CFG_BCSR_BASE | 0x06) = 0x09; ++} +diff -Naupr u-boot-1.1.6/board/amcc/yosemite/yosemite.c u-boot-1.1.6-fsl-1/board/amcc/yosemite/yosemite.c +--- u-boot-1.1.6/board/amcc/yosemite/yosemite.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/amcc/yosemite/yosemite.c 2006-11-30 12:34:13.000000000 -0600 +@@ -548,3 +548,9 @@ void hw_watchdog_reset(void) + + } + #endif ++ ++void board_reset(void) ++{ ++ /* give reset to BCSR */ ++ *(unsigned char *)(CFG_BCSR_BASE | 0x06) = 0x09; ++} +diff -Naupr u-boot-1.1.6/board/bc3450/bc3450.c u-boot-1.1.6-fsl-1/board/bc3450/bc3450.c +--- u-boot-1.1.6/board/bc3450/bc3450.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/bc3450/bc3450.c 2006-11-10 11:24:28.000000000 -0600 +@@ -295,7 +295,6 @@ void pci_init_board(void) + #endif + + #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) +-#define GPIO_PSC1_4 0x01000000UL + + void init_ide_reset (void) + { +@@ -311,9 +310,9 @@ void ide_set_reset (int idereset) + debug ("ide_reset(%d)\n", idereset); + + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + } + #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */ +diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/cfm_flash.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/cfm_flash.c +--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/cfm_flash.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/cfm_flash.c 2006-12-06 10:33:49.000000000 -0600 +@@ -60,7 +60,7 @@ void cfm_flash_init (flash_info_t * info + MCFCFM_MCR = 0; + MCFCFM_CLKD = CFM_CLK; + debug ("CFM Clock divider: %ld (%d Hz @ %ld Hz)\n",CFM_CLK,\ +- CFG_CLK / (2* ((CFM_CLK & 0x3F)+1) * (1+((CFM_CLK & 0x40)>>6)*7)),\ ++ CFG_CLK / (2* ((CFM_CLK & 0x3F)+1) * (1+((CFM_CLK & 0x40)>>6)*7)),\ + CFG_CLK); + MCFCFM_SACC = 0; + MCFCFM_DACC = 0; +diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c +--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/EB+MCF-EV123.c 2006-12-06 10:33:49.000000000 -0600 +@@ -50,13 +50,13 @@ long int initdram (int board_type) + + MCFSDRAMC_DACR0 = MCFSDRAMC_DACR_BASE(CFG_SDRAM_BASE0) + | MCFSDRAMC_DACR_CASL(1) +- | MCFSDRAMC_DACR_CBM(3) ++ | MCFSDRAMC_DACR_CBM(3) + | MCFSDRAMC_DACR_PS_16); + + MCFSDRAMC_DMR0 = MCFSDRAMC_DMR_BAM_16M + | MCFSDRAMC_DMR_V; + +- MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP; ++ MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_IP; + + *(unsigned short *)(CFG_SDRAM_BASE0) = 0xA5A5; + MCFSDRAMC_DACR0 |= MCFSDRAMC_DACR_RE; +@@ -70,10 +70,10 @@ long int initdram (int board_type) + #ifdef CFG_SDRAM_BASE1 + MCFSDRAMC_DACR1 = MCFSDRAMC_DACR_BASE(CFG_SDRAM_BASE1) + | MCFSDRAMC_DACR_CASL(1) +- | MCFSDRAMC_DACR_CBM(3) ++ | MCFSDRAMC_DACR_CBM(3) + | MCFSDRAMC_DACR_PS_16; + +- MCFSDRAMC_DMR1 = MCFSDRAMC_DMR_BAM_16M ++ MCFSDRAMC_DMR1 = MCFSDRAMC_DMR_BAM_16M + | MCFSDRAMC_DMR_V; + + MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IP; +@@ -82,7 +82,7 @@ long int initdram (int board_type) + MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_RE; + for (i=0; i < 2000; i++) + asm(" nop"); +- MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IMRS; ++ MCFSDRAMC_DACR1 |= MCFSDRAMC_DACR_IMRS; + *(unsigned int *)(CFG_SDRAM_BASE1 + 0x220) = 0xA5A5; + size += CFG_SDRAM_SIZE1 * 1024 * 1024; + #endif +diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/flash.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/flash.c +--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/flash.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/flash.c 2006-12-06 10:33:49.000000000 -0600 +@@ -256,7 +256,7 @@ int flash_erase (flash_info_t * info, in + enable_interrupts (); + + if (cflag) +- icache_enable (); ++ icache_enable (); + + return rc; + } +diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/u-boot.lds u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/u-boot.lds +--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/u-boot.lds 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/u-boot.lds 2006-12-06 10:33:49.000000000 -0600 +@@ -34,11 +34,11 @@ SECTIONS + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.text : { *(.rel.text) } +- .rela.text : { *(.rela.text) } ++ .rela.text : { *(.rela.text) } + .rel.data : { *(.rel.data) } +- .rela.data : { *(.rela.data) } +- .rel.rodata : { *(.rel.rodata) } +- .rela.rodata : { *(.rela.rodata) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.ctors : { *(.rel.ctors) } +diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.c u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.c +--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.c 2006-12-06 10:33:49.000000000 -0600 +@@ -66,7 +66,7 @@ int init_vcxk(void) + return 1; + } + +-void vcxk_loadimage(ulong source) ++void vcxk_loadimage(ulong source) + { + int cnt; + vcxk_acknowledge_wait(); +diff -Naupr u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.h u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.h +--- u-boot-1.1.6/board/BuS/EB+MCF-EV123/VCxK.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/BuS/EB+MCF-EV123/VCxK.h 2006-12-06 10:33:49.000000000 -0600 +@@ -25,24 +25,24 @@ + #define __VCXK_H_ + + extern int init_vcxk(void); +-void vcxk_loadimage(ulong source); ++void vcxk_loadimage(ulong source); + + #define VIDEO_ACKNOWLEDGE_PORT MCFGPTB_GPTPORT +-#define VIDEO_ACKNOWLEDGE_DDR MCFGPTB_GPTDDR ++#define VIDEO_ACKNOWLEDGE_DDR MCFGPTB_GPTDDR + #define VIDEO_ACKNOWLEDGE_PIN 0x0001 + +-#define VIDEO_ENABLE_PORT MCFGPTB_GPTPORT +-#define VIDEO_ENABLE_DDR MCFGPTB_GPTDDR ++#define VIDEO_ENABLE_PORT MCFGPTB_GPTPORT ++#define VIDEO_ENABLE_DDR MCFGPTB_GPTDDR + #define VIDEO_ENABLE_PIN 0x0002 + +-#define VIDEO_REQUEST_PORT MCFGPTB_GPTPORT +-#define VIDEO_REQUEST_DDR MCFGPTB_GPTDDR ++#define VIDEO_REQUEST_PORT MCFGPTB_GPTPORT ++#define VIDEO_REQUEST_DDR MCFGPTB_GPTDDR + #define VIDEO_REQUEST_PIN 0x0004 + + #define VIDEO_Invert_CFG MCFGPIO_PEPAR + #define VIDEO_Invert_IO MCFGPIO_PEPAR_PEPA2 +-#define VIDEO_INVERT_PORT MCFGPIO_PORTE +-#define VIDEO_INVERT_DDR MCFGPIO_DDRE ++#define VIDEO_INVERT_PORT MCFGPIO_PORTE ++#define VIDEO_INVERT_DDR MCFGPIO_DDRE + #define VIDEO_INVERT_PIN MCFGPIO_PORT2 + + #endif +diff -Naupr u-boot-1.1.6/board/emk/top5200/top5200.c u-boot-1.1.6-fsl-1/board/emk/top5200/top5200.c +--- u-boot-1.1.6/board/emk/top5200/top5200.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/emk/top5200/top5200.c 2006-12-06 10:33:49.000000000 -0600 +@@ -186,13 +186,11 @@ void pci_init_board(void) + *****************************************************************************/ + #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) + +-#define GPIO_PSC1_4 0x01000000UL +- + void init_ide_reset (void) + { + debug ("init_ide_reset\n"); + +- /* Configure PSC1_4 as GPIO output for ATA reset */ ++ /* Configure PSC1_4 as GPIO output for ATA reset */ + *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4; + *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4; + } +@@ -202,9 +200,9 @@ void ide_set_reset (int idereset) + debug ("ide_reset(%d)\n", idereset); + + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + } + #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */ +diff -Naupr u-boot-1.1.6/board/esd/cpci5200/cpci5200.c u-boot-1.1.6-fsl-1/board/esd/cpci5200/cpci5200.c +--- u-boot-1.1.6/board/esd/cpci5200/cpci5200.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/esd/cpci5200/cpci5200.c 2006-12-06 10:33:49.000000000 -0600 +@@ -191,16 +191,13 @@ static struct pci_controller hose; + + extern void pci_mpc5xxx_init(struct pci_controller *); + +-void pci_init_board(void +- ) { ++void pci_init_board(void) { + pci_mpc5xxx_init(&hose); + } + #endif + + #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) + +-#define GPIO_PSC1_4 0x01000000UL +- + void init_ide_reset(void) + { + debug("init_ide_reset\n"); +@@ -215,9 +212,9 @@ void ide_set_reset(int idereset) + debug("ide_reset(%d)\n", idereset); + + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + } + #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */ +@@ -242,7 +239,7 @@ void init_ata_reset(void) + debug("init_ata_reset\n"); + + /* Configure GPIO_WU6 as GPIO output for ATA reset */ +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_WU6; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_WU6; + *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_WU6; + *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_WU6; + __asm__ volatile ("sync"); +diff -Naupr u-boot-1.1.6/board/esd/pf5200/pf5200.c u-boot-1.1.6-fsl-1/board/esd/pf5200/pf5200.c +--- u-boot-1.1.6/board/esd/pf5200/pf5200.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/esd/pf5200/pf5200.c 2006-12-06 10:33:49.000000000 -0600 +@@ -191,16 +191,13 @@ static struct pci_controller hose; + + extern void pci_mpc5xxx_init(struct pci_controller *); + +-void pci_init_board(void +- ) { ++void pci_init_board(void) { + pci_mpc5xxx_init(&hose); + } + #endif + + #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) + +-#define GPIO_PSC1_4 0x01000000UL +- + void init_ide_reset(void) + { + debug("init_ide_reset\n"); +@@ -215,9 +212,9 @@ void ide_set_reset(int idereset) + debug("ide_reset(%d)\n", idereset); + + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + } + #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */ +@@ -242,7 +239,7 @@ void init_power_switch(void) + debug("init_power_switch\n"); + + /* Configure GPIO_WU6 as GPIO output for ATA reset */ +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_WU6; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_WU6; + *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_WU6; + *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_WU6; + __asm__ volatile ("sync"); +@@ -272,10 +269,10 @@ void power_set_reset(int power) + debug("ide_set_reset(%d)\n", power); + + if (power) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_WU6; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_WU6; + *(vu_long *) MPC5XXX_INTERRUPT_GPIO_DATA_OUTPUT &= ~GPIO_USB9; + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_WU6; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_WU6; + if ((*(vu_long *) MPC5XXX_INTERRUPT_GPIO_STATUS & GPIO_USB9S) == + 0) { + *(vu_long *) MPC5XXX_SIMPLEIO_GPIO_DATA_OUTPUT |= +diff -Naupr u-boot-1.1.6/board/icecube/icecube.c u-boot-1.1.6-fsl-1/board/icecube/icecube.c +--- u-boot-1.1.6/board/icecube/icecube.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/icecube/icecube.c 2006-12-06 10:33:49.000000000 -0600 +@@ -29,6 +29,10 @@ + #include <pci.h> + #include <asm/processor.h> + ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ + #if defined(CONFIG_LITE5200B) + #include "mt46v32m16.h" + #else +@@ -308,17 +312,15 @@ void pci_init_board(void) + + #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) + +-#define GPIO_PSC1_4 0x01000000UL +- + void init_ide_reset (void) + { + debug ("init_ide_reset\n"); + +- /* Configure PSC1_4 as GPIO output for ATA reset */ ++ /* Configure PSC1_4 as GPIO output for ATA reset */ + *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4; + *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4; + /* Deassert reset */ +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + + void ide_set_reset (int idereset) +@@ -326,11 +328,19 @@ void ide_set_reset (int idereset) + debug ("ide_reset(%d)\n", idereset); + + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + /* Make a delay. MPC5200 spec says 25 usec min */ + udelay(500000); + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + } + #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */ ++ ++#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) ++void ++ft_board_setup(void *blob, bd_t *bd) ++{ ++ ft_cpu_setup(blob, bd); ++} ++#endif +diff -Naupr u-boot-1.1.6/board/inka4x0/inka4x0.c u-boot-1.1.6-fsl-1/board/inka4x0/inka4x0.c +--- u-boot-1.1.6/board/inka4x0/inka4x0.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/inka4x0/inka4x0.c 2006-11-10 11:24:28.000000000 -0600 +@@ -173,9 +173,6 @@ void flash_preinit(void) + *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */ + } + +-#define GPIO_WKUP_7 0x80000000UL +-#define GPIO_PSC3_9 0x04000000UL +- + int misc_init_f (void) + { + uchar tmp[10]; +@@ -218,13 +215,13 @@ int misc_init_f (void) + *(vu_long *)MPC5XXX_WU_GPIO_DIR |= 0xc4000000; + + /* Set LR mirror bit because it is low-active */ +- *(vu_long *)MPC5XXX_WU_GPIO_DATA |= GPIO_WKUP_7; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_WKUP_7; + /* + * Reset Coral-P graphics controller + */ + *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC3_9; + *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC3_9; +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC3_9; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC3_9; + return 0; + } + +@@ -241,8 +238,6 @@ void pci_init_board(void) + + #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) + +-#define GPIO_PSC1_4 0x01000000UL +- + void init_ide_reset (void) + { + debug ("init_ide_reset\n"); +@@ -251,7 +246,7 @@ void init_ide_reset (void) + *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4; + *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4; + /* Deassert reset */ +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + + void ide_set_reset (int idereset) +@@ -259,11 +254,11 @@ void ide_set_reset (int idereset) + debug ("ide_reset(%d)\n", idereset); + + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + /* Make a delay. MPC5200 spec says 25 usec min */ + udelay(500000); + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + } + #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */ +diff -Naupr u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds +--- u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds 2006-12-06 10:33:49.000000000 -0600 +@@ -43,11 +43,11 @@ SECTIONS + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.text : { *(.rel.text) } +- .rela.text : { *(.rela.text) } ++ .rela.text : { *(.rela.text) } + .rel.data : { *(.rel.data) } +- .rela.data : { *(.rela.data) } +- .rel.rodata : { *(.rel.rodata) } +- .rela.rodata : { *(.rela.rodata) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.ctors : { *(.rel.ctors) } +diff -Naupr u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds.debug u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds.debug +--- u-boot-1.1.6/board/LEOX/elpt860/u-boot.lds.debug 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/LEOX/elpt860/u-boot.lds.debug 2006-12-06 10:33:49.000000000 -0600 +@@ -43,11 +43,11 @@ SECTIONS + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .rel.text : { *(.rel.text) } +- .rela.text : { *(.rela.text) } ++ .rela.text : { *(.rela.text) } + .rel.data : { *(.rel.data) } +- .rela.data : { *(.rela.data) } +- .rel.rodata : { *(.rel.rodata) } +- .rela.rodata : { *(.rela.rodata) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.ctors : { *(.rel.ctors) } +diff -Naupr u-boot-1.1.6/board/MAI/AmigaOneG3SE/articiaS_pci.c u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/articiaS_pci.c +--- u-boot-1.1.6/board/MAI/AmigaOneG3SE/articiaS_pci.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/articiaS_pci.c 2006-12-06 10:33:49.000000000 -0600 +@@ -368,11 +368,11 @@ void articiaS_pci_init (void) + if (articiaS_init_vga() == -1) + { + /* If the VGA didn't init and we have stdout set to VGA, reset to serial */ +-/* s = getenv("stdout"); */ +-/* if (s && strcmp(s, "vga") == 0) */ +-/* { */ +-/* setenv("stdout", "serial"); */ +-/* } */ ++/* s = getenv("stdout"); */ ++/* if (s && strcmp(s, "vga") == 0) */ ++/* { */ ++/* setenv("stdout", "serial"); */ ++/* } */ + } + } + pci_write_config_byte(PCI_BDF(0,1,0), PCI_INTERRUPT_LINE, 0xFF); +diff -Naupr u-boot-1.1.6/board/MAI/AmigaOneG3SE/enet.c u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/enet.c +--- u-boot-1.1.6/board/MAI/AmigaOneG3SE/enet.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/enet.c 2006-12-06 10:33:49.000000000 -0600 +@@ -41,57 +41,57 @@ + + /* 3Com Commands, top 5 bits are command and bottom 11 bits are parameters */ + +-#define TotalReset (0<<11) +-#define SelectWindow (1<<11) +-#define StartCoax (2<<11) +-#define RxDisable (3<<11) +-#define RxEnable (4<<11) +-#define RxReset (5<<11) +-#define UpStall (6<<11) +-#define UpUnstall (6<<11)+1 +-#define DownStall (6<<11)+2 +-#define DownUnstall (6<<11)+3 +-#define RxDiscard (8<<11) +-#define TxEnable (9<<11) +-#define TxDisable (10<<11) +-#define TxReset (11<<11) +-#define FakeIntr (12<<11) +-#define AckIntr (13<<11) +-#define SetIntrEnb (14<<11) +-#define SetStatusEnb (15<<11) +-#define SetRxFilter (16<<11) +-#define SetRxThreshold (17<<11) +-#define SetTxThreshold (18<<11) +-#define SetTxStart (19<<11) +-#define StartDMAUp (20<<11) +-#define StartDMADown (20<<11)+1 ++#define TotalReset (0<<11) ++#define SelectWindow (1<<11) ++#define StartCoax (2<<11) ++#define RxDisable (3<<11) ++#define RxEnable (4<<11) ++#define RxReset (5<<11) ++#define UpStall (6<<11) ++#define UpUnstall (6<<11)+1 ++#define DownStall (6<<11)+2 ++#define DownUnstall (6<<11)+3 ++#define RxDiscard (8<<11) ++#define TxEnable (9<<11) ++#define TxDisable (10<<11) ++#define TxReset (11<<11) ++#define FakeIntr (12<<11) ++#define AckIntr (13<<11) ++#define SetIntrEnb (14<<11) ++#define SetStatusEnb (15<<11) ++#define SetRxFilter (16<<11) ++#define SetRxThreshold (17<<11) ++#define SetTxThreshold (18<<11) ++#define SetTxStart (19<<11) ++#define StartDMAUp (20<<11) ++#define StartDMADown (20<<11)+1 + #define StatsEnable (21<<11) + #define StatsDisable (22<<11) +-#define StopCoax (23<<11) +-#define SetFilterBit (25<<11) ++#define StopCoax (23<<11) ++#define SetFilterBit (25<<11) + + /* The SetRxFilter command accepts the following classes */ + +-#define RxStation 1 ++#define RxStation 1 + #define RxMulticast 2 + #define RxBroadcast 4 +-#define RxProm 8 ++#define RxProm 8 + + /* 3Com status word defnitions */ + +-#define IntLatch 0x0001 +-#define HostError 0x0002 +-#define TxComplete 0x0004 +-#define TxAvailable 0x0008 +-#define RxComplete 0x0010 +-#define RxEarly 0x0020 +-#define IntReq 0x0040 +-#define StatsFull 0x0080 +-#define DMADone (1<<8) +-#define DownComplete (1<<9) +-#define UpComplete (1<<10) +-#define DMAInProgress (1<<11) /* DMA controller is still busy.*/ +-#define CmdInProgress (1<<12) /* EL3_CMD is still busy.*/ ++#define IntLatch 0x0001 ++#define HostError 0x0002 ++#define TxComplete 0x0004 ++#define TxAvailable 0x0008 ++#define RxComplete 0x0010 ++#define RxEarly 0x0020 ++#define IntReq 0x0040 ++#define StatsFull 0x0080 ++#define DMADone (1<<8) ++#define DownComplete (1<<9) ++#define UpComplete (1<<10) ++#define DMAInProgress (1<<11) /* DMA controller is still busy.*/ ++#define CmdInProgress (1<<12) /* EL3_CMD is still busy.*/ + + /* Polling Registers */ + +@@ -100,17 +100,17 @@ + + /* Register window 0 offets */ + +-#define Wn0EepromCmd 10 /* Window 0: EEPROM command register. */ +-#define Wn0EepromData 12 /* Window 0: EEPROM results register. */ ++#define Wn0EepromCmd 10 /* Window 0: EEPROM command register. */ ++#define Wn0EepromData 12 /* Window 0: EEPROM results register. */ + #define IntrStatus 0x0E /* Valid in all windows. */ + + /* Register window 0 EEPROM bits */ + +-#define EEPROM_Read 0x80 +-#define EEPROM_WRITE 0x40 +-#define EEPROM_ERASE 0xC0 +-#define EEPROM_EWENB 0x30 /* Enable erasing/writing for 10 msec. */ +-#define EEPROM_EWDIS 0x00 /* Disable EWENB before 10 msec timeout. */ ++#define EEPROM_Read 0x80 ++#define EEPROM_WRITE 0x40 ++#define EEPROM_ERASE 0xC0 ++#define EEPROM_EWENB 0x30 /* Enable erasing/writing for 10 msec. */ ++#define EEPROM_EWDIS 0x00 /* Disable EWENB before 10 msec timeout. */ + + /* EEPROM locations. */ + +@@ -129,13 +129,13 @@ + + /* Register window 1 offsets, the window used in normal operation */ + +-#define TX_FIFO 0x10 +-#define RX_FIFO 0x10 +-#define RxErrors 0x14 +-#define RxStatus 0x18 ++#define TX_FIFO 0x10 ++#define RX_FIFOa 0x10 ++#define RxErrors 0x14 ++#define RxStatus 0x18 + #define Timer 0x1A +-#define TxStatus 0x1B +-#define TxFree 0x1C /* Remaining free bytes in Tx buffer. */ ++#define TxStatus 0x1B ++#define TxFree 0x1C /* Remaining free bytes in Tx buffer. */ + + /* Register Window 2 */ + +@@ -147,47 +147,47 @@ + #define Wn3_MAC_Ctrl 6 + #define Wn3_Options 8 + +-#define BFEXT(value, offset, bitcount) \ ++#define BFEXT(value, offset, bitcount) \ + ((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1)) + + #define BFINS(lhs, rhs, offset, bitcount) \ +- (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \ ++ (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \ + (((rhs) & ((1 << (bitcount)) - 1)) << (offset))) + + #define RAM_SIZE(v) BFEXT(v, 0, 3) +-#define RAM_WIDTH(v) BFEXT(v, 3, 1) +-#define RAM_SPEED(v) BFEXT(v, 4, 2) ++#define RAM_WIDTH(v) BFEXT(v, 3, 1) ++#define RAM_SPEED(v) BFEXT(v, 4, 2) + #define ROM_SIZE(v) BFEXT(v, 6, 2) +-#define RAM_SPLIT(v) BFEXT(v, 16, 2) ++#define RAM_SPLIT(v) BFEXT(v, 16, 2) + #define XCVR(v) BFEXT(v, 20, 4) +-#define AUTOSELECT(v) BFEXT(v, 24, 1) ++#define AUTOSELECT(v) BFEXT(v, 24, 1) + + /* Register Window 4: Xcvr/media bits */ + +-#define Wn4_FIFODiag 4 +-#define Wn4_NetDiag 6 ++#define Wn4_FIFODiag 4 ++#define Wn4_NetDiag 6 + #define Wn4_PhysicalMgmt 8 +-#define Wn4_Media 10 ++#define Wn4_Media 10 + +-#define Media_SQE 0x0008 /* Enable SQE error counting for AUI. */ +-#define Media_10TP 0x00C0 /* Enable link beat and jabber for 10baseT. */ +-#define Media_Lnk 0x0080 /* Enable just link beat for 100TX/100FX. */ +-#define Media_LnkBeat 0x0800 ++#define Media_SQE 0x0008 /* Enable SQE error counting for AUI. */ ++#define Media_10TP 0x00C0 /* Enable link beat and jabber for 10baseT. */ ++#define Media_Lnk 0x0080 /* Enable just link beat for 100TX/100FX. */ ++#define Media_LnkBeat 0x0800 + + /* Register Window 7: Bus Master control */ + +-#define Wn7_MasterAddr 0 +-#define Wn7_MasterLen 6 +-#define Wn7_MasterStatus 12 ++#define Wn7_MasterAddr 0 ++#define Wn7_MasterLen 6 ++#define Wn7_MasterStatus 12 + + /* Boomerang bus master control registers. */ + +-#define PktStatus 0x20 ++#define PktStatus 0x20 + #define DownListPtr 0x24 +-#define FragAddr 0x28 +-#define FragLen 0x2c ++#define FragAddr 0x28 ++#define FragLen 0x2c + #define TxFreeThreshold 0x2f +-#define UpPktStatus 0x30 ++#define UpPktStatus 0x30 + #define UpListPtr 0x38 + + /* The Rx and Tx descriptor lists. */ +diff -Naupr u-boot-1.1.6/board/MAI/AmigaOneG3SE/Makefile u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/Makefile +--- u-boot-1.1.6/board/MAI/AmigaOneG3SE/Makefile 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/MAI/AmigaOneG3SE/Makefile 2006-12-06 10:33:49.000000000 -0600 +@@ -30,7 +30,7 @@ endif + LIB = $(obj)lib$(BOARD).a + + COBJS = $(BOARD).o articiaS.o flash.o serial.o smbus.o articiaS_pci.o \ +- via686.o i8259.o ../bios_emulator/x86interface.o \ ++ via686.o i8259.o ../bios_emulator/x86interface.o \ + ../bios_emulator/bios.o ../bios_emulator/glue.o \ + interrupts.o ps2kbd.o video.o usb_uhci.o enet.o \ + ../menu/cmd_menu.o cmd_boota.o nvram.o +diff -Naupr u-boot-1.1.6/board/mcc200/mcc200.c u-boot-1.1.6-fsl-1/board/mcc200/mcc200.c +--- u-boot-1.1.6/board/mcc200/mcc200.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mcc200/mcc200.c 2006-11-30 12:34:13.000000000 -0600 +@@ -27,6 +27,7 @@ + #include <common.h> + #include <mpc5xxx.h> + #include <pci.h> ++#include <asm/processor.h> + + /* Two MT48LC8M32B2 for 32 MB */ + /* #include "mt48lc8m32b2-6-7.h" */ +@@ -98,6 +99,7 @@ long int initdram (int board_type) + { + ulong dramsize = 0; + ulong dramsize2 = 0; ++ uint svr, pvr; + #ifndef CFG_RAMBOOT + ulong test1, test2; + +@@ -192,6 +194,22 @@ long int initdram (int board_type) + + #endif /* CFG_RAMBOOT */ + ++ /* ++ * On MPC5200B we need to set the special configuration delay in the ++ * DDR controller. Please refer to Freescale's AN3221 "MPC5200B SDRAM ++ * Initialization and Configuration", 3.3.1 SDelay--MBAR + 0x0190: ++ * ++ * "The SDelay should be written to a value of 0x00000004. It is ++ * required to account for changes caused by normal wafer processing ++ * parameters." ++ */ ++ svr = get_svr(); ++ pvr = get_pvr(); ++ if ((SVR_MJREV(svr) >= 2) && (PVR_MAJ(pvr) == 1) && (PVR_MIN(pvr) == 4)) { ++ *(vu_long *)MPC5XXX_SDRAM_SDELAY = 0x04; ++ __asm__ volatile ("sync"); ++ } ++ + return dramsize + dramsize2; + } + +diff -Naupr u-boot-1.1.6/board/mpc8349emds/Makefile u-boot-1.1.6-fsl-1/board/mpc8349emds/Makefile +--- u-boot-1.1.6/board/mpc8349emds/Makefile 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349emds/Makefile 2006-11-10 11:24:28.000000000 -0600 +@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk + + LIB = $(obj)lib$(BOARD).a + +-COBJS := $(BOARD).o ++COBJS := $(BOARD).o pci.o + + SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) + OBJS := $(addprefix $(obj),$(COBJS)) +diff -Naupr u-boot-1.1.6/board/mpc8349emds/mpc8349emds.c u-boot-1.1.6-fsl-1/board/mpc8349emds/mpc8349emds.c +--- u-boot-1.1.6/board/mpc8349emds/mpc8349emds.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349emds/mpc8349emds.c 2006-11-10 11:24:28.000000000 -0600 +@@ -33,6 +33,10 @@ + #if defined(CONFIG_SPD_EEPROM) + #include <spd_sdram.h> + #endif ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ + int fixed_sdram(void); + void sdram_init(void); + +@@ -59,7 +63,7 @@ int board_early_init_f (void) + + long int initdram (int board_type) + { +- volatile immap_t *im = (immap_t *)CFG_IMMRBAR; ++ volatile immap_t *im = (immap_t *)CFG_IMMR; + u32 msize = 0; + + if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im) +@@ -96,7 +100,7 @@ long int initdram (int board_type) + ************************************************************************/ + int fixed_sdram(void) + { +- volatile immap_t *im = (immap_t *)CFG_IMMRBAR; ++ volatile immap_t *im = (immap_t *)CFG_IMMR; + u32 msize = 0; + u32 ddr_size; + u32 ddr_size_log2; +@@ -167,8 +171,8 @@ int checkboard (void) + + void sdram_init(void) + { +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile lbus8349_t *lbc= &immap->lbus; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile lbus83xx_t *lbc= &immap->lbus; + uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE; + + puts("\n SDRAM on Local Bus: "); +@@ -245,8 +249,8 @@ void sdram_init(void) + */ + void ecc_print_status(void) + { +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile ddr8349_t *ddr = &immap->ddr; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile ddr83xx_t *ddr = &immap->ddr; + + printf("\nECC mode: %s\n\n", (ddr->sdram_cfg & SDRAM_CFG_ECC_EN) ? "ON" : "OFF"); + +@@ -320,8 +324,8 @@ void ecc_print_status(void) + + int do_ecc ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + { +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile ddr8349_t *ddr = &immap->ddr; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile ddr83xx_t *ddr = &immap->ddr; + volatile u32 val; + u64 *addr, count, val64; + register u64 *i; +@@ -564,3 +568,23 @@ U_BOOT_CMD( + " - re-inits memory" + ); + #endif /* if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD) */ ++ ++#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) ++void ++ft_board_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++#ifdef CONFIG_PCI ++ ft_pci_setup(blob, bd); ++#endif ++ ft_cpu_setup(blob, bd); ++ ++ p = ft_get_prop(blob, "/memory/reg", &len); ++ if (p != NULL) { ++ *p++ = cpu_to_be32(bd->bi_memstart); ++ *p = cpu_to_be32(bd->bi_memsize); ++ } ++} ++#endif +diff -Naupr u-boot-1.1.6/board/mpc8349emds/pci.c u-boot-1.1.6-fsl-1/board/mpc8349emds/pci.c +--- u-boot-1.1.6/board/mpc8349emds/pci.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349emds/pci.c 2006-12-06 10:33:49.000000000 -0600 +@@ -68,12 +68,13 @@ static struct pci_controller pci_hose[] + void + pib_init(void) + { +- u8 val8; ++ u8 val8, orig_i2c_bus; + /* + * Assign PIB PMC slot to desired PCI bus + */ +- mpc8349_i2c = (i2c_t*)(CFG_IMMRBAR + CFG_I2C2_OFFSET); +- i2c_init(CFG_I2C_SPEED, CFG_I2C_SLAVE); ++ /* Switch temporarily to I2C bus #2 */ ++ orig_i2c_bus = i2c_get_bus_num(); ++ i2c_set_bus_num(1); + + val8 = 0; + i2c_write(0x23, 0x6, 1, &val8, 1); +@@ -118,6 +119,8 @@ pib_init(void) + printf("PCI1: 32-bit on PMC1, PMC2\n"); + printf("PCI2: 32-bit on PMC3\n"); + #endif ++ /* Reset to original I2C bus */ ++ i2c_set_bus_num(orig_i2c_bus); + } + + /************************************************************************** +@@ -130,18 +133,18 @@ void + pci_init_board(void) + { + volatile immap_t * immr; +- volatile clk8349_t * clk; +- volatile law8349_t * pci_law; +- volatile pot8349_t * pci_pot; +- volatile pcictrl8349_t * pci_ctrl; +- volatile pciconf8349_t * pci_conf; ++ volatile clk83xx_t * clk; ++ volatile law83xx_t * pci_law; ++ volatile pot83xx_t * pci_pot; ++ volatile pcictrl83xx_t * pci_ctrl; ++ volatile pciconf83xx_t * pci_conf; + u16 reg16; + u32 reg32; + u32 dev; + struct pci_controller * hose; + +- immr = (immap_t *)CFG_IMMRBAR; +- clk = (clk8349_t *)&immr->clk; ++ immr = (immap_t *)CFG_IMMR; ++ clk = (clk83xx_t *)&immr->clk; + pci_law = immr->sysconf.pcilaw; + pci_pot = immr->ios.pot; + pci_ctrl = immr->pci_ctrl; +@@ -254,8 +257,8 @@ pci_init_board(void) + hose->region_count = 4; + + pci_setup_indirect(hose, +- (CFG_IMMRBAR+0x8300), +- (CFG_IMMRBAR+0x8304)); ++ (CFG_IMMR+0x8300), ++ (CFG_IMMR+0x8304)); + + pci_register_hose(hose); + +@@ -350,8 +353,8 @@ pci_init_board(void) + hose->region_count = 4; + + pci_setup_indirect(hose, +- (CFG_IMMRBAR+0x8380), +- (CFG_IMMRBAR+0x8384)); ++ (CFG_IMMR+0x8380), ++ (CFG_IMMR+0x8384)); + + pci_register_hose(hose); + +@@ -379,4 +382,26 @@ pci_init_board(void) + + } + ++#ifdef CONFIG_OF_FLAT_TREE ++void ++ft_pci_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++ p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len); ++ if (p != NULL) { ++ p[0] = pci_hose[0].first_busno; ++ p[1] = pci_hose[0].last_busno; ++ } ++ ++#ifdef CONFIG_MPC83XX_PCI2 ++ p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8600/bus-range", &len); ++ if (p != NULL) { ++ p[0] = pci_hose[1].first_busno; ++ p[1] = pci_hose[1].last_busno; ++ } ++#endif ++} ++#endif /* CONFIG_OF_FLAT_TREE */ + #endif /* CONFIG_PCI */ +diff -Naupr u-boot-1.1.6/board/mpc8349itx/config.mk u-boot-1.1.6-fsl-1/board/mpc8349itx/config.mk +--- u-boot-1.1.6/board/mpc8349itx/config.mk 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/config.mk 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,33 @@ ++# ++# Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++# ++# MPC8349ITX ++# ++ ++TEXT_BASE = 0xFEF00000 ++ ++ifneq ($(OBJTREE),$(SRCTREE)) ++# We are building u-boot in a separate directory, use generated ++# .lds script from OBJTREE directory. ++LDSCRIPT := $(OBJTREE)/board/$(BOARDDIR)/u-boot.lds ++endif +diff -Naupr u-boot-1.1.6/board/mpc8349itx/Makefile u-boot-1.1.6-fsl-1/board/mpc8349itx/Makefile +--- u-boot-1.1.6/board/mpc8349itx/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/Makefile 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,48 @@ ++# ++# Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++include $(TOPDIR)/config.mk ++ ++LIB = $(obj)lib$(BOARD).a ++ ++COBJS := $(BOARD).o pci.o ++ ++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS)) ++SOBJS := $(addprefix $(obj),$(SOBJS)) ++ ++$(LIB): $(obj).depend $(OBJS) ++ $(AR) crv $@ $(OBJS) ++ ++clean: ++ rm -f $(SOBJS) $(OBJS) ++ ++distclean: clean ++ rm -f $(LIB) core *.bak .depend ++ ++######################################################################### ++ ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +diff -Naupr u-boot-1.1.6/board/mpc8349itx/mpc8349itx.c u-boot-1.1.6-fsl-1/board/mpc8349itx/mpc8349itx.c +--- u-boot-1.1.6/board/mpc8349itx/mpc8349itx.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/mpc8349itx.c 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,477 @@ ++/* ++ * Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS for A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include <common.h> ++#include <ioports.h> ++#include <mpc83xx.h> ++#include <i2c.h> ++#include <spd.h> ++#include <miiphy.h> ++ ++#ifdef CONFIG_PCI ++#include <asm/mpc8349_pci.h> ++#include <pci.h> ++#endif ++ ++#ifdef CONFIG_SPD_EEPROM ++#include <spd_sdram.h> ++#else ++#include <asm/mmu.h> ++#endif ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ ++#ifndef CONFIG_SPD_EEPROM ++/************************************************************************* ++ * fixed sdram init -- doesn't use serial presence detect. ++ ************************************************************************/ ++int fixed_sdram(void) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 ddr_size; /* The size of RAM, in bytes */ ++ u32 ddr_size_log2 = 0; ++ ++ for (ddr_size = CFG_DDR_SIZE * 0x100000; ddr_size > 1; ddr_size >>= 1) { ++ if (ddr_size & 1) { ++ return -1; ++ } ++ ddr_size_log2++; ++ } ++ ++ im->sysconf.ddrlaw[0].ar = ++ LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE); ++ im->sysconf.ddrlaw[0].bar = (CFG_DDR_SDRAM_BASE >> 12) & 0xfffff; ++ ++ /* Only one CS0 for DDR */ ++ im->ddr.csbnds[0].csbnds = 0x0000000f; ++ im->ddr.cs_config[0] = CFG_DDR_CONFIG; ++ ++ debug("cs0_bnds = 0x%08x\n", im->ddr.csbnds[0].csbnds); ++ debug("cs0_config = 0x%08x\n", im->ddr.cs_config[0]); ++ ++ debug("DDR:bar=0x%08x\n", im->sysconf.ddrlaw[0].bar); ++ debug("DDR:ar=0x%08x\n", im->sysconf.ddrlaw[0].ar); ++ ++ im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; ++ im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2;/* Was "2 << TIMING_CFG2_WR_DATA_DELAY_SHIFT" */ ++ im->ddr.sdram_cfg = SDRAM_CFG_SREN | SDRAM_CFG_SDRAM_TYPE_DDR; ++ im->ddr.sdram_mode = ++ (0x0000 << SDRAM_MODE_ESD_SHIFT) | (0x0032 << SDRAM_MODE_SD_SHIFT); ++ im->ddr.sdram_interval = ++ (0x0410 << SDRAM_INTERVAL_REFINT_SHIFT) | (0x0100 << ++ SDRAM_INTERVAL_BSTOPRE_SHIFT); ++ im->ddr.sdram_clk_cntl = ++ DDR_SDRAM_CLK_CNTL_SS_EN | DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05; ++ ++ udelay(200); ++ ++ im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; ++ ++ debug("DDR:timing_cfg_1=0x%08x\n", im->ddr.timing_cfg_1); ++ debug("DDR:timing_cfg_2=0x%08x\n", im->ddr.timing_cfg_2); ++ debug("DDR:sdram_mode=0x%08x\n", im->ddr.sdram_mode); ++ debug("DDR:sdram_interval=0x%08x\n", im->ddr.sdram_interval); ++ debug("DDR:sdram_cfg=0x%08x\n", im->ddr.sdram_cfg); ++ ++ return CFG_DDR_SIZE; ++} ++#endif ++ ++#ifdef CONFIG_PCI ++/* ++ * Initialize PCI Devices, report devices found ++ */ ++#ifndef CONFIG_PCI_PNP ++static struct pci_config_table pci_mpc83xxmitx_config_table[] = { ++ { ++ PCI_ANY_ID, ++ PCI_ANY_ID, ++ PCI_ANY_ID, ++ PCI_ANY_ID, ++ 0x0f, ++ PCI_ANY_ID, ++ pci_cfgfunc_config_device, ++ { ++ PCI_ENET0_IOADDR, ++ PCI_ENET0_MEMADDR, ++ PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER} ++ }, ++ {} ++} ++#endif ++ ++volatile static struct pci_controller hose[] = { ++ { ++#ifndef CONFIG_PCI_PNP ++ config_table:pci_mpc83xxmitx_config_table, ++#endif ++ }, ++ { ++#ifndef CONFIG_PCI_PNP ++ config_table:pci_mpc83xxmitx_config_table, ++#endif ++ } ++}; ++#endif /* CONFIG_PCI */ ++ ++/* If MPC8349E-mITX is soldered with SDRAM, then initialize it. */ ++ ++void sdram_init(void) ++{ ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; ++ volatile lbus83xx_t *lbc = &immap->lbus; ++ ++#if defined(CFG_BR2_PRELIM) \ ++ && defined(CFG_OR2_PRELIM) \ ++ && defined(CFG_LBLAWBAR2_PRELIM) \ ++ && defined(CFG_LBLAWAR2_PRELIM) \ ++ && !defined(CONFIG_COMPACT_FLASH) ++ ++ uint *sdram_addr = (uint *) CFG_LBC_SDRAM_BASE; ++ ++ puts("\n SDRAM on Local Bus: "); ++ print_size(CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); ++ ++ /* ++ * Setup SDRAM Base and Option Registers, already done in cpu_init.c ++ */ ++ ++ /*setup mtrpt, lsrt and lbcr for LB bus */ ++ lbc->lbcr = CFG_LBC_LBCR; ++ lbc->mrtpr = CFG_LBC_MRTPR; ++ lbc->lsrt = CFG_LBC_LSRT; ++ asm("sync"); ++ ++ /* ++ * Configure the SDRAM controller Machine Mode register. ++ */ ++ lbc->lsdmr = CFG_LBC_LSDMR_5; /* 0x40636733; normal operation */ ++ ++ lbc->lsdmr = CFG_LBC_LSDMR_1; /*0x68636733; precharge all the banks */ ++ asm("sync"); ++ *sdram_addr = 0xff; ++ udelay(100); ++ ++ lbc->lsdmr = CFG_LBC_LSDMR_2; /*0x48636733; auto refresh */ ++ asm("sync"); ++ *sdram_addr = 0xff; /*1 time*/ ++ udelay(100); ++ *sdram_addr = 0xff; /*2 times*/ ++ udelay(100); ++ *sdram_addr = 0xff; /*3 times*/ ++ udelay(100); ++ *sdram_addr = 0xff; /*4 times*/ ++ udelay(100); ++ *sdram_addr = 0xff; /*5 times*/ ++ udelay(100); ++ *sdram_addr = 0xff; /*6 times*/ ++ udelay(100); ++ *sdram_addr = 0xff; /*7 times*/ ++ udelay(100); ++ *sdram_addr = 0xff; /*8 times*/ ++ udelay(100); ++ ++ lbc->lsdmr = CFG_LBC_LSDMR_4; /*0x58636733;mode register write operation */ ++ asm("sync"); ++ *sdram_addr = 0xff; ++ udelay(100); ++ ++ lbc->lsdmr = CFG_LBC_LSDMR_5; /*0x40636733;normal operation */ ++ asm("sync"); ++ *sdram_addr = 0xff; ++ udelay(100); ++ ++#else ++ puts("SDRAM on Local Bus is NOT available!\n"); ++ ++#ifdef CFG_BR2_PRELIM ++ lbc->bank[2].br = CFG_BR2_PRELIM; ++ lbc->bank[2].or = CFG_OR2_PRELIM; ++#endif ++ ++#ifdef CFG_BR3_PRELIM ++ lbc->bank[3].br = CFG_BR3_PRELIM; ++ lbc->bank[3].or = CFG_OR3_PRELIM; ++#endif ++#endif ++} ++ ++long int initdram(int board_type) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 msize = 0; ++#ifdef CONFIG_DDR_ECC ++ volatile ddr83xx_t *ddr = &im->ddr; ++#endif ++ ++ if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) ++ return -1; ++ ++ /* DDR SDRAM - Main SODIMM */ ++ im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR; ++#ifdef CONFIG_SPD_EEPROM ++ msize = spd_sdram(); ++#else ++ msize = fixed_sdram(); ++#endif ++ ++#ifdef CONFIG_DDR_ECC ++ if (ddr->sdram_cfg & SDRAM_CFG_ECC_EN) ++ /* Unlike every other board, on the 83xx spd_sdram() returns ++ megabytes instead of just bytes. That's why we need to ++ multiple by 1MB when calling ddr_enable_ecc(). */ ++ ddr_enable_ecc(msize * 1048576); ++#endif ++ ++ /* ++ * Initialize SDRAM if it is on local bus. ++ */ ++ sdram_init(); ++ puts(" DDR RAM: "); ++ /* return total bus SDRAM size(bytes) -- DDR */ ++ return msize * 1024 * 1024; ++} ++ ++int checkboard(void) ++{ ++ puts("Board: Freescale MPC8349E-mITX\n"); ++ ++ return 0; ++} ++ ++/* ++ * Implement a work-around for a hardware problem with compact ++ * flash. ++ * ++ * Program the UPM if compact flash is enabled. ++ */ ++int misc_init_f(void) ++{ ++ volatile u32 *vsc7385_cpuctrl; ++ ++ /* 0x1c0c0 is the VSC7385 CPU Control (CPUCTRL) Register. The power up ++ default of VSC7385 L1_IRQ and L2_IRQ requests are active high. That ++ means it is 0 when the IRQ is not active. This makes the wire-AND ++ logic always assert IRQ7 to CPU even if there is no request from the ++ switch. Since the compact flash and the switch share the same IRQ, ++ the Linux kernel will think that the compact flash is requesting irq ++ and get stuck when it tries to clear the IRQ. Thus we need to set ++ the L2_IRQ0 and L2_IRQ1 to active low. ++ ++ The following code sets the L1_IRQ and L2_IRQ polarity to active low. ++ Without this code, compact flash will not work in Linux because ++ unlike U-Boot, Linux uses the IRQ, so this code is necessary if we ++ don't enable compact flash for U-Boot. ++ */ ++ ++ vsc7385_cpuctrl = (volatile u32 *)(CFG_VSC7385_BASE + 0x1c0c0); ++ *vsc7385_cpuctrl |= 0x0c; ++ ++#ifdef CONFIG_COMPACT_FLASH ++ /* UPM Table Configuration Code */ ++ static uint UPMATable[] = { ++ 0xcffffc00, 0x0fffff00, 0x0fafff00, 0x0fafff00, ++ 0x0faffd00, 0x0faffc04, 0x0ffffc00, 0x3ffffc01, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfff7fc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, ++ 0xcffffc00, 0x0fffff00, 0x0ff3ff00, 0x0ff3ff00, ++ 0x0ff3fe00, 0x0ffffc00, 0x3ffffc05, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc00, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01, ++ 0xfffffc00, 0xfffffc00, 0xfffffc00, 0xfffffc01 ++ }; ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; ++ volatile lbus83xx_t *lbus = &immap->lbus; ++ ++ lbus->bank[3].br = CFG_BR3_PRELIM; ++ lbus->bank[3].or = CFG_OR3_PRELIM; ++ ++ /* Program the MAMR. RFEN=0, OP=00, UWPL=1, AM=000, DS=01, G0CL=000, ++ GPL4=0, RLF=0001, WLF=0001, TLF=0001, MAD=000000 ++ */ ++ lbus->mamr = 0x08404440; ++ ++ upmconfig(0, UPMATable, sizeof(UPMATable) / sizeof(UPMATable[0])); ++ ++ puts("UPMA: Configured for compact flash\n"); ++#endif ++ ++ return 0; ++} ++ ++/* ++ * Make sure the EEPROM has the HRCW correctly programmed. ++ * Make sure the RTC is correctly programmed. ++ * ++ * The MPC8349E-mITX can be configured to load the HRCW from ++ * EEPROM instead of flash. This is controlled via jumpers ++ * LGPL0, 1, and 3. Normally, these jumpers are set to 000 (all ++ * jumpered), but if they're set to 001 or 010, then the HRCW is ++ * read from the "I2C EEPROM". ++ * ++ * This function makes sure that the I2C EEPROM is programmed ++ * correctly. ++ */ ++int misc_init_r(void) ++{ ++ int rc = 0; ++ ++#ifdef CONFIG_HARD_I2C ++ ++ unsigned int orig_bus = i2c_get_bus_num();; ++ u8 i2c_data; ++ ++#ifdef CFG_I2C_RTC_ADDR ++ u8 ds1339_data[17]; ++#endif ++ ++#ifdef CFG_I2C_EEPROM_ADDR ++ static u8 eeprom_data[] = /* HRCW data */ ++ { ++ 0xaa, 0x55, 0xaa, ++ 0x7c, 0x02, 0x40, 0x05, 0x04, 0x00, 0x00, ++ 0x7c, 0x02, 0x41, 0xb4, 0x60, 0xa0, 0x00, ++ }; ++ ++ u8 data[sizeof(eeprom_data)]; ++#endif ++ ++ printf("Board revision: "); ++ i2c_set_bus_num(1); ++ if (i2c_read(CFG_I2C_8574A_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0) ++ printf("%u.%u (PCF8475A)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01); ++ else if (i2c_read(CFG_I2C_8574_ADDR2, 0, 0, &i2c_data, sizeof(i2c_data)) == 0) ++ printf("%u.%u (PCF8475)\n", (i2c_data & 0x02) >> 1, i2c_data & 0x01); ++ else { ++ printf("Unknown\n"); ++ rc = 1; ++ } ++ ++#ifdef CFG_I2C_EEPROM_ADDR ++ i2c_set_bus_num(0); ++ ++ if (i2c_read(CFG_I2C_EEPROM_ADDR, 0, 2, data, sizeof(data)) == 0) { ++ if (memcmp(data, eeprom_data, sizeof(data)) != 0) { ++ if (i2c_write ++ (CFG_I2C_EEPROM_ADDR, 0, 2, eeprom_data, ++ sizeof(eeprom_data)) != 0) { ++ puts("Failure writing the HRCW to EEPROM via I2C.\n"); ++ rc = 1; ++ } ++ } ++ } else { ++ puts("Failure reading the HRCW from EEPROM via I2C.\n"); ++ rc = 1; ++ } ++#endif ++ ++#ifdef CFG_I2C_RTC_ADDR ++ i2c_set_bus_num(1); ++ ++ if (i2c_read(CFG_I2C_RTC_ADDR, 0, 1, ds1339_data, sizeof(ds1339_data)) ++ == 0) { ++ ++ /* Work-around for MPC8349E-mITX bug #13601. ++ If the RTC does not contain valid register values, the DS1339 ++ Linux driver will not work. ++ */ ++ ++ /* Make sure status register bits 6-2 are zero */ ++ ds1339_data[0x0f] &= ~0x7c; ++ ++ /* Check for a valid day register value */ ++ ds1339_data[0x03] &= ~0xf8; ++ if (ds1339_data[0x03] == 0) { ++ ds1339_data[0x03] = 1; ++ } ++ ++ /* Check for a valid date register value */ ++ ds1339_data[0x04] &= ~0xc0; ++ if ((ds1339_data[0x04] == 0) || ++ ((ds1339_data[0x04] & 0x0f) > 9) || ++ (ds1339_data[0x04] >= 0x32)) { ++ ds1339_data[0x04] = 1; ++ } ++ ++ /* Check for a valid month register value */ ++ ds1339_data[0x05] &= ~0x60; ++ ++ if ((ds1339_data[0x05] == 0) || ++ ((ds1339_data[0x05] & 0x0f) > 9) || ++ ((ds1339_data[0x05] >= 0x13) ++ && (ds1339_data[0x05] <= 0x19))) { ++ ds1339_data[0x05] = 1; ++ } ++ ++ /* Enable Oscillator and rate select */ ++ ds1339_data[0x0e] = 0x1c; ++ ++ /* Work-around for MPC8349E-mITX bug #13330. ++ Ensure that the RTC control register contains the value 0x1c. ++ This affects SATA performance. ++ */ ++ ++ if (i2c_write ++ (CFG_I2C_RTC_ADDR, 0, 1, ds1339_data, ++ sizeof(ds1339_data))) { ++ puts("Failure writing to the RTC via I2C.\n"); ++ rc = 1; ++ } ++ } else { ++ puts("Failure reading from the RTC via I2C.\n"); ++ rc = 1; ++ } ++#endif ++ ++ i2c_set_bus_num(orig_bus); ++#endif ++ ++ return rc; ++} ++ ++#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) ++void ++ft_board_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++#ifdef CONFIG_PCI ++ ft_pci_setup(blob, bd); ++#endif ++ ft_cpu_setup(blob, bd); ++ ++ p = ft_get_prop(blob, "/memory/reg", &len); ++ if (p != NULL) { ++ *p++ = cpu_to_be32(bd->bi_memstart); ++ *p = cpu_to_be32(bd->bi_memsize); ++ } ++} ++#endif +diff -Naupr u-boot-1.1.6/board/mpc8349itx/pci.c u-boot-1.1.6-fsl-1/board/mpc8349itx/pci.c +--- u-boot-1.1.6/board/mpc8349itx/pci.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/pci.c 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,357 @@ ++/* ++ * Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include <common.h> ++ ++#ifdef CONFIG_PCI ++ ++#include <asm/mmu.h> ++#include <asm/global_data.h> ++#include <pci.h> ++#include <asm/mpc8349_pci.h> ++#include <i2c.h> ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++/* System RAM mapped to PCI space */ ++#define CONFIG_PCI_SYS_MEM_BUS CFG_SDRAM_BASE ++#define CONFIG_PCI_SYS_MEM_PHYS CFG_SDRAM_BASE ++ ++#ifndef CONFIG_PCI_PNP ++static struct pci_config_table pci_mpc8349itx_config_table[] = { ++ { ++ PCI_ANY_ID, ++ PCI_ANY_ID, ++ PCI_ANY_ID, ++ PCI_ANY_ID, ++ PCI_IDSEL_NUMBER, ++ PCI_ANY_ID, ++ pci_cfgfunc_config_device, ++ { ++ PCI_ENET0_IOADDR, ++ PCI_ENET0_MEMADDR, ++ PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER} ++ }, ++ {} ++}; ++#endif ++ ++static struct pci_controller pci_hose[] = { ++ { ++#ifndef CONFIG_PCI_PNP ++ config_table:pci_mpc8349itx_config_table, ++#endif ++ }, ++ { ++#ifndef CONFIG_PCI_PNP ++ config_table:pci_mpc8349itx_config_table, ++#endif ++ } ++}; ++ ++/************************************************************************** ++ * pci_init_board() ++ * ++ * NOTICE: PCI2 is not currently supported ++ * ++ */ ++void pci_init_board(void) ++{ ++ volatile immap_t *immr; ++ volatile clk83xx_t *clk; ++ volatile law83xx_t *pci_law; ++ volatile pot83xx_t *pci_pot; ++ volatile pcictrl83xx_t *pci_ctrl; ++ volatile pciconf83xx_t *pci_conf; ++ u8 reg8; ++ u16 reg16; ++ u32 reg32; ++ u32 dev; ++ struct pci_controller *hose; ++ ++ immr = (immap_t *) CFG_IMMR; ++ clk = (clk83xx_t *) & immr->clk; ++ pci_law = immr->sysconf.pcilaw; ++ pci_pot = immr->ios.pot; ++ pci_ctrl = immr->pci_ctrl; ++ pci_conf = immr->pci_conf; ++ ++ hose = &pci_hose[0]; ++ ++ /* ++ * Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode ++ */ ++ ++ reg32 = clk->occr; ++ udelay(2000); ++ ++#ifdef CONFIG_HARD_I2C ++ i2c_set_bus_num(1); ++ /* Read the PCI_M66EN jumper setting */ ++ if ((i2c_read(CFG_I2C_8574_ADDR2, 0, 0, ®8, sizeof(reg8)) == 0) || ++ (i2c_read(CFG_I2C_8574A_ADDR2, 0, 0, ®8, sizeof(reg8)) == 0)) { ++ if (reg8 & I2C_8574_PCI66) ++ clk->occr = 0xff000000; /* 66 MHz PCI */ ++ else ++ clk->occr = 0xff600001; /* 33 MHz PCI */ ++ } else { ++ clk->occr = 0xff600001; /* 33 MHz PCI */ ++ } ++#else ++ clk->occr = 0xff000000; /* 66 MHz PCI */ ++#endif ++ ++ udelay(2000); ++ ++ /* ++ * Release PCI RST Output signal ++ */ ++ pci_ctrl[0].gcr = 0; ++ udelay(2000); ++ pci_ctrl[0].gcr = 1; ++ ++#ifdef CONFIG_MPC83XX_PCI2 ++ pci_ctrl[1].gcr = 0; ++ udelay(2000); ++ pci_ctrl[1].gcr = 1; ++#endif ++ ++ /* We need to wait at least a 1sec based on PCI specs */ ++ { ++ int i; ++ ++ for (i = 0; i < 1000; i++) ++ udelay(1000); ++ } ++ ++ /* ++ * Configure PCI Local Access Windows ++ */ ++ pci_law[0].bar = CFG_PCI1_MEM_PHYS & LAWBAR_BAR; ++ pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_1G; ++ ++ pci_law[1].bar = CFG_PCI1_IO_PHYS & LAWBAR_BAR; ++ pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_32M; ++ ++ /* ++ * Configure PCI Outbound Translation Windows ++ */ ++ ++ /* PCI1 mem space - prefetch */ ++ pci_pot[0].potar = (CFG_PCI1_MEM_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[0].pobar = (CFG_PCI1_MEM_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[0].pocmr = POCMR_EN | POCMR_PREFETCH_EN | POCMR_CM_256M; ++ ++ /* PCI1 IO space */ ++ pci_pot[1].potar = (CFG_PCI1_IO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[1].pobar = (CFG_PCI1_IO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[1].pocmr = POCMR_EN | POCMR_IO | POCMR_CM_16M; ++ ++ /* PCI1 mmio - non-prefetch mem space */ ++ pci_pot[2].potar = (CFG_PCI1_MMIO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[2].pobar = (CFG_PCI1_MMIO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[2].pocmr = POCMR_EN | POCMR_CM_256M; ++ ++ /* ++ * Configure PCI Inbound Translation Windows ++ */ ++ ++ /* we need RAM mapped to PCI space for the devices to ++ * access main memory */ ++ pci_ctrl[0].pitar1 = 0x0; ++ pci_ctrl[0].pibar1 = 0x0; ++ pci_ctrl[0].piebar1 = 0x0; ++ pci_ctrl[0].piwar1 = PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | ++ PIWAR_WTT_SNOOP | (__ilog2(gd->ram_size) - 1); ++ ++ hose->first_busno = 0; ++ hose->last_busno = 0xff; ++ ++ /* PCI memory prefetch space */ ++ pci_set_region(hose->regions + 0, ++ CFG_PCI1_MEM_BASE, ++ CFG_PCI1_MEM_PHYS, ++ CFG_PCI1_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH); ++ ++ /* PCI memory space */ ++ pci_set_region(hose->regions + 1, ++ CFG_PCI1_MMIO_BASE, ++ CFG_PCI1_MMIO_PHYS, CFG_PCI1_MMIO_SIZE, PCI_REGION_MEM); ++ ++ /* PCI IO space */ ++ pci_set_region(hose->regions + 2, ++ CFG_PCI1_IO_BASE, ++ CFG_PCI1_IO_PHYS, CFG_PCI1_IO_SIZE, PCI_REGION_IO); ++ ++ /* System memory space */ ++ pci_set_region(hose->regions + 3, ++ CONFIG_PCI_SYS_MEM_BUS, ++ CONFIG_PCI_SYS_MEM_PHYS, ++ gd->ram_size, PCI_REGION_MEM | PCI_REGION_MEMORY); ++ ++ hose->region_count = 4; ++ ++ pci_setup_indirect(hose, ++ (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304)); ++ ++ pci_register_hose(hose); ++ ++ /* ++ * Write to Command register ++ */ ++ reg16 = 0xff; ++ dev = PCI_BDF(hose->first_busno, 0, 0); ++ pci_hose_read_config_word(hose, dev, PCI_COMMAND, ®16); ++ reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; ++ pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16); ++ ++ /* ++ * Clear non-reserved bits in status register. ++ */ ++ pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff); ++ pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80); ++ pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08); ++ ++#ifdef CONFIG_PCI_SCAN_SHOW ++ printf("PCI: Bus Dev VenId DevId Class Int\n"); ++#endif ++ /* ++ * Hose scan. ++ */ ++ hose->last_busno = pci_hose_scan(hose); ++ ++#ifdef CONFIG_MPC83XX_PCI2 ++ hose = &pci_hose[1]; ++ ++ /* ++ * Configure PCI Outbound Translation Windows ++ */ ++ ++ /* PCI2 mem space - prefetch */ ++ pci_pot[3].potar = (CFG_PCI2_MEM_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[3].pobar = (CFG_PCI2_MEM_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[3].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_PREFETCH_EN | POCMR_CM_256M; ++ ++ /* PCI2 IO space */ ++ pci_pot[4].potar = (CFG_PCI2_IO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[4].pobar = (CFG_PCI2_IO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[4].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_IO | POCMR_CM_16M; ++ ++ /* PCI2 mmio - non-prefetch mem space */ ++ pci_pot[5].potar = (CFG_PCI2_MMIO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[5].pobar = (CFG_PCI2_MMIO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[5].pocmr = POCMR_EN | POCMR_PCI2 | POCMR_CM_256M; ++ ++ /* ++ * Configure PCI Inbound Translation Windows ++ */ ++ ++ /* we need RAM mapped to PCI space for the devices to ++ * access main memory */ ++ pci_ctrl[1].pitar1 = 0x0; ++ pci_ctrl[1].pibar1 = 0x0; ++ pci_ctrl[1].piebar1 = 0x0; ++ pci_ctrl[1].piwar1 = ++ PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | ++ (__ilog2(gd->ram_size) - 1); ++ ++ hose->first_busno = pci_hose[0].last_busno + 1; ++ hose->last_busno = 0xff; ++ ++ /* PCI memory prefetch space */ ++ pci_set_region(hose->regions + 0, ++ CFG_PCI2_MEM_BASE, ++ CFG_PCI2_MEM_PHYS, ++ CFG_PCI2_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH); ++ ++ /* PCI memory space */ ++ pci_set_region(hose->regions + 1, ++ CFG_PCI2_MMIO_BASE, ++ CFG_PCI2_MMIO_PHYS, CFG_PCI2_MMIO_SIZE, PCI_REGION_MEM); ++ ++ /* PCI IO space */ ++ pci_set_region(hose->regions + 2, ++ CFG_PCI2_IO_BASE, ++ CFG_PCI2_IO_PHYS, CFG_PCI2_IO_SIZE, PCI_REGION_IO); ++ ++ /* System memory space */ ++ pci_set_region(hose->regions + 3, ++ CONFIG_PCI_SYS_MEM_BUS, ++ CONFIG_PCI_SYS_MEM_PHYS, ++ gd->ram_size, PCI_REGION_MEM | PCI_REGION_MEMORY); ++ ++ hose->region_count = 4; ++ ++ pci_setup_indirect(hose, ++ (CFG_IMMR + 0x8380), (CFG_IMMR + 0x8384)); ++ ++ pci_register_hose(hose); ++ ++ /* ++ * Write to Command register ++ */ ++ reg16 = 0xff; ++ dev = PCI_BDF(hose->first_busno, 0, 0); ++ pci_hose_read_config_word(hose, dev, PCI_COMMAND, ®16); ++ reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; ++ pci_hose_write_config_word(hose, dev, PCI_COMMAND, reg16); ++ ++ /* ++ * Clear non-reserved bits in status register. ++ */ ++ pci_hose_write_config_word(hose, dev, PCI_STATUS, 0xffff); ++ pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80); ++ pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08); ++ ++ /* ++ * Hose scan. ++ */ ++ hose->last_busno = pci_hose_scan(hose); ++#endif ++} ++ ++#endif /* CONFIG_PCI */ ++#ifdef CONFIG_OF_FLAT_TREE ++void ++ft_pci_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++ p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len); ++ if (p != NULL) { ++ p[0] = pci_hose[0].first_busno; ++ p[1] = pci_hose[0].last_busno; ++ } ++ ++#ifdef CONFIG_MPC83XX_PCI2 ++ p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8600/bus-range", &len); ++ if (p != NULL) { ++ p[0] = pci_hose[1].first_busno; ++ p[1] = pci_hose[1].last_busno; ++ } ++#endif ++} ++#endif /* CONFIG_OF_FLAT_TREE */ +diff -Naupr u-boot-1.1.6/board/mpc8349itx/u-boot.lds u-boot-1.1.6-fsl-1/board/mpc8349itx/u-boot.lds +--- u-boot-1.1.6/board/mpc8349itx/u-boot.lds 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8349itx/u-boot.lds 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,120 @@ ++/* ++ * Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++OUTPUT_ARCH(powerpc) ++SECTIONS ++{ ++ /* Read-only sections, merged into text segment: */ ++ . = + SIZEOF_HEADERS; ++ .interp : { *(.interp) } ++ .hash : { *(.hash) } ++ .dynsym : { *(.dynsym) } ++ .dynstr : { *(.dynstr) } ++ .rel.text : { *(.rel.text) } ++ .rela.text : { *(.rela.text) } ++ .rel.data : { *(.rel.data) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } ++ .rel.got : { *(.rel.got) } ++ .rela.got : { *(.rela.got) } ++ .rel.ctors : { *(.rel.ctors) } ++ .rela.ctors : { *(.rela.ctors) } ++ .rel.dtors : { *(.rel.dtors) } ++ .rela.dtors : { *(.rela.dtors) } ++ .rel.bss : { *(.rel.bss) } ++ .rela.bss : { *(.rela.bss) } ++ .rel.plt : { *(.rel.plt) } ++ .rela.plt : { *(.rela.plt) } ++ .init : { *(.init) } ++ .plt : { *(.plt) } ++ .text : ++ { ++ cpu/mpc83xx/start.o (.text) ++ *(.text) ++ *(.fixup) ++ *(.got1) ++ . = ALIGN(16); ++ *(.rodata) ++ *(.rodata1) ++ *(.rodata.str1.4) ++ } ++ .fini : { *(.fini) } =0 ++ .ctors : { *(.ctors) } ++ .dtors : { *(.dtors) } ++ ++ /* Read-write section, merged into data segment: */ ++ . = (. + 0x0FFF) & 0xFFFFF000; ++ _erotext = .; ++ PROVIDE (erotext = .); ++ .reloc : ++ { ++ *(.got) ++ _GOT2_TABLE_ = .; ++ *(.got2) ++ _FIXUP_TABLE_ = .; ++ *(.fixup) ++ } ++ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; ++ __fixup_entries = (. - _FIXUP_TABLE_) >> 2; ++ ++ .data : ++ { ++ *(.data) ++ *(.data1) ++ *(.sdata) ++ *(.sdata2) ++ *(.dynamic) ++ CONSTRUCTORS ++ } ++ _edata = .; ++ PROVIDE (edata = .); ++ ++ . = .; ++ __u_boot_cmd_start = .; ++ .u_boot_cmd : { *(.u_boot_cmd) } ++ __u_boot_cmd_end = .; ++ ++ . = .; ++ __start___ex_table = .; ++ __ex_table : { *(__ex_table) } ++ __stop___ex_table = .; ++ ++ . = ALIGN(4096); ++ __init_begin = .; ++ .text.init : { *(.text.init) } ++ .data.init : { *(.data.init) } ++ . = ALIGN(4096); ++ __init_end = .; ++ ++ __bss_start = .; ++ .bss : ++ { ++ *(.sbss) *(.scommon) ++ *(.dynbss) ++ *(.bss) ++ *(COMMON) ++ } ++ _end = . ; ++ PROVIDE (end = .); ++} ++ENTRY(_start) +diff -Naupr u-boot-1.1.6/board/mpc8360emds/config.mk u-boot-1.1.6-fsl-1/board/mpc8360emds/config.mk +--- u-boot-1.1.6/board/mpc8360emds/config.mk 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/config.mk 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,28 @@ ++# ++# (C) Copyright 2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++# ++# MPC8360EMDS ++# ++ ++TEXT_BASE = 0xFE000000 +diff -Naupr u-boot-1.1.6/board/mpc8360emds/Makefile u-boot-1.1.6-fsl-1/board/mpc8360emds/Makefile +--- u-boot-1.1.6/board/mpc8360emds/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/Makefile 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,50 @@ ++# ++# (C) Copyright 2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++include $(TOPDIR)/config.mk ++ ++LIB = $(obj)lib$(BOARD).a ++ ++COBJS := $(BOARD).o pci.o ++ ++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS)) ++SOBJS := $(addprefix $(obj),$(SOBJS)) ++ ++$(LIB): $(obj).depend $(OBJS) ++ $(AR) $(ARFLAGS) $@ $(OBJS) ++ ++clean: ++ rm -f $(SOBJS) $(OBJS) ++ ++distclean: clean ++ rm -f $(LIB) core *.bak .depend ++ ++######################################################################### ++ ++# defines $(obj).depend target ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +diff -Naupr u-boot-1.1.6/board/mpc8360emds/mpc8360emds.c u-boot-1.1.6-fsl-1/board/mpc8360emds/mpc8360emds.c +--- u-boot-1.1.6/board/mpc8360emds/mpc8360emds.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/mpc8360emds.c 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,657 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * based on board/mpc8349emds/mpc8349emds.c ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ */ ++ ++#include <common.h> ++#include <ioports.h> ++#include <mpc83xx.h> ++#include <i2c.h> ++#include <spd.h> ++#include <miiphy.h> ++#include <command.h> ++#if defined(CONFIG_PCI) ++#include <pci.h> ++#endif ++#if defined(CONFIG_SPD_EEPROM) ++#include <spd_sdram.h> ++#else ++#include <asm/mmu.h> ++#endif ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ ++const qe_iop_conf_t qe_iop_conf_tab[] = { ++ /* GETH1 */ ++ {0, 3, 1, 0, 1}, /* TxD0 */ ++ {0, 4, 1, 0, 1}, /* TxD1 */ ++ {0, 5, 1, 0, 1}, /* TxD2 */ ++ {0, 6, 1, 0, 1}, /* TxD3 */ ++ {1, 6, 1, 0, 3}, /* TxD4 */ ++ {1, 7, 1, 0, 1}, /* TxD5 */ ++ {1, 9, 1, 0, 2}, /* TxD6 */ ++ {1, 10, 1, 0, 2}, /* TxD7 */ ++ {0, 9, 2, 0, 1}, /* RxD0 */ ++ {0, 10, 2, 0, 1}, /* RxD1 */ ++ {0, 11, 2, 0, 1}, /* RxD2 */ ++ {0, 12, 2, 0, 1}, /* RxD3 */ ++ {0, 13, 2, 0, 1}, /* RxD4 */ ++ {1, 1, 2, 0, 2}, /* RxD5 */ ++ {1, 0, 2, 0, 2}, /* RxD6 */ ++ {1, 4, 2, 0, 2}, /* RxD7 */ ++ {0, 7, 1, 0, 1}, /* TX_EN */ ++ {0, 8, 1, 0, 1}, /* TX_ER */ ++ {0, 15, 2, 0, 1}, /* RX_DV */ ++ {0, 16, 2, 0, 1}, /* RX_ER */ ++ {0, 0, 2, 0, 1}, /* RX_CLK */ ++ {2, 9, 1, 0, 3}, /* GTX_CLK - CLK10 */ ++ {2, 8, 2, 0, 1}, /* GTX125 - CLK9 */ ++ /* GETH2 */ ++ {0, 17, 1, 0, 1}, /* TxD0 */ ++ {0, 18, 1, 0, 1}, /* TxD1 */ ++ {0, 19, 1, 0, 1}, /* TxD2 */ ++ {0, 20, 1, 0, 1}, /* TxD3 */ ++ {1, 2, 1, 0, 1}, /* TxD4 */ ++ {1, 3, 1, 0, 2}, /* TxD5 */ ++ {1, 5, 1, 0, 3}, /* TxD6 */ ++ {1, 8, 1, 0, 3}, /* TxD7 */ ++ {0, 23, 2, 0, 1}, /* RxD0 */ ++ {0, 24, 2, 0, 1}, /* RxD1 */ ++ {0, 25, 2, 0, 1}, /* RxD2 */ ++ {0, 26, 2, 0, 1}, /* RxD3 */ ++ {0, 27, 2, 0, 1}, /* RxD4 */ ++ {1, 12, 2, 0, 2}, /* RxD5 */ ++ {1, 13, 2, 0, 3}, /* RxD6 */ ++ {1, 11, 2, 0, 2}, /* RxD7 */ ++ {0, 21, 1, 0, 1}, /* TX_EN */ ++ {0, 22, 1, 0, 1}, /* TX_ER */ ++ {0, 29, 2, 0, 1}, /* RX_DV */ ++ {0, 30, 2, 0, 1}, /* RX_ER */ ++ {0, 31, 2, 0, 1}, /* RX_CLK */ ++ {2, 2, 1, 0, 2}, /* GTX_CLK = CLK10 */ ++ {2, 3, 2, 0, 1}, /* GTX125 - CLK4 */ ++ ++ {0, 1, 3, 0, 2}, /* MDIO */ ++ {0, 2, 1, 0, 1}, /* MDC */ ++ ++ {0, 0, 0, 0, QE_IOP_TAB_END}, /* END of table */ ++}; ++ ++int board_early_init_f(void) ++{ ++ volatile u8 *bcsr = (volatile u8 *)CFG_BCSR; ++ ++ /* Enable flash write */ ++ bcsr[0xa] &= ~0x04; ++ ++ return 0; ++} ++ ++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) ++extern void ddr_enable_ecc(unsigned int dram_size); ++#endif ++int fixed_sdram(void); ++void sdram_init(void); ++ ++long int initdram(int board_type) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 msize = 0; ++ ++ if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) ++ return -1; ++ ++ /* DDR SDRAM - Main SODIMM */ ++ im->sysconf.ddrlaw[0].bar = CFG_DDR_BASE & LAWBAR_BAR; ++#if defined(CONFIG_SPD_EEPROM) ++ msize = spd_sdram(); ++#else ++ msize = fixed_sdram(); ++#endif ++ ++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) ++ /* ++ * Initialize DDR ECC byte ++ */ ++ ddr_enable_ecc(msize * 1024 * 1024); ++#endif ++ /* ++ * Initialize SDRAM if it is on local bus. ++ */ ++ sdram_init(); ++ puts(" DDR RAM: "); ++ /* return total bus SDRAM size(bytes) -- DDR */ ++ return (msize * 1024 * 1024); ++} ++ ++#if !defined(CONFIG_SPD_EEPROM) ++/************************************************************************* ++ * fixed sdram init -- doesn't use serial presence detect. ++ ************************************************************************/ ++int fixed_sdram(void) ++{ ++ volatile immap_t *im = (immap_t *) CFG_IMMR; ++ u32 msize = 0; ++ u32 ddr_size; ++ u32 ddr_size_log2; ++ ++ msize = CFG_DDR_SIZE; ++ for (ddr_size = msize << 20, ddr_size_log2 = 0; ++ (ddr_size > 1); ddr_size = ddr_size >> 1, ddr_size_log2++) { ++ if (ddr_size & 1) { ++ return -1; ++ } ++ } ++ im->sysconf.ddrlaw[0].ar = ++ LAWAR_EN | ((ddr_size_log2 - 1) & LAWAR_SIZE); ++#if (CFG_DDR_SIZE != 256) ++#warning Currenly any ddr size other than 256 is not supported ++#endif ++ im->ddr.csbnds[0].csbnds = 0x00000007; ++ im->ddr.csbnds[1].csbnds = 0x0008000f; ++ ++ im->ddr.cs_config[0] = CFG_DDR_CONFIG; ++ im->ddr.cs_config[1] = CFG_DDR_CONFIG; ++ ++ im->ddr.timing_cfg_1 = CFG_DDR_TIMING_1; ++ im->ddr.timing_cfg_2 = CFG_DDR_TIMING_2; ++ im->ddr.sdram_cfg = CFG_DDR_CONTROL; ++ ++ im->ddr.sdram_mode = CFG_DDR_MODE; ++ im->ddr.sdram_interval = CFG_DDR_INTERVAL; ++ udelay(200); ++ im->ddr.sdram_cfg |= SDRAM_CFG_MEM_EN; ++ ++ return msize; ++} ++#endif /*!CFG_SPD_EEPROM */ ++ ++int checkboard(void) ++{ ++ puts("Board: Freescale MPC8360EMDS\n"); ++ return 0; ++} ++ ++/* ++ * if MPC8360EMDS is soldered with SDRAM ++ */ ++#if defined(CFG_BR2_PRELIM) \ ++ && defined(CFG_OR2_PRELIM) \ ++ && defined(CFG_LBLAWBAR2_PRELIM) \ ++ && defined(CFG_LBLAWAR2_PRELIM) ++/* ++ * Initialize SDRAM memory on the Local Bus. ++ */ ++ ++void sdram_init(void) ++{ ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; ++ volatile lbus83xx_t *lbc = &immap->lbus; ++ uint *sdram_addr = (uint *) CFG_LBC_SDRAM_BASE; ++ ++ puts("\n SDRAM on Local Bus: "); ++ print_size(CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); ++ /* ++ * Setup SDRAM Base and Option Registers, already done in cpu_init.c ++ */ ++ /*setup mtrpt, lsrt and lbcr for LB bus */ ++ lbc->lbcr = CFG_LBC_LBCR; ++ lbc->mrtpr = CFG_LBC_MRTPR; ++ lbc->lsrt = CFG_LBC_LSRT; ++ asm("sync"); ++ ++ /* ++ * Configure the SDRAM controller Machine Mode Register. ++ */ ++ lbc->lsdmr = CFG_LBC_LSDMR_5; /* Normal Operation */ ++ lbc->lsdmr = CFG_LBC_LSDMR_1; /* Precharge All Banks */ ++ asm("sync"); ++ *sdram_addr = 0xff; ++ udelay(100); ++ ++ /* ++ * We need do 8 times auto refresh operation. ++ */ ++ lbc->lsdmr = CFG_LBC_LSDMR_2; ++ asm("sync"); ++ *sdram_addr = 0xff; /* 1 times */ ++ udelay(100); ++ *sdram_addr = 0xff; /* 2 times */ ++ udelay(100); ++ *sdram_addr = 0xff; /* 3 times */ ++ udelay(100); ++ *sdram_addr = 0xff; /* 4 times */ ++ udelay(100); ++ *sdram_addr = 0xff; /* 5 times */ ++ udelay(100); ++ *sdram_addr = 0xff; /* 6 times */ ++ udelay(100); ++ *sdram_addr = 0xff; /* 7 times */ ++ udelay(100); ++ *sdram_addr = 0xff; /* 8 times */ ++ udelay(100); ++ ++ /* Mode register write operation */ ++ lbc->lsdmr = CFG_LBC_LSDMR_4; ++ asm("sync"); ++ *(sdram_addr + 0xcc) = 0xff; ++ udelay(100); ++ ++ /* Normal operation */ ++ lbc->lsdmr = CFG_LBC_LSDMR_5 | 0x40000000; ++ asm("sync"); ++ *sdram_addr = 0xff; ++ udelay(100); ++} ++#else ++void sdram_init(void) ++{ ++ puts("SDRAM on Local Bus is NOT available!\n"); ++} ++#endif ++ ++#if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD) ++/* ++ * ECC user commands ++ */ ++void ecc_print_status(void) ++{ ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; ++ volatile ddr83xx_t *ddr = &immap->ddr; ++ ++ printf("\nECC mode: %s\n\n", ++ (ddr->sdram_cfg & SDRAM_CFG_ECC_EN) ? "ON" : "OFF"); ++ ++ /* Interrupts */ ++ printf("Memory Error Interrupt Enable:\n"); ++ printf(" Multiple-Bit Error Interrupt Enable: %d\n", ++ (ddr->err_int_en & ECC_ERR_INT_EN_MBEE) ? 1 : 0); ++ printf(" Single-Bit Error Interrupt Enable: %d\n", ++ (ddr->err_int_en & ECC_ERR_INT_EN_SBEE) ? 1 : 0); ++ printf(" Memory Select Error Interrupt Enable: %d\n\n", ++ (ddr->err_int_en & ECC_ERR_INT_EN_MSEE) ? 1 : 0); ++ ++ /* Error disable */ ++ printf("Memory Error Disable:\n"); ++ printf(" Multiple-Bit Error Disable: %d\n", ++ (ddr->err_disable & ECC_ERROR_DISABLE_MBED) ? 1 : 0); ++ printf(" Sinle-Bit Error Disable: %d\n", ++ (ddr->err_disable & ECC_ERROR_DISABLE_SBED) ? 1 : 0); ++ printf(" Memory Select Error Disable: %d\n\n", ++ (ddr->err_disable & ECC_ERROR_DISABLE_MSED) ? 1 : 0); ++ ++ /* Error injection */ ++ printf("Memory Data Path Error Injection Mask High/Low: %08lx %08lx\n", ++ ddr->data_err_inject_hi, ddr->data_err_inject_lo); ++ ++ printf("Memory Data Path Error Injection Mask ECC:\n"); ++ printf(" ECC Mirror Byte: %d\n", ++ (ddr->ecc_err_inject & ECC_ERR_INJECT_EMB) ? 1 : 0); ++ printf(" ECC Injection Enable: %d\n", ++ (ddr->ecc_err_inject & ECC_ERR_INJECT_EIEN) ? 1 : 0); ++ printf(" ECC Error Injection Mask: 0x%02x\n\n", ++ ddr->ecc_err_inject & ECC_ERR_INJECT_EEIM); ++ ++ /* SBE counter/threshold */ ++ printf("Memory Single-Bit Error Management (0..255):\n"); ++ printf(" Single-Bit Error Threshold: %d\n", ++ (ddr->err_sbe & ECC_ERROR_MAN_SBET) >> ECC_ERROR_MAN_SBET_SHIFT); ++ printf(" Single-Bit Error Counter: %d\n\n", ++ (ddr->err_sbe & ECC_ERROR_MAN_SBEC) >> ECC_ERROR_MAN_SBEC_SHIFT); ++ ++ /* Error detect */ ++ printf("Memory Error Detect:\n"); ++ printf(" Multiple Memory Errors: %d\n", ++ (ddr->err_detect & ECC_ERROR_DETECT_MME) ? 1 : 0); ++ printf(" Multiple-Bit Error: %d\n", ++ (ddr->err_detect & ECC_ERROR_DETECT_MBE) ? 1 : 0); ++ printf(" Single-Bit Error: %d\n", ++ (ddr->err_detect & ECC_ERROR_DETECT_SBE) ? 1 : 0); ++ printf(" Memory Select Error: %d\n\n", ++ (ddr->err_detect & ECC_ERROR_DETECT_MSE) ? 1 : 0); ++ ++ /* Capture data */ ++ printf("Memory Error Address Capture: 0x%08lx\n", ddr->capture_address); ++ printf("Memory Data Path Read Capture High/Low: %08lx %08lx\n", ++ ddr->capture_data_hi, ddr->capture_data_lo); ++ printf("Memory Data Path Read Capture ECC: 0x%02x\n\n", ++ ddr->capture_ecc & CAPTURE_ECC_ECE); ++ ++ printf("Memory Error Attributes Capture:\n"); ++ printf(" Data Beat Number: %d\n", ++ (ddr->capture_attributes & ECC_CAPT_ATTR_BNUM) >> ++ ECC_CAPT_ATTR_BNUM_SHIFT); ++ printf(" Transaction Size: %d\n", ++ (ddr->capture_attributes & ECC_CAPT_ATTR_TSIZ) >> ++ ECC_CAPT_ATTR_TSIZ_SHIFT); ++ printf(" Transaction Source: %d\n", ++ (ddr->capture_attributes & ECC_CAPT_ATTR_TSRC) >> ++ ECC_CAPT_ATTR_TSRC_SHIFT); ++ printf(" Transaction Type: %d\n", ++ (ddr->capture_attributes & ECC_CAPT_ATTR_TTYP) >> ++ ECC_CAPT_ATTR_TTYP_SHIFT); ++ printf(" Error Information Valid: %d\n\n", ++ ddr->capture_attributes & ECC_CAPT_ATTR_VLD); ++} ++ ++int do_ecc(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ++{ ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; ++ volatile ddr83xx_t *ddr = &immap->ddr; ++ volatile u32 val; ++ u64 *addr; ++ u32 count; ++ register u64 *i; ++ u32 ret[2]; ++ u32 pattern[2]; ++ u32 writeback[2]; ++ ++ /* The pattern is written into memory to generate error */ ++ pattern[0] = 0xfedcba98UL; ++ pattern[1] = 0x76543210UL; ++ ++ /* After injecting error, re-initialize the memory with the value */ ++ writeback[0] = 0x01234567UL; ++ writeback[1] = 0x89abcdefUL; ++ ++ if (argc > 4) { ++ printf("Usage:\n%s\n", cmdtp->usage); ++ return 1; ++ } ++ ++ if (argc == 2) { ++ if (strcmp(argv[1], "status") == 0) { ++ ecc_print_status(); ++ return 0; ++ } else if (strcmp(argv[1], "captureclear") == 0) { ++ ddr->capture_address = 0; ++ ddr->capture_data_hi = 0; ++ ddr->capture_data_lo = 0; ++ ddr->capture_ecc = 0; ++ ddr->capture_attributes = 0; ++ return 0; ++ } ++ } ++ if (argc == 3) { ++ if (strcmp(argv[1], "sbecnt") == 0) { ++ val = simple_strtoul(argv[2], NULL, 10); ++ if (val > 255) { ++ printf("Incorrect Counter value, " ++ "should be 0..255\n"); ++ return 1; ++ } ++ ++ val = (val << ECC_ERROR_MAN_SBEC_SHIFT); ++ val |= (ddr->err_sbe & ECC_ERROR_MAN_SBET); ++ ++ ddr->err_sbe = val; ++ return 0; ++ } else if (strcmp(argv[1], "sbethr") == 0) { ++ val = simple_strtoul(argv[2], NULL, 10); ++ if (val > 255) { ++ printf("Incorrect Counter value, " ++ "should be 0..255\n"); ++ return 1; ++ } ++ ++ val = (val << ECC_ERROR_MAN_SBET_SHIFT); ++ val |= (ddr->err_sbe & ECC_ERROR_MAN_SBEC); ++ ++ ddr->err_sbe = val; ++ return 0; ++ } else if (strcmp(argv[1], "errdisable") == 0) { ++ val = ddr->err_disable; ++ ++ if (strcmp(argv[2], "+sbe") == 0) { ++ val |= ECC_ERROR_DISABLE_SBED; ++ } else if (strcmp(argv[2], "+mbe") == 0) { ++ val |= ECC_ERROR_DISABLE_MBED; ++ } else if (strcmp(argv[2], "+mse") == 0) { ++ val |= ECC_ERROR_DISABLE_MSED; ++ } else if (strcmp(argv[2], "+all") == 0) { ++ val |= (ECC_ERROR_DISABLE_SBED | ++ ECC_ERROR_DISABLE_MBED | ++ ECC_ERROR_DISABLE_MSED); ++ } else if (strcmp(argv[2], "-sbe") == 0) { ++ val &= ~ECC_ERROR_DISABLE_SBED; ++ } else if (strcmp(argv[2], "-mbe") == 0) { ++ val &= ~ECC_ERROR_DISABLE_MBED; ++ } else if (strcmp(argv[2], "-mse") == 0) { ++ val &= ~ECC_ERROR_DISABLE_MSED; ++ } else if (strcmp(argv[2], "-all") == 0) { ++ val &= ~(ECC_ERROR_DISABLE_SBED | ++ ECC_ERROR_DISABLE_MBED | ++ ECC_ERROR_DISABLE_MSED); ++ } else { ++ printf("Incorrect err_disable field\n"); ++ return 1; ++ } ++ ++ ddr->err_disable = val; ++ __asm__ __volatile__("sync"); ++ __asm__ __volatile__("isync"); ++ return 0; ++ } else if (strcmp(argv[1], "errdetectclr") == 0) { ++ val = ddr->err_detect; ++ ++ if (strcmp(argv[2], "mme") == 0) { ++ val |= ECC_ERROR_DETECT_MME; ++ } else if (strcmp(argv[2], "sbe") == 0) { ++ val |= ECC_ERROR_DETECT_SBE; ++ } else if (strcmp(argv[2], "mbe") == 0) { ++ val |= ECC_ERROR_DETECT_MBE; ++ } else if (strcmp(argv[2], "mse") == 0) { ++ val |= ECC_ERROR_DETECT_MSE; ++ } else if (strcmp(argv[2], "all") == 0) { ++ val |= (ECC_ERROR_DETECT_MME | ++ ECC_ERROR_DETECT_MBE | ++ ECC_ERROR_DETECT_SBE | ++ ECC_ERROR_DETECT_MSE); ++ } else { ++ printf("Incorrect err_detect field\n"); ++ return 1; ++ } ++ ++ ddr->err_detect = val; ++ return 0; ++ } else if (strcmp(argv[1], "injectdatahi") == 0) { ++ val = simple_strtoul(argv[2], NULL, 16); ++ ++ ddr->data_err_inject_hi = val; ++ return 0; ++ } else if (strcmp(argv[1], "injectdatalo") == 0) { ++ val = simple_strtoul(argv[2], NULL, 16); ++ ++ ddr->data_err_inject_lo = val; ++ return 0; ++ } else if (strcmp(argv[1], "injectecc") == 0) { ++ val = simple_strtoul(argv[2], NULL, 16); ++ if (val > 0xff) { ++ printf("Incorrect ECC inject mask, " ++ "should be 0x00..0xff\n"); ++ return 1; ++ } ++ val |= (ddr->ecc_err_inject & ~ECC_ERR_INJECT_EEIM); ++ ++ ddr->ecc_err_inject = val; ++ return 0; ++ } else if (strcmp(argv[1], "inject") == 0) { ++ val = ddr->ecc_err_inject; ++ ++ if (strcmp(argv[2], "en") == 0) ++ val |= ECC_ERR_INJECT_EIEN; ++ else if (strcmp(argv[2], "dis") == 0) ++ val &= ~ECC_ERR_INJECT_EIEN; ++ else ++ printf("Incorrect command\n"); ++ ++ ddr->ecc_err_inject = val; ++ __asm__ __volatile__("sync"); ++ __asm__ __volatile__("isync"); ++ return 0; ++ } else if (strcmp(argv[1], "mirror") == 0) { ++ val = ddr->ecc_err_inject; ++ ++ if (strcmp(argv[2], "en") == 0) ++ val |= ECC_ERR_INJECT_EMB; ++ else if (strcmp(argv[2], "dis") == 0) ++ val &= ~ECC_ERR_INJECT_EMB; ++ else ++ printf("Incorrect command\n"); ++ ++ ddr->ecc_err_inject = val; ++ return 0; ++ } ++ } ++ if (argc == 4) { ++ if (strcmp(argv[1], "testdw") == 0) { ++ addr = (u64 *) simple_strtoul(argv[2], NULL, 16); ++ count = simple_strtoul(argv[3], NULL, 16); ++ ++ if ((u32) addr % 8) { ++ printf("Address not alligned on " ++ "double word boundary\n"); ++ return 1; ++ } ++ disable_interrupts(); ++ ++ for (i = addr; i < addr + count; i++) { ++ ++ /* enable injects */ ++ ddr->ecc_err_inject |= ECC_ERR_INJECT_EIEN; ++ __asm__ __volatile__("sync"); ++ __asm__ __volatile__("isync"); ++ ++ /* write memory location injecting errors */ ++ ppcDWstore((u32 *) i, pattern); ++ __asm__ __volatile__("sync"); ++ ++ /* disable injects */ ++ ddr->ecc_err_inject &= ~ECC_ERR_INJECT_EIEN; ++ __asm__ __volatile__("sync"); ++ __asm__ __volatile__("isync"); ++ ++ /* read data, this generates ECC error */ ++ ppcDWload((u32 *) i, ret); ++ __asm__ __volatile__("sync"); ++ ++ /* re-initialize memory, double word write the location again, ++ * generates new ECC code this time */ ++ ppcDWstore((u32 *) i, writeback); ++ __asm__ __volatile__("sync"); ++ } ++ enable_interrupts(); ++ return 0; ++ } ++ if (strcmp(argv[1], "testword") == 0) { ++ addr = (u64 *) simple_strtoul(argv[2], NULL, 16); ++ count = simple_strtoul(argv[3], NULL, 16); ++ ++ if ((u32) addr % 8) { ++ printf("Address not alligned on " ++ "double word boundary\n"); ++ return 1; ++ } ++ disable_interrupts(); ++ ++ for (i = addr; i < addr + count; i++) { ++ ++ /* enable injects */ ++ ddr->ecc_err_inject |= ECC_ERR_INJECT_EIEN; ++ __asm__ __volatile__("sync"); ++ __asm__ __volatile__("isync"); ++ ++ /* write memory location injecting errors */ ++ *(u32 *) i = 0xfedcba98UL; ++ __asm__ __volatile__("sync"); ++ ++ /* sub double word write, ++ * bus will read-modify-write, ++ * generates ECC error */ ++ *((u32 *) i + 1) = 0x76543210UL; ++ __asm__ __volatile__("sync"); ++ ++ /* disable injects */ ++ ddr->ecc_err_inject &= ~ECC_ERR_INJECT_EIEN; ++ __asm__ __volatile__("sync"); ++ __asm__ __volatile__("isync"); ++ ++ /* re-initialize memory, ++ * double word write the location again, ++ * generates new ECC code this time */ ++ ppcDWstore((u32 *) i, writeback); ++ __asm__ __volatile__("sync"); ++ } ++ enable_interrupts(); ++ return 0; ++ } ++ } ++ printf("Usage:\n%s\n", cmdtp->usage); ++ return 1; ++} ++ ++U_BOOT_CMD(ecc, 4, 0, do_ecc, ++ "ecc - support for DDR ECC features\n", ++ "status - print out status info\n" ++ "ecc captureclear - clear capture regs data\n" ++ "ecc sbecnt <val> - set Single-Bit Error counter\n" ++ "ecc sbethr <val> - set Single-Bit Threshold\n" ++ "ecc errdisable <flag> - clear/set disable Memory Error Disable, flag:\n" ++ " [-|+]sbe - Single-Bit Error\n" ++ " [-|+]mbe - Multiple-Bit Error\n" ++ " [-|+]mse - Memory Select Error\n" ++ " [-|+]all - all errors\n" ++ "ecc errdetectclr <flag> - clear Memory Error Detect, flag:\n" ++ " mme - Multiple Memory Errors\n" ++ " sbe - Single-Bit Error\n" ++ " mbe - Multiple-Bit Error\n" ++ " mse - Memory Select Error\n" ++ " all - all errors\n" ++ "ecc injectdatahi <hi> - set Memory Data Path Error Injection Mask High\n" ++ "ecc injectdatalo <lo> - set Memory Data Path Error Injection Mask Low\n" ++ "ecc injectecc <ecc> - set ECC Error Injection Mask\n" ++ "ecc inject <en|dis> - enable/disable error injection\n" ++ "ecc mirror <en|dis> - enable/disable mirror byte\n" ++ "ecc testdw <addr> <cnt> - test mem region with double word access:\n" ++ " - enables injects\n" ++ " - writes pattern injecting errors with double word access\n" ++ " - disables injects\n" ++ " - reads pattern back with double word access, generates error\n" ++ " - re-inits memory\n" ++ "ecc testword <addr> <cnt> - test mem region with word access:\n" ++ " - enables injects\n" ++ " - writes pattern injecting errors with word access\n" ++ " - writes pattern with word access, generates error\n" ++ " - disables injects\n" " - re-inits memory"); ++#endif /* if defined(CONFIG_DDR_ECC) && defined(CONFIG_DDR_ECC_CMD) */ ++ ++#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP) ++void ++ft_board_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++#ifdef CONFIG_PCI ++ ft_pci_setup(blob, bd); ++#endif ++ ft_cpu_setup(blob, bd); ++ ++ p = ft_get_prop(blob, "/memory/reg", &len); ++ if (p != NULL) { ++ *p++ = cpu_to_be32(bd->bi_memstart); ++ *p = cpu_to_be32(bd->bi_memsize); ++ } ++} ++#endif +diff -Naupr u-boot-1.1.6/board/mpc8360emds/pci.c u-boot-1.1.6-fsl-1/board/mpc8360emds/pci.c +--- u-boot-1.1.6/board/mpc8360emds/pci.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/pci.c 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,313 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ */ ++ ++/* ++ * PCI Configuration space access support for MPC83xx PCI Bridge ++ */ ++#include <asm/mmu.h> ++#include <asm/io.h> ++#include <common.h> ++#include <pci.h> ++#include <i2c.h> ++ ++#include <asm/fsl_i2c.h> ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#if defined(CONFIG_PCI) ++#define PCI_FUNCTION_CONFIG 0x44 ++#define PCI_FUNCTION_CFG_LOCK 0x20 ++ ++/* ++ * Initialize PCI Devices, report devices found ++ */ ++#ifndef CONFIG_PCI_PNP ++static struct pci_config_table pci_mpc83xxemds_config_table[] = { ++ { ++ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, ++ pci_cfgfunc_config_device, ++ {PCI_ENET0_IOADDR, ++ PCI_ENET0_MEMADDR, ++ PCI_COMMON_MEMORY | PCI_COMMAND_MASTER} ++ }, ++ {} ++} ++#endif ++static struct pci_controller hose[] = { ++ { ++#ifndef CONFIG_PCI_PNP ++ config_table:pci_mpc83xxemds_config_table, ++#endif ++ }, ++}; ++ ++/********************************************************************** ++ * pci_init_board() ++ *********************************************************************/ ++void pci_init_board(void) ++#ifdef CONFIG_PCISLAVE ++{ ++ u16 reg16; ++ volatile immap_t *immr; ++ volatile law83xx_t *pci_law; ++ volatile pot83xx_t *pci_pot; ++ volatile pcictrl83xx_t *pci_ctrl; ++ volatile pciconf83xx_t *pci_conf; ++ ++ immr = (immap_t *) CFG_IMMR; ++ pci_law = immr->sysconf.pcilaw; ++ pci_pot = immr->ios.pot; ++ pci_ctrl = immr->pci_ctrl; ++ pci_conf = immr->pci_conf; ++ /* ++ * Configure PCI Inbound Translation Windows ++ */ ++ pci_ctrl[0].pitar0 = 0x0; ++ pci_ctrl[0].pibar0 = 0x0; ++ pci_ctrl[0].piwar0 = PIWAR_EN | PIWAR_RTT_SNOOP | ++ PIWAR_WTT_SNOOP | PIWAR_IWS_4K; ++ ++ pci_ctrl[0].pitar1 = 0x0; ++ pci_ctrl[0].pibar1 = 0x0; ++ pci_ctrl[0].piebar1 = 0x0; ++ pci_ctrl[0].piwar1 &= ~PIWAR_EN; ++ ++ pci_ctrl[0].pitar2 = 0x0; ++ pci_ctrl[0].pibar2 = 0x0; ++ pci_ctrl[0].piebar2 = 0x0; ++ pci_ctrl[0].piwar2 &= ~PIWAR_EN; ++ ++ hose[0].first_busno = 0; ++ hose[0].last_busno = 0xff; ++ pci_setup_indirect(&hose[0], ++ (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304)); ++ reg16 = 0xff; ++ ++ pci_hose_read_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_COMMAND, ®16); ++ reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MEMORY; ++ pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_COMMAND, reg16); ++ ++ /* ++ * Clear non-reserved bits in status register. ++ */ ++ pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_STATUS, 0xffff); ++ pci_hose_write_config_byte(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_LATENCY_TIMER, 0x80); ++ ++ /* ++ * Unlock configuration lock in PCI function configuration register. ++ */ ++ pci_hose_read_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_FUNCTION_CONFIG, ®16); ++ reg16 &= ~(PCI_FUNCTION_CFG_LOCK); ++ pci_hose_write_config_word(&hose[0], PCI_BDF(0, 0, 0), ++ PCI_FUNCTION_CONFIG, reg16); ++ ++ printf("Enabled PCI 32bit Agent Mode\n"); ++} ++#else ++{ ++ volatile immap_t *immr; ++ volatile clk83xx_t *clk; ++ volatile law83xx_t *pci_law; ++ volatile pot83xx_t *pci_pot; ++ volatile pcictrl83xx_t *pci_ctrl; ++ volatile pciconf83xx_t *pci_conf; ++ ++ u8 val8, orig_i2c_bus; ++ u16 reg16; ++ u32 val32; ++ u32 dev; ++ ++ immr = (immap_t *) CFG_IMMR; ++ clk = (clk83xx_t *) & immr->clk; ++ pci_law = immr->sysconf.pcilaw; ++ pci_pot = immr->ios.pot; ++ pci_ctrl = immr->pci_ctrl; ++ pci_conf = immr->pci_conf; ++ /* ++ * Configure PCI controller and PCI_CLK_OUTPUT both in 66M mode ++ */ ++ val32 = clk->occr; ++ udelay(2000); ++#if defined(PCI_66M) ++ clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2; ++ printf("PCI clock is 66MHz\n"); ++#elif defined(PCI_33M) ++ clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2 | ++ OCCR_PCICD0 | OCCR_PCICD1 | OCCR_PCICD2 | OCCR_PCICR; ++ printf("PCI clock is 33MHz\n"); ++#else ++ clk->occr = OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2; ++ printf("PCI clock is 66MHz\n"); ++#endif ++ udelay(2000); ++ ++ /* ++ * Configure PCI Local Access Windows ++ */ ++ pci_law[0].bar = CFG_PCI_MEM_PHYS & LAWBAR_BAR; ++ pci_law[0].ar = LAWAR_EN | LAWAR_SIZE_512M; ++ ++ pci_law[1].bar = CFG_PCI_IO_PHYS & LAWBAR_BAR; ++ pci_law[1].ar = LAWAR_EN | LAWAR_SIZE_1M; ++ ++ /* ++ * Configure PCI Outbound Translation Windows ++ */ ++ ++ /* PCI mem space - prefetch */ ++ pci_pot[0].potar = (CFG_PCI_MEM_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[0].pobar = (CFG_PCI_MEM_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[0].pocmr = ++ POCMR_EN | POCMR_SE | (POCMR_CM_256M & POCMR_CM_MASK); ++ ++ /* PCI mmio - non-prefetch mem space */ ++ pci_pot[1].potar = (CFG_PCI_MMIO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[1].pobar = (CFG_PCI_MMIO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[1].pocmr = POCMR_EN | (POCMR_CM_256M & POCMR_CM_MASK); ++ ++ /* PCI IO space */ ++ pci_pot[2].potar = (CFG_PCI_IO_BASE >> 12) & POTAR_TA_MASK; ++ pci_pot[2].pobar = (CFG_PCI_IO_PHYS >> 12) & POBAR_BA_MASK; ++ pci_pot[2].pocmr = POCMR_EN | POCMR_IO | (POCMR_CM_1M & POCMR_CM_MASK); ++ ++ /* ++ * Configure PCI Inbound Translation Windows ++ */ ++ pci_ctrl[0].pitar1 = (CFG_PCI_SLV_MEM_LOCAL >> 12) & PITAR_TA_MASK; ++ pci_ctrl[0].pibar1 = (CFG_PCI_SLV_MEM_BUS >> 12) & PIBAR_MASK; ++ pci_ctrl[0].piebar1 = 0x0; ++ pci_ctrl[0].piwar1 = ++ PIWAR_EN | PIWAR_PF | PIWAR_RTT_SNOOP | PIWAR_WTT_SNOOP | ++ PIWAR_IWS_2G; ++ ++ /* ++ * Assign PIB PMC slot to desired PCI bus ++ */ ++ ++ /* Switch temporarily to I2C bus #2 */ ++ orig_i2c_bus = i2c_get_bus_num(); ++ i2c_set_bus_num(1); ++ ++ val8 = 0; ++ i2c_write(0x23, 0x6, 1, &val8, 1); ++ i2c_write(0x23, 0x7, 1, &val8, 1); ++ val8 = 0xff; ++ i2c_write(0x23, 0x2, 1, &val8, 1); ++ i2c_write(0x23, 0x3, 1, &val8, 1); ++ ++ val8 = 0; ++ i2c_write(0x26, 0x6, 1, &val8, 1); ++ val8 = 0x34; ++ i2c_write(0x26, 0x7, 1, &val8, 1); ++ ++ val8 = 0xf3; /*PMC1, PMC2, PMC3 slot to PCI bus */ ++ i2c_write(0x26, 0x2, 1, &val8, 1); ++ val8 = 0xff; ++ i2c_write(0x26, 0x3, 1, &val8, 1); ++ ++ val8 = 0; ++ i2c_write(0x27, 0x6, 1, &val8, 1); ++ i2c_write(0x27, 0x7, 1, &val8, 1); ++ val8 = 0xff; ++ i2c_write(0x27, 0x2, 1, &val8, 1); ++ val8 = 0xef; ++ i2c_write(0x27, 0x3, 1, &val8, 1); ++ asm("eieio"); ++ ++ /* Reset to original I2C bus */ ++ i2c_set_bus_num(orig_i2c_bus); ++ ++ /* ++ * Release PCI RST Output signal ++ */ ++ udelay(2000); ++ pci_ctrl[0].gcr = 1; ++ udelay(2000); ++ ++ hose[0].first_busno = 0; ++ hose[0].last_busno = 0xff; ++ ++ /* PCI memory prefetch space */ ++ pci_set_region(hose[0].regions + 0, ++ CFG_PCI_MEM_BASE, ++ CFG_PCI_MEM_PHYS, ++ CFG_PCI_MEM_SIZE, PCI_REGION_MEM | PCI_REGION_PREFETCH); ++ ++ /* PCI memory space */ ++ pci_set_region(hose[0].regions + 1, ++ CFG_PCI_MMIO_BASE, ++ CFG_PCI_MMIO_PHYS, CFG_PCI_MMIO_SIZE, PCI_REGION_MEM); ++ ++ /* PCI IO space */ ++ pci_set_region(hose[0].regions + 2, ++ CFG_PCI_IO_BASE, ++ CFG_PCI_IO_PHYS, CFG_PCI_IO_SIZE, PCI_REGION_IO); ++ ++ /* System memory space */ ++ pci_set_region(hose[0].regions + 3, ++ CFG_PCI_SLV_MEM_LOCAL, ++ CFG_PCI_SLV_MEM_BUS, ++ CFG_PCI_SLV_MEM_SIZE, ++ PCI_REGION_MEM | PCI_REGION_MEMORY); ++ ++ hose[0].region_count = 4; ++ ++ pci_setup_indirect(&hose[0], ++ (CFG_IMMR + 0x8300), (CFG_IMMR + 0x8304)); ++ ++ pci_register_hose(hose); ++ ++ /* ++ * Write command register ++ */ ++ reg16 = 0xff; ++ dev = PCI_BDF(0, 0, 0); ++ pci_hose_read_config_word(&hose[0], dev, PCI_COMMAND, ®16); ++ reg16 |= PCI_COMMAND_SERR | PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; ++ pci_hose_write_config_word(&hose[0], dev, PCI_COMMAND, reg16); ++ ++ /* ++ * Clear non-reserved bits in status register. ++ */ ++ pci_hose_write_config_word(&hose[0], dev, PCI_STATUS, 0xffff); ++ pci_hose_write_config_byte(&hose[0], dev, PCI_LATENCY_TIMER, 0x80); ++ pci_hose_write_config_byte(&hose[0], dev, PCI_CACHE_LINE_SIZE, 0x08); ++ ++ printf("PCI 32bit bus on PMC1 & PMC2 & PMC3\n"); ++ ++ /* ++ * Hose scan. ++ */ ++ hose->last_busno = pci_hose_scan(hose); ++} ++#endif /* CONFIG_PCISLAVE */ ++ ++#ifdef CONFIG_OF_FLAT_TREE ++void ++ft_pci_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++ p = (u32 *)ft_get_prop(blob, "/" OF_SOC "/pci@8500/bus-range", &len); ++ if (p != NULL) { ++ p[0] = hose[0].first_busno; ++ p[1] = hose[0].last_busno; ++ } ++} ++#endif /* CONFIG_OF_FLAT_TREE */ ++#endif /* CONFIG_PCI */ +diff -Naupr u-boot-1.1.6/board/mpc8360emds/u-boot.lds u-boot-1.1.6-fsl-1/board/mpc8360emds/u-boot.lds +--- u-boot-1.1.6/board/mpc8360emds/u-boot.lds 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/mpc8360emds/u-boot.lds 2006-11-10 11:24:28.000000000 -0600 +@@ -0,0 +1,123 @@ ++/* ++ * (C) Copyright 2006 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++OUTPUT_ARCH(powerpc) ++SECTIONS ++{ ++ /* Read-only sections, merged into text segment: */ ++ . = + SIZEOF_HEADERS; ++ .interp : { *(.interp) } ++ .hash : { *(.hash) } ++ .dynsym : { *(.dynsym) } ++ .dynstr : { *(.dynstr) } ++ .rel.text : { *(.rel.text) } ++ .rela.text : { *(.rela.text) } ++ .rel.data : { *(.rel.data) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } ++ .rel.got : { *(.rel.got) } ++ .rela.got : { *(.rela.got) } ++ .rel.ctors : { *(.rel.ctors) } ++ .rela.ctors : { *(.rela.ctors) } ++ .rel.dtors : { *(.rel.dtors) } ++ .rela.dtors : { *(.rela.dtors) } ++ .rel.bss : { *(.rel.bss) } ++ .rela.bss : { *(.rela.bss) } ++ .rel.plt : { *(.rel.plt) } ++ .rela.plt : { *(.rela.plt) } ++ .init : { *(.init) } ++ .plt : { *(.plt) } ++ .text : ++ { ++ cpu/mpc83xx/start.o (.text) ++ *(.text) ++ *(.fixup) ++ *(.got1) ++ . = ALIGN(16); ++ *(.rodata) ++ *(.rodata1) ++ *(.rodata.str1.4) ++ *(.eh_frame) ++ } ++ .fini : { *(.fini) } =0 ++ .ctors : { *(.ctors) } ++ .dtors : { *(.dtors) } ++ ++ /* Read-write section, merged into data segment: */ ++ . = (. + 0x0FFF) & 0xFFFFF000; ++ _erotext = .; ++ PROVIDE (erotext = .); ++ .reloc : ++ { ++ *(.got) ++ _GOT2_TABLE_ = .; ++ *(.got2) ++ _FIXUP_TABLE_ = .; ++ *(.fixup) ++ } ++ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; ++ __fixup_entries = (. - _FIXUP_TABLE_) >> 2; ++ ++ .data : ++ { ++ *(.data) ++ *(.data1) ++ *(.sdata) ++ *(.sdata2) ++ *(.dynamic) ++ CONSTRUCTORS ++ } ++ _edata = .; ++ PROVIDE (edata = .); ++ ++ . = .; ++ __u_boot_cmd_start = .; ++ .u_boot_cmd : { *(.u_boot_cmd) } ++ __u_boot_cmd_end = .; ++ ++ ++ . = .; ++ __start___ex_table = .; ++ __ex_table : { *(__ex_table) } ++ __stop___ex_table = .; ++ ++ . = ALIGN(4096); ++ __init_begin = .; ++ .text.init : { *(.text.init) } ++ .data.init : { *(.data.init) } ++ . = ALIGN(4096); ++ __init_end = .; ++ ++ __bss_start = .; ++ .bss : ++ { ++ *(.sbss) *(.scommon) ++ *(.dynbss) ++ *(.bss) ++ *(COMMON) ++ } ++ _end = . ; ++ PROVIDE (end = .); ++} ++ENTRY(_start) +diff -Naupr u-boot-1.1.6/board/prodrive/alpr/alpr.c u-boot-1.1.6-fsl-1/board/prodrive/alpr/alpr.c +--- u-boot-1.1.6/board/prodrive/alpr/alpr.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/alpr.c 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,328 @@ ++/* ++ * (C) Copyright 2006 ++ * Stefan Roese, DENX Software Engineering, sr@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++ ++#include <common.h> ++#include <asm/processor.h> ++#include <spd_sdram.h> ++#include <ppc4xx_enet.h> ++#include <miiphy.h> ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++extern int alpr_fpga_init(void); ++ ++int board_early_init_f (void) ++{ ++ /*------------------------------------------------------------------------- ++ * Initialize EBC CONFIG ++ *-------------------------------------------------------------------------*/ ++ mtebc(xbcfg, EBC_CFG_LE_UNLOCK | ++ EBC_CFG_PTD_DISABLE | EBC_CFG_RTC_64PERCLK | ++ EBC_CFG_ATC_PREVIOUS | EBC_CFG_DTC_PREVIOUS | ++ EBC_CFG_CTC_PREVIOUS | EBC_CFG_EMC_NONDEFAULT | ++ EBC_CFG_PME_DISABLE | EBC_CFG_PR_32); ++ ++ /*-------------------------------------------------------------------- ++ * Setup the interrupt controller polarities, triggers, etc. ++ *-------------------------------------------------------------------*/ ++ mtdcr (uic0sr, 0xffffffff); /* clear all */ ++ mtdcr (uic0er, 0x00000000); /* disable all */ ++ mtdcr (uic0cr, 0x00000009); /* SMI & UIC1 crit are critical */ ++ mtdcr (uic0pr, 0xfffffe03); /* per manual */ ++ mtdcr (uic0tr, 0x01c00000); /* per manual */ ++ mtdcr (uic0vr, 0x00000001); /* int31 highest, base=0x000 */ ++ mtdcr (uic0sr, 0xffffffff); /* clear all */ ++ ++ mtdcr (uic1sr, 0xffffffff); /* clear all */ ++ mtdcr (uic1er, 0x00000000); /* disable all */ ++ mtdcr (uic1cr, 0x00000000); /* all non-critical */ ++ mtdcr (uic1pr, 0xffffe0ff); /* per ref-board manual */ ++ mtdcr (uic1tr, 0x00ffc000); /* per ref-board manual */ ++ mtdcr (uic1vr, 0x00000001); /* int31 highest, base=0x000 */ ++ mtdcr (uic1sr, 0xffffffff); /* clear all */ ++ ++ mtdcr (uic2sr, 0xffffffff); /* clear all */ ++ mtdcr (uic2er, 0x00000000); /* disable all */ ++ mtdcr (uic2cr, 0x00000000); /* all non-critical */ ++ mtdcr (uic2pr, 0xffffffff); /* per ref-board manual */ ++ mtdcr (uic2tr, 0x00ff8c0f); /* per ref-board manual */ ++ mtdcr (uic2vr, 0x00000001); /* int31 highest, base=0x000 */ ++ mtdcr (uic2sr, 0xffffffff); /* clear all */ ++ ++ mtdcr (uicb0sr, 0xfc000000); /* clear all */ ++ mtdcr (uicb0er, 0x00000000); /* disable all */ ++ mtdcr (uicb0cr, 0x00000000); /* all non-critical */ ++ mtdcr (uicb0pr, 0xfc000000); /* */ ++ mtdcr (uicb0tr, 0x00000000); /* */ ++ mtdcr (uicb0vr, 0x00000001); /* */ ++ ++ /* Setup GPIO/IRQ multiplexing */ ++ mtsdr(sdr_pfc0, 0x01a03e00); ++ ++ return 0; ++} ++ ++int last_stage_init(void) ++{ ++ unsigned short reg; ++ ++ /* ++ * Configure LED's of both Marvell 88E1111 PHY's ++ * ++ * This has to be done after the 4xx ethernet driver is loaded, ++ * so "last_stage_init()" is the right place. ++ */ ++ miiphy_read("ppc_4xx_eth2", CONFIG_PHY2_ADDR, 0x18, ®); ++ reg |= 0x0001; ++ miiphy_write("ppc_4xx_eth2", CONFIG_PHY2_ADDR, 0x18, reg); ++ miiphy_read("ppc_4xx_eth3", CONFIG_PHY3_ADDR, 0x18, ®); ++ reg |= 0x0001; ++ miiphy_write("ppc_4xx_eth3", CONFIG_PHY3_ADDR, 0x18, reg); ++ ++ return 0; ++} ++ ++static int board_rev(void) ++{ ++ int rev; ++ u32 pfc0; ++ ++ /* Setup GPIO14 & 15 as GPIO */ ++ mfsdr(sdr_pfc0, pfc0); ++ pfc0 |= CFG_GPIO_REV0 | CFG_GPIO_REV1; ++ mtsdr(sdr_pfc0, pfc0); ++ ++ /* Setup as input */ ++ out32(GPIO0_TCR, in32(GPIO0_TCR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV0)); ++ out32(GPIO0_ODR, in32(GPIO0_ODR) & ~(CFG_GPIO_REV0 | CFG_GPIO_REV0)); ++ ++ rev = (in32(GPIO0_IR) >> 16) & 0x3; ++ ++ /* Setup GPIO14 & 15 as non GPIO again */ ++ mfsdr(sdr_pfc0, pfc0); ++ pfc0 &= ~(CFG_GPIO_REV0 | CFG_GPIO_REV1); ++ mtsdr(sdr_pfc0, pfc0); ++ ++ return rev; ++} ++ ++int checkboard (void) ++{ ++ char *s = getenv ("serial#"); ++ ++ printf ("Board: ALPR"); ++ if (s != NULL) { ++ puts (", serial# "); ++ puts (s); ++ } ++ printf(" (Rev. %d)\n", board_rev()); ++ ++ return (0); ++} ++ ++#if defined(CFG_DRAM_TEST) ++int testdram (void) ++{ ++ uint *pstart = (uint *) 0x00000000; ++ uint *pend = (uint *) 0x08000000; ++ uint *p; ++ ++ for (p = pstart; p < pend; p++) ++ *p = 0xaaaaaaaa; ++ ++ for (p = pstart; p < pend; p++) { ++ if (*p != 0xaaaaaaaa) { ++ printf ("SDRAM test fails at: %08x\n", (uint) p); ++ return 1; ++ } ++ } ++ ++ for (p = pstart; p < pend; p++) ++ *p = 0x55555555; ++ ++ for (p = pstart; p < pend; p++) { ++ if (*p != 0x55555555) { ++ printf ("SDRAM test fails at: %08x\n", (uint) p); ++ return 1; ++ } ++ } ++ return 0; ++} ++#endif ++ ++/************************************************************************* ++ * pci_pre_init ++ * ++ * This routine is called just prior to registering the hose and gives ++ * the board the opportunity to check things. Returning a value of zero ++ * indicates that things are bad & PCI initialization should be aborted. ++ * ++ * Different boards may wish to customize the pci controller structure ++ * (add regions, override default access routines, etc) or perform ++ * certain pre-initialization actions. ++ * ++ ************************************************************************/ ++#if defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT) ++int pci_pre_init(struct pci_controller * hose ) ++{ ++ unsigned long strap; ++ ++ /*--------------------------------------------------------------------------+ ++ * The ocotea board is always configured as the host & requires the ++ * PCI arbiter to be enabled. ++ *--------------------------------------------------------------------------*/ ++ mfsdr(sdr_sdstp1, strap); ++ if( (strap & SDR0_SDSTP1_PAE_MASK) == 0 ){ ++ printf("PCI: SDR0_STRP1[%08lX] - PCI Arbiter disabled.\n",strap); ++ return 0; ++ } ++ ++ /* FPGA Init */ ++ alpr_fpga_init (); ++ ++ return 1; ++} ++#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT) */ ++ ++/************************************************************************* ++ * pci_target_init ++ * ++ * The bootstrap configuration provides default settings for the pci ++ * inbound map (PIM). But the bootstrap config choices are limited and ++ * may not be sufficient for a given board. ++ * ++ ************************************************************************/ ++#if defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) ++void pci_target_init(struct pci_controller * hose ) ++{ ++ /*--------------------------------------------------------------------------+ ++ * Disable everything ++ *--------------------------------------------------------------------------*/ ++ out32r( PCIX0_PIM0SA, 0 ); /* disable */ ++ out32r( PCIX0_PIM1SA, 0 ); /* disable */ ++ out32r( PCIX0_PIM2SA, 0 ); /* disable */ ++ out32r( PCIX0_EROMBA, 0 ); /* disable expansion rom */ ++ ++ /*--------------------------------------------------------------------------+ ++ * Map all of SDRAM to PCI address 0x0000_0000. Note that the 440 strapping ++ * options to not support sizes such as 128/256 MB. ++ *--------------------------------------------------------------------------*/ ++ out32r( PCIX0_PIM0LAL, CFG_SDRAM_BASE ); ++ out32r( PCIX0_PIM0LAH, 0 ); ++ out32r( PCIX0_PIM0SA, ~(gd->ram_size - 1) | 1 ); ++ ++ out32r( PCIX0_BAR0, 0 ); ++ ++ /*--------------------------------------------------------------------------+ ++ * Program the board's subsystem id/vendor id ++ *--------------------------------------------------------------------------*/ ++ out16r( PCIX0_SBSYSVID, CFG_PCI_SUBSYS_VENDORID ); ++ out16r( PCIX0_SBSYSID, CFG_PCI_SUBSYS_DEVICEID ); ++ ++ out16r( PCIX0_CMD, in16r(PCIX0_CMD) | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); ++} ++#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) */ ++ ++/************************************************************************* ++ * is_pci_host ++ * ++ * This routine is called to determine if a pci scan should be ++ * performed. With various hardware environments (especially cPCI and ++ * PPMC) it's insufficient to depend on the state of the arbiter enable ++ * bit in the strap register, or generic host/adapter assumptions. ++ * ++ * Rather than hard-code a bad assumption in the general 440 code, the ++ * 440 pci code requires the board to decide at runtime. ++ * ++ * Return 0 for adapter mode, non-zero for host (monarch) mode. ++ * ++ * ++ ************************************************************************/ ++#if defined(CONFIG_PCI) ++ ++static void wait_for_pci_ready(void) ++{ ++ /* ++ * Configure EREADY as input ++ */ ++ out32(GPIO0_TCR, in32(GPIO0_TCR) & ~CFG_GPIO_EREADY); ++ udelay(1000); ++ ++ for (;;) { ++ if (in32(GPIO0_IR) & CFG_GPIO_EREADY) ++ return; ++ } ++ ++} ++ ++int is_pci_host(struct pci_controller *hose) ++{ ++ wait_for_pci_ready(); ++ return 1; /* return 1 for host controller */ ++} ++#endif /* defined(CONFIG_PCI) */ ++ ++/************************************************************************* ++ * pci_master_init ++ * ++ ************************************************************************/ ++#if defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT) ++void pci_master_init(struct pci_controller *hose) ++{ ++ /*--------------------------------------------------------------------------+ ++ | PowerPC440 PCI Master configuration. ++ | Map PLB/processor addresses to PCI memory space. ++ | PLB address 0xA0000000-0xCFFFFFFF ==> PCI address 0x80000000-0xCFFFFFFF ++ | Use byte reversed out routines to handle endianess. ++ | Make this region non-prefetchable. ++ +--------------------------------------------------------------------------*/ ++ out32r( PCIX0_POM0SA, 0 ); /* disable */ ++ out32r( PCIX0_POM1SA, 0 ); /* disable */ ++ out32r( PCIX0_POM2SA, 0 ); /* disable */ ++ ++ out32r(PCIX0_POM0LAL, CFG_PCI_MEMBASE); /* PMM0 Local Address */ ++ out32r(PCIX0_POM0LAH, 0x00000003); /* PMM0 Local Address */ ++ out32r(PCIX0_POM0PCIAL, CFG_PCI_MEMBASE); /* PMM0 PCI Low Address */ ++ out32r(PCIX0_POM0PCIAH, 0x00000000); /* PMM0 PCI High Address */ ++ out32r(PCIX0_POM0SA, ~(0x10000000 - 1) | 1); /* 256MB + enable region */ ++ ++ out32r(PCIX0_POM1LAL, CFG_PCI_MEMBASE2); /* PMM0 Local Address */ ++ out32r(PCIX0_POM1LAH, 0x00000003); /* PMM0 Local Address */ ++ out32r(PCIX0_POM1PCIAL, CFG_PCI_MEMBASE2); /* PMM0 PCI Low Address */ ++ out32r(PCIX0_POM1PCIAH, 0x00000000); /* PMM0 PCI High Address */ ++ out32r(PCIX0_POM1SA, ~(0x10000000 - 1) | 1); /* 256MB + enable region */ ++} ++#endif /* defined(CONFIG_PCI) && defined(CFG_PCI_MASTER_INIT) */ ++ ++#ifdef CONFIG_POST ++/* ++ * Returns 1 if keys pressed to start the power-on long-running tests ++ * Called from board_init_f(). ++ */ ++int post_hotkeys_pressed(void) ++{ ++ ++ return (ctrlc()); ++} ++#endif +diff -Naupr u-boot-1.1.6/board/prodrive/alpr/config.mk u-boot-1.1.6-fsl-1/board/prodrive/alpr/config.mk +--- u-boot-1.1.6/board/prodrive/alpr/config.mk 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/config.mk 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,44 @@ ++# ++# (C) Copyright 2004 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++# ++# AMCC 440GX Reference Platform (Ocotea) board ++# ++ ++#TEXT_BASE = 0xFFFE0000 ++ ++ifeq ($(ramsym),1) ++TEXT_BASE = 0x07FD0000 ++else ++TEXT_BASE = 0xFFFC0000 ++endif ++ ++PLATFORM_CPPFLAGS += -DCONFIG_440=1 ++ ++ifeq ($(debug),1) ++PLATFORM_CPPFLAGS += -DDEBUG ++endif ++ ++ifeq ($(dbcr),1) ++PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8cff0000 ++endif +diff -Naupr u-boot-1.1.6/board/prodrive/alpr/fpga.c u-boot-1.1.6-fsl-1/board/prodrive/alpr/fpga.c +--- u-boot-1.1.6/board/prodrive/alpr/fpga.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/fpga.c 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,257 @@ ++/* ++ * (C) Copyright 2006 ++ * Heiko Schocher, DENX Software Engineering, hs@denx.de ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ * ++ */ ++ ++/* ++ * Altera FPGA configuration support for the ALPR computer from prodrive ++ */ ++ ++#include <common.h> ++#include <altera.h> ++#include <ACEX1K.h> ++#include <command.h> ++#include <asm-ppc/processor.h> ++#include <ppc440.h> ++#include "fpga.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#if defined(CONFIG_FPGA) ++ ++#ifdef FPGA_DEBUG ++#define PRINTF(fmt,args...) printf (fmt ,##args) ++#else ++#define PRINTF(fmt,args...) ++#endif ++ ++static unsigned long regval; ++ ++#define SET_GPIO_REG_0(reg, bit) { \ ++ regval = in32(reg); \ ++ regval &= ~(0x80000000 >> bit); \ ++ out32(reg, regval); \ ++ } ++ ++#define SET_GPIO_REG_1(reg, bit) { \ ++ regval = in32(reg); \ ++ regval |= (0x80000000 >> bit); \ ++ out32(reg, regval); \ ++ } ++ ++#define SET_GPIO_0(bit) SET_GPIO_REG_0(GPIO0_OR, bit) ++#define SET_GPIO_1(bit) SET_GPIO_REG_1(GPIO0_OR, bit) ++ ++#define FPGA_PRG (0x80000000 >> CFG_GPIO_PROG_EN) ++#define FPGA_CONFIG (0x80000000 >> CFG_GPIO_CONFIG) ++#define FPGA_DATA (0x80000000 >> CFG_GPIO_DATA) ++#define FPGA_CLK (0x80000000 >> CFG_GPIO_CLK) ++#define OLD_VAL (FPGA_PRG | FPGA_CONFIG) ++ ++#define SET_FPGA(data) out32(GPIO0_OR, data) ++ ++#define FPGA_WRITE_1 { \ ++ SET_FPGA(OLD_VAL | 0 | FPGA_DATA); /* set data to 1 */ \ ++ SET_FPGA(OLD_VAL | FPGA_CLK | FPGA_DATA);} /* set data to 1 */ ++ ++#define FPGA_WRITE_0 { \ ++ SET_FPGA(OLD_VAL | 0 | 0 ); /* set data to 0 */ \ ++ SET_FPGA(OLD_VAL | FPGA_CLK | 0 );} /* set data to 1 */ ++ ++/* Plattforminitializations */ ++/* Here we have to set the FPGA Chain */ ++/* PROGRAM_PROG_EN = HIGH */ ++/* PROGRAM_SEL_DPR = LOW */ ++int fpga_pre_fn (int cookie) ++{ ++ unsigned long reg; ++ ++ reg = in32(GPIO0_IR); ++ /* Enable the FPGA Chain */ ++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_PROG_EN); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_PROG_EN); ++ SET_GPIO_1(CFG_GPIO_PROG_EN); ++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_SEL_DPR); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_SEL_DPR); ++ SET_GPIO_0((CFG_GPIO_SEL_DPR)); ++ ++ /* initialize the GPIO Pins */ ++ /* output */ ++ SET_GPIO_0(CFG_GPIO_CLK); ++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_CLK); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_CLK); ++ ++ /* output */ ++ SET_GPIO_0(CFG_GPIO_DATA); ++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_DATA); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_DATA); ++ ++ /* First we set STATUS to 0 then as an input */ ++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_STATUS); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_STATUS); ++ SET_GPIO_0(CFG_GPIO_STATUS); ++ SET_GPIO_REG_0(GPIO0_TCR, CFG_GPIO_STATUS); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_STATUS); ++ ++ /* output */ ++ SET_GPIO_REG_1(GPIO0_TCR, CFG_GPIO_CONFIG); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_CONFIG); ++ SET_GPIO_0(CFG_GPIO_CONFIG); ++ ++ /* input */ ++ SET_GPIO_0(CFG_GPIO_CON_DON); ++ SET_GPIO_REG_0(GPIO0_TCR, CFG_GPIO_CON_DON); ++ SET_GPIO_REG_0(GPIO0_ODR, CFG_GPIO_CON_DON); ++ ++ /* CONFIG = 0 STATUS = 0 -> FPGA in reset state */ ++ SET_GPIO_0(CFG_GPIO_CONFIG); ++ return FPGA_SUCCESS; ++} ++ ++/* Set the state of CONFIG Pin */ ++int fpga_config_fn (int assert_config, int flush, int cookie) ++{ ++ if (assert_config) { ++ SET_GPIO_1(CFG_GPIO_CONFIG); ++ } else { ++ SET_GPIO_0(CFG_GPIO_CONFIG); ++ } ++ return FPGA_SUCCESS; ++} ++ ++/* Returns the state of STATUS Pin */ ++int fpga_status_fn (int cookie) ++{ ++ unsigned long reg; ++ ++ reg = in32(GPIO0_IR); ++ if (reg &= (0x80000000 >> CFG_GPIO_STATUS)) { ++ PRINTF("STATUS = HIGH\n"); ++ return FPGA_FAIL; ++ } ++ PRINTF("STATUS = LOW\n"); ++ return FPGA_SUCCESS; ++} ++ ++/* Returns the state of CONF_DONE Pin */ ++int fpga_done_fn (int cookie) ++{ ++ unsigned long reg; ++ reg = in32(GPIO0_IR); ++ if (reg &= (0x80000000 >> CFG_GPIO_CON_DON)) { ++ PRINTF("CONF_DON = HIGH\n"); ++ return FPGA_FAIL; ++ } ++ PRINTF("CONF_DON = LOW\n"); ++ return FPGA_SUCCESS; ++} ++ ++/* writes the complete buffer to the FPGA ++ writing the complete buffer in one function is much faster, ++ then calling it for every bit */ ++int fpga_write_fn (void *buf, size_t len, int flush, int cookie) ++{ ++ size_t bytecount = 0; ++ unsigned char *data = (unsigned char *) buf; ++ unsigned char val=0; ++ int i; ++ int len_40 = len / 40; ++ ++ while (bytecount < len) { ++ val = data[bytecount++]; ++ i = 8; ++ do { ++ if (val & 0x01) { ++ FPGA_WRITE_1; ++ } else { ++ FPGA_WRITE_0; ++ } ++ val >>= 1; ++ i --; ++ } while (i > 0); ++ ++#ifdef CFG_FPGA_PROG_FEEDBACK ++ if (bytecount % len_40 == 0) { ++ putc ('.'); /* let them know we are alive */ ++#ifdef CFG_FPGA_CHECK_CTRLC ++ if (ctrlc ()) ++ return FPGA_FAIL; ++#endif ++ } ++#endif ++ } ++ return FPGA_SUCCESS; ++} ++ ++/* called, when programming is aborted */ ++int fpga_abort_fn (int cookie) ++{ ++ SET_GPIO_1((CFG_GPIO_SEL_DPR)); ++ return FPGA_SUCCESS; ++} ++ ++/* called, when programming was succesful */ ++int fpga_post_fn (int cookie) ++{ ++ return fpga_abort_fn (cookie); ++} ++ ++/* Note that these are pointers to code that is in Flash. They will be ++ * relocated at runtime. ++ */ ++Altera_CYC2_Passive_Serial_fns fpga_fns = { ++ fpga_pre_fn, ++ fpga_config_fn, ++ fpga_status_fn, ++ fpga_done_fn, ++ fpga_write_fn, ++ fpga_abort_fn, ++ fpga_post_fn ++}; ++ ++Altera_desc fpga[CONFIG_FPGA_COUNT] = { ++ {Altera_CYC2, ++ passive_serial, ++ Altera_EP2C35_SIZE, ++ (void *) &fpga_fns, ++ NULL, ++ 0} ++}; ++ ++/* ++ * Initialize the fpga. Return 1 on success, 0 on failure. ++ */ ++int alpr_fpga_init (void) ++{ ++ int i; ++ ++ PRINTF ("%s:%d: Initialize FPGA interface (relocation offset = 0x%.8lx)\n", __FUNCTION__, __LINE__, gd->reloc_off); ++ fpga_init (gd->reloc_off); ++ ++ for (i = 0; i < CONFIG_FPGA_COUNT; i++) { ++ PRINTF ("%s:%d: Adding fpga %d\n", __FUNCTION__, __LINE__, i); ++ fpga_add (fpga_altera, &fpga[i]); ++ } ++ return 1; ++} ++ ++#endif +diff -Naupr u-boot-1.1.6/board/prodrive/alpr/init.S u-boot-1.1.6-fsl-1/board/prodrive/alpr/init.S +--- u-boot-1.1.6/board/prodrive/alpr/init.S 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/init.S 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,103 @@ ++/* ++ * (C) Copyright 2006 ++ * Stefan Roese, DENX Software Engineering, sr@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include <ppc_asm.tmpl> ++#include <config.h> ++ ++/* General */ ++#define TLB_VALID 0x00000200 ++ ++/* Supported page sizes */ ++#define SZ_1K 0x00000000 ++#define SZ_4K 0x00000010 ++#define SZ_16K 0x00000020 ++#define SZ_64K 0x00000030 ++#define SZ_256K 0x00000040 ++#define SZ_1M 0x00000050 ++#define SZ_16M 0x00000070 ++#define SZ_256M 0x00000090 ++ ++/* Storage attributes */ ++#define SA_W 0x00000800 /* Write-through */ ++#define SA_I 0x00000400 /* Caching inhibited */ ++#define SA_M 0x00000200 /* Memory coherence */ ++#define SA_G 0x00000100 /* Guarded */ ++#define SA_E 0x00000080 /* Endian */ ++ ++/* Access control */ ++#define AC_X 0x00000024 /* Execute */ ++#define AC_W 0x00000012 /* Write */ ++#define AC_R 0x00000009 /* Read */ ++ ++/* Some handy macros */ ++ ++#define EPN(e) ((e) & 0xfffffc00) ++#define TLB0(epn,sz) ( (EPN((epn)) | (sz) | TLB_VALID ) ) ++#define TLB1(rpn,erpn) ( ((rpn)&0xfffffc00) | (erpn) ) ++#define TLB2(a) ( (a)&0x00000fbf ) ++ ++#define tlbtab_start\ ++ mflr r1 ;\ ++ bl 0f ; ++ ++#define tlbtab_end\ ++ .long 0, 0, 0 ; \ ++0: mflr r0 ; \ ++ mtlr r1 ; \ ++ blr ; ++ ++#define tlbentry(epn,sz,rpn,erpn,attr)\ ++ .long TLB0(epn,sz),TLB1(rpn,erpn),TLB2(attr) ++ ++ ++/************************************************************************** ++ * TLB TABLE ++ * ++ * This table is used by the cpu boot code to setup the initial tlb ++ * entries. Rather than make broad assumptions in the cpu source tree, ++ * this table lets each board set things up however they like. ++ * ++ * Pointer to the table is returned in r1 ++ * ++ *************************************************************************/ ++ ++ .section .bootpg,"ax" ++ .globl tlbtab ++ ++tlbtab: ++ tlbtab_start ++ tlbentry( 0xff000000, SZ_16M, 0xff000000, 1, AC_R|AC_W|AC_X|SA_G|SA_I ) ++ tlbentry( CFG_PERIPHERAL_BASE, SZ_256M, 0x40000000, 1, AC_R|AC_W|SA_G|SA_I ) ++ tlbentry( CFG_ISRAM_BASE, SZ_4K, 0x80000000, 0, AC_R|AC_W|AC_X ) ++ tlbentry( CFG_ISRAM_BASE + 0x1000, SZ_4K, 0x80001000, 0, AC_R|AC_W|AC_X ) ++ tlbentry( CFG_SDRAM_BASE, SZ_256M, 0x00000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I ) ++ tlbentry( CFG_PCI_BASE, SZ_256M, 0x00000000, 2, AC_R|AC_W|SA_G|SA_I ) ++ ++ /* PCI */ ++ tlbentry( CFG_PCI_MEMBASE, SZ_256M, CFG_PCI_MEMBASE, 3, AC_R|AC_W|SA_G|SA_I ) ++ tlbentry( CFG_PCI_MEMBASE1, SZ_256M, CFG_PCI_MEMBASE1, 3, AC_R|AC_W|SA_G|SA_I ) ++ tlbentry( CFG_PCI_MEMBASE2, SZ_256M, CFG_PCI_MEMBASE2, 3, AC_R|AC_W|SA_G|SA_I ) ++ ++ /* NAND */ ++ tlbentry( CFG_NAND_BASE, SZ_4K, CFG_NAND_BASE, 1, AC_R|AC_W|AC_X|SA_G|SA_I ) ++ tlbtab_end +diff -Naupr u-boot-1.1.6/board/prodrive/alpr/Makefile u-boot-1.1.6-fsl-1/board/prodrive/alpr/Makefile +--- u-boot-1.1.6/board/prodrive/alpr/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/Makefile 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,51 @@ ++# ++# (C) Copyright 2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++include $(TOPDIR)/config.mk ++ ++LIB = $(obj)lib$(BOARD).a ++ ++COBJS = $(BOARD).o fpga.o nand.o ++SOBJS = init.o ++ ++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS)) ++SOBJS := $(addprefix $(obj),$(SOBJS)) ++ ++$(LIB): $(OBJS) $(SOBJS) ++ $(AR) $(ARFLAGS) $@ $(OBJS) ++ ++clean: ++ rm -f $(SOBJS) $(OBJS) ++ ++distclean: clean ++ rm -f $(LIB) core *.bak .depend *~ ++ ++######################################################################### ++ ++# defines $(obj).depend target ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +diff -Naupr u-boot-1.1.6/board/prodrive/alpr/nand.c u-boot-1.1.6-fsl-1/board/prodrive/alpr/nand.c +--- u-boot-1.1.6/board/prodrive/alpr/nand.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/nand.c 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,173 @@ ++/* ++ * (C) Copyright 2006 ++ * Heiko Schocher, DENX Software Engineering, hs@denx.de ++ * ++ * (C) Copyright 2006 ++ * Stefan Roese, DENX Software Engineering, sr@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include <common.h> ++ ++#if (CONFIG_COMMANDS & CFG_CMD_NAND) ++ ++#include <asm/processor.h> ++#include <nand.h> ++ ++struct alpr_ndfc_regs { ++ u8 cmd[4]; ++ u8 addr_wait; ++ u8 term; ++ u8 dummy; ++ u8 dummy2; ++ u8 data; ++}; ++ ++static u8 hwctl; ++static struct alpr_ndfc_regs *alpr_ndfc = NULL; ++ ++#define readb(addr) (u8)(*(volatile u8 *)(addr)) ++#define writeb(d,addr) *(volatile u8 *)(addr) = ((u8)(d)) ++ ++/* ++ * The ALPR has a NAND Flash Controller (NDFC) that handles all accesses to ++ * the NAND devices. The NDFC has command, address and data registers that ++ * when accessed will set up the NAND flash pins appropriately. We'll use the ++ * hwcontrol function to save the configuration in a global variable. ++ * We can then use this information in the read and write functions to ++ * determine which NDFC register to access. ++ * ++ * There are 2 NAND devices on the board, a Hynix HY27US08561A (1 GByte). ++ */ ++static void alpr_nand_hwcontrol(struct mtd_info *mtd, int cmd) ++{ ++ switch (cmd) { ++ case NAND_CTL_SETCLE: ++ hwctl |= 0x1; ++ break; ++ case NAND_CTL_CLRCLE: ++ hwctl &= ~0x1; ++ break; ++ case NAND_CTL_SETALE: ++ hwctl |= 0x2; ++ break; ++ case NAND_CTL_CLRALE: ++ hwctl &= ~0x2; ++ break; ++ case NAND_CTL_SETNCE: ++ break; ++ case NAND_CTL_CLRNCE: ++ writeb(0x00, &(alpr_ndfc->term)); ++ break; ++ } ++} ++ ++static void alpr_nand_write_byte(struct mtd_info *mtd, u_char byte) ++{ ++ struct nand_chip *nand = mtd->priv; ++ ++ if (hwctl & 0x1) ++ /* ++ * IO_ADDR_W used as CMD[i] reg to support multiple NAND ++ * chips. ++ */ ++ writeb(byte, nand->IO_ADDR_W); ++ else if (hwctl & 0x2) { ++ writeb(byte, &(alpr_ndfc->addr_wait)); ++ } else ++ writeb(byte, &(alpr_ndfc->data)); ++} ++ ++static u_char alpr_nand_read_byte(struct mtd_info *mtd) ++{ ++ return readb(&(alpr_ndfc->data)); ++} ++ ++static void alpr_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) ++{ ++ struct nand_chip *nand = mtd->priv; ++ int i; ++ ++ for (i = 0; i < len; i++) { ++ if (hwctl & 0x1) ++ /* ++ * IO_ADDR_W used as CMD[i] reg to support multiple NAND ++ * chips. ++ */ ++ writeb(buf[i], nand->IO_ADDR_W); ++ else if (hwctl & 0x2) ++ writeb(buf[i], &(alpr_ndfc->addr_wait)); ++ else ++ writeb(buf[i], &(alpr_ndfc->data)); ++ } ++} ++ ++static void alpr_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) ++{ ++ int i; ++ ++ for (i = 0; i < len; i++) { ++ buf[i] = readb(&(alpr_ndfc->data)); ++ } ++} ++ ++static int alpr_nand_verify_buf(struct mtd_info *mtd, const u_char *buf, int len) ++{ ++ int i; ++ ++ for (i = 0; i < len; i++) ++ if (buf[i] != readb(&(alpr_ndfc->data))) ++ return i; ++ ++ return 0; ++} ++ ++static int alpr_nand_dev_ready(struct mtd_info *mtd) ++{ ++ volatile u_char val; ++ ++ /* ++ * Blocking read to wait for NAND to be ready ++ */ ++ val = readb(&(alpr_ndfc->addr_wait)); ++ ++ /* ++ * Return always true ++ */ ++ return 1; ++} ++ ++void board_nand_init(struct nand_chip *nand) ++{ ++ alpr_ndfc = (struct alpr_ndfc_regs *)CFG_NAND_BASE; ++ ++ nand->eccmode = NAND_ECC_SOFT; ++ ++ /* Reference hardware control function */ ++ nand->hwcontrol = alpr_nand_hwcontrol; ++ /* Set command delay time */ ++ nand->write_byte = alpr_nand_write_byte; ++ nand->read_byte = alpr_nand_read_byte; ++ nand->write_buf = alpr_nand_write_buf; ++ nand->read_buf = alpr_nand_read_buf; ++ nand->verify_buf = alpr_nand_verify_buf; ++ nand->dev_ready = alpr_nand_dev_ready; ++} ++#endif +diff -Naupr u-boot-1.1.6/board/prodrive/alpr/u-boot.lds u-boot-1.1.6-fsl-1/board/prodrive/alpr/u-boot.lds +--- u-boot-1.1.6/board/prodrive/alpr/u-boot.lds 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/alpr/u-boot.lds 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,157 @@ ++/* ++ * (C) Copyright 2004 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++OUTPUT_ARCH(powerpc) ++SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); ++/* Do we need any of these for elf? ++ __DYNAMIC = 0; */ ++SECTIONS ++{ ++ .resetvec 0xFFFFFFFC : ++ { ++ *(.resetvec) ++ } = 0xffff ++ ++ .bootpg 0xFFFFF000 : ++ { ++ cpu/ppc4xx/start.o (.bootpg) ++ } = 0xffff ++ ++ /* Read-only sections, merged into text segment: */ ++ . = + SIZEOF_HEADERS; ++ .interp : { *(.interp) } ++ .hash : { *(.hash) } ++ .dynsym : { *(.dynsym) } ++ .dynstr : { *(.dynstr) } ++ .rel.text : { *(.rel.text) } ++ .rela.text : { *(.rela.text) } ++ .rel.data : { *(.rel.data) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } ++ .rel.got : { *(.rel.got) } ++ .rela.got : { *(.rela.got) } ++ .rel.ctors : { *(.rel.ctors) } ++ .rela.ctors : { *(.rela.ctors) } ++ .rel.dtors : { *(.rel.dtors) } ++ .rela.dtors : { *(.rela.dtors) } ++ .rel.bss : { *(.rel.bss) } ++ .rela.bss : { *(.rela.bss) } ++ .rel.plt : { *(.rel.plt) } ++ .rela.plt : { *(.rela.plt) } ++ .init : { *(.init) } ++ .plt : { *(.plt) } ++ .text : ++ { ++ /* WARNING - the following is hand-optimized to fit within */ ++ /* the sector layout of our flash chips! XXX FIXME XXX */ ++ ++ cpu/ppc4xx/start.o (.text) ++ board/prodrive/alpr/init.o (.text) ++ cpu/ppc4xx/kgdb.o (.text) ++ cpu/ppc4xx/traps.o (.text) ++ cpu/ppc4xx/interrupts.o (.text) ++ cpu/ppc4xx/serial.o (.text) ++ cpu/ppc4xx/cpu_init.o (.text) ++ cpu/ppc4xx/speed.o (.text) ++ common/dlmalloc.o (.text) ++ lib_generic/crc32.o (.text) ++ lib_ppc/extable.o (.text) ++ lib_generic/zlib.o (.text) ++ ++/* . = env_offset;*/ ++/* common/environment.o(.text)*/ ++ ++ *(.text) ++ *(.fixup) ++ *(.got1) ++ } ++ _etext = .; ++ PROVIDE (etext = .); ++ .rodata : ++ { ++ *(.rodata) ++ *(.rodata1) ++ *(.rodata.str1.4) ++ *(.eh_frame) ++ } ++ .fini : { *(.fini) } =0 ++ .ctors : { *(.ctors) } ++ .dtors : { *(.dtors) } ++ ++ /* Read-write section, merged into data segment: */ ++ . = (. + 0x00FF) & 0xFFFFFF00; ++ _erotext = .; ++ PROVIDE (erotext = .); ++ .reloc : ++ { ++ *(.got) ++ _GOT2_TABLE_ = .; ++ *(.got2) ++ _FIXUP_TABLE_ = .; ++ *(.fixup) ++ } ++ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; ++ __fixup_entries = (. - _FIXUP_TABLE_)>>2; ++ ++ .data : ++ { ++ *(.data) ++ *(.data1) ++ *(.sdata) ++ *(.sdata2) ++ *(.dynamic) ++ CONSTRUCTORS ++ } ++ _edata = .; ++ PROVIDE (edata = .); ++ ++ . = .; ++ __u_boot_cmd_start = .; ++ .u_boot_cmd : { *(.u_boot_cmd) } ++ __u_boot_cmd_end = .; ++ ++ ++ . = .; ++ __start___ex_table = .; ++ __ex_table : { *(__ex_table) } ++ __stop___ex_table = .; ++ ++ . = ALIGN(256); ++ __init_begin = .; ++ .text.init : { *(.text.init) } ++ .data.init : { *(.data.init) } ++ . = ALIGN(256); ++ __init_end = .; ++ ++ __bss_start = .; ++ .bss : ++ { ++ *(.sbss) *(.scommon) ++ *(.dynbss) ++ *(.bss) ++ *(COMMON) ++ } ++ _end = . ; ++ PROVIDE (end = .); ++} +diff -Naupr u-boot-1.1.6/board/prodrive/common/flash.c u-boot-1.1.6-fsl-1/board/prodrive/common/flash.c +--- u-boot-1.1.6/board/prodrive/common/flash.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/common/flash.c 2006-11-30 12:34:13.000000000 -0600 +@@ -48,6 +48,7 @@ void flash_print_info(flash_info_t *info + case FLASH_MAN_AMD: printf ("AMD "); break; + case FLASH_MAN_FUJ: printf ("FUJITSU "); break; + case FLASH_MAN_SST: printf ("SST "); break; ++ case FLASH_MAN_STM: printf ("ST "); break; + case FLASH_MAN_EXCEL: printf ("Excel Semiconductor "); break; + default: printf ("Unknown Vendor "); break; + } +@@ -156,6 +157,9 @@ static ulong flash_get_size(vu_long *add + case (CFG_FLASH_WORD_SIZE)SST_MANUFACT: + info->flash_id = FLASH_MAN_SST; + break; ++ case (CFG_FLASH_WORD_SIZE)STM_MANUFACT: ++ info->flash_id = FLASH_MAN_STM; ++ break; + case (CFG_FLASH_WORD_SIZE)EXCEL_MANUFACT: + info->flash_id = FLASH_MAN_EXCEL; + break; +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/64460.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/64460.h +--- u-boot-1.1.6/board/prodrive/p3mx/64460.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/64460.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,52 @@ ++/* ++ * (C) Copyright 2003 ++ * Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ * main board support/init for the Galileo Eval board DB64460. ++ */ ++ ++#ifndef __64460_H__ ++#define __64460_H__ ++ ++/* CPU Configuration bits */ ++#define CPU_CONF_ADDR_MISS_EN (1 << 8) ++#define CPU_CONF_SINGLE_CPU (1 << 11) ++#define CPU_CONF_ENDIANESS (1 << 12) ++#define CPU_CONF_PIPELINE (1 << 13) ++#define CPU_CONF_STOP_RETRY (1 << 17) ++#define CPU_CONF_MULTI_DECODE (1 << 18) ++#define CPU_CONF_DP_VALID (1 << 19) ++#define CPU_CONF_PERR_PROP (1 << 22) ++#define CPU_CONF_AACK_DELAY_2 (1 << 25) ++#define CPU_CONF_AP_VALID (1 << 26) ++#define CPU_CONF_REMAP_WR_DIS (1 << 27) ++ ++/* CPU Master Control bits */ ++#define CPU_MAST_CTL_ARB_EN (1 << 8) ++#define CPU_MAST_CTL_MASK_BR_1 (1 << 9) ++#define CPU_MAST_CTL_M_WR_TRIG (1 << 10) ++#define CPU_MAST_CTL_M_RD_TRIG (1 << 11) ++#define CPU_MAST_CTL_CLEAN_BLK (1 << 12) ++#define CPU_MAST_CTL_FLUSH_BLK (1 << 13) ++ ++#endif /* __64460_H__ */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/config.mk u-boot-1.1.6-fsl-1/board/prodrive/p3mx/config.mk +--- u-boot-1.1.6/board/prodrive/p3mx/config.mk 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/config.mk 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,28 @@ ++# ++# (C) Copyright 2002-2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++# ++# p3mx boards (P3M750 & P3M7448) ++# ++ ++TEXT_BASE = 0xfff00000 +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/eth.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/eth.h +--- u-boot-1.1.6/board/prodrive/p3mx/eth.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/eth.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,43 @@ ++/* ++ * (C) Copyright 2001 ++ * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ * eth.h - header file for the polled mode GT ethernet driver ++ */ ++ ++#ifndef __EVB64360_ETH_H__ ++#define __EVB64360_ETH_H__ ++ ++#include <asm/types.h> ++#include <asm/io.h> ++#include <asm/byteorder.h> ++#include <common.h> ++ ++ ++int db64360_eth0_poll(void); ++int db64360_eth0_transmit(unsigned int s, volatile char *p); ++void db64360_eth0_disable(void); ++bool network_start(bd_t *bis); ++ ++ ++#endif /* __EVB64360_ETH_H__ */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/Makefile u-boot-1.1.6-fsl-1/board/prodrive/p3mx/Makefile +--- u-boot-1.1.6/board/prodrive/p3mx/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/Makefile 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,55 @@ ++# ++# (C) Copyright 2002-2006 ++# Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++include $(TOPDIR)/config.mk ++ifneq ($(OBJTREE),$(SRCTREE)) ++$(shell mkdir -p $(obj)../../Marvell/common) ++endif ++ ++LIB = $(obj)lib$(BOARD).a ++ ++SOBJS = misc.o ++COBJS = $(BOARD).o mpsc.o mv_eth.o pci.o sdram_init.o serial.o \ ++ ../../Marvell/common/i2c.o ../../Marvell/common/memory.o ++ ++SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS)) ++SOBJS := $(addprefix $(obj),$(SOBJS)) ++ ++$(LIB): $(obj).depend $(OBJS) $(SOBJS) ++ $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) ++ ++clean: ++ rm -f $(SOBJS) $(OBJS) ++ ++distclean: clean ++ rm -f $(LIB) core *.bak .depend *~ ++ ++######################################################################### ++ ++# defines $(obj).depend target ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/misc.S u-boot-1.1.6-fsl-1/board/prodrive/p3mx/misc.S +--- u-boot-1.1.6/board/prodrive/p3mx/misc.S 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/misc.S 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,245 @@ ++#include <config.h> ++#include <74xx_7xx.h> ++#include "version.h" ++ ++#include <ppc_asm.tmpl> ++#include <ppc_defs.h> ++ ++#include <asm/cache.h> ++#include <asm/mmu.h> ++ ++#include "../../Marvell/include/mv_gen_reg.h" ++ ++#ifdef CONFIG_ECC ++ /* Galileo specific asm code for initializing ECC */ ++ .globl board_relocate_rom ++board_relocate_rom: ++ mflr r7 ++ /* update the location of the GT registers */ ++ lis r11, CFG_GT_REGS@h ++ /* if we're using ECC, we must use the DMA engine to copy ourselves */ ++ bl start_idma_transfer_0 ++ bl wait_for_idma_0 ++ bl stop_idma_engine_0 ++ ++ mtlr r7 ++ blr ++ ++ .globl board_init_ecc ++board_init_ecc: ++ mflr r7 ++ /* NOTE: r10 still contains the location we've been relocated to ++ * which happens to be TOP_OF_RAM - CFG_MONITOR_LEN */ ++ ++ /* now that we're running from ram, init the rest of main memory ++ * for ECC use */ ++ lis r8, CFG_MONITOR_LEN@h ++ ori r8, r8, CFG_MONITOR_LEN@l ++ ++ divw r3, r10, r8 ++ ++ /* set up the counter, and init the starting address */ ++ mtctr r3 ++ li r12, 0 ++ ++ /* bytes per transfer */ ++ mr r5, r8 ++about_to_init_ecc: ++1: mr r3, r12 ++ mr r4, r12 ++ bl start_idma_transfer_0 ++ bl wait_for_idma_0 ++ bl stop_idma_engine_0 ++ add r12, r12, r8 ++ bdnz 1b ++ ++ mtlr r7 ++ blr ++ ++ /* r3: dest addr ++ * r4: source addr ++ * r5: byte count ++ * r11: gt regbase ++ * trashes: r6, r5 ++ */ ++start_idma_transfer_0: ++ /* set the byte count, including the OWN bit */ ++ mr r6, r11 ++ ori r6, r6, CHANNEL0_DMA_BYTE_COUNT ++ stwbrx r5, 0, (r6) ++ ++ /* set the source address */ ++ mr r6, r11 ++ ori r6, r6, CHANNEL0_DMA_SOURCE_ADDRESS ++ stwbrx r4, 0, (r6) ++ ++ /* set the dest address */ ++ mr r6, r11 ++ ori r6, r6, CHANNEL0_DMA_DESTINATION_ADDRESS ++ stwbrx r3, 0, (r6) ++ ++ /* set the next record pointer */ ++ li r5, 0 ++ mr r6, r11 ++ ori r6, r6, CHANNEL0NEXT_RECORD_POINTER ++ stwbrx r5, 0, (r6) ++ ++ /* set the low control register */ ++ /* bit 9 is NON chained mode, bit 31 is new style descriptors. ++ bit 12 is channel enable */ ++ ori r5, r5, (1 << 12) | (1 << 12) | (1 << 11) ++ /* 15 shifted by 16 (oris) == bit 31 */ ++ oris r5, r5, (1 << 15) ++ mr r6, r11 ++ ori r6, r6, CHANNEL0CONTROL ++ stwbrx r5, 0, (r6) ++ ++ blr ++ ++ /* this waits for the bytecount to return to zero, indicating ++ * that the trasfer is complete */ ++wait_for_idma_0: ++ mr r5, r11 ++ lis r6, 0xff ++ ori r6, r6, 0xffff ++ ori r5, r5, CHANNEL0_DMA_BYTE_COUNT ++1: lwbrx r4, 0, (r5) ++ and. r4, r4, r6 ++ bne 1b ++ ++ blr ++ ++ /* this turns off channel 0 of the idma engine */ ++stop_idma_engine_0: ++ /* shut off the DMA engine */ ++ li r5, 0 ++ mr r6, r11 ++ ori r6, r6, CHANNEL0CONTROL ++ stwbrx r5, 0, (r6) ++ ++ blr ++#endif ++ ++#ifdef CFG_BOARD_ASM_INIT ++ /* NOTE: trashes r3-r7 */ ++ .globl board_asm_init ++board_asm_init: ++ /* just move the GT registers to where they belong */ ++ lis r3, CFG_DFL_GT_REGS@h ++ ori r3, r3, CFG_DFL_GT_REGS@l ++ lis r4, CFG_GT_REGS@h ++ ori r4, r4, CFG_GT_REGS@l ++ li r5, INTERNAL_SPACE_DECODE ++ ++ /* test to see if we've already moved */ ++ lwbrx r6, r5, r4 ++ andi. r6, r6, 0xffff ++ /* check loading of R7 is: 0x0F80 should: 0xf800: DONE */ ++/* rlwinm r7, r4, 8, 16, 31 ++ rlwinm r7, r4, 12, 16, 31 */ /* original */ ++ rlwinm r7, r4, 16, 16, 31 ++ /* -----------------------------------------------------*/ ++ cmp cr0, r7, r6 ++ beqlr ++ ++ /* nope, have to move the registers */ ++ lwbrx r6, r5, r3 ++ andis. r6, r6, 0xffff ++ or r6, r6, r7 ++ stwbrx r6, r5, r3 ++ ++ /* now, poll for the change */ ++1: lwbrx r7, r5, r4 ++ cmp cr0, r7, r6 ++ bne 1b ++ ++ lis r3, CFG_INT_SRAM_BASE@h ++ ori r3, r3, CFG_INT_SRAM_BASE@l ++ rlwinm r3, r3, 16, 16, 31 ++ lis r4, CFG_GT_REGS@h ++ ori r4, r4, CFG_GT_REGS@l ++ li r5, INTEGRATED_SRAM_BASE_ADDR ++ stwbrx r3, r5, r4 ++ ++2: lwbrx r6, r5, r4 ++ cmp cr0, r3, r6 ++ bne 2b ++ ++ /* done! */ ++ blr ++#endif ++ ++/* For use of the debug LEDs */ ++ .global led_on0_relocated ++led_on0_relocated: ++ xor r21, r21, r21 ++ xor r18, r18, r18 ++ lis r18, 0xFC80 ++ ori r18, r18, 0x8000 ++/* stw r21, 0x0(r18) */ ++ sync ++ blr ++ ++ .global led_off0_relocated ++led_off0_relocated: ++ xor r21, r21, r21 ++ xor r18, r18, r18 ++ lis r18, 0xFC81 ++ ori r18, r18, 0x4000 ++/* stw r21, 0x0(r18) */ ++ sync ++ blr ++ ++ .global led_on0 ++led_on0: ++ xor r18, r18, r18 ++ lis r18, 0x1c80 ++ ori r18, r18, 0x8000 ++/* stw r18, 0x0(r18) */ ++ sync ++ blr ++ ++ .global led_off0 ++led_off0: ++ xor r18, r18, r18 ++ lis r18, 0x1c81 ++ ori r18, r18, 0x4000 ++/* stw r18, 0x0(r18) */ ++ sync ++ blr ++ ++ .global led_on1 ++led_on1: ++ xor r18, r18, r18 ++ lis r18, 0x1c80 ++ ori r18, r18, 0xc000 ++/* stw r18, 0x0(r18) */ ++ sync ++ blr ++ ++ .global led_off1 ++led_off1: ++ xor r18, r18, r18 ++ lis r18, 0x1c81 ++ ori r18, r18, 0x8000 ++/* stw r18, 0x0(r18) */ ++ sync ++ blr ++ ++ .global led_on2 ++led_on2: ++ xor r18, r18, r18 ++ lis r18, 0x1c81 ++ ori r18, r18, 0x0000 ++/* stw r18, 0x0(r18) */ ++ sync ++ blr ++ ++ .global led_off2 ++led_off2: ++ xor r18, r18, r18 ++ lis r18, 0x1c81 ++ ori r18, r18, 0xc000 ++/* stw r18, 0x0(r18) */ ++ sync ++ blr +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mpsc.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.c +--- u-boot-1.1.6/board/prodrive/p3mx/mpsc.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,1013 @@ ++/* ++ * (C) Copyright 2001 ++ * John Clemens <clemens@mclx.com>, Mission Critical Linux, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/************************************************************************* ++ * changes for Marvell DB64460 eval board 2003 by Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ ************************************************************************/ ++ ++/* ++ * mpsc.c - driver for console over the MPSC. ++ */ ++ ++ ++#include <common.h> ++#include <config.h> ++#include <asm/cache.h> ++ ++#include <malloc.h> ++#include "mpsc.h" ++ ++#include "mv_regs.h" ++ ++#include "../../Marvell/include/memory.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++/* Define this if you wish to use the MPSC as a register based UART. ++ * This will force the serial port to not use the SDMA engine at all. ++ */ ++#undef CONFIG_MPSC_DEBUG_PORT ++ ++ ++int (*mpsc_putchar) (char ch) = mpsc_putchar_early; ++char (*mpsc_getchar) (void) = mpsc_getchar_debug; ++int (*mpsc_test_char) (void) = mpsc_test_char_debug; ++ ++ ++static volatile unsigned int *rx_desc_base = NULL; ++static unsigned int rx_desc_index = 0; ++static volatile unsigned int *tx_desc_base = NULL; ++static unsigned int tx_desc_index = 0; ++ ++/* local function declarations */ ++static int galmpsc_connect (int channel, int connect); ++static int galmpsc_route_rx_clock (int channel, int brg); ++static int galmpsc_route_tx_clock (int channel, int brg); ++static int galmpsc_write_config_regs (int mpsc, int mode); ++static int galmpsc_config_channel_regs (int mpsc); ++static int galmpsc_set_char_length (int mpsc, int value); ++static int galmpsc_set_stop_bit_length (int mpsc, int value); ++static int galmpsc_set_parity (int mpsc, int value); ++static int galmpsc_enter_hunt (int mpsc); ++static int galmpsc_set_brkcnt (int mpsc, int value); ++static int galmpsc_set_tcschar (int mpsc, int value); ++static int galmpsc_set_snoop (int mpsc, int value); ++static int galmpsc_shutdown (int mpsc); ++ ++static int galsdma_set_RFT (int channel); ++static int galsdma_set_SFM (int channel); ++static int galsdma_set_rxle (int channel); ++static int galsdma_set_txle (int channel); ++static int galsdma_set_burstsize (int channel, unsigned int value); ++static int galsdma_set_RC (int channel, unsigned int value); ++ ++static int galbrg_set_CDV (int channel, int value); ++static int galbrg_enable (int channel); ++static int galbrg_disable (int channel); ++static int galbrg_set_clksrc (int channel, int value); ++static int galbrg_set_CUV (int channel, int value); ++ ++static void galsdma_enable_rx (void); ++static int galsdma_set_mem_space (unsigned int memSpace, ++ unsigned int memSpaceTarget, ++ unsigned int memSpaceAttr, ++ unsigned int baseAddress, ++ unsigned int size); ++ ++ ++#define SOFTWARE_CACHE_MANAGEMENT ++ ++#ifdef SOFTWARE_CACHE_MANAGEMENT ++#define FLUSH_DCACHE(a,b) if(dcache_status()){clean_dcache_range((u32)(a),(u32)(b));} ++#define FLUSH_AND_INVALIDATE_DCACHE(a,b) if(dcache_status()){flush_dcache_range((u32)(a),(u32)(b));} ++#define INVALIDATE_DCACHE(a,b) if(dcache_status()){invalidate_dcache_range((u32)(a),(u32)(b));} ++#else ++#define FLUSH_DCACHE(a,b) ++#define FLUSH_AND_INVALIDATE_DCACHE(a,b) ++#define INVALIDATE_DCACHE(a,b) ++#endif ++ ++#ifdef CONFIG_MPSC_DEBUG_PORT ++static void mpsc_debug_init (void) ++{ ++ ++ volatile unsigned int temp; ++ ++ /* Clear the CFR (CHR4) */ ++ /* Write random 'Z' bit (bit 29) of CHR4 to enable debug uart *UNDOCUMENTED FEATURE* */ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_4 + (CHANNEL * GALMPSC_REG_GAP)); ++ temp &= 0xffffff00; ++ temp |= BIT29; ++ GT_REG_WRITE (GALMPSC_CHANNELREG_4 + (CHANNEL * GALMPSC_REG_GAP), ++ temp); ++ ++ /* Set the Valid bit 'V' (bit 12) and int generation bit 'INT' (bit 15) */ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_5 + (CHANNEL * GALMPSC_REG_GAP)); ++ temp |= (BIT12 | BIT15); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_5 + (CHANNEL * GALMPSC_REG_GAP), ++ temp); ++ ++ /* Set int mask */ ++ temp = GTREGREAD (GALMPSC_0_INT_MASK); ++ temp |= BIT6; ++ GT_REG_WRITE (GALMPSC_0_INT_MASK, temp); ++} ++#endif ++ ++char mpsc_getchar_debug (void) ++{ ++ volatile int temp; ++ volatile unsigned int cause; ++ ++ cause = GTREGREAD (GALMPSC_0_INT_CAUSE); ++ while ((cause & BIT6) == 0) { ++ cause = GTREGREAD (GALMPSC_0_INT_CAUSE); ++ } ++ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_10 + ++ (CHANNEL * GALMPSC_REG_GAP)); ++ /* By writing 1's to the set bits, the register is cleared */ ++ GT_REG_WRITE (GALMPSC_CHANNELREG_10 + (CHANNEL * GALMPSC_REG_GAP), ++ temp); ++ GT_REG_WRITE (GALMPSC_0_INT_CAUSE, cause & ~BIT6); ++ return (temp >> 16) & 0xff; ++} ++ ++/* special function for running out of flash. doesn't modify any ++ * global variables [josh] */ ++int mpsc_putchar_early (char ch) ++{ ++ int mpsc = CHANNEL; ++ int temp = ++ GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP)); ++ galmpsc_set_tcschar (mpsc, ch); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), ++ temp | 0x200); ++ ++#define MAGIC_FACTOR (10*1000000) ++ ++ udelay (MAGIC_FACTOR / gd->baudrate); ++ return 0; ++} ++ ++/* This is used after relocation, see serial.c and mpsc_init2 */ ++static int mpsc_putchar_sdma (char ch) ++{ ++ volatile unsigned int *p; ++ unsigned int temp; ++ ++ ++ /* align the descriptor */ ++ p = tx_desc_base; ++ memset ((void *) p, 0, 8 * sizeof (unsigned int)); ++ ++ /* fill one 64 bit buffer */ ++ /* word swap, pad with 0 */ ++ p[4] = 0; /* x */ ++ p[5] = (unsigned int) ch; /* x */ ++ ++ /* CHANGED completely according to GT64260A dox - NTL */ ++ p[0] = 0x00010001; /* 0 */ ++ p[1] = DESC_OWNER_BIT | DESC_FIRST | DESC_LAST; /* 4 */ ++ p[2] = 0; /* 8 */ ++ p[3] = (unsigned int) &p[4]; /* c */ ++ ++#if 0 ++ p[9] = DESC_FIRST | DESC_LAST; ++ p[10] = (unsigned int) &p[0]; ++ p[11] = (unsigned int) &p[12]; ++#endif ++ ++ FLUSH_DCACHE (&p[0], &p[8]); ++ ++ GT_REG_WRITE (GALSDMA_0_CUR_TX_PTR + (CHANNEL * GALSDMA_REG_DIFF), ++ (unsigned int) &p[0]); ++ GT_REG_WRITE (GALSDMA_0_FIR_TX_PTR + (CHANNEL * GALSDMA_REG_DIFF), ++ (unsigned int) &p[0]); ++ ++ temp = GTREGREAD (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF)); ++ temp |= (TX_DEMAND | TX_STOP); ++ GT_REG_WRITE (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF), temp); ++ ++ INVALIDATE_DCACHE (&p[1], &p[2]); ++ ++ while (p[1] & DESC_OWNER_BIT) { ++ udelay (100); ++ INVALIDATE_DCACHE (&p[1], &p[2]); ++ } ++ return 0; ++} ++ ++char mpsc_getchar_sdma (void) ++{ ++ static unsigned int done = 0; ++ volatile char ch; ++ unsigned int len = 0, idx = 0, temp; ++ ++ volatile unsigned int *p; ++ ++ ++ do { ++ p = &rx_desc_base[rx_desc_index * 8]; ++ ++ INVALIDATE_DCACHE (&p[0], &p[1]); ++ /* Wait for character */ ++ while (p[1] & DESC_OWNER_BIT) { ++ udelay (100); ++ INVALIDATE_DCACHE (&p[0], &p[1]); ++ } ++ ++ /* Handle error case */ ++ if (p[1] & (1 << 15)) { ++ printf ("oops, error: %08x\n", p[1]); ++ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 + ++ (CHANNEL * GALMPSC_REG_GAP)); ++ temp |= (1 << 23); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + ++ (CHANNEL * GALMPSC_REG_GAP), temp); ++ ++ /* Can't poll on abort bit, so we just wait. */ ++ udelay (100); ++ ++ galsdma_enable_rx (); ++ } ++ ++ /* Number of bytes left in this descriptor */ ++ len = p[0] & 0xffff; ++ ++ if (len) { ++ /* Where to look */ ++ idx = 5; ++ if (done > 3) ++ idx = 4; ++ if (done > 7) ++ idx = 7; ++ if (done > 11) ++ idx = 6; ++ ++ INVALIDATE_DCACHE (&p[idx], &p[idx + 1]); ++ ch = p[idx] & 0xff; ++ done++; ++ } ++ ++ if (done < len) { ++ /* this descriptor has more bytes still ++ * shift down the char we just read, and leave the ++ * buffer in place for the next time around ++ */ ++ p[idx] = p[idx] >> 8; ++ FLUSH_DCACHE (&p[idx], &p[idx + 1]); ++ } ++ ++ if (done == len) { ++ /* nothing left in this descriptor. ++ * go to next one ++ */ ++ p[1] = DESC_OWNER_BIT | DESC_FIRST | DESC_LAST; ++ p[0] = 0x00100000; ++ FLUSH_DCACHE (&p[0], &p[1]); ++ /* Next descriptor */ ++ rx_desc_index = (rx_desc_index + 1) % RX_DESC; ++ done = 0; ++ } ++ } while (len == 0); /* galileo bug.. len might be zero */ ++ ++ return ch; ++} ++ ++ ++int mpsc_test_char_debug (void) ++{ ++ if ((GTREGREAD (GALMPSC_0_INT_CAUSE) & BIT6) == 0) ++ return 0; ++ else { ++ return 1; ++ } ++} ++ ++ ++int mpsc_test_char_sdma (void) ++{ ++ volatile unsigned int *p = &rx_desc_base[rx_desc_index * 8]; ++ ++ INVALIDATE_DCACHE (&p[1], &p[2]); ++ ++ if (p[1] & DESC_OWNER_BIT) ++ return 0; ++ else ++ return 1; ++} ++ ++int mpsc_init (int baud) ++{ ++ /* BRG CONFIG */ ++ galbrg_set_baudrate (CHANNEL, baud); ++ galbrg_set_clksrc (CHANNEL, 8); /* set source=Tclk */ ++ galbrg_set_CUV (CHANNEL, 0); /* set up CountUpValue */ ++ galbrg_enable (CHANNEL); /* Enable BRG */ ++ ++ /* Set up clock routing */ ++ galmpsc_connect (CHANNEL, GALMPSC_CONNECT); /* connect it */ ++ ++ galmpsc_route_rx_clock (CHANNEL, CHANNEL); /* chosse BRG0 for Rx */ ++ galmpsc_route_tx_clock (CHANNEL, CHANNEL); /* chose BRG0 for Tx */ ++ ++ /* reset MPSC state */ ++ galmpsc_shutdown (CHANNEL); ++ ++ /* SDMA CONFIG */ ++ galsdma_set_burstsize (CHANNEL, L1_CACHE_BYTES / 8); /* in 64 bit words (8 bytes) */ ++ galsdma_set_txle (CHANNEL); ++ galsdma_set_rxle (CHANNEL); ++ galsdma_set_RC (CHANNEL, 0xf); ++ galsdma_set_SFM (CHANNEL); ++ galsdma_set_RFT (CHANNEL); ++ ++ /* MPSC CONFIG */ ++ galmpsc_write_config_regs (CHANNEL, GALMPSC_UART); ++ galmpsc_config_channel_regs (CHANNEL); ++ galmpsc_set_char_length (CHANNEL, GALMPSC_CHAR_LENGTH_8); /* 8 */ ++ galmpsc_set_parity (CHANNEL, GALMPSC_PARITY_NONE); /* N */ ++ galmpsc_set_stop_bit_length (CHANNEL, GALMPSC_STOP_BITS_1); /* 1 */ ++ ++#ifdef CONFIG_MPSC_DEBUG_PORT ++ mpsc_debug_init (); ++#endif ++ ++ /* COMM_MPSC CONFIG */ ++#ifdef SOFTWARE_CACHE_MANAGEMENT ++ galmpsc_set_snoop (CHANNEL, 0); /* disable snoop */ ++#else ++ galmpsc_set_snoop (CHANNEL, 1); /* enable snoop */ ++#endif ++ ++ return 0; ++} ++ ++ ++void mpsc_sdma_init (void) ++{ ++ /* Setup SDMA channel0 SDMA_CONFIG_REG*/ ++ GT_REG_WRITE (SDMA_CONFIG_REG (0), 0x000020ff); ++ ++ /* Enable MPSC-Window0 for DRAM Bank 0 */ ++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_0_BIT, ++ MV64460_SDMA_DRAM_CS_0_TARGET, ++ 0, ++ memoryGetBankBaseAddress(0), ++ memoryGetBankSize(0)) != true) ++ printf ("%s: SDMA_Window0 memory setup failed !!! \n", ++ __FUNCTION__); ++ ++ ++ /* Enable MPSC-Window1 for DRAM Bank 1 */ ++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_1_BIT, ++ MV64460_SDMA_DRAM_CS_1_TARGET, ++ 0, ++ memoryGetBankBaseAddress(1), ++ memoryGetBankSize(1)) != true) ++ printf ("%s: SDMA_Window1 memory setup failed !!! \n", ++ __FUNCTION__); ++ ++ ++ /* Disable MPSC-Window2 */ ++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_2_BIT, ++ MV64460_SDMA_DRAM_CS_2_TARGET, ++ 0, ++ memoryGetBankBaseAddress(2), ++ memoryGetBankSize(2)) != true) ++ printf ("%s: SDMA_Window2 memory setup failed !!! \n", ++ __FUNCTION__); ++ ++ ++ /* Disable MPSC-Window3 */ ++ if (galsdma_set_mem_space (MV64460_CUNIT_BASE_ADDR_WIN_3_BIT, ++ MV64460_SDMA_DRAM_CS_3_TARGET, ++ 0, ++ memoryGetBankBaseAddress(3), ++ memoryGetBankSize(3)) != true) ++ printf ("%s: SDMA_Window3 memory setup failed !!! \n", ++ __FUNCTION__); ++ ++ /* Setup MPSC0 access mode Window0 full access */ ++ GT_SET_REG_BITS (MPSC0_ACCESS_PROTECTION_REG, ++ (MV64460_SDMA_WIN_ACCESS_FULL << ++ (MV64460_CUNIT_BASE_ADDR_WIN_0_BIT * 2))); ++ ++ /* Setup MPSC1 access mode Window1 full access */ ++ GT_SET_REG_BITS (MPSC1_ACCESS_PROTECTION_REG, ++ (MV64460_SDMA_WIN_ACCESS_FULL << ++ (MV64460_CUNIT_BASE_ADDR_WIN_0_BIT * 2))); ++ ++ /* Setup MPSC internal address space base address */ ++ GT_REG_WRITE (CUNIT_INTERNAL_SPACE_BASE_ADDR_REG, CFG_GT_REGS); ++ ++ /* no high address remap*/ ++ GT_REG_WRITE (CUNIT_HIGH_ADDR_REMAP_REG0, 0x00); ++ GT_REG_WRITE (CUNIT_HIGH_ADDR_REMAP_REG1, 0x00); ++ ++ /* clear interrupt cause register for MPSC (fault register)*/ ++ GT_REG_WRITE (CUNIT_INTERRUPT_CAUSE_REG, 0x00); ++} ++ ++ ++void mpsc_init2 (void) ++{ ++ int i; ++ ++#ifndef CONFIG_MPSC_DEBUG_PORT ++ mpsc_putchar = mpsc_putchar_sdma; ++ mpsc_getchar = mpsc_getchar_sdma; ++ mpsc_test_char = mpsc_test_char_sdma; ++#endif ++ /* RX descriptors */ ++ rx_desc_base = (unsigned int *) malloc (((RX_DESC + 1) * 8) * ++ sizeof (unsigned int)); ++ ++ /* align descriptors */ ++ rx_desc_base = (unsigned int *) ++ (((unsigned int) rx_desc_base + 32) & 0xFFFFFFF0); ++ ++ rx_desc_index = 0; ++ ++ memset ((void *) rx_desc_base, 0, ++ (RX_DESC * 8) * sizeof (unsigned int)); ++ ++ for (i = 0; i < RX_DESC; i++) { ++ rx_desc_base[i * 8 + 3] = (unsigned int) &rx_desc_base[i * 8 + 4]; /* Buffer */ ++ rx_desc_base[i * 8 + 2] = (unsigned int) &rx_desc_base[(i + 1) * 8]; /* Next descriptor */ ++ rx_desc_base[i * 8 + 1] = DESC_OWNER_BIT | DESC_FIRST | DESC_LAST; /* Command & control */ ++ rx_desc_base[i * 8] = 0x00100000; ++ } ++ rx_desc_base[(i - 1) * 8 + 2] = (unsigned int) &rx_desc_base[0]; ++ ++ FLUSH_DCACHE (&rx_desc_base[0], &rx_desc_base[RX_DESC * 8]); ++ GT_REG_WRITE (GALSDMA_0_CUR_RX_PTR + (CHANNEL * GALSDMA_REG_DIFF), ++ (unsigned int) &rx_desc_base[0]); ++ ++ /* TX descriptors */ ++ tx_desc_base = (unsigned int *) malloc (((TX_DESC + 1) * 8) * ++ sizeof (unsigned int)); ++ ++ /* align descriptors */ ++ tx_desc_base = (unsigned int *) ++ (((unsigned int) tx_desc_base + 32) & 0xFFFFFFF0); ++ ++ tx_desc_index = -1; ++ ++ memset ((void *) tx_desc_base, 0, ++ (TX_DESC * 8) * sizeof (unsigned int)); ++ ++ for (i = 0; i < TX_DESC; i++) { ++ tx_desc_base[i * 8 + 5] = (unsigned int) 0x23232323; ++ tx_desc_base[i * 8 + 4] = (unsigned int) 0x23232323; ++ tx_desc_base[i * 8 + 3] = ++ (unsigned int) &tx_desc_base[i * 8 + 4]; ++ tx_desc_base[i * 8 + 2] = ++ (unsigned int) &tx_desc_base[(i + 1) * 8]; ++ tx_desc_base[i * 8 + 1] = ++ DESC_OWNER_BIT | DESC_FIRST | DESC_LAST; ++ ++ /* set sbytecnt and shadow byte cnt to 1 */ ++ tx_desc_base[i * 8] = 0x00010001; ++ } ++ tx_desc_base[(i - 1) * 8 + 2] = (unsigned int) &tx_desc_base[0]; ++ ++ FLUSH_DCACHE (&tx_desc_base[0], &tx_desc_base[TX_DESC * 8]); ++ ++ udelay (100); ++ ++ galsdma_enable_rx (); ++ ++ return; ++} ++ ++int galbrg_set_baudrate (int channel, int rate) ++{ ++ int clock; ++ ++ galbrg_disable (channel); /*ok */ ++ ++#ifdef ZUMA_NTL ++ /* from tclk */ ++ clock = (CFG_TCLK / (16 * rate)) - 1; ++#else ++ clock = (CFG_TCLK / (16 * rate)) - 1; ++#endif ++ ++ galbrg_set_CDV (channel, clock); /* set timer Reg. for BRG */ ++ ++ galbrg_enable (channel); ++ ++ gd->baudrate = rate; ++ ++ return 0; ++} ++ ++/* ------------------------------------------------------------------ */ ++ ++/* Below are all the private functions that no one else needs */ ++ ++static int galbrg_set_CDV (int channel, int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP)); ++ temp &= 0xFFFF0000; ++ temp |= (value & 0x0000FFFF); ++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galbrg_enable (int channel) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP)); ++ temp |= 0x00010000; ++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galbrg_disable (int channel) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP)); ++ temp &= 0xFFFEFFFF; ++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galbrg_set_clksrc (int channel, int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP)); ++ temp &= 0xFFC3FFFF; /* Bit 18 - 21 (MV 64260 18-22) */ ++ temp |= (value << 18); ++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp); ++ return 0; ++} ++ ++static int galbrg_set_CUV (int channel, int value) ++{ ++ /* set CountUpValue */ ++ GT_REG_WRITE (GALBRG_0_BTREG + (channel * GALBRG_REG_GAP), value); ++ ++ return 0; ++} ++ ++#if 0 ++static int galbrg_reset (int channel) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP)); ++ temp |= 0x20000; ++ GT_REG_WRITE (GALBRG_0_CONFREG + (channel * GALBRG_REG_GAP), temp); ++ ++ return 0; ++} ++#endif ++ ++static int galsdma_set_RFT (int channel) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF)); ++ temp |= 0x00000001; ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF), ++ temp); ++ ++ return 0; ++} ++ ++static int galsdma_set_SFM (int channel) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF)); ++ temp |= 0x00000002; ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF), ++ temp); ++ ++ return 0; ++} ++ ++static int galsdma_set_rxle (int channel) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF)); ++ temp |= 0x00000040; ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF), ++ temp); ++ ++ return 0; ++} ++ ++static int galsdma_set_txle (int channel) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF)); ++ temp |= 0x00000080; ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF), ++ temp); ++ ++ return 0; ++} ++ ++static int galsdma_set_RC (int channel, unsigned int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF)); ++ temp &= ~0x0000003c; ++ temp |= (value << 2); ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF), ++ temp); ++ ++ return 0; ++} ++ ++static int galsdma_set_burstsize (int channel, unsigned int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALSDMA_0_CONF_REG + (channel * GALSDMA_REG_DIFF)); ++ temp &= 0xFFFFCFFF; ++ switch (value) { ++ case 8: ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + ++ (channel * GALSDMA_REG_DIFF), ++ (temp | (0x3 << 12))); ++ break; ++ ++ case 4: ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + ++ (channel * GALSDMA_REG_DIFF), ++ (temp | (0x2 << 12))); ++ break; ++ ++ case 2: ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + ++ (channel * GALSDMA_REG_DIFF), ++ (temp | (0x1 << 12))); ++ break; ++ ++ case 1: ++ GT_REG_WRITE (GALSDMA_0_CONF_REG + ++ (channel * GALSDMA_REG_DIFF), ++ (temp | (0x0 << 12))); ++ break; ++ ++ default: ++ return -1; ++ break; ++ } ++ ++ return 0; ++} ++ ++static int galmpsc_connect (int channel, int connect) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_ROUTING_REGISTER); ++ ++ if ((channel == 0) && connect) ++ temp &= ~0x00000007; ++ else if ((channel == 1) && connect) ++ temp &= ~(0x00000007 << 6); ++ else if ((channel == 0) && !connect) ++ temp |= 0x00000007; ++ else ++ temp |= (0x00000007 << 6); ++ ++ /* Just in case... */ ++ temp &= 0x3fffffff; ++ ++ GT_REG_WRITE (GALMPSC_ROUTING_REGISTER, temp); ++ ++ return 0; ++} ++ ++static int galmpsc_route_rx_clock (int channel, int brg) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_RxC_ROUTE); ++ ++ if (channel == 0) { ++ temp &= ~0x0000000F; ++ temp |= brg; ++ } else { ++ temp &= ~0x00000F00; ++ temp |= (brg << 8); ++ } ++ ++ GT_REG_WRITE (GALMPSC_RxC_ROUTE, temp); ++ ++ return 0; ++} ++ ++static int galmpsc_route_tx_clock (int channel, int brg) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_TxC_ROUTE); ++ ++ if (channel == 0) { ++ temp &= ~0x0000000F; ++ temp |= brg; ++ } else { ++ temp &= ~0x00000F00; ++ temp |= (brg << 8); ++ } ++ ++ GT_REG_WRITE (GALMPSC_TxC_ROUTE, temp); ++ ++ return 0; ++} ++ ++static int galmpsc_write_config_regs (int mpsc, int mode) ++{ ++ if (mode == GALMPSC_UART) { ++ /* Main config reg Low (Null modem, Enable Tx/Rx, UART mode) */ ++ GT_REG_WRITE (GALMPSC_MCONF_LOW + (mpsc * GALMPSC_REG_GAP), ++ 0x000004c4); ++ ++ /* Main config reg High (32x Rx/Tx clock mode, width=8bits */ ++ GT_REG_WRITE (GALMPSC_MCONF_HIGH + (mpsc * GALMPSC_REG_GAP), ++ 0x024003f8); ++ /* 22 2222 1111 */ ++ /* 54 3210 9876 */ ++ /* 0000 0010 0000 0000 */ ++ /* 1 */ ++ /* 098 7654 3210 */ ++ /* 0000 0011 1111 1000 */ ++ } else ++ return -1; ++ ++ return 0; ++} ++ ++static int galmpsc_config_channel_regs (int mpsc) ++{ ++ GT_REG_WRITE (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_3 + (mpsc * GALMPSC_REG_GAP), 1); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_4 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_5 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_6 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_7 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_8 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_9 + (mpsc * GALMPSC_REG_GAP), 0); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_10 + (mpsc * GALMPSC_REG_GAP), 0); ++ ++ galmpsc_set_brkcnt (mpsc, 0x3); ++ galmpsc_set_tcschar (mpsc, 0xab); ++ ++ return 0; ++} ++ ++static int galmpsc_set_brkcnt (int mpsc, int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP)); ++ temp &= 0x0000FFFF; ++ temp |= (value << 16); ++ GT_REG_WRITE (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galmpsc_set_tcschar (int mpsc, int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP)); ++ temp &= 0xFFFF0000; ++ temp |= value; ++ GT_REG_WRITE (GALMPSC_CHANNELREG_1 + (mpsc * GALMPSC_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galmpsc_set_char_length (int mpsc, int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP)); ++ temp &= 0xFFFFCFFF; ++ temp |= (value << 12); ++ GT_REG_WRITE (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galmpsc_set_stop_bit_length (int mpsc, int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP)); ++ temp &= 0xFFFFBFFF; ++ temp |= (value << 14); ++ GT_REG_WRITE (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galmpsc_set_parity (int mpsc, int value) ++{ ++ unsigned int temp; ++ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP)); ++ if (value != -1) { ++ temp &= 0xFFF3FFF3; ++ temp |= ((value << 18) | (value << 2)); ++ temp |= ((value << 17) | (value << 1)); ++ } else { ++ temp &= 0xFFF1FFF1; ++ } ++ ++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), temp); ++ ++ return 0; ++} ++ ++static int galmpsc_enter_hunt (int mpsc) ++{ ++ int temp; ++ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP)); ++ temp |= 0x80000000; ++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), temp); ++ ++ while (GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP)) & ++ MPSC_ENTER_HUNT) { ++ udelay (1); ++ } ++ return 0; ++} ++ ++ ++static int galmpsc_shutdown (int mpsc) ++{ ++ unsigned int temp; ++ ++ /* cause RX abort (clears RX) */ ++ temp = GTREGREAD (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP)); ++ temp |= MPSC_RX_ABORT | MPSC_TX_ABORT; ++ temp &= ~MPSC_ENTER_HUNT; ++ GT_REG_WRITE (GALMPSC_CHANNELREG_2 + (mpsc * GALMPSC_REG_GAP), temp); ++ ++ GT_REG_WRITE (GALSDMA_0_COM_REG, 0); ++ GT_REG_WRITE (GALSDMA_0_COM_REG, SDMA_TX_ABORT | SDMA_RX_ABORT); ++ ++ /* shut down the MPSC */ ++ GT_REG_WRITE (GALMPSC_MCONF_LOW, 0); ++ GT_REG_WRITE (GALMPSC_MCONF_HIGH, 0); ++ GT_REG_WRITE (GALMPSC_PROTOCONF_REG + (mpsc * GALMPSC_REG_GAP), 0); ++ ++ udelay (100); ++ ++ /* shut down the sdma engines. */ ++ /* reset config to default */ ++ GT_REG_WRITE (GALSDMA_0_CONF_REG, 0x000000fc); ++ ++ udelay (100); ++ ++ /* clear the SDMA current and first TX and RX pointers */ ++ GT_REG_WRITE (GALSDMA_0_CUR_RX_PTR, 0); ++ GT_REG_WRITE (GALSDMA_0_CUR_TX_PTR, 0); ++ GT_REG_WRITE (GALSDMA_0_FIR_TX_PTR, 0); ++ ++ udelay (100); ++ ++ return 0; ++} ++ ++static void galsdma_enable_rx (void) ++{ ++ int temp; ++ ++ /* Enable RX processing */ ++ temp = GTREGREAD (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF)); ++ temp |= RX_ENABLE; ++ GT_REG_WRITE (GALSDMA_0_COM_REG + (CHANNEL * GALSDMA_REG_DIFF), temp); ++ ++ galmpsc_enter_hunt (CHANNEL); ++} ++ ++static int galmpsc_set_snoop (int mpsc, int value) ++{ ++ int reg = ++ mpsc ? MPSC_1_ADDRESS_CONTROL_LOW : ++ MPSC_0_ADDRESS_CONTROL_LOW; ++ int temp = GTREGREAD (reg); ++ ++ if (value) ++ temp |= (1 << 6) | (1 << 14) | (1 << 22) | (1 << 30); ++ else ++ temp &= ~((1 << 6) | (1 << 14) | (1 << 22) | (1 << 30)); ++ GT_REG_WRITE (reg, temp); ++ return 0; ++} ++ ++/******************************************************************************* ++* galsdma_set_mem_space - Set MV64460 IDMA memory decoding map. ++* ++* DESCRIPTION: ++* the MV64460 SDMA has its own address decoding map that is de-coupled ++* from the CPU interface address decoding windows. The SDMA channels ++* share four address windows. Each region can be individually configured ++* by this function by associating it to a target interface and setting ++* base and size values. ++* ++* NOTE!!! ++* The size must be in 64Kbyte granularity. ++* The base address must be aligned to the size. ++* The size must be a series of 1s followed by a series of zeros ++* ++* OUTPUT: ++* None. ++* ++* RETURN: ++* True for success, false otherwise. ++* ++*******************************************************************************/ ++ ++static int galsdma_set_mem_space (unsigned int memSpace, ++ unsigned int memSpaceTarget, ++ unsigned int memSpaceAttr, ++ unsigned int baseAddress, unsigned int size) ++{ ++ unsigned int temp; ++ ++ if (size == 0) { ++ GT_RESET_REG_BITS (MV64460_CUNIT_BASE_ADDR_ENABLE_REG, ++ 1 << memSpace); ++ return true; ++ } ++ ++ /* The base address must be aligned to the size. */ ++ if (baseAddress % size != 0) { ++ return false; ++ } ++ if (size < 0x10000) { ++ return false; ++ } ++ ++ /* Align size and base to 64K */ ++ baseAddress &= 0xffff0000; ++ size &= 0xffff0000; ++ temp = size >> 16; ++ ++ /* Checking that the size is a sequence of '1' followed by a ++ sequence of '0' starting from LSB to MSB. */ ++ while ((temp > 0) && (temp & 0x1)) { ++ temp = temp >> 1; ++ } ++ ++ if (temp != 0) { ++ GT_REG_WRITE (MV64460_CUNIT_BASE_ADDR_REG0 + memSpace * 8, ++ (baseAddress | memSpaceTarget | memSpaceAttr)); ++ GT_REG_WRITE ((MV64460_CUNIT_SIZE0 + memSpace * 8), ++ (size - 1) & 0xffff0000); ++ GT_RESET_REG_BITS (MV64460_CUNIT_BASE_ADDR_ENABLE_REG, ++ 1 << memSpace); ++ } else { ++ /* An invalid size was specified */ ++ return false; ++ } ++ return true; ++} +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mpsc.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.h +--- u-boot-1.1.6/board/prodrive/p3mx/mpsc.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mpsc.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,156 @@ ++/* ++ * (C) Copyright 2001 ++ * John Clemens <clemens@mclx.com>, Mission Critical Linux, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/************************************************************************* ++ * changes for Marvell DB64360 eval board 2003 by Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ ************************************************************************/ ++ ++ ++/* ++ * mpsc.h - header file for MPSC in uart mode (console driver) ++ */ ++ ++#ifndef __MPSC_H__ ++#define __MPSC_H__ ++ ++/* include actual Galileo defines */ ++#include "../../Marvell/include/mv_gen_reg.h" ++ ++/* driver related defines */ ++ ++int mpsc_init(int baud); ++void mpsc_sdma_init(void); ++void mpsc_init2(void); ++int galbrg_set_baudrate(int channel, int rate); ++ ++int mpsc_putchar_early(char ch); ++char mpsc_getchar_debug(void); ++int mpsc_test_char_debug(void); ++ ++int mpsc_test_char_sdma(void); ++ ++extern int (*mpsc_putchar)(char ch); ++extern char (*mpsc_getchar)(void); ++extern int (*mpsc_test_char)(void); ++ ++#define CHANNEL CONFIG_MPSC_PORT ++ ++#define TX_DESC 5 ++#define RX_DESC 20 ++ ++#define DESC_FIRST 0x00010000 ++#define DESC_LAST 0x00020000 ++#define DESC_OWNER_BIT 0x80000000 ++ ++#define TX_DEMAND 0x00800000 ++#define TX_STOP 0x00010000 ++#define RX_ENABLE 0x00000080 ++ ++#define SDMA_RX_ABORT (1 << 15) ++#define SDMA_TX_ABORT (1 << 31) ++#define MPSC_TX_ABORT (1 << 7) ++#define MPSC_RX_ABORT (1 << 23) ++#define MPSC_ENTER_HUNT (1 << 31) ++ ++/* MPSC defines */ ++ ++#define GALMPSC_CONNECT 0x1 ++#define GALMPSC_DISCONNECT 0x0 ++ ++#define GALMPSC_UART 0x1 ++ ++#define GALMPSC_STOP_BITS_1 0x0 ++#define GALMPSC_STOP_BITS_2 0x1 ++#define GALMPSC_CHAR_LENGTH_8 0x3 ++#define GALMPSC_CHAR_LENGTH_7 0x2 ++ ++#define GALMPSC_PARITY_ODD 0x0 ++#define GALMPSC_PARITY_EVEN 0x2 ++#define GALMPSC_PARITY_MARK 0x3 ++#define GALMPSC_PARITY_SPACE 0x1 ++#define GALMPSC_PARITY_NONE -1 ++ ++#define GALMPSC_SERIAL_MULTIPLEX SERIAL_PORT_MULTIPLEX /* 0xf010 */ ++#define GALMPSC_ROUTING_REGISTER MAIN_ROUTING_REGISTER /* 0xb400 */ ++#define GALMPSC_RxC_ROUTE RECEIVE_CLOCK_ROUTING_REGISTER /* 0xb404 */ ++#define GALMPSC_TxC_ROUTE TRANSMIT_CLOCK_ROUTING_REGISTER /* 0xb408 */ ++#define GALMPSC_MCONF_LOW MPSC0_MAIN_CONFIGURATION_LOW /* 0x8000 */ ++#define GALMPSC_MCONF_HIGH MPSC0_MAIN_CONFIGURATION_HIGH /* 0x8004 */ ++#define GALMPSC_PROTOCONF_REG MPSC0_PROTOCOL_CONFIGURATION /* 0x8008 */ ++ ++#define GALMPSC_REG_GAP 0x1000 ++ ++#define GALMPSC_MCONF_CHREG_BASE CHANNEL0_REGISTER1 /* 0x800c */ ++#define GALMPSC_CHANNELREG_1 CHANNEL0_REGISTER1 /* 0x800c */ ++#define GALMPSC_CHANNELREG_2 CHANNEL0_REGISTER2 /* 0x8010 */ ++#define GALMPSC_CHANNELREG_3 CHANNEL0_REGISTER3 /* 0x8014 */ ++#define GALMPSC_CHANNELREG_4 CHANNEL0_REGISTER4 /* 0x8018 */ ++#define GALMPSC_CHANNELREG_5 CHANNEL0_REGISTER5 /* 0x801c */ ++#define GALMPSC_CHANNELREG_6 CHANNEL0_REGISTER6 /* 0x8020 */ ++#define GALMPSC_CHANNELREG_7 CHANNEL0_REGISTER7 /* 0x8024 */ ++#define GALMPSC_CHANNELREG_8 CHANNEL0_REGISTER8 /* 0x8028 */ ++#define GALMPSC_CHANNELREG_9 CHANNEL0_REGISTER9 /* 0x802c */ ++#define GALMPSC_CHANNELREG_10 CHANNEL0_REGISTER10 /* 0x8030 */ ++#define GALMPSC_CHANNELREG_11 CHANNEL0_REGISTER11 /* 0x8034 */ ++ ++#define GALSDMA_COMMAND_FIRST (1 << 16) ++#define GALSDMA_COMMAND_LAST (1 << 17) ++#define GALSDMA_COMMAND_ENABLEINT (1 << 23) ++#define GALSDMA_COMMAND_AUTO (1 << 30) ++#define GALSDMA_COMMAND_OWNER (1 << 31) ++ ++#define GALSDMA_RX 0 ++#define GALSDMA_TX 1 ++ ++/* CHANNEL2 should be CHANNEL1, according to documentation, ++ * but to work with the current GTREGS file... ++ */ ++#define GALSDMA_0_CONF_REG CHANNEL0_CONFIGURATION_REGISTER /* 0x4000 */ ++#define GALSDMA_1_CONF_REG CHANNEL2_CONFIGURATION_REGISTER /* 0x6000 */ ++#define GALSDMA_0_COM_REG CHANNEL0_COMMAND_REGISTER /* 0x4008 */ ++#define GALSDMA_1_COM_REG CHANNEL2_COMMAND_REGISTER /* 0x6008 */ ++#define GALSDMA_0_CUR_RX_PTR CHANNEL0_CURRENT_RX_DESCRIPTOR_POINTER /* 0x4810 */ ++#define GALSDMA_0_CUR_TX_PTR CHANNEL0_CURRENT_TX_DESCRIPTOR_POINTER /* 0x4c10 */ ++#define GALSDMA_0_FIR_TX_PTR CHANNEL0_FIRST_TX_DESCRIPTOR_POINTER /* 0x4c14 */ ++#define GALSDMA_1_CUR_RX_PTR CHANNEL2_CURRENT_RX_DESCRIPTOR_POINTER /* 0x6810 */ ++#define GALSDMA_1_CUR_TX_PTR CHANNEL2_CURRENT_TX_DESCRIPTOR_POINTER /* 0x6c10 */ ++#define GALSDMA_1_FIR_TX_PTR CHANNEL2_FIRST_TX_DESCRIPTOR_POINTER /* 0x6c14 */ ++#define GALSDMA_REG_DIFF 0x2000 ++ ++/* WRONG in gt64260R.h */ ++#define GALSDMA_INT_CAUSE 0xb800 /* SDMA_CAUSE */ ++#define GALSDMA_INT_MASK 0xb880 /* SDMA_MASK */ ++#define GALMPSC_0_INT_CAUSE 0xb804 ++#define GALMPSC_0_INT_MASK 0xb884 ++ ++#define GALSDMA_MODE_UART 0 ++#define GALSDMA_MODE_BISYNC 1 ++#define GALSDMA_MODE_HDLC 2 ++#define GALSDMA_MODE_TRANSPARENT 3 ++ ++#define GALBRG_0_CONFREG BRG0_CONFIGURATION_REGISTER /* 0xb200 */ ++#define GALBRG_REG_GAP 0x0008 ++#define GALBRG_0_BTREG BRG0_BAUDE_TUNING_REGISTER /* 0xb204 */ ++ ++#endif /* __MPSC_H__ */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mv_eth.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.c +--- u-boot-1.1.6/board/prodrive/p3mx/mv_eth.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,3344 @@ ++/* ++ * (C) Copyright 2003 ++ * Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ * based on - Driver for MV64460X ethernet ports ++ * Copyright (C) 2002 rabeeh@galileo.co.il ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ 3 the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ * mv_eth.c - header file for the polled mode GT ethernet driver ++ */ ++#include <common.h> ++#include <net.h> ++#include <malloc.h> ++#include <miiphy.h> ++ ++#include "mv_eth.h" ++ ++/* enable Debug outputs */ ++ ++#undef DEBUG_MV_ETH ++ ++#ifdef DEBUG_MV_ETH ++#define DEBUG ++#define DP(x) x ++#else ++#define DP(x) ++#endif ++ ++/* PHY DFCDL Registers */ ++#define ETH_PHY_DFCDL_CONFIG0_REG 0x2100 ++#define ETH_PHY_DFCDL_CONFIG1_REG 0x2104 ++#define ETH_PHY_DFCDL_ADDR_REG 0x2110 ++#define ETH_PHY_DFCDL_DATA0_REG 0x2114 ++ ++#define PHY_AUTONEGOTIATE_TIMEOUT 4000 /* 4000 ms autonegotiate timeout */ ++#define PHY_UPDATE_TIMEOUT 10000 ++ ++#undef MV64460_CHECKSUM_OFFLOAD ++/************************************************************************* ++* The first part is the high level driver of the gigE ethernet ports. * ++*************************************************************************/ ++ ++/* Definition for configuring driver */ ++/* #define UPDATE_STATS_BY_SOFTWARE */ ++#undef MV64460_RX_QUEUE_FILL_ON_TASK ++ ++/* Constants */ ++#define MAGIC_ETH_RUNNING 8031971 ++#define MV64460_INTERNAL_SRAM_SIZE _256K ++#define EXTRA_BYTES 32 ++#define WRAP ETH_HLEN + 2 + 4 + 16 ++#define BUFFER_MTU dev->mtu + WRAP ++#define INT_CAUSE_UNMASK_ALL 0x0007ffff ++#define INT_CAUSE_UNMASK_ALL_EXT 0x0011ffff ++#ifdef MV64460_RX_FILL_ON_TASK ++#define INT_CAUSE_MASK_ALL 0x00000000 ++#define INT_CAUSE_CHECK_BITS INT_CAUSE_UNMASK_ALL ++#define INT_CAUSE_CHECK_BITS_EXT INT_CAUSE_UNMASK_ALL_EXT ++#endif ++ ++/* Read/Write to/from MV64460 internal registers */ ++#define MV_REG_READ(offset) my_le32_to_cpu(* (volatile unsigned int *) (INTERNAL_REG_BASE_ADDR + offset)) ++#define MV_REG_WRITE(offset,data) *(volatile unsigned int *) (INTERNAL_REG_BASE_ADDR + offset) = my_cpu_to_le32 (data) ++#define MV_SET_REG_BITS(regOffset,bits) ((*((volatile unsigned int*)((INTERNAL_REG_BASE_ADDR) + (regOffset)))) |= ((unsigned int)my_cpu_to_le32(bits))) ++#define MV_RESET_REG_BITS(regOffset,bits) ((*((volatile unsigned int*)((INTERNAL_REG_BASE_ADDR) + (regOffset)))) &= ~((unsigned int)my_cpu_to_le32(bits))) ++ ++#define my_cpu_to_le32(x) my_le32_to_cpu((x)) ++ ++/* Static function declarations */ ++static int mv64460_eth_real_open (struct eth_device *eth); ++static int mv64460_eth_real_stop (struct eth_device *eth); ++static struct net_device_stats *mv64460_eth_get_stats (struct eth_device ++ *dev); ++static void eth_port_init_mac_tables (ETH_PORT eth_port_num); ++static void mv64460_eth_update_stat (struct eth_device *dev); ++bool db64460_eth_start (struct eth_device *eth); ++unsigned int eth_read_mib_counter (ETH_PORT eth_port_num, ++ unsigned int mib_offset); ++int mv64460_eth_receive (struct eth_device *dev); ++ ++int mv64460_eth_xmit (struct eth_device *, volatile void *packet, int length); ++ ++int mv_miiphy_read(char *devname, unsigned char phy_addr, ++ unsigned char phy_reg, unsigned short *value); ++int mv_miiphy_write(char *devname, unsigned char phy_addr, ++ unsigned char phy_reg, unsigned short value); ++ ++int phy_setup_aneg (char *devname, unsigned char addr); ++ ++#ifndef UPDATE_STATS_BY_SOFTWARE ++static void mv64460_eth_print_stat (struct eth_device *dev); ++#endif ++/* Processes a received packet */ ++extern void NetReceive (volatile uchar *, int); ++ ++extern unsigned int INTERNAL_REG_BASE_ADDR; ++ ++unsigned long my_le32_to_cpu (unsigned long x) ++{ ++ return (((x & 0x000000ffU) << 24) | ++ ((x & 0x0000ff00U) << 8) | ++ ((x & 0x00ff0000U) >> 8) | ((x & 0xff000000U) >> 24)); ++} ++ ++/************************************************* ++ *Helper functions - used inside the driver only * ++ *************************************************/ ++#ifdef DEBUG_MV_ETH ++void print_globals (struct eth_device *dev) ++{ ++ printf ("Ethernet PRINT_Globals-Debug function\n"); ++ printf ("Base Address for ETH_PORT_INFO: %08x\n", ++ (unsigned int) dev->priv); ++ printf ("Base Address for mv64460_eth_priv: %08x\n", ++ (unsigned int) &(((ETH_PORT_INFO *) dev->priv)-> ++ port_private)); ++ ++ printf ("GT Internal Base Address: %08x\n", ++ INTERNAL_REG_BASE_ADDR); ++ printf ("Base Address for TX-DESCs: %08x Number of allocated Buffers %d\n", ++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)->p_tx_desc_area_base[0], MV64460_TX_QUEUE_SIZE); ++ printf ("Base Address for RX-DESCs: %08x Number of allocated Buffers %d\n", ++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)->p_rx_desc_area_base[0], MV64460_RX_QUEUE_SIZE); ++ printf ("Base Address for RX-Buffer: %08x allocated Bytes %d\n", ++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)-> ++ p_rx_buffer_base[0], ++ (MV64460_RX_QUEUE_SIZE * MV64460_RX_BUFFER_SIZE) + 32); ++ printf ("Base Address for TX-Buffer: %08x allocated Bytes %d\n", ++ (unsigned int) ((ETH_PORT_INFO *) dev->priv)-> ++ p_tx_buffer_base[0], ++ (MV64460_TX_QUEUE_SIZE * MV64460_TX_BUFFER_SIZE) + 32); ++} ++#endif ++ ++/********************************************************************** ++ * mv64460_eth_print_phy_status ++ * ++ * Prints gigabit ethenret phy status ++ * ++ * Input : pointer to ethernet interface network device structure ++ * Output : N/A ++ **********************************************************************/ ++void mv64460_eth_print_phy_status (struct eth_device *dev) ++{ ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ ETH_PORT_INFO *ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ unsigned int port_status, phy_reg_data; ++ ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ /* Check Link status on phy */ ++ eth_port_read_smi_reg (port_num, 1, &phy_reg_data); ++ if (!(phy_reg_data & 0x20)) { ++ printf ("Ethernet port changed link status to DOWN\n"); ++ } else { ++ port_status = ++ MV_REG_READ (MV64460_ETH_PORT_STATUS_REG (port_num)); ++ printf ("Ethernet status port %d: Link up", port_num); ++ printf (", %s", ++ (port_status & BIT2) ? "Full Duplex" : "Half Duplex"); ++ if (port_status & BIT4) ++ printf (", Speed 1 Gbps"); ++ else ++ printf (", %s", ++ (port_status & BIT5) ? "Speed 100 Mbps" : ++ "Speed 10 Mbps"); ++ printf ("\n"); ++ } ++} ++ ++/********************************************************************** ++ * u-boot entry functions for mv64460_eth ++ * ++ **********************************************************************/ ++int db64460_eth_probe (struct eth_device *dev) ++{ ++ return ((int) db64460_eth_start (dev)); ++} ++ ++int db64460_eth_poll (struct eth_device *dev) ++{ ++ return mv64460_eth_receive (dev); ++} ++ ++int db64460_eth_transmit (struct eth_device *dev, volatile void *packet, ++ int length) ++{ ++ mv64460_eth_xmit (dev, packet, length); ++ return 0; ++} ++ ++void db64460_eth_disable (struct eth_device *dev) ++{ ++ mv64460_eth_stop (dev); ++} ++ ++#define DFCDL(write,read) ((write << 6) | read) ++unsigned int ethDfcdls[] = { ++ DFCDL(0,0), DFCDL(1,1), DFCDL(2,2), DFCDL(3,3), ++ DFCDL(4,4), DFCDL(5,5), DFCDL(6,6), DFCDL(7,7), ++ DFCDL(8,8), DFCDL(9,9), DFCDL(10,10), DFCDL(11,11), ++ DFCDL(12,12), DFCDL(13,13), DFCDL(14,14), DFCDL(15,15), ++ DFCDL(16,16), DFCDL(17,17), DFCDL(18,18), DFCDL(19,19), ++ DFCDL(20,20), DFCDL(21,21), DFCDL(22,22), DFCDL(23,23), ++ DFCDL(24,24), DFCDL(25,25), DFCDL(26,26), DFCDL(27,27), ++ DFCDL(28,28), DFCDL(29,29), DFCDL(30,30), DFCDL(31,31), ++ DFCDL(32,32), DFCDL(33,33), DFCDL(34,34), DFCDL(35,35), ++ DFCDL(36,36), DFCDL(37,37), DFCDL(38,38), DFCDL(39,39), ++ DFCDL(40,40), DFCDL(41,41), DFCDL(42,42), DFCDL(43,43), ++ DFCDL(44,44), DFCDL(45,45), DFCDL(46,46), DFCDL(47,47), ++ DFCDL(48,48), DFCDL(49,49), DFCDL(50,50), DFCDL(51,51), ++ DFCDL(52,52), DFCDL(53,53), DFCDL(54,54), DFCDL(55,55), ++ DFCDL(56,56), DFCDL(57,57), DFCDL(58,58), DFCDL(59,59), ++ DFCDL(60,60), DFCDL(61,61), DFCDL(62,62), DFCDL(63,63), ++}; ++ ++void mv_eth_phy_init (void) ++{ ++ int i; ++ ++ MV_REG_WRITE (ETH_PHY_DFCDL_ADDR_REG, 0); ++ ++ for (i = 0; i < 64; i++) { ++ MV_REG_WRITE (ETH_PHY_DFCDL_DATA0_REG, ethDfcdls[i]); ++ } ++ ++ MV_REG_WRITE (ETH_PHY_DFCDL_CONFIG0_REG, 0x300000); ++} ++ ++void mv6446x_eth_initialize (bd_t * bis) ++{ ++ struct eth_device *dev; ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ int devnum, x, temp; ++ char *s, *e, buf[64]; ++ ++ /* P3M750 only ++ * Set RGMII clock drives strength ++ */ ++ temp = MV_REG_READ(0x20A0); ++ temp |= 0x04000080; ++ MV_REG_WRITE(0x20A0, temp); ++ ++ mv_eth_phy_init(); ++ ++ for (devnum = 0; devnum < MV_ETH_DEVS; devnum++) { ++ dev = calloc (sizeof (*dev), 1); ++ if (!dev) { ++ printf ("%s: mv_enet%d allocation failure, %s\n", ++ __FUNCTION__, devnum, "eth_device structure"); ++ return; ++ } ++ ++ /* must be less than NAMESIZE (16) */ ++ sprintf (dev->name, "mv_enet%d", devnum); ++ ++#ifdef DEBUG ++ printf ("Initializing %s\n", dev->name); ++#endif ++ ++ /* Extract the MAC address from the environment */ ++ switch (devnum) { ++ case 0: ++ s = "ethaddr"; ++ break; ++ case 1: ++ s = "eth1addr"; ++ break; ++ case 2: ++ s = "eth2addr"; ++ break; ++ default: /* this should never happen */ ++ printf ("%s: Invalid device number %d\n", ++ __FUNCTION__, devnum); ++ return; ++ } ++ ++ temp = getenv_r (s, buf, sizeof (buf)); ++ s = (temp > 0) ? buf : NULL; ++ ++#ifdef DEBUG ++ printf ("Setting MAC %d to %s\n", devnum, s); ++#endif ++ for (x = 0; x < 6; ++x) { ++ dev->enetaddr[x] = s ? simple_strtoul (s, &e, 16) : 0; ++ if (s) ++ s = (*e) ? e + 1 : e; ++ } ++ /* ronen - set the MAC addr in the HW */ ++ eth_port_uc_addr_set (devnum, dev->enetaddr, 0); ++ ++ dev->init = (void *) db64460_eth_probe; ++ dev->halt = (void *) ethernet_phy_reset; ++ dev->send = (void *) db64460_eth_transmit; ++ dev->recv = (void *) db64460_eth_poll; ++ ++ ethernet_private = calloc (sizeof (*ethernet_private), 1); ++ dev->priv = (void *)ethernet_private; ++ if (!ethernet_private) { ++ printf ("%s: %s allocation failure, %s\n", ++ __FUNCTION__, dev->name, ++ "Private Device Structure"); ++ free (dev); ++ return; ++ } ++ /* start with an zeroed ETH_PORT_INFO */ ++ memset (ethernet_private, 0, sizeof (ETH_PORT_INFO)); ++ memcpy (ethernet_private->port_mac_addr, dev->enetaddr, 6); ++ ++ /* set pointer to memory for stats data structure etc... */ ++ port_private = calloc (sizeof (*ethernet_private), 1); ++ ethernet_private->port_private = (void *)port_private; ++ if (!port_private) { ++ printf ("%s: %s allocation failure, %s\n", ++ __FUNCTION__, dev->name, ++ "Port Private Device Structure"); ++ ++ free (ethernet_private); ++ free (dev); ++ return; ++ } ++ ++ port_private->stats = ++ calloc (sizeof (struct net_device_stats), 1); ++ if (!port_private->stats) { ++ printf ("%s: %s allocation failure, %s\n", ++ __FUNCTION__, dev->name, ++ "Net stat Structure"); ++ ++ free (port_private); ++ free (ethernet_private); ++ free (dev); ++ return; ++ } ++ memset (ethernet_private->port_private, 0, ++ sizeof (struct mv64460_eth_priv)); ++ switch (devnum) { ++ case 0: ++ ethernet_private->port_num = ETH_0; ++ break; ++ case 1: ++ ethernet_private->port_num = ETH_1; ++ break; ++ case 2: ++ ethernet_private->port_num = ETH_2; ++ break; ++ default: ++ printf ("Invalid device number %d\n", devnum); ++ break; ++ }; ++ ++ port_private->port_num = devnum; ++ /* ++ * Read MIB counter on the GT in order to reset them, ++ * then zero all the stats fields in memory ++ */ ++ mv64460_eth_update_stat (dev); ++ memset (port_private->stats, 0, ++ sizeof (struct net_device_stats)); ++ /* Extract the MAC address from the environment */ ++ switch (devnum) { ++ case 0: ++ s = "ethaddr"; ++ break; ++ case 1: ++ s = "eth1addr"; ++ break; ++ case 2: ++ s = "eth2addr"; ++ break; ++ default: /* this should never happen */ ++ printf ("%s: Invalid device number %d\n", ++ __FUNCTION__, devnum); ++ return; ++ } ++ ++ temp = getenv_r (s, buf, sizeof (buf)); ++ s = (temp > 0) ? buf : NULL; ++ ++#ifdef DEBUG ++ printf ("Setting MAC %d to %s\n", devnum, s); ++#endif ++ for (x = 0; x < 6; ++x) { ++ dev->enetaddr[x] = s ? simple_strtoul (s, &e, 16) : 0; ++ if (s) ++ s = (*e) ? e + 1 : e; ++ } ++ ++ DP (printf ("Allocating descriptor and buffer rings\n")); ++ ++ ethernet_private->p_rx_desc_area_base[0] = ++ (ETH_RX_DESC *) memalign (16, ++ RX_DESC_ALIGNED_SIZE * ++ MV64460_RX_QUEUE_SIZE + 1); ++ ethernet_private->p_tx_desc_area_base[0] = ++ (ETH_TX_DESC *) memalign (16, ++ TX_DESC_ALIGNED_SIZE * ++ MV64460_TX_QUEUE_SIZE + 1); ++ ++ ethernet_private->p_rx_buffer_base[0] = ++ (char *) memalign (16, ++ MV64460_RX_QUEUE_SIZE * ++ MV64460_TX_BUFFER_SIZE + 1); ++ ethernet_private->p_tx_buffer_base[0] = ++ (char *) memalign (16, ++ MV64460_RX_QUEUE_SIZE * ++ MV64460_TX_BUFFER_SIZE + 1); ++ ++#ifdef DEBUG_MV_ETH ++ /* DEBUG OUTPUT prints adresses of globals */ ++ print_globals (dev); ++#endif ++ eth_register (dev); ++ ++ miiphy_register(dev->name, mv_miiphy_read, mv_miiphy_write); ++ } ++ DP (printf ("%s: exit\n", __FUNCTION__)); ++ ++} ++ ++/********************************************************************** ++ * mv64460_eth_open ++ * ++ * This function is called when openning the network device. The function ++ * should initialize all the hardware, initialize cyclic Rx/Tx ++ * descriptors chain and buffers and allocate an IRQ to the network ++ * device. ++ * ++ * Input : a pointer to the network device structure ++ * / / ronen - changed the output to match net/eth.c needs ++ * Output : nonzero of success , zero if fails. ++ * under construction ++ **********************************************************************/ ++ ++int mv64460_eth_open (struct eth_device *dev) ++{ ++ return (mv64460_eth_real_open (dev)); ++} ++ ++/* Helper function for mv64460_eth_open */ ++static int mv64460_eth_real_open (struct eth_device *dev) ++{ ++ ++ unsigned int queue; ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ u32 port_status; ++ ushort reg_short; ++ int speed; ++ int duplex; ++ int i; ++ int reg; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ /* ronen - when we update the MAC env params we only update dev->enetaddr ++ see ./net/eth.c eth_set_enetaddr() */ ++ memcpy (ethernet_private->port_mac_addr, dev->enetaddr, 6); ++ ++ port_private = (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ /* Stop RX Queues */ ++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (port_num), 0x0000ff00); ++ ++ /* Clear the ethernet port interrupts */ ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_REG (port_num), 0); ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG (port_num), 0); ++ ++ /* Unmask RX buffer and TX end interrupt */ ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_MASK_REG (port_num), ++ INT_CAUSE_UNMASK_ALL); ++ ++ /* Unmask phy and link status changes interrupts */ ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_EXTEND_MASK_REG (port_num), ++ INT_CAUSE_UNMASK_ALL_EXT); ++ ++ /* Set phy address of the port */ ++ ethernet_private->port_phy_addr = 0x1 + (port_num << 1); ++ reg = ethernet_private->port_phy_addr; ++ ++ /* Activate the DMA channels etc */ ++ eth_port_init (ethernet_private); ++ ++ /* "Allocate" setup TX rings */ ++ ++ for (queue = 0; queue < MV64460_TX_QUEUE_NUM; queue++) { ++ unsigned int size; ++ ++ port_private->tx_ring_size[queue] = MV64460_TX_QUEUE_SIZE; ++ size = (port_private->tx_ring_size[queue] * TX_DESC_ALIGNED_SIZE); /*size = no of DESCs times DESC-size */ ++ ethernet_private->tx_desc_area_size[queue] = size; ++ ++ /* first clear desc area completely */ ++ memset ((void *) ethernet_private->p_tx_desc_area_base[queue], ++ 0, ethernet_private->tx_desc_area_size[queue]); ++ ++ /* initialize tx desc ring with low level driver */ ++ if (ether_init_tx_desc_ring ++ (ethernet_private, ETH_Q0, ++ port_private->tx_ring_size[queue], ++ MV64460_TX_BUFFER_SIZE /* Each Buffer is 1600 Byte */ , ++ (unsigned int) ethernet_private-> ++ p_tx_desc_area_base[queue], ++ (unsigned int) ethernet_private-> ++ p_tx_buffer_base[queue]) == false) ++ printf ("### Error initializing TX Ring\n"); ++ } ++ ++ /* "Allocate" setup RX rings */ ++ for (queue = 0; queue < MV64460_RX_QUEUE_NUM; queue++) { ++ unsigned int size; ++ ++ /* Meantime RX Ring are fixed - but must be configurable by user */ ++ port_private->rx_ring_size[queue] = MV64460_RX_QUEUE_SIZE; ++ size = (port_private->rx_ring_size[queue] * ++ RX_DESC_ALIGNED_SIZE); ++ ethernet_private->rx_desc_area_size[queue] = size; ++ ++ /* first clear desc area completely */ ++ memset ((void *) ethernet_private->p_rx_desc_area_base[queue], ++ 0, ethernet_private->rx_desc_area_size[queue]); ++ if ((ether_init_rx_desc_ring ++ (ethernet_private, ETH_Q0, ++ port_private->rx_ring_size[queue], ++ MV64460_RX_BUFFER_SIZE /* Each Buffer is 1600 Byte */ , ++ (unsigned int) ethernet_private-> ++ p_rx_desc_area_base[queue], ++ (unsigned int) ethernet_private-> ++ p_rx_buffer_base[queue])) == false) ++ printf ("### Error initializing RX Ring\n"); ++ } ++ ++ eth_port_start (ethernet_private); ++ ++ /* Set maximum receive buffer to 9700 bytes */ ++ MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (port_num), ++ (0x5 << 17) | ++ (MV_REG_READ ++ (MV64460_ETH_PORT_SERIAL_CONTROL_REG (port_num)) ++ & 0xfff1ffff)); ++ ++ /* ++ * Set ethernet MTU for leaky bucket mechanism to 0 - this will ++ * disable the leaky bucket mechanism . ++ */ ++ ++ MV_REG_WRITE (MV64460_ETH_MAXIMUM_TRANSMIT_UNIT (port_num), 0); ++ port_status = MV_REG_READ (MV64460_ETH_PORT_STATUS_REG (port_num)); ++ ++#if defined(CONFIG_PHY_RESET) ++ /* ++ * Reset the phy, only if its the first time through ++ * otherwise, just check the speeds & feeds ++ */ ++ if (port_private->first_init == 0) { ++ port_private->first_init = 1; ++ ethernet_phy_reset (port_num); ++ ++ /* Start/Restart autonegotiation */ ++ phy_setup_aneg (dev->name, reg); ++ udelay (1000); ++ } ++#endif /* defined(CONFIG_PHY_RESET) */ ++ ++ miiphy_read (dev->name, reg, PHY_BMSR, ®_short); ++ ++ /* ++ * Wait if PHY is capable of autonegotiation and autonegotiation is not complete ++ */ ++ if ((reg_short & PHY_BMSR_AUTN_ABLE) ++ && !(reg_short & PHY_BMSR_AUTN_COMP)) { ++ puts ("Waiting for PHY auto negotiation to complete"); ++ i = 0; ++ while (!(reg_short & PHY_BMSR_AUTN_COMP)) { ++ /* ++ * Timeout reached ? ++ */ ++ if (i > PHY_AUTONEGOTIATE_TIMEOUT) { ++ puts (" TIMEOUT !\n"); ++ break; ++ } ++ ++ if ((i++ % 1000) == 0) { ++ putc ('.'); ++ } ++ udelay (1000); /* 1 ms */ ++ miiphy_read (dev->name, reg, PHY_BMSR, ®_short); ++ ++ } ++ puts (" done\n"); ++ udelay (500000); /* another 500 ms (results in faster booting) */ ++ } ++ ++ speed = miiphy_speed (dev->name, reg); ++ duplex = miiphy_duplex (dev->name, reg); ++ ++ printf ("ENET Speed is %d Mbps - %s duplex connection\n", ++ (int) speed, (duplex == HALF) ? "HALF" : "FULL"); ++ ++ port_private->eth_running = MAGIC_ETH_RUNNING; ++ return 1; ++} ++ ++static int mv64460_eth_free_tx_rings (struct eth_device *dev) ++{ ++ unsigned int queue; ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ volatile ETH_TX_DESC *p_tx_curr_desc; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ /* Stop Tx Queues */ ++ MV_REG_WRITE (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG (port_num), ++ 0x0000ff00); ++ ++ /* Free TX rings */ ++ DP (printf ("Clearing previously allocated TX queues... ")); ++ for (queue = 0; queue < MV64460_TX_QUEUE_NUM; queue++) { ++ /* Free on TX rings */ ++ for (p_tx_curr_desc = ++ ethernet_private->p_tx_desc_area_base[queue]; ++ ((unsigned int) p_tx_curr_desc <= (unsigned int) ++ ethernet_private->p_tx_desc_area_base[queue] + ++ ethernet_private->tx_desc_area_size[queue]); ++ p_tx_curr_desc = ++ (ETH_TX_DESC *) ((unsigned int) p_tx_curr_desc + ++ TX_DESC_ALIGNED_SIZE)) { ++ /* this is inside for loop */ ++ if (p_tx_curr_desc->return_info != 0) { ++ p_tx_curr_desc->return_info = 0; ++ DP (printf ("freed\n")); ++ } ++ } ++ DP (printf ("Done\n")); ++ } ++ return 0; ++} ++ ++static int mv64460_eth_free_rx_rings (struct eth_device *dev) ++{ ++ unsigned int queue; ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ volatile ETH_RX_DESC *p_rx_curr_desc; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ /* Stop RX Queues */ ++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (port_num), ++ 0x0000ff00); ++ ++ /* Free RX rings */ ++ DP (printf ("Clearing previously allocated RX queues... ")); ++ for (queue = 0; queue < MV64460_RX_QUEUE_NUM; queue++) { ++ /* Free preallocated skb's on RX rings */ ++ for (p_rx_curr_desc = ++ ethernet_private->p_rx_desc_area_base[queue]; ++ (((unsigned int) p_rx_curr_desc < ++ ((unsigned int) ethernet_private-> ++ p_rx_desc_area_base[queue] + ++ ethernet_private->rx_desc_area_size[queue]))); ++ p_rx_curr_desc = ++ (ETH_RX_DESC *) ((unsigned int) p_rx_curr_desc + ++ RX_DESC_ALIGNED_SIZE)) { ++ if (p_rx_curr_desc->return_info != 0) { ++ p_rx_curr_desc->return_info = 0; ++ DP (printf ("freed\n")); ++ } ++ } ++ DP (printf ("Done\n")); ++ } ++ return 0; ++} ++ ++/********************************************************************** ++ * mv64460_eth_stop ++ * ++ * This function is used when closing the network device. ++ * It updates the hardware, ++ * release all memory that holds buffers and descriptors and release the IRQ. ++ * Input : a pointer to the device structure ++ * Output : zero if success , nonzero if fails ++ *********************************************************************/ ++ ++int mv64460_eth_stop (struct eth_device *dev) ++{ ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ /* Disable all gigE address decoder */ ++ MV_REG_WRITE (MV64460_ETH_BASE_ADDR_ENABLE_REG, 0x3f); ++ DP (printf ("%s Ethernet stop called ... \n", __FUNCTION__)); ++ mv64460_eth_real_stop (dev); ++ ++ return 0; ++}; ++ ++/* Helper function for mv64460_eth_stop */ ++ ++static int mv64460_eth_real_stop (struct eth_device *dev) ++{ ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ mv64460_eth_free_tx_rings (dev); ++ mv64460_eth_free_rx_rings (dev); ++ ++ eth_port_reset (ethernet_private->port_num); ++ /* Disable ethernet port interrupts */ ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_REG (port_num), 0); ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG (port_num), 0); ++ /* Mask RX buffer and TX end interrupt */ ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_MASK_REG (port_num), 0); ++ /* Mask phy and link status changes interrupts */ ++ MV_REG_WRITE (MV64460_ETH_INTERRUPT_EXTEND_MASK_REG (port_num), 0); ++ MV_RESET_REG_BITS (MV64460_CPU_INTERRUPT0_MASK_HIGH, ++ BIT0 << port_num); ++ /* Print Network statistics */ ++#ifndef UPDATE_STATS_BY_SOFTWARE ++ /* ++ * Print statistics (only if ethernet is running), ++ * then zero all the stats fields in memory ++ */ ++ if (port_private->eth_running == MAGIC_ETH_RUNNING) { ++ port_private->eth_running = 0; ++ mv64460_eth_print_stat (dev); ++ } ++ memset (port_private->stats, 0, sizeof (struct net_device_stats)); ++#endif ++ DP (printf ("\nEthernet stopped ... \n")); ++ return 0; ++} ++ ++/********************************************************************** ++ * mv64460_eth_start_xmit ++ * ++ * This function is queues a packet in the Tx descriptor for ++ * required port. ++ * ++ * Input : skb - a pointer to socket buffer ++ * dev - a pointer to the required port ++ * ++ * Output : zero upon success ++ **********************************************************************/ ++ ++int mv64460_eth_xmit (struct eth_device *dev, volatile void *dataPtr, ++ int dataSize) ++{ ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ PKT_INFO pkt_info; ++ ETH_FUNC_RET_STATUS status; ++ struct net_device_stats *stats; ++ ETH_FUNC_RET_STATUS release_result; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ stats = port_private->stats; ++ ++ /* Update packet info data structure */ ++ pkt_info.cmd_sts = ETH_TX_FIRST_DESC | ETH_TX_LAST_DESC; /* DMA owned, first last */ ++ pkt_info.byte_cnt = dataSize; ++ pkt_info.buf_ptr = (unsigned int) dataPtr; ++ pkt_info.return_info = 0; ++ ++ status = eth_port_send (ethernet_private, ETH_Q0, &pkt_info); ++ if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL)) { ++ printf ("Error on transmitting packet .."); ++ if (status == ETH_QUEUE_FULL) ++ printf ("ETH Queue is full. \n"); ++ if (status == ETH_QUEUE_LAST_RESOURCE) ++ printf ("ETH Queue: using last available resource. \n"); ++ return 1; ++ } ++ ++ /* Update statistics and start of transmittion time */ ++ stats->tx_bytes += dataSize; ++ stats->tx_packets++; ++ ++ /* Check if packet(s) is(are) transmitted correctly (release everything) */ ++ do { ++ release_result = ++ eth_tx_return_desc (ethernet_private, ETH_Q0, ++ &pkt_info); ++ switch (release_result) { ++ case ETH_OK: ++ DP (printf ("descriptor released\n")); ++ if (pkt_info.cmd_sts & BIT0) { ++ printf ("Error in TX\n"); ++ stats->tx_errors++; ++ } ++ break; ++ case ETH_RETRY: ++ DP (printf ("transmission still in process\n")); ++ break; ++ ++ case ETH_ERROR: ++ printf ("routine can not access Tx desc ring\n"); ++ break; ++ ++ case ETH_END_OF_JOB: ++ DP (printf ("the routine has nothing to release\n")); ++ break; ++ default: /* should not happen */ ++ break; ++ } ++ } while (release_result == ETH_OK); ++ ++ return 0; /* success */ ++} ++ ++/********************************************************************** ++ * mv64460_eth_receive ++ * ++ * This function is forward packets that are received from the port's ++ * queues toward kernel core or FastRoute them to another interface. ++ * ++ * Input : dev - a pointer to the required interface ++ * max - maximum number to receive (0 means unlimted) ++ * ++ * Output : number of served packets ++ **********************************************************************/ ++ ++int mv64460_eth_receive (struct eth_device *dev) ++{ ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ PKT_INFO pkt_info; ++ struct net_device_stats *stats; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ stats = port_private->stats; ++ ++ while ((eth_port_receive (ethernet_private, ETH_Q0, &pkt_info) == ETH_OK)) { ++#ifdef DEBUG_MV_ETH ++ if (pkt_info.byte_cnt != 0) { ++ printf ("%s: Received %d byte Packet @ 0x%x\n", ++ __FUNCTION__, pkt_info.byte_cnt, ++ pkt_info.buf_ptr); ++ if(pkt_info.buf_ptr != 0){ ++ for(i=0; i < pkt_info.byte_cnt; i++){ ++ if((i % 4) == 0){ ++ printf("\n0x"); ++ } ++ printf("%02x", ((char*)pkt_info.buf_ptr)[i]); ++ } ++ printf("\n"); ++ } ++ } ++#endif ++ /* Update statistics. Note byte count includes 4 byte CRC count */ ++ stats->rx_packets++; ++ stats->rx_bytes += pkt_info.byte_cnt; ++ ++ /* ++ * In case received a packet without first / last bits on OR the error ++ * summary bit is on, the packets needs to be dropeed. ++ */ ++ if (((pkt_info. ++ cmd_sts & (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) != ++ (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) ++ || (pkt_info.cmd_sts & ETH_ERROR_SUMMARY)) { ++ stats->rx_dropped++; ++ ++ printf ("Received packet spread on multiple descriptors\n"); ++ ++ /* Is this caused by an error ? */ ++ if (pkt_info.cmd_sts & ETH_ERROR_SUMMARY) { ++ stats->rx_errors++; ++ } ++ ++ /* free these descriptors again without forwarding them to the higher layers */ ++ pkt_info.buf_ptr &= ~0x7; /* realign buffer again */ ++ pkt_info.byte_cnt = 0x0000; /* Reset Byte count */ ++ ++ if (eth_rx_return_buff ++ (ethernet_private, ETH_Q0, &pkt_info) != ETH_OK) { ++ printf ("Error while returning the RX Desc to Ring\n"); ++ } else { ++ DP (printf ("RX Desc returned to Ring\n")); ++ } ++ /* /free these descriptors again */ ++ } else { ++ ++/* !!! call higher layer processing */ ++#ifdef DEBUG_MV_ETH ++ printf ("\nNow send it to upper layer protocols (NetReceive) ...\n"); ++#endif ++ /* let the upper layer handle the packet */ ++ NetReceive ((uchar *) pkt_info.buf_ptr, ++ (int) pkt_info.byte_cnt); ++ ++/* **************************************************************** */ ++/* free descriptor */ ++ pkt_info.buf_ptr &= ~0x7; /* realign buffer again */ ++ pkt_info.byte_cnt = 0x0000; /* Reset Byte count */ ++ DP (printf ("RX: pkt_info.buf_ptr = %x\n", pkt_info.buf_ptr)); ++ if (eth_rx_return_buff ++ (ethernet_private, ETH_Q0, &pkt_info) != ETH_OK) { ++ printf ("Error while returning the RX Desc to Ring\n"); ++ } else { ++ DP (printf ("RX: Desc returned to Ring\n")); ++ } ++ ++/* **************************************************************** */ ++ ++ } ++ } ++ mv64460_eth_get_stats (dev); /* update statistics */ ++ return 1; ++} ++ ++/********************************************************************** ++ * mv64460_eth_get_stats ++ * ++ * Returns a pointer to the interface statistics. ++ * ++ * Input : dev - a pointer to the required interface ++ * ++ * Output : a pointer to the interface's statistics ++ **********************************************************************/ ++ ++static struct net_device_stats *mv64460_eth_get_stats (struct eth_device *dev) ++{ ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ unsigned int port_num; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ ++ mv64460_eth_update_stat (dev); ++ ++ return port_private->stats; ++} ++ ++/********************************************************************** ++ * mv64460_eth_update_stat ++ * ++ * Update the statistics structure in the private data structure ++ * ++ * Input : pointer to ethernet interface network device structure ++ * Output : N/A ++ **********************************************************************/ ++ ++static void mv64460_eth_update_stat (struct eth_device *dev) ++{ ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ struct net_device_stats *stats; ++ unsigned int port_num; ++ volatile unsigned int dummy; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ stats = port_private->stats; ++ ++ /* These are false updates */ ++ stats->rx_packets += (unsigned long) ++ eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_GOOD_FRAMES_RECEIVED); ++ stats->tx_packets += (unsigned long) ++ eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_GOOD_FRAMES_SENT); ++ stats->rx_bytes += (unsigned long) ++ eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_GOOD_OCTETS_RECEIVED_LOW); ++ /* ++ * Ideally this should be as follows - ++ * ++ * stats->rx_bytes += stats->rx_bytes + ++ * ((unsigned long) ethReadMibCounter (ethernet_private->port_num , ++ * ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH) << 32); ++ * ++ * But the unsigned long in PowerPC and MIPS are 32bit. So the next read ++ * is just a dummy read for proper work of the GigE port ++ */ ++ dummy = eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH); ++ stats->tx_bytes += (unsigned long) ++ eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_GOOD_OCTETS_SENT_LOW); ++ dummy = eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_GOOD_OCTETS_SENT_HIGH); ++ stats->rx_errors += (unsigned long) ++ eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_MAC_RECEIVE_ERROR); ++ ++ /* Rx dropped is for received packet with CRC error */ ++ stats->rx_dropped += ++ (unsigned long) eth_read_mib_counter (ethernet_private-> ++ port_num, ++ ETH_MIB_BAD_CRC_EVENT); ++ stats->multicast += (unsigned long) ++ eth_read_mib_counter (ethernet_private->port_num, ++ ETH_MIB_MULTICAST_FRAMES_RECEIVED); ++ stats->collisions += ++ (unsigned long) eth_read_mib_counter (ethernet_private-> ++ port_num, ++ ETH_MIB_COLLISION) + ++ (unsigned long) eth_read_mib_counter (ethernet_private-> ++ port_num, ++ ETH_MIB_LATE_COLLISION); ++ /* detailed rx errors */ ++ stats->rx_length_errors += ++ (unsigned long) eth_read_mib_counter (ethernet_private-> ++ port_num, ++ ETH_MIB_UNDERSIZE_RECEIVED) ++ + ++ (unsigned long) eth_read_mib_counter (ethernet_private-> ++ port_num, ++ ETH_MIB_OVERSIZE_RECEIVED); ++ /* detailed tx errors */ ++} ++ ++#ifndef UPDATE_STATS_BY_SOFTWARE ++/********************************************************************** ++ * mv64460_eth_print_stat ++ * ++ * Update the statistics structure in the private data structure ++ * ++ * Input : pointer to ethernet interface network device structure ++ * Output : N/A ++ **********************************************************************/ ++ ++static void mv64460_eth_print_stat (struct eth_device *dev) ++{ ++ ETH_PORT_INFO *ethernet_private; ++ struct mv64460_eth_priv *port_private; ++ struct net_device_stats *stats; ++ unsigned int port_num; ++ ++ ethernet_private = (ETH_PORT_INFO *) dev->priv; ++ port_private = ++ (struct mv64460_eth_priv *) ethernet_private->port_private; ++ port_num = port_private->port_num; ++ stats = port_private->stats; ++ ++ /* These are false updates */ ++ printf ("\n### Network statistics: ###\n"); ++ printf ("--------------------------\n"); ++ printf (" Packets received: %ld\n", stats->rx_packets); ++ printf (" Packets send: %ld\n", stats->tx_packets); ++ printf (" Received bytes: %ld\n", stats->rx_bytes); ++ printf (" Send bytes: %ld\n", stats->tx_bytes); ++ if (stats->rx_errors != 0) ++ printf (" Rx Errors: %ld\n", ++ stats->rx_errors); ++ if (stats->rx_dropped != 0) ++ printf (" Rx dropped (CRC Errors): %ld\n", ++ stats->rx_dropped); ++ if (stats->multicast != 0) ++ printf (" Rx mulicast frames: %ld\n", ++ stats->multicast); ++ if (stats->collisions != 0) ++ printf (" No. of collisions: %ld\n", ++ stats->collisions); ++ if (stats->rx_length_errors != 0) ++ printf (" Rx length errors: %ld\n", ++ stats->rx_length_errors); ++} ++#endif ++ ++/************************************************************************** ++ *network_start - Network Kick Off Routine UBoot ++ *Inputs : ++ *Outputs : ++ **************************************************************************/ ++ ++bool db64460_eth_start (struct eth_device *dev) ++{ ++ return (mv64460_eth_open (dev)); /* calls real open */ ++} ++ ++/************************************************************************* ++************************************************************************** ++************************************************************************** ++* The second part is the low level driver of the gigE ethernet ports. * ++************************************************************************** ++************************************************************************** ++*************************************************************************/ ++/* ++ * based on Linux code ++ * arch/ppc/galileo/EVB64460/mv64460_eth.c - Driver for MV64460X ethernet ports ++ * Copyright (C) 2002 rabeeh@galileo.co.il ++ ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version 2 ++ * of the License, or (at your option) any later version. ++ ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++/******************************************************************************** ++ * Marvell's Gigabit Ethernet controller low level driver ++ * ++ * DESCRIPTION: ++ * This file introduce low level API to Marvell's Gigabit Ethernet ++ * controller. This Gigabit Ethernet Controller driver API controls ++ * 1) Operations (i.e. port init, start, reset etc'). ++ * 2) Data flow (i.e. port send, receive etc'). ++ * Each Gigabit Ethernet port is controlled via ETH_PORT_INFO ++ * struct. ++ * This struct includes user configuration information as well as ++ * driver internal data needed for its operations. ++ * ++ * Supported Features: ++ * - This low level driver is OS independent. Allocating memory for ++ * the descriptor rings and buffers are not within the scope of ++ * this driver. ++ * - The user is free from Rx/Tx queue managing. ++ * - This low level driver introduce functionality API that enable ++ * the to operate Marvell's Gigabit Ethernet Controller in a ++ * convenient way. ++ * - Simple Gigabit Ethernet port operation API. ++ * - Simple Gigabit Ethernet port data flow API. ++ * - Data flow and operation API support per queue functionality. ++ * - Support cached descriptors for better performance. ++ * - Enable access to all four DRAM banks and internal SRAM memory ++ * spaces. ++ * - PHY access and control API. ++ * - Port control register configuration API. ++ * - Full control over Unicast and Multicast MAC configurations. ++ * ++ * Operation flow: ++ * ++ * Initialization phase ++ * This phase complete the initialization of the ETH_PORT_INFO ++ * struct. ++ * User information regarding port configuration has to be set ++ * prior to calling the port initialization routine. For example, ++ * the user has to assign the port_phy_addr field which is board ++ * depended parameter. ++ * In this phase any port Tx/Rx activity is halted, MIB counters ++ * are cleared, PHY address is set according to user parameter and ++ * access to DRAM and internal SRAM memory spaces. ++ * ++ * Driver ring initialization ++ * Allocating memory for the descriptor rings and buffers is not ++ * within the scope of this driver. Thus, the user is required to ++ * allocate memory for the descriptors ring and buffers. Those ++ * memory parameters are used by the Rx and Tx ring initialization ++ * routines in order to curve the descriptor linked list in a form ++ * of a ring. ++ * Note: Pay special attention to alignment issues when using ++ * cached descriptors/buffers. In this phase the driver store ++ * information in the ETH_PORT_INFO struct regarding each queue ++ * ring. ++ * ++ * Driver start ++ * This phase prepares the Ethernet port for Rx and Tx activity. ++ * It uses the information stored in the ETH_PORT_INFO struct to ++ * initialize the various port registers. ++ * ++ * Data flow: ++ * All packet references to/from the driver are done using PKT_INFO ++ * struct. ++ * This struct is a unified struct used with Rx and Tx operations. ++ * This way the user is not required to be familiar with neither ++ * Tx nor Rx descriptors structures. ++ * The driver's descriptors rings are management by indexes. ++ * Those indexes controls the ring resources and used to indicate ++ * a SW resource error: ++ * 'current' ++ * This index points to the current available resource for use. For ++ * example in Rx process this index will point to the descriptor ++ * that will be passed to the user upon calling the receive routine. ++ * In Tx process, this index will point to the descriptor ++ * that will be assigned with the user packet info and transmitted. ++ * 'used' ++ * This index points to the descriptor that need to restore its ++ * resources. For example in Rx process, using the Rx buffer return ++ * API will attach the buffer returned in packet info to the ++ * descriptor pointed by 'used'. In Tx process, using the Tx ++ * descriptor return will merely return the user packet info with ++ * the command status of the transmitted buffer pointed by the ++ * 'used' index. Nevertheless, it is essential to use this routine ++ * to update the 'used' index. ++ * 'first' ++ * This index supports Tx Scatter-Gather. It points to the first ++ * descriptor of a packet assembled of multiple buffers. For example ++ * when in middle of Such packet we have a Tx resource error the ++ * 'curr' index get the value of 'first' to indicate that the ring ++ * returned to its state before trying to transmit this packet. ++ * ++ * Receive operation: ++ * The eth_port_receive API set the packet information struct, ++ * passed by the caller, with received information from the ++ * 'current' SDMA descriptor. ++ * It is the user responsibility to return this resource back ++ * to the Rx descriptor ring to enable the reuse of this source. ++ * Return Rx resource is done using the eth_rx_return_buff API. ++ * ++ * Transmit operation: ++ * The eth_port_send API supports Scatter-Gather which enables to ++ * send a packet spanned over multiple buffers. This means that ++ * for each packet info structure given by the user and put into ++ * the Tx descriptors ring, will be transmitted only if the 'LAST' ++ * bit will be set in the packet info command status field. This ++ * API also consider restriction regarding buffer alignments and ++ * sizes. ++ * The user must return a Tx resource after ensuring the buffer ++ * has been transmitted to enable the Tx ring indexes to update. ++ * ++ * BOARD LAYOUT ++ * This device is on-board. No jumper diagram is necessary. ++ * ++ * EXTERNAL INTERFACE ++ * ++ * Prior to calling the initialization routine eth_port_init() the user ++ * must set the following fields under ETH_PORT_INFO struct: ++ * port_num User Ethernet port number. ++ * port_phy_addr User PHY address of Ethernet port. ++ * port_mac_addr[6] User defined port MAC address. ++ * port_config User port configuration value. ++ * port_config_extend User port config extend value. ++ * port_sdma_config User port SDMA config value. ++ * port_serial_control User port serial control value. ++ * *port_virt_to_phys () User function to cast virtual addr to CPU bus addr. ++ * *port_private User scratch pad for user specific data structures. ++ * ++ * This driver introduce a set of default values: ++ * PORT_CONFIG_VALUE Default port configuration value ++ * PORT_CONFIG_EXTEND_VALUE Default port extend configuration value ++ * PORT_SDMA_CONFIG_VALUE Default sdma control value ++ * PORT_SERIAL_CONTROL_VALUE Default port serial control value ++ * ++ * This driver data flow is done using the PKT_INFO struct which is ++ * a unified struct for Rx and Tx operations: ++ * byte_cnt Tx/Rx descriptor buffer byte count. ++ * l4i_chk CPU provided TCP Checksum. For Tx operation only. ++ * cmd_sts Tx/Rx descriptor command status. ++ * buf_ptr Tx/Rx descriptor buffer pointer. ++ * return_info Tx/Rx user resource return information. ++ * ++ * ++ * EXTERNAL SUPPORT REQUIREMENTS ++ * ++ * This driver requires the following external support: ++ * ++ * D_CACHE_FLUSH_LINE (address, address offset) ++ * ++ * This macro applies assembly code to flush and invalidate cache ++ * line. ++ * address - address base. ++ * address offset - address offset ++ * ++ * ++ * CPU_PIPE_FLUSH ++ * ++ * This macro applies assembly code to flush the CPU pipeline. ++ * ++ *******************************************************************************/ ++/* includes */ ++ ++/* defines */ ++/* SDMA command macros */ ++#define ETH_ENABLE_TX_QUEUE(tx_queue, eth_port) \ ++ MV_REG_WRITE(MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port), (1 << tx_queue)) ++ ++#define ETH_DISABLE_TX_QUEUE(tx_queue, eth_port) \ ++ MV_REG_WRITE(MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port),\ ++ (1 << (8 + tx_queue))) ++ ++#define ETH_ENABLE_RX_QUEUE(rx_queue, eth_port) \ ++MV_REG_WRITE(MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << rx_queue)) ++ ++#define ETH_DISABLE_RX_QUEUE(rx_queue, eth_port) \ ++MV_REG_WRITE(MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << (8 + rx_queue))) ++ ++#define CURR_RFD_GET(p_curr_desc, queue) \ ++ ((p_curr_desc) = p_eth_port_ctrl->p_rx_curr_desc_q[queue]) ++ ++#define CURR_RFD_SET(p_curr_desc, queue) \ ++ (p_eth_port_ctrl->p_rx_curr_desc_q[queue] = (p_curr_desc)) ++ ++#define USED_RFD_GET(p_used_desc, queue) \ ++ ((p_used_desc) = p_eth_port_ctrl->p_rx_used_desc_q[queue]) ++ ++#define USED_RFD_SET(p_used_desc, queue)\ ++(p_eth_port_ctrl->p_rx_used_desc_q[queue] = (p_used_desc)) ++ ++ ++#define CURR_TFD_GET(p_curr_desc, queue) \ ++ ((p_curr_desc) = p_eth_port_ctrl->p_tx_curr_desc_q[queue]) ++ ++#define CURR_TFD_SET(p_curr_desc, queue) \ ++ (p_eth_port_ctrl->p_tx_curr_desc_q[queue] = (p_curr_desc)) ++ ++#define USED_TFD_GET(p_used_desc, queue) \ ++ ((p_used_desc) = p_eth_port_ctrl->p_tx_used_desc_q[queue]) ++ ++#define USED_TFD_SET(p_used_desc, queue) \ ++ (p_eth_port_ctrl->p_tx_used_desc_q[queue] = (p_used_desc)) ++ ++#define FIRST_TFD_GET(p_first_desc, queue) \ ++ ((p_first_desc) = p_eth_port_ctrl->p_tx_first_desc_q[queue]) ++ ++#define FIRST_TFD_SET(p_first_desc, queue) \ ++ (p_eth_port_ctrl->p_tx_first_desc_q[queue] = (p_first_desc)) ++ ++ ++/* Macros that save access to desc in order to find next desc pointer */ ++#define RX_NEXT_DESC_PTR(p_rx_desc, queue) (ETH_RX_DESC*)(((((unsigned int)p_rx_desc - (unsigned int)p_eth_port_ctrl->p_rx_desc_area_base[queue]) + RX_DESC_ALIGNED_SIZE) % p_eth_port_ctrl->rx_desc_area_size[queue]) + (unsigned int)p_eth_port_ctrl->p_rx_desc_area_base[queue]) ++ ++#define TX_NEXT_DESC_PTR(p_tx_desc, queue) (ETH_TX_DESC*)(((((unsigned int)p_tx_desc - (unsigned int)p_eth_port_ctrl->p_tx_desc_area_base[queue]) + TX_DESC_ALIGNED_SIZE) % p_eth_port_ctrl->tx_desc_area_size[queue]) + (unsigned int)p_eth_port_ctrl->p_tx_desc_area_base[queue]) ++ ++#define LINK_UP_TIMEOUT 100000 ++#define PHY_BUSY_TIMEOUT 10000000 ++ ++/* locals */ ++ ++/* PHY routines */ ++static void ethernet_phy_set (ETH_PORT eth_port_num, int phy_addr); ++static int ethernet_phy_get (ETH_PORT eth_port_num); ++ ++/* Ethernet Port routines */ ++static void eth_set_access_control (ETH_PORT eth_port_num, ++ ETH_WIN_PARAM * param); ++static bool eth_port_uc_addr (ETH_PORT eth_port_num, unsigned char uc_nibble, ++ ETH_QUEUE queue, int option); ++#if 0 /* FIXME */ ++static bool eth_port_smc_addr (ETH_PORT eth_port_num, ++ unsigned char mc_byte, ++ ETH_QUEUE queue, int option); ++static bool eth_port_omc_addr (ETH_PORT eth_port_num, ++ unsigned char crc8, ++ ETH_QUEUE queue, int option); ++#endif ++ ++static void eth_b_copy (unsigned int src_addr, unsigned int dst_addr, ++ int byte_count); ++ ++void eth_dbg (ETH_PORT_INFO * p_eth_port_ctrl); ++ ++ ++typedef enum _memory_bank { BANK0, BANK1, BANK2, BANK3 } MEMORY_BANK; ++u32 mv_get_dram_bank_base_addr (MEMORY_BANK bank) ++{ ++ u32 result = 0; ++ u32 enable = MV_REG_READ (MV64460_BASE_ADDR_ENABLE); ++ ++ if (enable & (1 << bank)) ++ return 0; ++ if (bank == BANK0) ++ result = MV_REG_READ (MV64460_CS_0_BASE_ADDR); ++ if (bank == BANK1) ++ result = MV_REG_READ (MV64460_CS_1_BASE_ADDR); ++ if (bank == BANK2) ++ result = MV_REG_READ (MV64460_CS_2_BASE_ADDR); ++ if (bank == BANK3) ++ result = MV_REG_READ (MV64460_CS_3_BASE_ADDR); ++ result &= 0x0000ffff; ++ result = result << 16; ++ return result; ++} ++ ++u32 mv_get_dram_bank_size (MEMORY_BANK bank) ++{ ++ u32 result = 0; ++ u32 enable = MV_REG_READ (MV64460_BASE_ADDR_ENABLE); ++ ++ if (enable & (1 << bank)) ++ return 0; ++ if (bank == BANK0) ++ result = MV_REG_READ (MV64460_CS_0_SIZE); ++ if (bank == BANK1) ++ result = MV_REG_READ (MV64460_CS_1_SIZE); ++ if (bank == BANK2) ++ result = MV_REG_READ (MV64460_CS_2_SIZE); ++ if (bank == BANK3) ++ result = MV_REG_READ (MV64460_CS_3_SIZE); ++ result += 1; ++ result &= 0x0000ffff; ++ result = result << 16; ++ return result; ++} ++ ++u32 mv_get_internal_sram_base (void) ++{ ++ u32 result; ++ ++ result = MV_REG_READ (MV64460_INTEGRATED_SRAM_BASE_ADDR); ++ result &= 0x0000ffff; ++ result = result << 16; ++ return result; ++} ++ ++/******************************************************************************* ++* eth_port_init - Initialize the Ethernet port driver ++* ++* DESCRIPTION: ++* This function prepares the ethernet port to start its activity: ++* 1) Completes the ethernet port driver struct initialization toward port ++* start routine. ++* 2) Resets the device to a quiescent state in case of warm reboot. ++* 3) Enable SDMA access to all four DRAM banks as well as internal SRAM. ++* 4) Clean MAC tables. The reset status of those tables is unknown. ++* 5) Set PHY address. ++* Note: Call this routine prior to eth_port_start routine and after setting ++* user values in the user fields of Ethernet port control struct (i.e. ++* port_phy_addr). ++* ++* INPUT: ++* ETH_PORT_INFO *p_eth_port_ctrl Ethernet port control struct ++* ++* OUTPUT: ++* See description. ++* ++* RETURN: ++* None. ++* ++*******************************************************************************/ ++static void eth_port_init (ETH_PORT_INFO * p_eth_port_ctrl) ++{ ++ int queue; ++ ETH_WIN_PARAM win_param; ++ ++ p_eth_port_ctrl->port_config = PORT_CONFIG_VALUE; ++ p_eth_port_ctrl->port_config_extend = PORT_CONFIG_EXTEND_VALUE; ++ p_eth_port_ctrl->port_sdma_config = PORT_SDMA_CONFIG_VALUE; ++ p_eth_port_ctrl->port_serial_control = PORT_SERIAL_CONTROL_VALUE; ++ ++ p_eth_port_ctrl->port_rx_queue_command = 0; ++ p_eth_port_ctrl->port_tx_queue_command = 0; ++ ++ /* Zero out SW structs */ ++ for (queue = 0; queue < MAX_RX_QUEUE_NUM; queue++) { ++ CURR_RFD_SET ((ETH_RX_DESC *) 0x00000000, queue); ++ USED_RFD_SET ((ETH_RX_DESC *) 0x00000000, queue); ++ p_eth_port_ctrl->rx_resource_err[queue] = false; ++ } ++ ++ for (queue = 0; queue < MAX_TX_QUEUE_NUM; queue++) { ++ CURR_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue); ++ USED_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue); ++ FIRST_TFD_SET ((ETH_TX_DESC *) 0x00000000, queue); ++ p_eth_port_ctrl->tx_resource_err[queue] = false; ++ } ++ ++ eth_port_reset (p_eth_port_ctrl->port_num); ++ ++ /* Set access parameters for DRAM bank 0 */ ++ win_param.win = ETH_WIN0; /* Use Ethernet window 0 */ ++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */ ++ win_param.attributes = EBAR_ATTR_DRAM_CS0; /* Enable DRAM bank */ ++#ifndef CONFIG_NOT_COHERENT_CACHE ++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB; ++#endif ++ win_param.high_addr = 0; ++ /* Get bank base */ ++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK0); ++ win_param.size = mv_get_dram_bank_size (BANK0); /* Get bank size */ ++ if (win_param.size == 0) ++ win_param.enable = 0; ++ else ++ win_param.enable = 1; /* Enable the access */ ++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */ ++ ++ /* Set the access control for address window (EPAPR) READ & WRITE */ ++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param); ++ ++ /* Set access parameters for DRAM bank 1 */ ++ win_param.win = ETH_WIN1; /* Use Ethernet window 1 */ ++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */ ++ win_param.attributes = EBAR_ATTR_DRAM_CS1; /* Enable DRAM bank */ ++#ifndef CONFIG_NOT_COHERENT_CACHE ++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB; ++#endif ++ win_param.high_addr = 0; ++ /* Get bank base */ ++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK1); ++ win_param.size = mv_get_dram_bank_size (BANK1); /* Get bank size */ ++ if (win_param.size == 0) ++ win_param.enable = 0; ++ else ++ win_param.enable = 1; /* Enable the access */ ++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */ ++ ++ /* Set the access control for address window (EPAPR) READ & WRITE */ ++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param); ++ ++ /* Set access parameters for DRAM bank 2 */ ++ win_param.win = ETH_WIN2; /* Use Ethernet window 2 */ ++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */ ++ win_param.attributes = EBAR_ATTR_DRAM_CS2; /* Enable DRAM bank */ ++#ifndef CONFIG_NOT_COHERENT_CACHE ++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB; ++#endif ++ win_param.high_addr = 0; ++ /* Get bank base */ ++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK2); ++ win_param.size = mv_get_dram_bank_size (BANK2); /* Get bank size */ ++ if (win_param.size == 0) ++ win_param.enable = 0; ++ else ++ win_param.enable = 1; /* Enable the access */ ++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */ ++ ++ /* Set the access control for address window (EPAPR) READ & WRITE */ ++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param); ++ ++ /* Set access parameters for DRAM bank 3 */ ++ win_param.win = ETH_WIN3; /* Use Ethernet window 3 */ ++ win_param.target = ETH_TARGET_DRAM; /* Window target - DDR */ ++ win_param.attributes = EBAR_ATTR_DRAM_CS3; /* Enable DRAM bank */ ++#ifndef CONFIG_NOT_COHERENT_CACHE ++ win_param.attributes |= EBAR_ATTR_DRAM_CACHE_COHERENCY_WB; ++#endif ++ win_param.high_addr = 0; ++ /* Get bank base */ ++ win_param.base_addr = mv_get_dram_bank_base_addr (BANK3); ++ win_param.size = mv_get_dram_bank_size (BANK3); /* Get bank size */ ++ if (win_param.size == 0) ++ win_param.enable = 0; ++ else ++ win_param.enable = 1; /* Enable the access */ ++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */ ++ ++ /* Set the access control for address window (EPAPR) READ & WRITE */ ++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param); ++ ++ /* Set access parameters for Internal SRAM */ ++ win_param.win = ETH_WIN4; /* Use Ethernet window 0 */ ++ win_param.target = EBAR_TARGET_CBS; /* Target - Internal SRAM */ ++ win_param.attributes = EBAR_ATTR_CBS_SRAM | EBAR_ATTR_CBS_SRAM_BLOCK0; ++ win_param.high_addr = 0; ++ win_param.base_addr = mv_get_internal_sram_base (); /* Get base addr */ ++ win_param.size = MV64460_INTERNAL_SRAM_SIZE; /* Get bank size */ ++ win_param.enable = 1; /* Enable the access */ ++ win_param.access_ctrl = EWIN_ACCESS_FULL; /* Enable full access */ ++ ++ /* Set the access control for address window (EPAPR) READ & WRITE */ ++ eth_set_access_control (p_eth_port_ctrl->port_num, &win_param); ++ ++ eth_port_init_mac_tables (p_eth_port_ctrl->port_num); ++ ++ ethernet_phy_set (p_eth_port_ctrl->port_num, ++ p_eth_port_ctrl->port_phy_addr); ++ ++ return; ++ ++} ++ ++/******************************************************************************* ++* eth_port_start - Start the Ethernet port activity. ++* ++* DESCRIPTION: ++* This routine prepares the Ethernet port for Rx and Tx activity: ++* 1. Initialize Tx and Rx Current Descriptor Pointer for each queue that ++* has been initialized a descriptor's ring (using ether_init_tx_desc_ring ++* for Tx and ether_init_rx_desc_ring for Rx) ++* 2. Initialize and enable the Ethernet configuration port by writing to ++* the port's configuration and command registers. ++* 3. Initialize and enable the SDMA by writing to the SDMA's ++* configuration and command registers. ++* After completing these steps, the ethernet port SDMA can starts to ++* perform Rx and Tx activities. ++* ++* Note: Each Rx and Tx queue descriptor's list must be initialized prior ++* to calling this function (use ether_init_tx_desc_ring for Tx queues and ++* ether_init_rx_desc_ring for Rx queues). ++* ++* INPUT: ++* ETH_PORT_INFO *p_eth_port_ctrl Ethernet port control struct ++* ++* OUTPUT: ++* Ethernet port is ready to receive and transmit. ++* ++* RETURN: ++* false if the port PHY is not up. ++* true otherwise. ++* ++*******************************************************************************/ ++static bool eth_port_start (ETH_PORT_INFO * p_eth_port_ctrl) ++{ ++ int queue; ++ volatile ETH_TX_DESC *p_tx_curr_desc; ++ volatile ETH_RX_DESC *p_rx_curr_desc; ++ unsigned int phy_reg_data; ++ ETH_PORT eth_port_num = p_eth_port_ctrl->port_num; ++ ++ /* Assignment of Tx CTRP of given queue */ ++ for (queue = 0; queue < MAX_TX_QUEUE_NUM; queue++) { ++ CURR_TFD_GET (p_tx_curr_desc, queue); ++ MV_REG_WRITE ((MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_0 ++ (eth_port_num) ++ + (4 * queue)), ++ ((unsigned int) p_tx_curr_desc)); ++ ++ } ++ ++ /* Assignment of Rx CRDP of given queue */ ++ for (queue = 0; queue < MAX_RX_QUEUE_NUM; queue++) { ++ CURR_RFD_GET (p_rx_curr_desc, queue); ++ MV_REG_WRITE ((MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_0 ++ (eth_port_num) ++ + (4 * queue)), ++ ((unsigned int) p_rx_curr_desc)); ++ ++ if (p_rx_curr_desc != NULL) ++ /* Add the assigned Ethernet address to the port's address table */ ++ eth_port_uc_addr_set (p_eth_port_ctrl->port_num, ++ p_eth_port_ctrl->port_mac_addr, ++ queue); ++ } ++ ++ /* Assign port configuration and command. */ ++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_REG (eth_port_num), ++ p_eth_port_ctrl->port_config); ++ ++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_EXTEND_REG (eth_port_num), ++ p_eth_port_ctrl->port_config_extend); ++ ++ MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num), ++ p_eth_port_ctrl->port_serial_control); ++ ++ MV_SET_REG_BITS (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num), ++ ETH_SERIAL_PORT_ENABLE); ++ ++ /* Assign port SDMA configuration */ ++ MV_REG_WRITE (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num), ++ p_eth_port_ctrl->port_sdma_config); ++ ++ MV_REG_WRITE (MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_COUNT ++ (eth_port_num), 0x3fffffff); ++ MV_REG_WRITE (MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_CONFIG ++ (eth_port_num), 0x03fffcff); ++ /* Turn off the port/queue bandwidth limitation */ ++ MV_REG_WRITE (MV64460_ETH_MAXIMUM_TRANSMIT_UNIT (eth_port_num), 0x0); ++ ++ /* Enable port Rx. */ ++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG (eth_port_num), ++ p_eth_port_ctrl->port_rx_queue_command); ++ ++ /* Check if link is up */ ++ eth_port_read_smi_reg (eth_port_num, 1, &phy_reg_data); ++ ++ if (!(phy_reg_data & 0x20)) ++ return false; ++ ++ return true; ++} ++ ++/******************************************************************************* ++* eth_port_uc_addr_set - This function Set the port Unicast address. ++* ++* DESCRIPTION: ++* This function Set the port Ethernet MAC address. ++* ++* INPUT: ++* ETH_PORT eth_port_num Port number. ++* char * p_addr Address to be set ++* ETH_QUEUE queue Rx queue number for this MAC address. ++* ++* OUTPUT: ++* Set MAC address low and high registers. also calls eth_port_uc_addr() ++* To set the unicast table with the proper information. ++* ++* RETURN: ++* N/A. ++* ++*******************************************************************************/ ++static void eth_port_uc_addr_set (ETH_PORT eth_port_num, ++ unsigned char *p_addr, ETH_QUEUE queue) ++{ ++ unsigned int mac_h; ++ unsigned int mac_l; ++ ++ mac_l = (p_addr[4] << 8) | (p_addr[5]); ++ mac_h = (p_addr[0] << 24) | (p_addr[1] << 16) | ++ (p_addr[2] << 8) | (p_addr[3] << 0); ++ ++ MV_REG_WRITE (MV64460_ETH_MAC_ADDR_LOW (eth_port_num), mac_l); ++ MV_REG_WRITE (MV64460_ETH_MAC_ADDR_HIGH (eth_port_num), mac_h); ++ ++ /* Accept frames of this address */ ++ eth_port_uc_addr (eth_port_num, p_addr[5], queue, ACCEPT_MAC_ADDR); ++ ++ return; ++} ++ ++/******************************************************************************* ++* eth_port_uc_addr - This function Set the port unicast address table ++* ++* DESCRIPTION: ++* This function locates the proper entry in the Unicast table for the ++* specified MAC nibble and sets its properties according to function ++* parameters. ++* ++* INPUT: ++* ETH_PORT eth_port_num Port number. ++* unsigned char uc_nibble Unicast MAC Address last nibble. ++* ETH_QUEUE queue Rx queue number for this MAC address. ++* int option 0 = Add, 1 = remove address. ++* ++* OUTPUT: ++* This function add/removes MAC addresses from the port unicast address ++* table. ++* ++* RETURN: ++* true is output succeeded. ++* false if option parameter is invalid. ++* ++*******************************************************************************/ ++static bool eth_port_uc_addr (ETH_PORT eth_port_num, ++ unsigned char uc_nibble, ++ ETH_QUEUE queue, int option) ++{ ++ unsigned int unicast_reg; ++ unsigned int tbl_offset; ++ unsigned int reg_offset; ++ ++ /* Locate the Unicast table entry */ ++ uc_nibble = (0xf & uc_nibble); ++ tbl_offset = (uc_nibble / 4) * 4; /* Register offset from unicast table base */ ++ reg_offset = uc_nibble % 4; /* Entry offset within the above register */ ++ ++ switch (option) { ++ case REJECT_MAC_ADDR: ++ /* Clear accepts frame bit at specified unicast DA table entry */ ++ unicast_reg = ++ MV_REG_READ ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE ++ (eth_port_num) ++ + tbl_offset)); ++ ++ unicast_reg &= (0x0E << (8 * reg_offset)); ++ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE ++ (eth_port_num) ++ + tbl_offset), unicast_reg); ++ break; ++ ++ case ACCEPT_MAC_ADDR: ++ /* Set accepts frame bit at unicast DA filter table entry */ ++ unicast_reg = ++ MV_REG_READ ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE ++ (eth_port_num) ++ + tbl_offset)); ++ ++ unicast_reg |= ((0x01 | queue) << (8 * reg_offset)); ++ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE ++ (eth_port_num) ++ + tbl_offset), unicast_reg); ++ ++ break; ++ ++ default: ++ return false; ++ } ++ return true; ++} ++ ++#if 0 /* FIXME */ ++/******************************************************************************* ++* eth_port_mc_addr - Multicast address settings. ++* ++* DESCRIPTION: ++* This API controls the MV device MAC multicast support. ++* The MV device supports multicast using two tables: ++* 1) Special Multicast Table for MAC addresses of the form ++* 0x01-00-5E-00-00-XX (where XX is between 0x00 and 0x_fF). ++* The MAC DA[7:0] bits are used as a pointer to the Special Multicast ++* Table entries in the DA-Filter table. ++* In this case, the function calls eth_port_smc_addr() routine to set the ++* Special Multicast Table. ++* 2) Other Multicast Table for multicast of another type. A CRC-8bit ++* is used as an index to the Other Multicast Table entries in the ++* DA-Filter table. ++* In this case, the function calculates the CRC-8bit value and calls ++* eth_port_omc_addr() routine to set the Other Multicast Table. ++* INPUT: ++* ETH_PORT eth_port_num Port number. ++* unsigned char *p_addr Unicast MAC Address. ++* ETH_QUEUE queue Rx queue number for this MAC address. ++* int option 0 = Add, 1 = remove address. ++* ++* OUTPUT: ++* See description. ++* ++* RETURN: ++* true is output succeeded. ++* false if add_address_table_entry( ) failed. ++* ++*******************************************************************************/ ++static void eth_port_mc_addr (ETH_PORT eth_port_num, ++ unsigned char *p_addr, ++ ETH_QUEUE queue, int option) ++{ ++ unsigned int mac_h; ++ unsigned int mac_l; ++ unsigned char crc_result = 0; ++ int mac_array[48]; ++ int crc[8]; ++ int i; ++ ++ if ((p_addr[0] == 0x01) && ++ (p_addr[1] == 0x00) && ++ (p_addr[2] == 0x5E) && (p_addr[3] == 0x00) && (p_addr[4] == 0x00)) { ++ ++ eth_port_smc_addr (eth_port_num, p_addr[5], queue, option); ++ } else { ++ /* Calculate CRC-8 out of the given address */ ++ mac_h = (p_addr[0] << 8) | (p_addr[1]); ++ mac_l = (p_addr[2] << 24) | (p_addr[3] << 16) | ++ (p_addr[4] << 8) | (p_addr[5] << 0); ++ ++ for (i = 0; i < 32; i++) ++ mac_array[i] = (mac_l >> i) & 0x1; ++ for (i = 32; i < 48; i++) ++ mac_array[i] = (mac_h >> (i - 32)) & 0x1; ++ ++ crc[0] = mac_array[45] ^ mac_array[43] ^ mac_array[40] ^ ++ mac_array[39] ^ mac_array[35] ^ mac_array[34] ^ ++ mac_array[31] ^ mac_array[30] ^ mac_array[28] ^ ++ mac_array[23] ^ mac_array[21] ^ mac_array[19] ^ ++ mac_array[18] ^ mac_array[16] ^ mac_array[14] ^ ++ mac_array[12] ^ mac_array[8] ^ mac_array[7] ^ ++ mac_array[6] ^ mac_array[0]; ++ ++ crc[1] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^ ++ mac_array[43] ^ mac_array[41] ^ mac_array[39] ^ ++ mac_array[36] ^ mac_array[34] ^ mac_array[32] ^ ++ mac_array[30] ^ mac_array[29] ^ mac_array[28] ^ ++ mac_array[24] ^ mac_array[23] ^ mac_array[22] ^ ++ mac_array[21] ^ mac_array[20] ^ mac_array[18] ^ ++ mac_array[17] ^ mac_array[16] ^ mac_array[15] ^ ++ mac_array[14] ^ mac_array[13] ^ mac_array[12] ^ ++ mac_array[9] ^ mac_array[6] ^ mac_array[1] ^ ++ mac_array[0]; ++ ++ crc[2] = mac_array[47] ^ mac_array[46] ^ mac_array[44] ^ ++ mac_array[43] ^ mac_array[42] ^ mac_array[39] ^ ++ mac_array[37] ^ mac_array[34] ^ mac_array[33] ^ ++ mac_array[29] ^ mac_array[28] ^ mac_array[25] ^ ++ mac_array[24] ^ mac_array[22] ^ mac_array[17] ^ ++ mac_array[15] ^ mac_array[13] ^ mac_array[12] ^ ++ mac_array[10] ^ mac_array[8] ^ mac_array[6] ^ ++ mac_array[2] ^ mac_array[1] ^ mac_array[0]; ++ ++ crc[3] = mac_array[47] ^ mac_array[45] ^ mac_array[44] ^ ++ mac_array[43] ^ mac_array[40] ^ mac_array[38] ^ ++ mac_array[35] ^ mac_array[34] ^ mac_array[30] ^ ++ mac_array[29] ^ mac_array[26] ^ mac_array[25] ^ ++ mac_array[23] ^ mac_array[18] ^ mac_array[16] ^ ++ mac_array[14] ^ mac_array[13] ^ mac_array[11] ^ ++ mac_array[9] ^ mac_array[7] ^ mac_array[3] ^ ++ mac_array[2] ^ mac_array[1]; ++ ++ crc[4] = mac_array[46] ^ mac_array[45] ^ mac_array[44] ^ ++ mac_array[41] ^ mac_array[39] ^ mac_array[36] ^ ++ mac_array[35] ^ mac_array[31] ^ mac_array[30] ^ ++ mac_array[27] ^ mac_array[26] ^ mac_array[24] ^ ++ mac_array[19] ^ mac_array[17] ^ mac_array[15] ^ ++ mac_array[14] ^ mac_array[12] ^ mac_array[10] ^ ++ mac_array[8] ^ mac_array[4] ^ mac_array[3] ^ ++ mac_array[2]; ++ ++ crc[5] = mac_array[47] ^ mac_array[46] ^ mac_array[45] ^ ++ mac_array[42] ^ mac_array[40] ^ mac_array[37] ^ ++ mac_array[36] ^ mac_array[32] ^ mac_array[31] ^ ++ mac_array[28] ^ mac_array[27] ^ mac_array[25] ^ ++ mac_array[20] ^ mac_array[18] ^ mac_array[16] ^ ++ mac_array[15] ^ mac_array[13] ^ mac_array[11] ^ ++ mac_array[9] ^ mac_array[5] ^ mac_array[4] ^ ++ mac_array[3]; ++ ++ crc[6] = mac_array[47] ^ mac_array[46] ^ mac_array[43] ^ ++ mac_array[41] ^ mac_array[38] ^ mac_array[37] ^ ++ mac_array[33] ^ mac_array[32] ^ mac_array[29] ^ ++ mac_array[28] ^ mac_array[26] ^ mac_array[21] ^ ++ mac_array[19] ^ mac_array[17] ^ mac_array[16] ^ ++ mac_array[14] ^ mac_array[12] ^ mac_array[10] ^ ++ mac_array[6] ^ mac_array[5] ^ mac_array[4]; ++ ++ crc[7] = mac_array[47] ^ mac_array[44] ^ mac_array[42] ^ ++ mac_array[39] ^ mac_array[38] ^ mac_array[34] ^ ++ mac_array[33] ^ mac_array[30] ^ mac_array[29] ^ ++ mac_array[27] ^ mac_array[22] ^ mac_array[20] ^ ++ mac_array[18] ^ mac_array[17] ^ mac_array[15] ^ ++ mac_array[13] ^ mac_array[11] ^ mac_array[7] ^ ++ mac_array[6] ^ mac_array[5]; ++ ++ for (i = 0; i < 8; i++) ++ crc_result = crc_result | (crc[i] << i); ++ ++ eth_port_omc_addr (eth_port_num, crc_result, queue, option); ++ } ++ return; ++} ++ ++/******************************************************************************* ++* eth_port_smc_addr - Special Multicast address settings. ++* ++* DESCRIPTION: ++* This routine controls the MV device special MAC multicast support. ++* The Special Multicast Table for MAC addresses supports MAC of the form ++* 0x01-00-5E-00-00-XX (where XX is between 0x00 and 0x_fF). ++* The MAC DA[7:0] bits are used as a pointer to the Special Multicast ++* Table entries in the DA-Filter table. ++* This function set the Special Multicast Table appropriate entry ++* according to the argument given. ++* ++* INPUT: ++* ETH_PORT eth_port_num Port number. ++* unsigned char mc_byte Multicast addr last byte (MAC DA[7:0] bits). ++* ETH_QUEUE queue Rx queue number for this MAC address. ++* int option 0 = Add, 1 = remove address. ++* ++* OUTPUT: ++* See description. ++* ++* RETURN: ++* true is output succeeded. ++* false if option parameter is invalid. ++* ++*******************************************************************************/ ++static bool eth_port_smc_addr (ETH_PORT eth_port_num, ++ unsigned char mc_byte, ++ ETH_QUEUE queue, int option) ++{ ++ unsigned int smc_table_reg; ++ unsigned int tbl_offset; ++ unsigned int reg_offset; ++ ++ /* Locate the SMC table entry */ ++ tbl_offset = (mc_byte / 4) * 4; /* Register offset from SMC table base */ ++ reg_offset = mc_byte % 4; /* Entry offset within the above register */ ++ queue &= 0x7; ++ ++ switch (option) { ++ case REJECT_MAC_ADDR: ++ /* Clear accepts frame bit at specified Special DA table entry */ ++ smc_table_reg = ++ MV_REG_READ ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset)); ++ smc_table_reg &= (0x0E << (8 * reg_offset)); ++ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), smc_table_reg); ++ break; ++ ++ case ACCEPT_MAC_ADDR: ++ /* Set accepts frame bit at specified Special DA table entry */ ++ smc_table_reg = ++ MV_REG_READ ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset)); ++ smc_table_reg |= ((0x01 | queue) << (8 * reg_offset)); ++ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), smc_table_reg); ++ break; ++ ++ default: ++ return false; ++ } ++ return true; ++} ++ ++/******************************************************************************* ++* eth_port_omc_addr - Multicast address settings. ++* ++* DESCRIPTION: ++* This routine controls the MV device Other MAC multicast support. ++* The Other Multicast Table is used for multicast of another type. ++* A CRC-8bit is used as an index to the Other Multicast Table entries ++* in the DA-Filter table. ++* The function gets the CRC-8bit value from the calling routine and ++* set the Other Multicast Table appropriate entry according to the ++* CRC-8 argument given. ++* ++* INPUT: ++* ETH_PORT eth_port_num Port number. ++* unsigned char crc8 A CRC-8bit (Polynomial: x^8+x^2+x^1+1). ++* ETH_QUEUE queue Rx queue number for this MAC address. ++* int option 0 = Add, 1 = remove address. ++* ++* OUTPUT: ++* See description. ++* ++* RETURN: ++* true is output succeeded. ++* false if option parameter is invalid. ++* ++*******************************************************************************/ ++static bool eth_port_omc_addr (ETH_PORT eth_port_num, ++ unsigned char crc8, ++ ETH_QUEUE queue, int option) ++{ ++ unsigned int omc_table_reg; ++ unsigned int tbl_offset; ++ unsigned int reg_offset; ++ ++ /* Locate the OMC table entry */ ++ tbl_offset = (crc8 / 4) * 4; /* Register offset from OMC table base */ ++ reg_offset = crc8 % 4; /* Entry offset within the above register */ ++ queue &= 0x7; ++ ++ switch (option) { ++ case REJECT_MAC_ADDR: ++ /* Clear accepts frame bit at specified Other DA table entry */ ++ omc_table_reg = ++ MV_REG_READ ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset)); ++ omc_table_reg &= (0x0E << (8 * reg_offset)); ++ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), omc_table_reg); ++ break; ++ ++ case ACCEPT_MAC_ADDR: ++ /* Set accepts frame bit at specified Other DA table entry */ ++ omc_table_reg = ++ MV_REG_READ ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset)); ++ omc_table_reg |= ((0x01 | queue) << (8 * reg_offset)); ++ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + tbl_offset), omc_table_reg); ++ break; ++ ++ default: ++ return false; ++ } ++ return true; ++} ++#endif ++ ++/******************************************************************************* ++* eth_port_init_mac_tables - Clear all entrance in the UC, SMC and OMC tables ++* ++* DESCRIPTION: ++* Go through all the DA filter tables (Unicast, Special Multicast & Other ++* Multicast) and set each entry to 0. ++* ++* INPUT: ++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++* ++* OUTPUT: ++* Multicast and Unicast packets are rejected. ++* ++* RETURN: ++* None. ++* ++*******************************************************************************/ ++static void eth_port_init_mac_tables (ETH_PORT eth_port_num) ++{ ++ int table_index; ++ ++ /* Clear DA filter unicast table (Ex_dFUT) */ ++ for (table_index = 0; table_index <= 0xC; table_index += 4) ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE ++ (eth_port_num) + table_index), 0); ++ ++ for (table_index = 0; table_index <= 0xFC; table_index += 4) { ++ /* Clear DA filter special multicast table (Ex_dFSMT) */ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE (eth_port_num) + table_index), 0); ++ /* Clear DA filter other multicast table (Ex_dFOMT) */ ++ MV_REG_WRITE ((MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE (eth_port_num) + table_index), 0); ++ } ++} ++ ++/******************************************************************************* ++* eth_clear_mib_counters - Clear all MIB counters ++* ++* DESCRIPTION: ++* This function clears all MIB counters of a specific ethernet port. ++* A read from the MIB counter will reset the counter. ++* ++* INPUT: ++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++* ++* OUTPUT: ++* After reading all MIB counters, the counters resets. ++* ++* RETURN: ++* MIB counter value. ++* ++*******************************************************************************/ ++static void eth_clear_mib_counters (ETH_PORT eth_port_num) ++{ ++ int i; ++ unsigned int dummy; ++ ++ /* Perform dummy reads from MIB counters */ ++ for (i = ETH_MIB_GOOD_OCTETS_RECEIVED_LOW; i < ETH_MIB_LATE_COLLISION; ++ i += 4) ++ dummy = MV_REG_READ ((MV64460_ETH_MIB_COUNTERS_BASE ++ (eth_port_num) + i)); ++ ++ return; ++} ++ ++/******************************************************************************* ++* eth_read_mib_counter - Read a MIB counter ++* ++* DESCRIPTION: ++* This function reads a MIB counter of a specific ethernet port. ++* NOTE - If read from ETH_MIB_GOOD_OCTETS_RECEIVED_LOW, then the ++* following read must be from ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH ++* register. The same applies for ETH_MIB_GOOD_OCTETS_SENT_LOW and ++* ETH_MIB_GOOD_OCTETS_SENT_HIGH ++* ++* INPUT: ++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++* unsigned int mib_offset MIB counter offset (use ETH_MIB_... macros). ++* ++* OUTPUT: ++* After reading the MIB counter, the counter resets. ++* ++* RETURN: ++* MIB counter value. ++* ++*******************************************************************************/ ++unsigned int eth_read_mib_counter (ETH_PORT eth_port_num, ++ unsigned int mib_offset) ++{ ++ return (MV_REG_READ (MV64460_ETH_MIB_COUNTERS_BASE (eth_port_num) ++ + mib_offset)); ++} ++ ++/******************************************************************************* ++* ethernet_phy_set - Set the ethernet port PHY address. ++* ++* DESCRIPTION: ++* This routine set the ethernet port PHY address according to given ++* parameter. ++* ++* INPUT: ++* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++* ++* OUTPUT: ++* Set PHY Address Register with given PHY address parameter. ++* ++* RETURN: ++* None. ++* ++*******************************************************************************/ ++static void ethernet_phy_set (ETH_PORT eth_port_num, int phy_addr) ++{ ++ unsigned int reg_data; ++ ++ reg_data = MV_REG_READ (MV64460_ETH_PHY_ADDR_REG); ++ ++ reg_data &= ~(0x1F << (5 * eth_port_num)); ++ reg_data |= (phy_addr << (5 * eth_port_num)); ++ ++ MV_REG_WRITE (MV64460_ETH_PHY_ADDR_REG, reg_data); ++ ++ return; ++} ++ ++/******************************************************************************* ++ * ethernet_phy_get - Get the ethernet port PHY address. ++ * ++ * DESCRIPTION: ++ * This routine returns the given ethernet port PHY address. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * ++ * OUTPUT: ++ * None. ++ * ++ * RETURN: ++ * PHY address. ++ * ++ *******************************************************************************/ ++static int ethernet_phy_get (ETH_PORT eth_port_num) ++{ ++ unsigned int reg_data; ++ ++ reg_data = MV_REG_READ (MV64460_ETH_PHY_ADDR_REG); ++ ++ return ((reg_data >> (5 * eth_port_num)) & 0x1f); ++} ++ ++/***********************************************************/ ++/* (Re)start autonegotiation */ ++/***********************************************************/ ++int phy_setup_aneg (char *devname, unsigned char addr) ++{ ++ unsigned short ctl, adv; ++ ++ /* Setup standard advertise */ ++ miiphy_read (devname, addr, PHY_ANAR, &adv); ++ adv |= (PHY_ANLPAR_ACK | PHY_ANLPAR_RF | PHY_ANLPAR_T4 | ++ PHY_ANLPAR_TXFD | PHY_ANLPAR_TX | PHY_ANLPAR_10FD | ++ PHY_ANLPAR_10); ++ miiphy_write (devname, addr, PHY_ANAR, adv); ++ ++ miiphy_read (devname, addr, PHY_1000BTCR, &adv); ++ adv |= (0x0300); ++ miiphy_write (devname, addr, PHY_1000BTCR, adv); ++ ++ /* Start/Restart aneg */ ++ miiphy_read (devname, addr, PHY_BMCR, &ctl); ++ ctl |= (PHY_BMCR_AUTON | PHY_BMCR_RST_NEG); ++ miiphy_write (devname, addr, PHY_BMCR, ctl); ++ ++ return 0; ++} ++ ++/******************************************************************************* ++ * ethernet_phy_reset - Reset Ethernet port PHY. ++ * ++ * DESCRIPTION: ++ * This routine utilize the SMI interface to reset the ethernet port PHY. ++ * The routine waits until the link is up again or link up is timeout. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * ++ * OUTPUT: ++ * The ethernet port PHY renew its link. ++ * ++ * RETURN: ++ * None. ++ * ++ *******************************************************************************/ ++static bool ethernet_phy_reset (ETH_PORT eth_port_num) ++{ ++ unsigned int time_out = 50; ++ unsigned int phy_reg_data; ++ ++ eth_port_read_smi_reg (eth_port_num, 20, &phy_reg_data); ++ phy_reg_data |= 0x0083; /* Set bit 7 to 1 for different RGMII timing */ ++ eth_port_write_smi_reg (eth_port_num, 20, phy_reg_data); ++ ++ /* Reset the PHY */ ++ eth_port_read_smi_reg (eth_port_num, 0, &phy_reg_data); ++ phy_reg_data |= 0x8000; /* Set bit 15 to reset the PHY */ ++ eth_port_write_smi_reg (eth_port_num, 0, phy_reg_data); ++ ++ /* Poll on the PHY LINK */ ++ do { ++ eth_port_read_smi_reg (eth_port_num, 1, &phy_reg_data); ++ ++ if (time_out-- == 0) ++ return false; ++ } ++ while (!(phy_reg_data & 0x20)); ++ ++ return true; ++} ++ ++/******************************************************************************* ++ * eth_port_reset - Reset Ethernet port ++ * ++ * DESCRIPTION: ++ * This routine resets the chip by aborting any SDMA engine activity and ++ * clearing the MIB counters. The Receiver and the Transmit unit are in ++ * idle state after this command is performed and the port is disabled. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * ++ * OUTPUT: ++ * Channel activity is halted. ++ * ++ * RETURN: ++ * None. ++ * ++ *******************************************************************************/ ++static void eth_port_reset (ETH_PORT eth_port_num) ++{ ++ unsigned int reg_data; ++ ++ /* Stop Tx port activity. Check port Tx activity. */ ++ reg_data = ++ MV_REG_READ (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG ++ (eth_port_num)); ++ ++ if (reg_data & 0xFF) { ++ /* Issue stop command for active channels only */ ++ MV_REG_WRITE (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG ++ (eth_port_num), (reg_data << 8)); ++ ++ /* Wait for all Tx activity to terminate. */ ++ do { ++ /* Check port cause register that all Tx queues are stopped */ ++ reg_data = ++ MV_REG_READ ++ (MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG ++ (eth_port_num)); ++ } ++ while (reg_data & 0xFF); ++ } ++ ++ /* Stop Rx port activity. Check port Rx activity. */ ++ reg_data = ++ MV_REG_READ (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG ++ (eth_port_num)); ++ ++ if (reg_data & 0xFF) { ++ /* Issue stop command for active channels only */ ++ MV_REG_WRITE (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG ++ (eth_port_num), (reg_data << 8)); ++ ++ /* Wait for all Rx activity to terminate. */ ++ do { ++ /* Check port cause register that all Rx queues are stopped */ ++ reg_data = ++ MV_REG_READ ++ (MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG ++ (eth_port_num)); ++ } ++ while (reg_data & 0xFF); ++ } ++ ++ /* Clear all MIB counters */ ++ eth_clear_mib_counters (eth_port_num); ++ ++ /* Reset the Enable bit in the Configuration Register */ ++ reg_data = ++ MV_REG_READ (MV64460_ETH_PORT_SERIAL_CONTROL_REG ++ (eth_port_num)); ++ reg_data &= ~ETH_SERIAL_PORT_ENABLE; ++ MV_REG_WRITE (MV64460_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num), ++ reg_data); ++ ++ return; ++} ++ ++#if 0 /* Not needed here */ ++/******************************************************************************* ++ * ethernet_set_config_reg - Set specified bits in configuration register. ++ * ++ * DESCRIPTION: ++ * This function sets specified bits in the given ethernet ++ * configuration register. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * unsigned int value 32 bit value. ++ * ++ * OUTPUT: ++ * The set bits in the value parameter are set in the configuration ++ * register. ++ * ++ * RETURN: ++ * None. ++ * ++ *******************************************************************************/ ++static void ethernet_set_config_reg (ETH_PORT eth_port_num, ++ unsigned int value) ++{ ++ unsigned int eth_config_reg; ++ ++ eth_config_reg = ++ MV_REG_READ (MV64460_ETH_PORT_CONFIG_REG (eth_port_num)); ++ eth_config_reg |= value; ++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_REG (eth_port_num), ++ eth_config_reg); ++ ++ return; ++} ++#endif ++ ++#if 0 /* FIXME */ ++/******************************************************************************* ++ * ethernet_reset_config_reg - Reset specified bits in configuration register. ++ * ++ * DESCRIPTION: ++ * This function resets specified bits in the given Ethernet ++ * configuration register. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * unsigned int value 32 bit value. ++ * ++ * OUTPUT: ++ * The set bits in the value parameter are reset in the configuration ++ * register. ++ * ++ * RETURN: ++ * None. ++ * ++ *******************************************************************************/ ++static void ethernet_reset_config_reg (ETH_PORT eth_port_num, ++ unsigned int value) ++{ ++ unsigned int eth_config_reg; ++ ++ eth_config_reg = MV_REG_READ (MV64460_ETH_PORT_CONFIG_EXTEND_REG ++ (eth_port_num)); ++ eth_config_reg &= ~value; ++ MV_REG_WRITE (MV64460_ETH_PORT_CONFIG_EXTEND_REG (eth_port_num), ++ eth_config_reg); ++ ++ return; ++} ++#endif ++ ++#if 0 /* Not needed here */ ++/******************************************************************************* ++ * ethernet_get_config_reg - Get the port configuration register ++ * ++ * DESCRIPTION: ++ * This function returns the configuration register value of the given ++ * ethernet port. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * ++ * OUTPUT: ++ * None. ++ * ++ * RETURN: ++ * Port configuration register value. ++ * ++ *******************************************************************************/ ++static unsigned int ethernet_get_config_reg (ETH_PORT eth_port_num) ++{ ++ unsigned int eth_config_reg; ++ ++ eth_config_reg = MV_REG_READ (MV64460_ETH_PORT_CONFIG_EXTEND_REG ++ (eth_port_num)); ++ return eth_config_reg; ++} ++ ++#endif ++ ++/******************************************************************************* ++ * eth_port_read_smi_reg - Read PHY registers ++ * ++ * DESCRIPTION: ++ * This routine utilize the SMI interface to interact with the PHY in ++ * order to perform PHY register read. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * unsigned int phy_reg PHY register address offset. ++ * unsigned int *value Register value buffer. ++ * ++ * OUTPUT: ++ * Write the value of a specified PHY register into given buffer. ++ * ++ * RETURN: ++ * false if the PHY is busy or read data is not in valid state. ++ * true otherwise. ++ * ++ *******************************************************************************/ ++static bool eth_port_read_smi_reg (ETH_PORT eth_port_num, ++ unsigned int phy_reg, unsigned int *value) ++{ ++ unsigned int reg_value; ++ unsigned int time_out = PHY_BUSY_TIMEOUT; ++ int phy_addr; ++ ++ phy_addr = ethernet_phy_get (eth_port_num); ++ ++ /* first check that it is not busy */ ++ do { ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ if (time_out-- == 0) { ++ return false; ++ } ++ } ++ while (reg_value & ETH_SMI_BUSY); ++ ++ /* not busy */ ++ ++ MV_REG_WRITE (MV64460_ETH_SMI_REG, ++ (phy_addr << 16) | (phy_reg << 21) | ++ ETH_SMI_OPCODE_READ); ++ ++ time_out = PHY_BUSY_TIMEOUT; /* initialize the time out var again */ ++ ++ do { ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ if (time_out-- == 0) { ++ return false; ++ } ++ } ++ while ((reg_value & ETH_SMI_READ_VALID) != ETH_SMI_READ_VALID); /* Bit set equ operation done */ ++ ++ /* Wait for the data to update in the SMI register */ ++#define PHY_UPDATE_TIMEOUT 10000 ++ for (time_out = 0; time_out < PHY_UPDATE_TIMEOUT; time_out++); ++ ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ ++ *value = reg_value & 0xffff; ++ ++ return true; ++} ++ ++int mv_miiphy_read(char *devname, unsigned char phy_addr, ++ unsigned char phy_reg, unsigned short *value) ++{ ++ unsigned int reg_value; ++ unsigned int time_out = PHY_BUSY_TIMEOUT; ++ ++ /* first check that it is not busy */ ++ do { ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ if (time_out-- == 0) { ++ return false; ++ } ++ } ++ while (reg_value & ETH_SMI_BUSY); ++ ++ /* not busy */ ++ MV_REG_WRITE (MV64460_ETH_SMI_REG, ++ (phy_addr << 16) | (phy_reg << 21) | ++ ETH_SMI_OPCODE_READ); ++ ++ time_out = PHY_BUSY_TIMEOUT; /* initialize the time out var again */ ++ ++ do { ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ if (time_out-- == 0) { ++ return false; ++ } ++ } ++ while ((reg_value & ETH_SMI_READ_VALID) != ETH_SMI_READ_VALID); /* Bit set equ operation done */ ++ ++ /* Wait for the data to update in the SMI register */ ++ for (time_out = 0; time_out < PHY_UPDATE_TIMEOUT; time_out++); ++ ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ ++ *value = reg_value & 0xffff; ++ ++ return 0; ++} ++ ++/******************************************************************************* ++ * eth_port_write_smi_reg - Write to PHY registers ++ * ++ * DESCRIPTION: ++ * This routine utilize the SMI interface to interact with the PHY in ++ * order to perform writes to PHY registers. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * unsigned int phy_reg PHY register address offset. ++ * unsigned int value Register value. ++ * ++ * OUTPUT: ++ * Write the given value to the specified PHY register. ++ * ++ * RETURN: ++ * false if the PHY is busy. ++ * true otherwise. ++ * ++ *******************************************************************************/ ++static bool eth_port_write_smi_reg (ETH_PORT eth_port_num, ++ unsigned int phy_reg, unsigned int value) ++{ ++ unsigned int reg_value; ++ unsigned int time_out = PHY_BUSY_TIMEOUT; ++ int phy_addr; ++ ++ phy_addr = ethernet_phy_get (eth_port_num); ++ ++ /* first check that it is not busy */ ++ do { ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ if (time_out-- == 0) { ++ return false; ++ } ++ } ++ while (reg_value & ETH_SMI_BUSY); ++ ++ /* not busy */ ++ MV_REG_WRITE (MV64460_ETH_SMI_REG, ++ (phy_addr << 16) | (phy_reg << 21) | ++ ETH_SMI_OPCODE_WRITE | (value & 0xffff)); ++ return true; ++} ++ ++int mv_miiphy_write(char *devname, unsigned char phy_addr, ++ unsigned char phy_reg, unsigned short value) ++{ ++ unsigned int reg_value; ++ unsigned int time_out = PHY_BUSY_TIMEOUT; ++ ++ /* first check that it is not busy */ ++ do { ++ reg_value = MV_REG_READ (MV64460_ETH_SMI_REG); ++ if (time_out-- == 0) { ++ return false; ++ } ++ } ++ while (reg_value & ETH_SMI_BUSY); ++ ++ /* not busy */ ++ MV_REG_WRITE (MV64460_ETH_SMI_REG, ++ (phy_addr << 16) | (phy_reg << 21) | ++ ETH_SMI_OPCODE_WRITE | (value & 0xffff)); ++ return 0; ++} ++ ++/******************************************************************************* ++ * eth_set_access_control - Config address decode parameters for Ethernet unit ++ * ++ * DESCRIPTION: ++ * This function configures the address decode parameters for the Gigabit ++ * Ethernet Controller according the given parameters struct. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. ++ * ETH_WIN_PARAM *param Address decode parameter struct. ++ * ++ * OUTPUT: ++ * An access window is opened using the given access parameters. ++ * ++ * RETURN: ++ * None. ++ * ++ *******************************************************************************/ ++static void eth_set_access_control (ETH_PORT eth_port_num, ++ ETH_WIN_PARAM * param) ++{ ++ unsigned int access_prot_reg; ++ ++ /* Set access control register */ ++ access_prot_reg = MV_REG_READ (MV64460_ETH_ACCESS_PROTECTION_REG ++ (eth_port_num)); ++ access_prot_reg &= (~(3 << (param->win * 2))); /* clear window permission */ ++ access_prot_reg |= (param->access_ctrl << (param->win * 2)); ++ MV_REG_WRITE (MV64460_ETH_ACCESS_PROTECTION_REG (eth_port_num), ++ access_prot_reg); ++ ++ /* Set window Size reg (SR) */ ++ MV_REG_WRITE ((MV64460_ETH_SIZE_REG_0 + ++ (ETH_SIZE_REG_GAP * param->win)), ++ (((param->size / 0x10000) - 1) << 16)); ++ ++ /* Set window Base address reg (BA) */ ++ MV_REG_WRITE ((MV64460_ETH_BAR_0 + (ETH_BAR_GAP * param->win)), ++ (param->target | param->attributes | param->base_addr)); ++ /* High address remap reg (HARR) */ ++ if (param->win < 4) ++ MV_REG_WRITE ((MV64460_ETH_HIGH_ADDR_REMAP_REG_0 + ++ (ETH_HIGH_ADDR_REMAP_REG_GAP * param->win)), ++ param->high_addr); ++ ++ /* Base address enable reg (BARER) */ ++ if (param->enable == 1) ++ MV_RESET_REG_BITS (MV64460_ETH_BASE_ADDR_ENABLE_REG, ++ (1 << param->win)); ++ else ++ MV_SET_REG_BITS (MV64460_ETH_BASE_ADDR_ENABLE_REG, ++ (1 << param->win)); ++} ++ ++/******************************************************************************* ++ * ether_init_rx_desc_ring - Curve a Rx chain desc list and buffer in memory. ++ * ++ * DESCRIPTION: ++ * This function prepares a Rx chained list of descriptors and packet ++ * buffers in a form of a ring. The routine must be called after port ++ * initialization routine and before port start routine. ++ * The Ethernet SDMA engine uses CPU bus addresses to access the various ++ * devices in the system (i.e. DRAM). This function uses the ethernet ++ * struct 'virtual to physical' routine (set by the user) to set the ring ++ * with physical addresses. ++ * ++ * INPUT: ++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. ++ * ETH_QUEUE rx_queue Number of Rx queue. ++ * int rx_desc_num Number of Rx descriptors ++ * int rx_buff_size Size of Rx buffer ++ * unsigned int rx_desc_base_addr Rx descriptors memory area base addr. ++ * unsigned int rx_buff_base_addr Rx buffer memory area base addr. ++ * ++ * OUTPUT: ++ * The routine updates the Ethernet port control struct with information ++ * regarding the Rx descriptors and buffers. ++ * ++ * RETURN: ++ * false if the given descriptors memory area is not aligned according to ++ * Ethernet SDMA specifications. ++ * true otherwise. ++ * ++ *******************************************************************************/ ++static bool ether_init_rx_desc_ring (ETH_PORT_INFO * p_eth_port_ctrl, ++ ETH_QUEUE rx_queue, ++ int rx_desc_num, ++ int rx_buff_size, ++ unsigned int rx_desc_base_addr, ++ unsigned int rx_buff_base_addr) ++{ ++ ETH_RX_DESC *p_rx_desc; ++ ETH_RX_DESC *p_rx_prev_desc; /* pointer to link with the last descriptor */ ++ unsigned int buffer_addr; ++ int ix; /* a counter */ ++ ++ p_rx_desc = (ETH_RX_DESC *) rx_desc_base_addr; ++ p_rx_prev_desc = p_rx_desc; ++ buffer_addr = rx_buff_base_addr; ++ ++ /* Rx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */ ++ if (rx_buff_base_addr & 0xF) ++ return false; ++ ++ /* Rx buffers are limited to 64K bytes and Minimum size is 8 bytes */ ++ if ((rx_buff_size < 8) || (rx_buff_size > RX_BUFFER_MAX_SIZE)) ++ return false; ++ ++ /* Rx buffers must be 64-bit aligned. */ ++ if ((rx_buff_base_addr + rx_buff_size) & 0x7) ++ return false; ++ ++ /* initialize the Rx descriptors ring */ ++ for (ix = 0; ix < rx_desc_num; ix++) { ++ p_rx_desc->buf_size = rx_buff_size; ++ p_rx_desc->byte_cnt = 0x0000; ++ p_rx_desc->cmd_sts = ++ ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT; ++ p_rx_desc->next_desc_ptr = ++ ((unsigned int) p_rx_desc) + RX_DESC_ALIGNED_SIZE; ++ p_rx_desc->buf_ptr = buffer_addr; ++ p_rx_desc->return_info = 0x00000000; ++ D_CACHE_FLUSH_LINE (p_rx_desc, 0); ++ buffer_addr += rx_buff_size; ++ p_rx_prev_desc = p_rx_desc; ++ p_rx_desc = (ETH_RX_DESC *) ++ ((unsigned int) p_rx_desc + RX_DESC_ALIGNED_SIZE); ++ } ++ ++ /* Closing Rx descriptors ring */ ++ p_rx_prev_desc->next_desc_ptr = (rx_desc_base_addr); ++ D_CACHE_FLUSH_LINE (p_rx_prev_desc, 0); ++ ++ /* Save Rx desc pointer to driver struct. */ ++ CURR_RFD_SET ((ETH_RX_DESC *) rx_desc_base_addr, rx_queue); ++ USED_RFD_SET ((ETH_RX_DESC *) rx_desc_base_addr, rx_queue); ++ ++ p_eth_port_ctrl->p_rx_desc_area_base[rx_queue] = ++ (ETH_RX_DESC *) rx_desc_base_addr; ++ p_eth_port_ctrl->rx_desc_area_size[rx_queue] = ++ rx_desc_num * RX_DESC_ALIGNED_SIZE; ++ ++ p_eth_port_ctrl->port_rx_queue_command |= (1 << rx_queue); ++ ++ return true; ++} ++ ++/******************************************************************************* ++ * ether_init_tx_desc_ring - Curve a Tx chain desc list and buffer in memory. ++ * ++ * DESCRIPTION: ++ * This function prepares a Tx chained list of descriptors and packet ++ * buffers in a form of a ring. The routine must be called after port ++ * initialization routine and before port start routine. ++ * The Ethernet SDMA engine uses CPU bus addresses to access the various ++ * devices in the system (i.e. DRAM). This function uses the ethernet ++ * struct 'virtual to physical' routine (set by the user) to set the ring ++ * with physical addresses. ++ * ++ * INPUT: ++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. ++ * ETH_QUEUE tx_queue Number of Tx queue. ++ * int tx_desc_num Number of Tx descriptors ++ * int tx_buff_size Size of Tx buffer ++ * unsigned int tx_desc_base_addr Tx descriptors memory area base addr. ++ * unsigned int tx_buff_base_addr Tx buffer memory area base addr. ++ * ++ * OUTPUT: ++ * The routine updates the Ethernet port control struct with information ++ * regarding the Tx descriptors and buffers. ++ * ++ * RETURN: ++ * false if the given descriptors memory area is not aligned according to ++ * Ethernet SDMA specifications. ++ * true otherwise. ++ * ++ *******************************************************************************/ ++static bool ether_init_tx_desc_ring (ETH_PORT_INFO * p_eth_port_ctrl, ++ ETH_QUEUE tx_queue, ++ int tx_desc_num, ++ int tx_buff_size, ++ unsigned int tx_desc_base_addr, ++ unsigned int tx_buff_base_addr) ++{ ++ ++ ETH_TX_DESC *p_tx_desc; ++ ETH_TX_DESC *p_tx_prev_desc; ++ unsigned int buffer_addr; ++ int ix; /* a counter */ ++ ++ /* save the first desc pointer to link with the last descriptor */ ++ p_tx_desc = (ETH_TX_DESC *) tx_desc_base_addr; ++ p_tx_prev_desc = p_tx_desc; ++ buffer_addr = tx_buff_base_addr; ++ ++ /* Tx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */ ++ if (tx_buff_base_addr & 0xF) ++ return false; ++ ++ /* Tx buffers are limited to 64K bytes and Minimum size is 8 bytes */ ++ if ((tx_buff_size > TX_BUFFER_MAX_SIZE) ++ || (tx_buff_size < TX_BUFFER_MIN_SIZE)) ++ return false; ++ ++ /* Initialize the Tx descriptors ring */ ++ for (ix = 0; ix < tx_desc_num; ix++) { ++ p_tx_desc->byte_cnt = 0x0000; ++ p_tx_desc->l4i_chk = 0x0000; ++ p_tx_desc->cmd_sts = 0x00000000; ++ p_tx_desc->next_desc_ptr = ++ ((unsigned int) p_tx_desc) + TX_DESC_ALIGNED_SIZE; ++ ++ p_tx_desc->buf_ptr = buffer_addr; ++ p_tx_desc->return_info = 0x00000000; ++ D_CACHE_FLUSH_LINE (p_tx_desc, 0); ++ buffer_addr += tx_buff_size; ++ p_tx_prev_desc = p_tx_desc; ++ p_tx_desc = (ETH_TX_DESC *) ++ ((unsigned int) p_tx_desc + TX_DESC_ALIGNED_SIZE); ++ ++ } ++ /* Closing Tx descriptors ring */ ++ p_tx_prev_desc->next_desc_ptr = tx_desc_base_addr; ++ D_CACHE_FLUSH_LINE (p_tx_prev_desc, 0); ++ /* Set Tx desc pointer in driver struct. */ ++ CURR_TFD_SET ((ETH_TX_DESC *) tx_desc_base_addr, tx_queue); ++ USED_TFD_SET ((ETH_TX_DESC *) tx_desc_base_addr, tx_queue); ++ ++ /* Init Tx ring base and size parameters */ ++ p_eth_port_ctrl->p_tx_desc_area_base[tx_queue] = ++ (ETH_TX_DESC *) tx_desc_base_addr; ++ p_eth_port_ctrl->tx_desc_area_size[tx_queue] = ++ (tx_desc_num * TX_DESC_ALIGNED_SIZE); ++ ++ /* Add the queue to the list of Tx queues of this port */ ++ p_eth_port_ctrl->port_tx_queue_command |= (1 << tx_queue); ++ ++ return true; ++} ++ ++/******************************************************************************* ++ * eth_port_send - Send an Ethernet packet ++ * ++ * DESCRIPTION: ++ * This routine send a given packet described by p_pktinfo parameter. It ++ * supports transmitting of a packet spaned over multiple buffers. The ++ * routine updates 'curr' and 'first' indexes according to the packet ++ * segment passed to the routine. In case the packet segment is first, ++ * the 'first' index is update. In any case, the 'curr' index is updated. ++ * If the routine get into Tx resource error it assigns 'curr' index as ++ * 'first'. This way the function can abort Tx process of multiple ++ * descriptors per packet. ++ * ++ * INPUT: ++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. ++ * ETH_QUEUE tx_queue Number of Tx queue. ++ * PKT_INFO *p_pkt_info User packet buffer. ++ * ++ * OUTPUT: ++ * Tx ring 'curr' and 'first' indexes are updated. ++ * ++ * RETURN: ++ * ETH_QUEUE_FULL in case of Tx resource error. ++ * ETH_ERROR in case the routine can not access Tx desc ring. ++ * ETH_QUEUE_LAST_RESOURCE if the routine uses the last Tx resource. ++ * ETH_OK otherwise. ++ * ++ *******************************************************************************/ ++static ETH_FUNC_RET_STATUS eth_port_send (ETH_PORT_INFO * p_eth_port_ctrl, ++ ETH_QUEUE tx_queue, ++ PKT_INFO * p_pkt_info) ++{ ++ volatile ETH_TX_DESC *p_tx_desc_first; ++ volatile ETH_TX_DESC *p_tx_desc_curr; ++ volatile ETH_TX_DESC *p_tx_next_desc_curr; ++ volatile ETH_TX_DESC *p_tx_desc_used; ++ unsigned int command_status; ++ ++ /* Do not process Tx ring in case of Tx ring resource error */ ++ if (p_eth_port_ctrl->tx_resource_err[tx_queue] == true) ++ return ETH_QUEUE_FULL; ++ ++ /* Get the Tx Desc ring indexes */ ++ CURR_TFD_GET (p_tx_desc_curr, tx_queue); ++ USED_TFD_GET (p_tx_desc_used, tx_queue); ++ ++ if (p_tx_desc_curr == NULL) ++ return ETH_ERROR; ++ ++ /* The following parameters are used to save readings from memory */ ++ p_tx_next_desc_curr = TX_NEXT_DESC_PTR (p_tx_desc_curr, tx_queue); ++ command_status = p_pkt_info->cmd_sts | ETH_ZERO_PADDING | ETH_GEN_CRC; ++ ++ if (command_status & (ETH_TX_FIRST_DESC)) { ++ /* Update first desc */ ++ FIRST_TFD_SET (p_tx_desc_curr, tx_queue); ++ p_tx_desc_first = p_tx_desc_curr; ++ } else { ++ FIRST_TFD_GET (p_tx_desc_first, tx_queue); ++ command_status |= ETH_BUFFER_OWNED_BY_DMA; ++ } ++ ++ /* Buffers with a payload smaller than 8 bytes must be aligned to 64-bit */ ++ /* boundary. We use the memory allocated for Tx descriptor. This memory */ ++ /* located in TX_BUF_OFFSET_IN_DESC offset within the Tx descriptor. */ ++ if (p_pkt_info->byte_cnt <= 8) { ++ printf ("You have failed in the < 8 bytes errata - fixme\n"); /* RABEEH - TBD */ ++ return ETH_ERROR; ++ ++ p_tx_desc_curr->buf_ptr = ++ (unsigned int) p_tx_desc_curr + TX_BUF_OFFSET_IN_DESC; ++ eth_b_copy (p_pkt_info->buf_ptr, p_tx_desc_curr->buf_ptr, ++ p_pkt_info->byte_cnt); ++ } else ++ p_tx_desc_curr->buf_ptr = p_pkt_info->buf_ptr; ++ ++ p_tx_desc_curr->byte_cnt = p_pkt_info->byte_cnt; ++ p_tx_desc_curr->return_info = p_pkt_info->return_info; ++ ++ if (p_pkt_info->cmd_sts & (ETH_TX_LAST_DESC)) { ++ /* Set last desc with DMA ownership and interrupt enable. */ ++ p_tx_desc_curr->cmd_sts = command_status | ++ ETH_BUFFER_OWNED_BY_DMA | ETH_TX_ENABLE_INTERRUPT; ++ ++ if (p_tx_desc_curr != p_tx_desc_first) ++ p_tx_desc_first->cmd_sts |= ETH_BUFFER_OWNED_BY_DMA; ++ ++ /* Flush CPU pipe */ ++ ++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_curr, 0); ++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_first, 0); ++ CPU_PIPE_FLUSH; ++ ++ /* Apply send command */ ++ ETH_ENABLE_TX_QUEUE (tx_queue, p_eth_port_ctrl->port_num); ++ ++ /* Finish Tx packet. Update first desc in case of Tx resource error */ ++ p_tx_desc_first = p_tx_next_desc_curr; ++ FIRST_TFD_SET (p_tx_desc_first, tx_queue); ++ ++ } else { ++ p_tx_desc_curr->cmd_sts = command_status; ++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_curr, 0); ++ } ++ ++ /* Check for ring index overlap in the Tx desc ring */ ++ if (p_tx_next_desc_curr == p_tx_desc_used) { ++ /* Update the current descriptor */ ++ CURR_TFD_SET (p_tx_desc_first, tx_queue); ++ ++ p_eth_port_ctrl->tx_resource_err[tx_queue] = true; ++ return ETH_QUEUE_LAST_RESOURCE; ++ } else { ++ /* Update the current descriptor */ ++ CURR_TFD_SET (p_tx_next_desc_curr, tx_queue); ++ return ETH_OK; ++ } ++} ++ ++/******************************************************************************* ++ * eth_tx_return_desc - Free all used Tx descriptors ++ * ++ * DESCRIPTION: ++ * This routine returns the transmitted packet information to the caller. ++ * It uses the 'first' index to support Tx desc return in case a transmit ++ * of a packet spanned over multiple buffer still in process. ++ * In case the Tx queue was in "resource error" condition, where there are ++ * no available Tx resources, the function resets the resource error flag. ++ * ++ * INPUT: ++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. ++ * ETH_QUEUE tx_queue Number of Tx queue. ++ * PKT_INFO *p_pkt_info User packet buffer. ++ * ++ * OUTPUT: ++ * Tx ring 'first' and 'used' indexes are updated. ++ * ++ * RETURN: ++ * ETH_ERROR in case the routine can not access Tx desc ring. ++ * ETH_RETRY in case there is transmission in process. ++ * ETH_END_OF_JOB if the routine has nothing to release. ++ * ETH_OK otherwise. ++ * ++ *******************************************************************************/ ++static ETH_FUNC_RET_STATUS eth_tx_return_desc (ETH_PORT_INFO * ++ p_eth_port_ctrl, ++ ETH_QUEUE tx_queue, ++ PKT_INFO * p_pkt_info) ++{ ++ volatile ETH_TX_DESC *p_tx_desc_used = NULL; ++ volatile ETH_TX_DESC *p_tx_desc_first = NULL; ++ unsigned int command_status; ++ ++ /* Get the Tx Desc ring indexes */ ++ USED_TFD_GET (p_tx_desc_used, tx_queue); ++ FIRST_TFD_GET (p_tx_desc_first, tx_queue); ++ ++ /* Sanity check */ ++ if (p_tx_desc_used == NULL) ++ return ETH_ERROR; ++ ++ command_status = p_tx_desc_used->cmd_sts; ++ ++ /* Still transmitting... */ ++ if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) { ++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0); ++ return ETH_RETRY; ++ } ++ ++ /* Stop release. About to overlap the current available Tx descriptor */ ++ if ((p_tx_desc_used == p_tx_desc_first) && ++ (p_eth_port_ctrl->tx_resource_err[tx_queue] == false)) { ++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0); ++ return ETH_END_OF_JOB; ++ } ++ ++ /* Pass the packet information to the caller */ ++ p_pkt_info->cmd_sts = command_status; ++ p_pkt_info->return_info = p_tx_desc_used->return_info; ++ p_tx_desc_used->return_info = 0; ++ ++ /* Update the next descriptor to release. */ ++ USED_TFD_SET (TX_NEXT_DESC_PTR (p_tx_desc_used, tx_queue), tx_queue); ++ ++ /* Any Tx return cancels the Tx resource error status */ ++ if (p_eth_port_ctrl->tx_resource_err[tx_queue] == true) ++ p_eth_port_ctrl->tx_resource_err[tx_queue] = false; ++ ++ D_CACHE_FLUSH_LINE ((unsigned int) p_tx_desc_used, 0); ++ ++ return ETH_OK; ++ ++} ++ ++/******************************************************************************* ++ * eth_port_receive - Get received information from Rx ring. ++ * ++ * DESCRIPTION: ++ * This routine returns the received data to the caller. There is no ++ * data copying during routine operation. All information is returned ++ * using pointer to packet information struct passed from the caller. ++ * If the routine exhausts Rx ring resources then the resource error flag ++ * is set. ++ * ++ * INPUT: ++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. ++ * ETH_QUEUE rx_queue Number of Rx queue. ++ * PKT_INFO *p_pkt_info User packet buffer. ++ * ++ * OUTPUT: ++ * Rx ring current and used indexes are updated. ++ * ++ * RETURN: ++ * ETH_ERROR in case the routine can not access Rx desc ring. ++ * ETH_QUEUE_FULL if Rx ring resources are exhausted. ++ * ETH_END_OF_JOB if there is no received data. ++ * ETH_OK otherwise. ++ * ++ *******************************************************************************/ ++static ETH_FUNC_RET_STATUS eth_port_receive (ETH_PORT_INFO * p_eth_port_ctrl, ++ ETH_QUEUE rx_queue, ++ PKT_INFO * p_pkt_info) ++{ ++ volatile ETH_RX_DESC *p_rx_curr_desc; ++ volatile ETH_RX_DESC *p_rx_next_curr_desc; ++ volatile ETH_RX_DESC *p_rx_used_desc; ++ unsigned int command_status; ++ ++ /* Do not process Rx ring in case of Rx ring resource error */ ++ if (p_eth_port_ctrl->rx_resource_err[rx_queue] == true) { ++ printf ("\nRx Queue is full ...\n"); ++ return ETH_QUEUE_FULL; ++ } ++ ++ /* Get the Rx Desc ring 'curr and 'used' indexes */ ++ CURR_RFD_GET (p_rx_curr_desc, rx_queue); ++ USED_RFD_GET (p_rx_used_desc, rx_queue); ++ ++ /* Sanity check */ ++ if (p_rx_curr_desc == NULL) ++ return ETH_ERROR; ++ ++ /* The following parameters are used to save readings from memory */ ++ p_rx_next_curr_desc = RX_NEXT_DESC_PTR (p_rx_curr_desc, rx_queue); ++ command_status = p_rx_curr_desc->cmd_sts; ++ ++ /* Nothing to receive... */ ++ if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) { ++/* DP(printf("Rx: command_status: %08x\n", command_status)); */ ++ D_CACHE_FLUSH_LINE ((unsigned int) p_rx_curr_desc, 0); ++/* DP(printf("\nETH_END_OF_JOB ...\n"));*/ ++ return ETH_END_OF_JOB; ++ } ++ ++ p_pkt_info->byte_cnt = (p_rx_curr_desc->byte_cnt) - RX_BUF_OFFSET; ++ p_pkt_info->cmd_sts = command_status; ++ p_pkt_info->buf_ptr = (p_rx_curr_desc->buf_ptr) + RX_BUF_OFFSET; ++ p_pkt_info->return_info = p_rx_curr_desc->return_info; ++ p_pkt_info->l4i_chk = p_rx_curr_desc->buf_size; /* IP fragment indicator */ ++ ++ /* Clean the return info field to indicate that the packet has been */ ++ /* moved to the upper layers */ ++ p_rx_curr_desc->return_info = 0; ++ ++ /* Update 'curr' in data structure */ ++ CURR_RFD_SET (p_rx_next_curr_desc, rx_queue); ++ ++ /* Rx descriptors resource exhausted. Set the Rx ring resource error flag */ ++ if (p_rx_next_curr_desc == p_rx_used_desc) ++ p_eth_port_ctrl->rx_resource_err[rx_queue] = true; ++ ++ D_CACHE_FLUSH_LINE ((unsigned int) p_rx_curr_desc, 0); ++ CPU_PIPE_FLUSH; ++ ++ return ETH_OK; ++} ++ ++/******************************************************************************* ++ * eth_rx_return_buff - Returns a Rx buffer back to the Rx ring. ++ * ++ * DESCRIPTION: ++ * This routine returns a Rx buffer back to the Rx ring. It retrieves the ++ * next 'used' descriptor and attached the returned buffer to it. ++ * In case the Rx ring was in "resource error" condition, where there are ++ * no available Rx resources, the function resets the resource error flag. ++ * ++ * INPUT: ++ * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. ++ * ETH_QUEUE rx_queue Number of Rx queue. ++ * PKT_INFO *p_pkt_info Information on the returned buffer. ++ * ++ * OUTPUT: ++ * New available Rx resource in Rx descriptor ring. ++ * ++ * RETURN: ++ * ETH_ERROR in case the routine can not access Rx desc ring. ++ * ETH_OK otherwise. ++ * ++ *******************************************************************************/ ++static ETH_FUNC_RET_STATUS eth_rx_return_buff (ETH_PORT_INFO * ++ p_eth_port_ctrl, ++ ETH_QUEUE rx_queue, ++ PKT_INFO * p_pkt_info) ++{ ++ volatile ETH_RX_DESC *p_used_rx_desc; /* Where to return Rx resource */ ++ ++ /* Get 'used' Rx descriptor */ ++ USED_RFD_GET (p_used_rx_desc, rx_queue); ++ ++ /* Sanity check */ ++ if (p_used_rx_desc == NULL) ++ return ETH_ERROR; ++ ++ p_used_rx_desc->buf_ptr = p_pkt_info->buf_ptr; ++ p_used_rx_desc->return_info = p_pkt_info->return_info; ++ p_used_rx_desc->byte_cnt = p_pkt_info->byte_cnt; ++ p_used_rx_desc->buf_size = MV64460_RX_BUFFER_SIZE; /* Reset Buffer size */ ++ ++ /* Flush the write pipe */ ++ CPU_PIPE_FLUSH; ++ ++ /* Return the descriptor to DMA ownership */ ++ p_used_rx_desc->cmd_sts = ++ ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT; ++ ++ /* Flush descriptor and CPU pipe */ ++ D_CACHE_FLUSH_LINE ((unsigned int) p_used_rx_desc, 0); ++ CPU_PIPE_FLUSH; ++ ++ /* Move the used descriptor pointer to the next descriptor */ ++ USED_RFD_SET (RX_NEXT_DESC_PTR (p_used_rx_desc, rx_queue), rx_queue); ++ ++ /* Any Rx return cancels the Rx resource error status */ ++ if (p_eth_port_ctrl->rx_resource_err[rx_queue] == true) ++ p_eth_port_ctrl->rx_resource_err[rx_queue] = false; ++ ++ return ETH_OK; ++} ++ ++/******************************************************************************* ++ * eth_port_set_rx_coal - Sets coalescing interrupt mechanism on RX path ++ * ++ * DESCRIPTION: ++ * This routine sets the RX coalescing interrupt mechanism parameter. ++ * This parameter is a timeout counter, that counts in 64 t_clk ++ * chunks ; that when timeout event occurs a maskable interrupt ++ * occurs. ++ * The parameter is calculated using the tClk of the MV-643xx chip ++ * , and the required delay of the interrupt in usec. ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet port number ++ * unsigned int t_clk t_clk of the MV-643xx chip in HZ units ++ * unsigned int delay Delay in usec ++ * ++ * OUTPUT: ++ * Interrupt coalescing mechanism value is set in MV-643xx chip. ++ * ++ * RETURN: ++ * The interrupt coalescing value set in the gigE port. ++ * ++ *******************************************************************************/ ++#if 0 /* FIXME */ ++static unsigned int eth_port_set_rx_coal (ETH_PORT eth_port_num, ++ unsigned int t_clk, ++ unsigned int delay) ++{ ++ unsigned int coal; ++ ++ coal = ((t_clk / 1000000) * delay) / 64; ++ /* Set RX Coalescing mechanism */ ++ MV_REG_WRITE (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num), ++ ((coal & 0x3fff) << 8) | ++ (MV_REG_READ ++ (MV64460_ETH_SDMA_CONFIG_REG (eth_port_num)) ++ & 0xffc000ff)); ++ return coal; ++} ++ ++#endif ++/******************************************************************************* ++ * eth_port_set_tx_coal - Sets coalescing interrupt mechanism on TX path ++ * ++ * DESCRIPTION: ++ * This routine sets the TX coalescing interrupt mechanism parameter. ++ * This parameter is a timeout counter, that counts in 64 t_clk ++ * chunks ; that when timeout event occurs a maskable interrupt ++ * occurs. ++ * The parameter is calculated using the t_cLK frequency of the ++ * MV-643xx chip and the required delay in the interrupt in uSec ++ * ++ * INPUT: ++ * ETH_PORT eth_port_num Ethernet port number ++ * unsigned int t_clk t_clk of the MV-643xx chip in HZ units ++ * unsigned int delay Delay in uSeconds ++ * ++ * OUTPUT: ++ * Interrupt coalescing mechanism value is set in MV-643xx chip. ++ * ++ * RETURN: ++ * The interrupt coalescing value set in the gigE port. ++ * ++ *******************************************************************************/ ++#if 0 /* FIXME */ ++static unsigned int eth_port_set_tx_coal (ETH_PORT eth_port_num, ++ unsigned int t_clk, ++ unsigned int delay) ++{ ++ unsigned int coal; ++ ++ coal = ((t_clk / 1000000) * delay) / 64; ++ /* Set TX Coalescing mechanism */ ++ MV_REG_WRITE (MV64460_ETH_TX_FIFO_URGENT_THRESHOLD_REG (eth_port_num), ++ coal << 4); ++ return coal; ++} ++#endif ++ ++/******************************************************************************* ++ * eth_b_copy - Copy bytes from source to destination ++ * ++ * DESCRIPTION: ++ * This function supports the eight bytes limitation on Tx buffer size. ++ * The routine will zero eight bytes starting from the destination address ++ * followed by copying bytes from the source address to the destination. ++ * ++ * INPUT: ++ * unsigned int src_addr 32 bit source address. ++ * unsigned int dst_addr 32 bit destination address. ++ * int byte_count Number of bytes to copy. ++ * ++ * OUTPUT: ++ * See description. ++ * ++ * RETURN: ++ * None. ++ * ++ *******************************************************************************/ ++static void eth_b_copy (unsigned int src_addr, unsigned int dst_addr, ++ int byte_count) ++{ ++ /* Zero the dst_addr area */ ++ *(unsigned int *) dst_addr = 0x0; ++ ++ while (byte_count != 0) { ++ *(char *) dst_addr = *(char *) src_addr; ++ dst_addr++; ++ src_addr++; ++ byte_count--; ++ } ++} +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mv_eth.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.h +--- u-boot-1.1.6/board/prodrive/p3mx/mv_eth.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_eth.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,840 @@ ++/* ++ * (C) Copyright 2003 ++ * Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ * based on - Driver for MV64460X ethernet ports ++ * Copyright (C) 2002 rabeeh@galileo.co.il ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ * mv_eth.h - header file for the polled mode GT ethernet driver ++ */ ++ ++#ifndef __DB64460_ETH_H__ ++#define __DB64460_ETH_H__ ++ ++#include <asm/types.h> ++#include <asm/io.h> ++#include <asm/byteorder.h> ++#include <common.h> ++#include <net.h> ++#include "mv_regs.h" ++#include "ppc_error_no.h" ++#include "../../Marvell/include/core.h" ++ ++/************************************************************************* ++************************************************************************** ++************************************************************************** ++* The first part is the high level driver of the gigE ethernet ports. * ++************************************************************************** ++************************************************************************** ++*************************************************************************/ ++#ifndef TRUE ++#define TRUE 1 ++#endif ++#ifndef FALSE ++#define FALSE 0 ++#endif ++ ++/* In case not using SG on Tx, define MAX_SKB_FRAGS as 0 */ ++#ifndef MAX_SKB_FRAGS ++#define MAX_SKB_FRAGS 0 ++#endif ++ ++/* Port attributes */ ++/*#define MAX_RX_QUEUE_NUM 8*/ ++/*#define MAX_TX_QUEUE_NUM 8*/ ++#define MAX_RX_QUEUE_NUM 1 ++#define MAX_TX_QUEUE_NUM 1 ++ ++ ++/* Use one TX queue and one RX queue */ ++#define MV64460_TX_QUEUE_NUM 1 ++#define MV64460_RX_QUEUE_NUM 1 ++ ++/* ++ * Number of RX / TX descriptors on RX / TX rings. ++ * Note that allocating RX descriptors is done by allocating the RX ++ * ring AND a preallocated RX buffers (skb's) for each descriptor. ++ * The TX descriptors only allocates the TX descriptors ring, ++ * with no pre allocated TX buffers (skb's are allocated by higher layers. ++ */ ++ ++/* Default TX ring size is 10 descriptors */ ++#ifdef CONFIG_MV64460_ETH_TXQUEUE_SIZE ++#define MV64460_TX_QUEUE_SIZE CONFIG_MV64460_ETH_TXQUEUE_SIZE ++#else ++#define MV64460_TX_QUEUE_SIZE 4 ++#endif ++ ++/* Default RX ring size is 4 descriptors */ ++#ifdef CONFIG_MV64460_ETH_RXQUEUE_SIZE ++#define MV64460_RX_QUEUE_SIZE CONFIG_MV64460_ETH_RXQUEUE_SIZE ++#else ++#define MV64460_RX_QUEUE_SIZE 4 ++#endif ++ ++#ifdef CONFIG_RX_BUFFER_SIZE ++#define MV64460_RX_BUFFER_SIZE CONFIG_RX_BUFFER_SIZE ++#else ++#define MV64460_RX_BUFFER_SIZE 1600 ++#endif ++ ++#ifdef CONFIG_TX_BUFFER_SIZE ++#define MV64460_TX_BUFFER_SIZE CONFIG_TX_BUFFER_SIZE ++#else ++#define MV64460_TX_BUFFER_SIZE 1600 ++#endif ++ ++/* ++ * Network device statistics. Akin to the 2.0 ether stats but ++ * with byte counters. ++ */ ++ ++struct net_device_stats ++{ ++ unsigned long rx_packets; /* total packets received */ ++ unsigned long tx_packets; /* total packets transmitted */ ++ unsigned long rx_bytes; /* total bytes received */ ++ unsigned long tx_bytes; /* total bytes transmitted */ ++ unsigned long rx_errors; /* bad packets received */ ++ unsigned long tx_errors; /* packet transmit problems */ ++ unsigned long rx_dropped; /* no space in linux buffers */ ++ unsigned long tx_dropped; /* no space available in linux */ ++ unsigned long multicast; /* multicast packets received */ ++ unsigned long collisions; ++ ++ /* detailed rx_errors: */ ++ unsigned long rx_length_errors; ++ unsigned long rx_over_errors; /* receiver ring buff overflow */ ++ unsigned long rx_crc_errors; /* recved pkt with crc error */ ++ unsigned long rx_frame_errors; /* recv'd frame alignment error */ ++ unsigned long rx_fifo_errors; /* recv'r fifo overrun */ ++ unsigned long rx_missed_errors; /* receiver missed packet */ ++ ++ /* detailed tx_errors */ ++ unsigned long tx_aborted_errors; ++ unsigned long tx_carrier_errors; ++ unsigned long tx_fifo_errors; ++ unsigned long tx_heartbeat_errors; ++ unsigned long tx_window_errors; ++ ++ /* for cslip etc */ ++ unsigned long rx_compressed; ++ unsigned long tx_compressed; ++}; ++ ++ ++/* Private data structure used for ethernet device */ ++struct mv64460_eth_priv { ++ unsigned int port_num; ++ struct net_device_stats *stats; ++ ++ /* to buffer area aligned */ ++ char * p_eth_tx_buffer[MV64460_TX_QUEUE_SIZE+1]; /*pointers to alligned tx buffs in memory space */ ++ char * p_eth_rx_buffer[MV64460_RX_QUEUE_SIZE+1]; /*pointers to allinged rx buffs in memory space */ ++ ++ /* Size of Tx Ring per queue */ ++ unsigned int tx_ring_size [MAX_TX_QUEUE_NUM]; ++ ++ /* Size of Rx Ring per queue */ ++ unsigned int rx_ring_size [MAX_RX_QUEUE_NUM]; ++ ++ /* Magic Number for Ethernet running */ ++ unsigned int eth_running; ++ ++ int first_init; ++}; ++ ++int mv64460_eth_init (struct eth_device *dev); ++int mv64460_eth_stop (struct eth_device *dev); ++int mv64460_eth_start_xmit (struct eth_device*, volatile void* packet, int length); ++/* return db64460_eth0_poll(); */ ++ ++int mv64460_eth_open (struct eth_device *dev); ++ ++ ++/************************************************************************* ++************************************************************************** ++************************************************************************** ++* The second part is the low level driver of the gigE ethernet ports. * ++************************************************************************** ++************************************************************************** ++*************************************************************************/ ++ ++ ++/******************************************************************************** ++ * Header File for : MV-643xx network interface header ++ * ++ * DESCRIPTION: ++ * This header file contains macros typedefs and function declaration for ++ * the Marvell Gig Bit Ethernet Controller. ++ * ++ * DEPENDENCIES: ++ * None. ++ * ++ *******************************************************************************/ ++ ++ ++#ifdef CONFIG_SPECIAL_CONSISTENT_MEMORY ++#ifdef CONFIG_MV64460_SRAM_CACHEABLE ++/* In case SRAM is cacheable but not cache coherent */ ++#define D_CACHE_FLUSH_LINE(addr, offset) \ ++{ \ ++ __asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \ ++} ++#else ++/* In case SRAM is cache coherent or non-cacheable */ ++#define D_CACHE_FLUSH_LINE(addr, offset) ; ++#endif ++#else ++#ifdef CONFIG_NOT_COHERENT_CACHE ++/* In case of descriptors on DDR but not cache coherent */ ++#define D_CACHE_FLUSH_LINE(addr, offset) \ ++{ \ ++ __asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \ ++} ++#else ++/* In case of descriptors on DDR and cache coherent */ ++#define D_CACHE_FLUSH_LINE(addr, offset) ; ++#endif /* CONFIG_NOT_COHERENT_CACHE */ ++#endif /* CONFIG_SPECIAL_CONSISTENT_MEMORY */ ++ ++ ++#define CPU_PIPE_FLUSH \ ++{ \ ++ __asm__ __volatile__ ("eieio"); \ ++} ++ ++ ++/* defines */ ++ ++/* Default port configuration value */ ++#define PORT_CONFIG_VALUE \ ++ ETH_UNICAST_NORMAL_MODE | \ ++ ETH_DEFAULT_RX_QUEUE_0 | \ ++ ETH_DEFAULT_RX_ARP_QUEUE_0 | \ ++ ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP | \ ++ ETH_RECEIVE_BC_IF_IP | \ ++ ETH_RECEIVE_BC_IF_ARP | \ ++ ETH_CAPTURE_TCP_FRAMES_DIS | \ ++ ETH_CAPTURE_UDP_FRAMES_DIS | \ ++ ETH_DEFAULT_RX_TCP_QUEUE_0 | \ ++ ETH_DEFAULT_RX_UDP_QUEUE_0 | \ ++ ETH_DEFAULT_RX_BPDU_QUEUE_0 ++ ++/* Default port extend configuration value */ ++#define PORT_CONFIG_EXTEND_VALUE \ ++ ETH_SPAN_BPDU_PACKETS_AS_NORMAL | \ ++ ETH_PARTITION_DISABLE ++ ++ ++/* Default sdma control value */ ++#ifdef CONFIG_NOT_COHERENT_CACHE ++#define PORT_SDMA_CONFIG_VALUE \ ++ ETH_RX_BURST_SIZE_16_64BIT | \ ++ GT_ETH_IPG_INT_RX(0) | \ ++ ETH_TX_BURST_SIZE_16_64BIT; ++#else ++#define PORT_SDMA_CONFIG_VALUE \ ++ ETH_RX_BURST_SIZE_4_64BIT | \ ++ GT_ETH_IPG_INT_RX(0) | \ ++ ETH_TX_BURST_SIZE_4_64BIT; ++#endif ++ ++#define GT_ETH_IPG_INT_RX(value) \ ++ ((value & 0x3fff) << 8) ++ ++/* Default port serial control value */ ++#define PORT_SERIAL_CONTROL_VALUE \ ++ ETH_FORCE_LINK_PASS | \ ++ ETH_ENABLE_AUTO_NEG_FOR_DUPLX | \ ++ ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL | \ ++ ETH_ADV_SYMMETRIC_FLOW_CTRL | \ ++ ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX | \ ++ ETH_FORCE_BP_MODE_NO_JAM | \ ++ BIT9 | \ ++ ETH_DO_NOT_FORCE_LINK_FAIL | \ ++ ETH_RETRANSMIT_16_ETTEMPTS | \ ++ ETH_ENABLE_AUTO_NEG_SPEED_GMII | \ ++ ETH_DTE_ADV_0 | \ ++ ETH_DISABLE_AUTO_NEG_BYPASS | \ ++ ETH_AUTO_NEG_NO_CHANGE | \ ++ ETH_MAX_RX_PACKET_1552BYTE | \ ++ ETH_CLR_EXT_LOOPBACK | \ ++ ETH_SET_FULL_DUPLEX_MODE | \ ++ ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX; ++ ++#define RX_BUFFER_MAX_SIZE 0xFFFF ++#define TX_BUFFER_MAX_SIZE 0xFFFF /* Buffer are limited to 64k */ ++ ++#define RX_BUFFER_MIN_SIZE 0x8 ++#define TX_BUFFER_MIN_SIZE 0x8 ++ ++/* Tx WRR confoguration macros */ ++#define PORT_MAX_TRAN_UNIT 0x24 /* MTU register (default) 9KByte */ ++#define PORT_MAX_TOKEN_BUCKET_SIZE 0x_fFFF /* PMTBS register (default) */ ++#define PORT_TOKEN_RATE 1023 /* PTTBRC register (default) */ ++ ++/* MAC accepet/reject macros */ ++#define ACCEPT_MAC_ADDR 0 ++#define REJECT_MAC_ADDR 1 ++ ++/* Size of a Tx/Rx descriptor used in chain list data structure */ ++#define RX_DESC_ALIGNED_SIZE 0x20 ++#define TX_DESC_ALIGNED_SIZE 0x20 ++ ++/* An offest in Tx descriptors to store data for buffers less than 8 Bytes */ ++#define TX_BUF_OFFSET_IN_DESC 0x18 ++/* Buffer offset from buffer pointer */ ++#define RX_BUF_OFFSET 0x2 ++ ++/* Gap define */ ++#define ETH_BAR_GAP 0x8 ++#define ETH_SIZE_REG_GAP 0x8 ++#define ETH_HIGH_ADDR_REMAP_REG_GAP 0x4 ++#define ETH_PORT_ACCESS_CTRL_GAP 0x4 ++ ++/* Gigabit Ethernet Unit Global Registers */ ++ ++/* MIB Counters register definitions */ ++#define ETH_MIB_GOOD_OCTETS_RECEIVED_LOW 0x0 ++#define ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH 0x4 ++#define ETH_MIB_BAD_OCTETS_RECEIVED 0x8 ++#define ETH_MIB_INTERNAL_MAC_TRANSMIT_ERR 0xc ++#define ETH_MIB_GOOD_FRAMES_RECEIVED 0x10 ++#define ETH_MIB_BAD_FRAMES_RECEIVED 0x14 ++#define ETH_MIB_BROADCAST_FRAMES_RECEIVED 0x18 ++#define ETH_MIB_MULTICAST_FRAMES_RECEIVED 0x1c ++#define ETH_MIB_FRAMES_64_OCTETS 0x20 ++#define ETH_MIB_FRAMES_65_TO_127_OCTETS 0x24 ++#define ETH_MIB_FRAMES_128_TO_255_OCTETS 0x28 ++#define ETH_MIB_FRAMES_256_TO_511_OCTETS 0x2c ++#define ETH_MIB_FRAMES_512_TO_1023_OCTETS 0x30 ++#define ETH_MIB_FRAMES_1024_TO_MAX_OCTETS 0x34 ++#define ETH_MIB_GOOD_OCTETS_SENT_LOW 0x38 ++#define ETH_MIB_GOOD_OCTETS_SENT_HIGH 0x3c ++#define ETH_MIB_GOOD_FRAMES_SENT 0x40 ++#define ETH_MIB_EXCESSIVE_COLLISION 0x44 ++#define ETH_MIB_MULTICAST_FRAMES_SENT 0x48 ++#define ETH_MIB_BROADCAST_FRAMES_SENT 0x4c ++#define ETH_MIB_UNREC_MAC_CONTROL_RECEIVED 0x50 ++#define ETH_MIB_FC_SENT 0x54 ++#define ETH_MIB_GOOD_FC_RECEIVED 0x58 ++#define ETH_MIB_BAD_FC_RECEIVED 0x5c ++#define ETH_MIB_UNDERSIZE_RECEIVED 0x60 ++#define ETH_MIB_FRAGMENTS_RECEIVED 0x64 ++#define ETH_MIB_OVERSIZE_RECEIVED 0x68 ++#define ETH_MIB_JABBER_RECEIVED 0x6c ++#define ETH_MIB_MAC_RECEIVE_ERROR 0x70 ++#define ETH_MIB_BAD_CRC_EVENT 0x74 ++#define ETH_MIB_COLLISION 0x78 ++#define ETH_MIB_LATE_COLLISION 0x7c ++ ++/* Port serial status reg (PSR) */ ++#define ETH_INTERFACE_GMII_MII 0 ++#define ETH_INTERFACE_PCM BIT0 ++#define ETH_LINK_IS_DOWN 0 ++#define ETH_LINK_IS_UP BIT1 ++#define ETH_PORT_AT_HALF_DUPLEX 0 ++#define ETH_PORT_AT_FULL_DUPLEX BIT2 ++#define ETH_RX_FLOW_CTRL_DISABLED 0 ++#define ETH_RX_FLOW_CTRL_ENBALED BIT3 ++#define ETH_GMII_SPEED_100_10 0 ++#define ETH_GMII_SPEED_1000 BIT4 ++#define ETH_MII_SPEED_10 0 ++#define ETH_MII_SPEED_100 BIT5 ++#define ETH_NO_TX 0 ++#define ETH_TX_IN_PROGRESS BIT7 ++#define ETH_BYPASS_NO_ACTIVE 0 ++#define ETH_BYPASS_ACTIVE BIT8 ++#define ETH_PORT_NOT_AT_PARTITION_STATE 0 ++#define ETH_PORT_AT_PARTITION_STATE BIT9 ++#define ETH_PORT_TX_FIFO_NOT_EMPTY 0 ++#define ETH_PORT_TX_FIFO_EMPTY BIT10 ++ ++ ++/* These macros describes the Port configuration reg (Px_cR) bits */ ++#define ETH_UNICAST_NORMAL_MODE 0 ++#define ETH_UNICAST_PROMISCUOUS_MODE BIT0 ++#define ETH_DEFAULT_RX_QUEUE_0 0 ++#define ETH_DEFAULT_RX_QUEUE_1 BIT1 ++#define ETH_DEFAULT_RX_QUEUE_2 BIT2 ++#define ETH_DEFAULT_RX_QUEUE_3 (BIT2 | BIT1) ++#define ETH_DEFAULT_RX_QUEUE_4 BIT3 ++#define ETH_DEFAULT_RX_QUEUE_5 (BIT3 | BIT1) ++#define ETH_DEFAULT_RX_QUEUE_6 (BIT3 | BIT2) ++#define ETH_DEFAULT_RX_QUEUE_7 (BIT3 | BIT2 | BIT1) ++#define ETH_DEFAULT_RX_ARP_QUEUE_0 0 ++#define ETH_DEFAULT_RX_ARP_QUEUE_1 BIT4 ++#define ETH_DEFAULT_RX_ARP_QUEUE_2 BIT5 ++#define ETH_DEFAULT_RX_ARP_QUEUE_3 (BIT5 | BIT4) ++#define ETH_DEFAULT_RX_ARP_QUEUE_4 BIT6 ++#define ETH_DEFAULT_RX_ARP_QUEUE_5 (BIT6 | BIT4) ++#define ETH_DEFAULT_RX_ARP_QUEUE_6 (BIT6 | BIT5) ++#define ETH_DEFAULT_RX_ARP_QUEUE_7 (BIT6 | BIT5 | BIT4) ++#define ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP 0 ++#define ETH_REJECT_BC_IF_NOT_IP_OR_ARP BIT7 ++#define ETH_RECEIVE_BC_IF_IP 0 ++#define ETH_REJECT_BC_IF_IP BIT8 ++#define ETH_RECEIVE_BC_IF_ARP 0 ++#define ETH_REJECT_BC_IF_ARP BIT9 ++#define ETH_TX_AM_NO_UPDATE_ERROR_SUMMARY BIT12 ++#define ETH_CAPTURE_TCP_FRAMES_DIS 0 ++#define ETH_CAPTURE_TCP_FRAMES_EN BIT14 ++#define ETH_CAPTURE_UDP_FRAMES_DIS 0 ++#define ETH_CAPTURE_UDP_FRAMES_EN BIT15 ++#define ETH_DEFAULT_RX_TCP_QUEUE_0 0 ++#define ETH_DEFAULT_RX_TCP_QUEUE_1 BIT16 ++#define ETH_DEFAULT_RX_TCP_QUEUE_2 BIT17 ++#define ETH_DEFAULT_RX_TCP_QUEUE_3 (BIT17 | BIT16) ++#define ETH_DEFAULT_RX_TCP_QUEUE_4 BIT18 ++#define ETH_DEFAULT_RX_TCP_QUEUE_5 (BIT18 | BIT16) ++#define ETH_DEFAULT_RX_TCP_QUEUE_6 (BIT18 | BIT17) ++#define ETH_DEFAULT_RX_TCP_QUEUE_7 (BIT18 | BIT17 | BIT16) ++#define ETH_DEFAULT_RX_UDP_QUEUE_0 0 ++#define ETH_DEFAULT_RX_UDP_QUEUE_1 BIT19 ++#define ETH_DEFAULT_RX_UDP_QUEUE_2 BIT20 ++#define ETH_DEFAULT_RX_UDP_QUEUE_3 (BIT20 | BIT19) ++#define ETH_DEFAULT_RX_UDP_QUEUE_4 (BIT21 ++#define ETH_DEFAULT_RX_UDP_QUEUE_5 (BIT21 | BIT19) ++#define ETH_DEFAULT_RX_UDP_QUEUE_6 (BIT21 | BIT20) ++#define ETH_DEFAULT_RX_UDP_QUEUE_7 (BIT21 | BIT20 | BIT19) ++#define ETH_DEFAULT_RX_BPDU_QUEUE_0 0 ++#define ETH_DEFAULT_RX_BPDU_QUEUE_1 BIT22 ++#define ETH_DEFAULT_RX_BPDU_QUEUE_2 BIT23 ++#define ETH_DEFAULT_RX_BPDU_QUEUE_3 (BIT23 | BIT22) ++#define ETH_DEFAULT_RX_BPDU_QUEUE_4 BIT24 ++#define ETH_DEFAULT_RX_BPDU_QUEUE_5 (BIT24 | BIT22) ++#define ETH_DEFAULT_RX_BPDU_QUEUE_6 (BIT24 | BIT23) ++#define ETH_DEFAULT_RX_BPDU_QUEUE_7 (BIT24 | BIT23 | BIT22) ++ ++ ++/* These macros describes the Port configuration extend reg (Px_cXR) bits*/ ++#define ETH_CLASSIFY_EN BIT0 ++#define ETH_SPAN_BPDU_PACKETS_AS_NORMAL 0 ++#define ETH_SPAN_BPDU_PACKETS_TO_RX_QUEUE_7 BIT1 ++#define ETH_PARTITION_DISABLE 0 ++#define ETH_PARTITION_ENABLE BIT2 ++ ++ ++/* Tx/Rx queue command reg (RQCR/TQCR)*/ ++#define ETH_QUEUE_0_ENABLE BIT0 ++#define ETH_QUEUE_1_ENABLE BIT1 ++#define ETH_QUEUE_2_ENABLE BIT2 ++#define ETH_QUEUE_3_ENABLE BIT3 ++#define ETH_QUEUE_4_ENABLE BIT4 ++#define ETH_QUEUE_5_ENABLE BIT5 ++#define ETH_QUEUE_6_ENABLE BIT6 ++#define ETH_QUEUE_7_ENABLE BIT7 ++#define ETH_QUEUE_0_DISABLE BIT8 ++#define ETH_QUEUE_1_DISABLE BIT9 ++#define ETH_QUEUE_2_DISABLE BIT10 ++#define ETH_QUEUE_3_DISABLE BIT11 ++#define ETH_QUEUE_4_DISABLE BIT12 ++#define ETH_QUEUE_5_DISABLE BIT13 ++#define ETH_QUEUE_6_DISABLE BIT14 ++#define ETH_QUEUE_7_DISABLE BIT15 ++ ++/* These macros describes the Port Sdma configuration reg (SDCR) bits */ ++#define ETH_RIFB BIT0 ++#define ETH_RX_BURST_SIZE_1_64BIT 0 ++#define ETH_RX_BURST_SIZE_2_64BIT BIT1 ++#define ETH_RX_BURST_SIZE_4_64BIT BIT2 ++#define ETH_RX_BURST_SIZE_8_64BIT (BIT2 | BIT1) ++#define ETH_RX_BURST_SIZE_16_64BIT BIT3 ++#define ETH_BLM_RX_NO_SWAP BIT4 ++#define ETH_BLM_RX_BYTE_SWAP 0 ++#define ETH_BLM_TX_NO_SWAP BIT5 ++#define ETH_BLM_TX_BYTE_SWAP 0 ++#define ETH_DESCRIPTORS_BYTE_SWAP BIT6 ++#define ETH_DESCRIPTORS_NO_SWAP 0 ++#define ETH_TX_BURST_SIZE_1_64BIT 0 ++#define ETH_TX_BURST_SIZE_2_64BIT BIT22 ++#define ETH_TX_BURST_SIZE_4_64BIT BIT23 ++#define ETH_TX_BURST_SIZE_8_64BIT (BIT23 | BIT22) ++#define ETH_TX_BURST_SIZE_16_64BIT BIT24 ++ ++/* These macros describes the Port serial control reg (PSCR) bits */ ++#define ETH_SERIAL_PORT_DISABLE 0 ++#define ETH_SERIAL_PORT_ENABLE BIT0 ++#define ETH_FORCE_LINK_PASS BIT1 ++#define ETH_DO_NOT_FORCE_LINK_PASS 0 ++#define ETH_ENABLE_AUTO_NEG_FOR_DUPLX 0 ++#define ETH_DISABLE_AUTO_NEG_FOR_DUPLX BIT2 ++#define ETH_ENABLE_AUTO_NEG_FOR_FLOW_CTRL 0 ++#define ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL BIT3 ++#define ETH_ADV_NO_FLOW_CTRL 0 ++#define ETH_ADV_SYMMETRIC_FLOW_CTRL BIT4 ++#define ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX 0 ++#define ETH_FORCE_FC_MODE_TX_PAUSE_DIS BIT5 ++#define ETH_FORCE_BP_MODE_NO_JAM 0 ++#define ETH_FORCE_BP_MODE_JAM_TX BIT7 ++#define ETH_FORCE_BP_MODE_JAM_TX_ON_RX_ERR BIT8 ++#define ETH_FORCE_LINK_FAIL 0 ++#define ETH_DO_NOT_FORCE_LINK_FAIL BIT10 ++#define ETH_RETRANSMIT_16_ETTEMPTS 0 ++#define ETH_RETRANSMIT_FOREVER BIT11 ++#define ETH_DISABLE_AUTO_NEG_SPEED_GMII BIT13 ++#define ETH_ENABLE_AUTO_NEG_SPEED_GMII 0 ++#define ETH_DTE_ADV_0 0 ++#define ETH_DTE_ADV_1 BIT14 ++#define ETH_DISABLE_AUTO_NEG_BYPASS 0 ++#define ETH_ENABLE_AUTO_NEG_BYPASS BIT15 ++#define ETH_AUTO_NEG_NO_CHANGE 0 ++#define ETH_RESTART_AUTO_NEG BIT16 ++#define ETH_MAX_RX_PACKET_1518BYTE 0 ++#define ETH_MAX_RX_PACKET_1522BYTE BIT17 ++#define ETH_MAX_RX_PACKET_1552BYTE BIT18 ++#define ETH_MAX_RX_PACKET_9022BYTE (BIT18 | BIT17) ++#define ETH_MAX_RX_PACKET_9192BYTE BIT19 ++#define ETH_MAX_RX_PACKET_9700BYTE (BIT19 | BIT17) ++#define ETH_SET_EXT_LOOPBACK BIT20 ++#define ETH_CLR_EXT_LOOPBACK 0 ++#define ETH_SET_FULL_DUPLEX_MODE BIT21 ++#define ETH_SET_HALF_DUPLEX_MODE 0 ++#define ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX BIT22 ++#define ETH_DISABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX 0 ++#define ETH_SET_GMII_SPEED_TO_10_100 0 ++#define ETH_SET_GMII_SPEED_TO_1000 BIT23 ++#define ETH_SET_MII_SPEED_TO_10 0 ++#define ETH_SET_MII_SPEED_TO_100 BIT24 ++ ++ ++/* SMI reg */ ++#define ETH_SMI_BUSY BIT28 /* 0 - Write, 1 - Read */ ++#define ETH_SMI_READ_VALID BIT27 /* 0 - Write, 1 - Read */ ++#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read operation */ ++#define ETH_SMI_OPCODE_READ BIT26 /* Operation is in progress */ ++ ++/* SDMA command status fields macros */ ++ ++/* Tx & Rx descriptors status */ ++#define ETH_ERROR_SUMMARY (BIT0) ++ ++/* Tx & Rx descriptors command */ ++#define ETH_BUFFER_OWNED_BY_DMA (BIT31) ++ ++/* Tx descriptors status */ ++#define ETH_LC_ERROR (0 ) ++#define ETH_UR_ERROR (BIT1 ) ++#define ETH_RL_ERROR (BIT2 ) ++#define ETH_LLC_SNAP_FORMAT (BIT9 ) ++ ++/* Rx descriptors status */ ++#define ETH_CRC_ERROR (0 ) ++#define ETH_OVERRUN_ERROR (BIT1 ) ++#define ETH_MAX_FRAME_LENGTH_ERROR (BIT2 ) ++#define ETH_RESOURCE_ERROR ((BIT2 | BIT1)) ++#define ETH_VLAN_TAGGED (BIT19) ++#define ETH_BPDU_FRAME (BIT20) ++#define ETH_TCP_FRAME_OVER_IP_V_4 (0 ) ++#define ETH_UDP_FRAME_OVER_IP_V_4 (BIT21) ++#define ETH_OTHER_FRAME_TYPE (BIT22) ++#define ETH_LAYER_2_IS_ETH_V_2 (BIT23) ++#define ETH_FRAME_TYPE_IP_V_4 (BIT24) ++#define ETH_FRAME_HEADER_OK (BIT25) ++#define ETH_RX_LAST_DESC (BIT26) ++#define ETH_RX_FIRST_DESC (BIT27) ++#define ETH_UNKNOWN_DESTINATION_ADDR (BIT28) ++#define ETH_RX_ENABLE_INTERRUPT (BIT29) ++#define ETH_LAYER_4_CHECKSUM_OK (BIT30) ++ ++/* Rx descriptors byte count */ ++#define ETH_FRAME_FRAGMENTED (BIT2) ++ ++/* Tx descriptors command */ ++#define ETH_LAYER_4_CHECKSUM_FIRST_DESC (BIT10) ++#define ETH_FRAME_SET_TO_VLAN (BIT15) ++#define ETH_TCP_FRAME (0 ) ++#define ETH_UDP_FRAME (BIT16) ++#define ETH_GEN_TCP_UDP_CHECKSUM (BIT17) ++#define ETH_GEN_IP_V_4_CHECKSUM (BIT18) ++#define ETH_ZERO_PADDING (BIT19) ++#define ETH_TX_LAST_DESC (BIT20) ++#define ETH_TX_FIRST_DESC (BIT21) ++#define ETH_GEN_CRC (BIT22) ++#define ETH_TX_ENABLE_INTERRUPT (BIT23) ++#define ETH_AUTO_MODE (BIT30) ++ ++/* Address decode parameters */ ++/* Ethernet Base Address Register bits */ ++#define EBAR_TARGET_DRAM 0x00000000 ++#define EBAR_TARGET_DEVICE 0x00000001 ++#define EBAR_TARGET_CBS 0x00000002 ++#define EBAR_TARGET_PCI0 0x00000003 ++#define EBAR_TARGET_PCI1 0x00000004 ++#define EBAR_TARGET_CUNIT 0x00000005 ++#define EBAR_TARGET_AUNIT 0x00000006 ++#define EBAR_TARGET_GUNIT 0x00000007 ++ ++/* Window attributes */ ++#define EBAR_ATTR_DRAM_CS0 0x00000E00 ++#define EBAR_ATTR_DRAM_CS1 0x00000D00 ++#define EBAR_ATTR_DRAM_CS2 0x00000B00 ++#define EBAR_ATTR_DRAM_CS3 0x00000700 ++ ++/* DRAM Target interface */ ++#define EBAR_ATTR_DRAM_NO_CACHE_COHERENCY 0x00000000 ++#define EBAR_ATTR_DRAM_CACHE_COHERENCY_WT 0x00001000 ++#define EBAR_ATTR_DRAM_CACHE_COHERENCY_WB 0x00002000 ++ ++/* Device Bus Target interface */ ++#define EBAR_ATTR_DEVICE_DEVCS0 0x00001E00 ++#define EBAR_ATTR_DEVICE_DEVCS1 0x00001D00 ++#define EBAR_ATTR_DEVICE_DEVCS2 0x00001B00 ++#define EBAR_ATTR_DEVICE_DEVCS3 0x00001700 ++#define EBAR_ATTR_DEVICE_BOOTCS3 0x00000F00 ++ ++/* PCI Target interface */ ++#define EBAR_ATTR_PCI_BYTE_SWAP 0x00000000 ++#define EBAR_ATTR_PCI_NO_SWAP 0x00000100 ++#define EBAR_ATTR_PCI_BYTE_WORD_SWAP 0x00000200 ++#define EBAR_ATTR_PCI_WORD_SWAP 0x00000300 ++#define EBAR_ATTR_PCI_NO_SNOOP_NOT_ASSERT 0x00000000 ++#define EBAR_ATTR_PCI_NO_SNOOP_ASSERT 0x00000400 ++#define EBAR_ATTR_PCI_IO_SPACE 0x00000000 ++#define EBAR_ATTR_PCI_MEMORY_SPACE 0x00000800 ++#define EBAR_ATTR_PCI_REQ64_FORCE 0x00000000 ++#define EBAR_ATTR_PCI_REQ64_SIZE 0x00001000 ++ ++/* CPU 60x bus or internal SRAM interface */ ++#define EBAR_ATTR_CBS_SRAM_BLOCK0 0x00000000 ++#define EBAR_ATTR_CBS_SRAM_BLOCK1 0x00000100 ++#define EBAR_ATTR_CBS_SRAM 0x00000000 ++#define EBAR_ATTR_CBS_CPU_BUS 0x00000800 ++ ++/* Window access control */ ++#define EWIN_ACCESS_NOT_ALLOWED 0 ++#define EWIN_ACCESS_READ_ONLY BIT0 ++#define EWIN_ACCESS_FULL (BIT1 | BIT0) ++#define EWIN0_ACCESS_MASK 0x0003 ++#define EWIN1_ACCESS_MASK 0x000C ++#define EWIN2_ACCESS_MASK 0x0030 ++#define EWIN3_ACCESS_MASK 0x00C0 ++ ++/* typedefs */ ++ ++typedef enum _eth_port ++{ ++ ETH_0 = 0, ++ ETH_1 = 1, ++ ETH_2 = 2 ++}ETH_PORT; ++ ++typedef enum _eth_func_ret_status ++{ ++ ETH_OK, /* Returned as expected. */ ++ ETH_ERROR, /* Fundamental error. */ ++ ETH_RETRY, /* Could not process request. Try later. */ ++ ETH_END_OF_JOB, /* Ring has nothing to process. */ ++ ETH_QUEUE_FULL, /* Ring resource error. */ ++ ETH_QUEUE_LAST_RESOURCE /* Ring resources about to exhaust. */ ++}ETH_FUNC_RET_STATUS; ++ ++typedef enum _eth_queue ++{ ++ ETH_Q0 = 0, ++ ETH_Q1 = 1, ++ ETH_Q2 = 2, ++ ETH_Q3 = 3, ++ ETH_Q4 = 4, ++ ETH_Q5 = 5, ++ ETH_Q6 = 6, ++ ETH_Q7 = 7 ++} ETH_QUEUE; ++ ++typedef enum _addr_win ++{ ++ ETH_WIN0, ++ ETH_WIN1, ++ ETH_WIN2, ++ ETH_WIN3, ++ ETH_WIN4, ++ ETH_WIN5 ++} ETH_ADDR_WIN; ++ ++typedef enum _eth_target ++{ ++ ETH_TARGET_DRAM , ++ ETH_TARGET_DEVICE, ++ ETH_TARGET_CBS , ++ ETH_TARGET_PCI0 , ++ ETH_TARGET_PCI1 ++}ETH_TARGET; ++ ++typedef struct _eth_rx_desc ++{ ++ unsigned short byte_cnt ; /* Descriptor buffer byte count */ ++ unsigned short buf_size ; /* Buffer size */ ++ unsigned int cmd_sts ; /* Descriptor command status */ ++ unsigned int next_desc_ptr; /* Next descriptor pointer */ ++ unsigned int buf_ptr ; /* Descriptor buffer pointer */ ++ unsigned int return_info ; /* User resource return information */ ++} ETH_RX_DESC; ++ ++ ++typedef struct _eth_tx_desc ++{ ++ unsigned short byte_cnt ; /* Descriptor buffer byte count */ ++ unsigned short l4i_chk ; /* CPU provided TCP Checksum */ ++ unsigned int cmd_sts ; /* Descriptor command status */ ++ unsigned int next_desc_ptr; /* Next descriptor pointer */ ++ unsigned int buf_ptr ; /* Descriptor buffer pointer */ ++ unsigned int return_info ; /* User resource return information */ ++} ETH_TX_DESC; ++ ++/* Unified struct for Rx and Tx operations. The user is not required to */ ++/* be familier with neither Tx nor Rx descriptors. */ ++typedef struct _pkt_info ++{ ++ unsigned short byte_cnt ; /* Descriptor buffer byte count */ ++ unsigned short l4i_chk ; /* Tx CPU provided TCP Checksum */ ++ unsigned int cmd_sts ; /* Descriptor command status */ ++ unsigned int buf_ptr ; /* Descriptor buffer pointer */ ++ unsigned int return_info ; /* User resource return information */ ++} PKT_INFO; ++ ++ ++typedef struct _eth_win_param ++{ ++ ETH_ADDR_WIN win; /* Window number. See ETH_ADDR_WIN enum */ ++ ETH_TARGET target; /* System targets. See ETH_TARGET enum */ ++ unsigned short attributes; /* BAR attributes. See above macros. */ ++ unsigned int base_addr; /* Window base address in unsigned int form */ ++ unsigned int high_addr; /* Window high address in unsigned int form */ ++ unsigned int size; /* Size in MBytes. Must be % 64Kbyte. */ ++ bool enable; /* Enable/disable access to the window. */ ++ unsigned short access_ctrl; /* Access ctrl register. see above macros */ ++} ETH_WIN_PARAM; ++ ++ ++/* Ethernet port specific infomation */ ++ ++typedef struct _eth_port_ctrl ++{ ++ ETH_PORT port_num; /* User Ethernet port number */ ++ int port_phy_addr; /* User phy address of Ethrnet port */ ++ unsigned char port_mac_addr[6]; /* User defined port MAC address. */ ++ unsigned int port_config; /* User port configuration value */ ++ unsigned int port_config_extend; /* User port config extend value */ ++ unsigned int port_sdma_config; /* User port SDMA config value */ ++ unsigned int port_serial_control; /* User port serial control value */ ++ unsigned int port_tx_queue_command; /* Port active Tx queues summary */ ++ unsigned int port_rx_queue_command; /* Port active Rx queues summary */ ++ ++ /* User function to cast virtual address to CPU bus address */ ++ unsigned int (*port_virt_to_phys)(unsigned int addr); ++ /* User scratch pad for user specific data structures */ ++ void *port_private; ++ ++ bool rx_resource_err[MAX_RX_QUEUE_NUM]; /* Rx ring resource error flag */ ++ bool tx_resource_err[MAX_TX_QUEUE_NUM]; /* Tx ring resource error flag */ ++ ++ /* Tx/Rx rings managment indexes fields. For driver use */ ++ ++ /* Next available Rx resource */ ++ volatile ETH_RX_DESC *p_rx_curr_desc_q[MAX_RX_QUEUE_NUM]; ++ /* Returning Rx resource */ ++ volatile ETH_RX_DESC *p_rx_used_desc_q[MAX_RX_QUEUE_NUM]; ++ ++ /* Next available Tx resource */ ++ volatile ETH_TX_DESC *p_tx_curr_desc_q[MAX_TX_QUEUE_NUM]; ++ /* Returning Tx resource */ ++ volatile ETH_TX_DESC *p_tx_used_desc_q[MAX_TX_QUEUE_NUM]; ++ /* An extra Tx index to support transmit of multiple buffers per packet */ ++ volatile ETH_TX_DESC *p_tx_first_desc_q[MAX_TX_QUEUE_NUM]; ++ ++ /* Tx/Rx rings size and base variables fields. For driver use */ ++ ++ volatile ETH_RX_DESC *p_rx_desc_area_base[MAX_RX_QUEUE_NUM]; ++ unsigned int rx_desc_area_size[MAX_RX_QUEUE_NUM]; ++ char *p_rx_buffer_base[MAX_RX_QUEUE_NUM]; ++ ++ volatile ETH_TX_DESC *p_tx_desc_area_base[MAX_TX_QUEUE_NUM]; ++ unsigned int tx_desc_area_size[MAX_TX_QUEUE_NUM]; ++ char *p_tx_buffer_base[MAX_TX_QUEUE_NUM]; ++ ++} ETH_PORT_INFO; ++ ++ ++/* ethernet.h API list */ ++ ++/* Port operation control routines */ ++static void eth_port_init (ETH_PORT_INFO *p_eth_port_ctrl); ++static void eth_port_reset(ETH_PORT eth_port_num); ++static bool eth_port_start(ETH_PORT_INFO *p_eth_port_ctrl); ++ ++ ++/* Port MAC address routines */ ++static void eth_port_uc_addr_set (ETH_PORT eth_port_num, ++ unsigned char *p_addr, ++ ETH_QUEUE queue); ++#if 0 /* FIXME */ ++static void eth_port_mc_addr (ETH_PORT eth_port_num, ++ unsigned char *p_addr, ++ ETH_QUEUE queue, ++ int option); ++#endif ++ ++/* PHY and MIB routines */ ++static bool ethernet_phy_reset(ETH_PORT eth_port_num); ++ ++static bool eth_port_write_smi_reg(ETH_PORT eth_port_num, ++ unsigned int phy_reg, ++ unsigned int value); ++ ++static bool eth_port_read_smi_reg(ETH_PORT eth_port_num, ++ unsigned int phy_reg, ++ unsigned int* value); ++ ++static void eth_clear_mib_counters(ETH_PORT eth_port_num); ++ ++/* Port data flow control routines */ ++static ETH_FUNC_RET_STATUS eth_port_send (ETH_PORT_INFO *p_eth_port_ctrl, ++ ETH_QUEUE tx_queue, ++ PKT_INFO *p_pkt_info); ++static ETH_FUNC_RET_STATUS eth_tx_return_desc(ETH_PORT_INFO *p_eth_port_ctrl, ++ ETH_QUEUE tx_queue, ++ PKT_INFO *p_pkt_info); ++static ETH_FUNC_RET_STATUS eth_port_receive (ETH_PORT_INFO *p_eth_port_ctrl, ++ ETH_QUEUE rx_queue, ++ PKT_INFO *p_pkt_info); ++static ETH_FUNC_RET_STATUS eth_rx_return_buff(ETH_PORT_INFO *p_eth_port_ctrl, ++ ETH_QUEUE rx_queue, ++ PKT_INFO *p_pkt_info); ++ ++ ++static bool ether_init_tx_desc_ring(ETH_PORT_INFO *p_eth_port_ctrl, ++ ETH_QUEUE tx_queue, ++ int tx_desc_num, ++ int tx_buff_size, ++ unsigned int tx_desc_base_addr, ++ unsigned int tx_buff_base_addr); ++ ++static bool ether_init_rx_desc_ring(ETH_PORT_INFO *p_eth_port_ctrl, ++ ETH_QUEUE rx_queue, ++ int rx_desc_num, ++ int rx_buff_size, ++ unsigned int rx_desc_base_addr, ++ unsigned int rx_buff_base_addr); ++ ++#endif /* MV64460_ETH_ */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/mv_regs.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_regs.h +--- u-boot-1.1.6/board/prodrive/p3mx/mv_regs.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/mv_regs.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,1125 @@ ++/* ++ * (C) Copyright 2003 ++ * Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ * based on - Driver for MV64460X ethernet ports ++ * Copyright (C) 2002 rabeeh@galileo.co.il ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/******************************************************************************** ++* gt64460r.h - GT-64460 Internal registers definition file. ++* ++* DESCRIPTION: ++* None. ++* ++* DEPENDENCIES: ++* None. ++* ++*******************************************************************************/ ++ ++#ifndef __INCmv_regsh ++#define __INCmv_regsh ++ ++#define MV64460 ++ ++/* Supported by the Atlantis */ ++#define MV64460_INCLUDE_PCI_1 ++#define MV64460_INCLUDE_PCI_0_ARBITER ++#define MV64460_INCLUDE_PCI_1_ARBITER ++#define MV64460_INCLUDE_SNOOP_SUPPORT ++#define MV64460_INCLUDE_P2P ++#define MV64460_INCLUDE_ETH_PORT_2 ++#define MV64460_INCLUDE_CPU_MAPPING ++#define MV64460_INCLUDE_MPSC ++ ++/* Not supported features */ ++#undef INCLUDE_CNTMR_4_7 ++#undef INCLUDE_DMA_4_7 ++ ++/****************************************/ ++/* Processor Address Space */ ++/****************************************/ ++ ++/* DDR SDRAM BAR and size registers */ ++ ++#define MV64460_CS_0_BASE_ADDR 0x008 ++#define MV64460_CS_0_SIZE 0x010 ++#define MV64460_CS_1_BASE_ADDR 0x208 ++#define MV64460_CS_1_SIZE 0x210 ++#define MV64460_CS_2_BASE_ADDR 0x018 ++#define MV64460_CS_2_SIZE 0x020 ++#define MV64460_CS_3_BASE_ADDR 0x218 ++#define MV64460_CS_3_SIZE 0x220 ++ ++/* Devices BAR and size registers */ ++ ++#define MV64460_DEV_CS0_BASE_ADDR 0x028 ++#define MV64460_DEV_CS0_SIZE 0x030 ++#define MV64460_DEV_CS1_BASE_ADDR 0x228 ++#define MV64460_DEV_CS1_SIZE 0x230 ++#define MV64460_DEV_CS2_BASE_ADDR 0x248 ++#define MV64460_DEV_CS2_SIZE 0x250 ++#define MV64460_DEV_CS3_BASE_ADDR 0x038 ++#define MV64460_DEV_CS3_SIZE 0x040 ++#define MV64460_BOOTCS_BASE_ADDR 0x238 ++#define MV64460_BOOTCS_SIZE 0x240 ++ ++/* PCI 0 BAR and size registers */ ++ ++#define MV64460_PCI_0_IO_BASE_ADDR 0x048 ++#define MV64460_PCI_0_IO_SIZE 0x050 ++#define MV64460_PCI_0_MEMORY0_BASE_ADDR 0x058 ++#define MV64460_PCI_0_MEMORY0_SIZE 0x060 ++#define MV64460_PCI_0_MEMORY1_BASE_ADDR 0x080 ++#define MV64460_PCI_0_MEMORY1_SIZE 0x088 ++#define MV64460_PCI_0_MEMORY2_BASE_ADDR 0x258 ++#define MV64460_PCI_0_MEMORY2_SIZE 0x260 ++#define MV64460_PCI_0_MEMORY3_BASE_ADDR 0x280 ++#define MV64460_PCI_0_MEMORY3_SIZE 0x288 ++ ++/* PCI 1 BAR and size registers */ ++#define MV64460_PCI_1_IO_BASE_ADDR 0x090 ++#define MV64460_PCI_1_IO_SIZE 0x098 ++#define MV64460_PCI_1_MEMORY0_BASE_ADDR 0x0a0 ++#define MV64460_PCI_1_MEMORY0_SIZE 0x0a8 ++#define MV64460_PCI_1_MEMORY1_BASE_ADDR 0x0b0 ++#define MV64460_PCI_1_MEMORY1_SIZE 0x0b8 ++#define MV64460_PCI_1_MEMORY2_BASE_ADDR 0x2a0 ++#define MV64460_PCI_1_MEMORY2_SIZE 0x2a8 ++#define MV64460_PCI_1_MEMORY3_BASE_ADDR 0x2b0 ++#define MV64460_PCI_1_MEMORY3_SIZE 0x2b8 ++ ++/* SRAM base address */ ++#define MV64460_INTEGRATED_SRAM_BASE_ADDR 0x268 ++ ++/* internal registers space base address */ ++#define MV64460_INTERNAL_SPACE_BASE_ADDR 0x068 ++ ++/* Enables the CS , DEV_CS , PCI 0 and PCI 1 ++ windows above */ ++#define MV64460_BASE_ADDR_ENABLE 0x278 ++ ++/****************************************/ ++/* PCI remap registers */ ++/****************************************/ ++ /* PCI 0 */ ++#define MV64460_PCI_0_IO_ADDR_REMAP 0x0f0 ++#define MV64460_PCI_0_MEMORY0_LOW_ADDR_REMAP 0x0f8 ++#define MV64460_PCI_0_MEMORY0_HIGH_ADDR_REMAP 0x320 ++#define MV64460_PCI_0_MEMORY1_LOW_ADDR_REMAP 0x100 ++#define MV64460_PCI_0_MEMORY1_HIGH_ADDR_REMAP 0x328 ++#define MV64460_PCI_0_MEMORY2_LOW_ADDR_REMAP 0x2f8 ++#define MV64460_PCI_0_MEMORY2_HIGH_ADDR_REMAP 0x330 ++#define MV64460_PCI_0_MEMORY3_LOW_ADDR_REMAP 0x300 ++#define MV64460_PCI_0_MEMORY3_HIGH_ADDR_REMAP 0x338 ++ /* PCI 1 */ ++#define MV64460_PCI_1_IO_ADDR_REMAP 0x108 ++#define MV64460_PCI_1_MEMORY0_LOW_ADDR_REMAP 0x110 ++#define MV64460_PCI_1_MEMORY0_HIGH_ADDR_REMAP 0x340 ++#define MV64460_PCI_1_MEMORY1_LOW_ADDR_REMAP 0x118 ++#define MV64460_PCI_1_MEMORY1_HIGH_ADDR_REMAP 0x348 ++#define MV64460_PCI_1_MEMORY2_LOW_ADDR_REMAP 0x310 ++#define MV64460_PCI_1_MEMORY2_HIGH_ADDR_REMAP 0x350 ++#define MV64460_PCI_1_MEMORY3_LOW_ADDR_REMAP 0x318 ++#define MV64460_PCI_1_MEMORY3_HIGH_ADDR_REMAP 0x358 ++ ++#define MV64460_CPU_PCI_0_HEADERS_RETARGET_CONTROL 0x3b0 ++#define MV64460_CPU_PCI_0_HEADERS_RETARGET_BASE 0x3b8 ++#define MV64460_CPU_PCI_1_HEADERS_RETARGET_CONTROL 0x3c0 ++#define MV64460_CPU_PCI_1_HEADERS_RETARGET_BASE 0x3c8 ++#define MV64460_CPU_GE_HEADERS_RETARGET_CONTROL 0x3d0 ++#define MV64460_CPU_GE_HEADERS_RETARGET_BASE 0x3d8 ++#define MV64460_CPU_IDMA_HEADERS_RETARGET_CONTROL 0x3e0 ++#define MV64460_CPU_IDMA_HEADERS_RETARGET_BASE 0x3e8 ++ ++/****************************************/ ++/* CPU Control Registers */ ++/****************************************/ ++ ++#define MV64460_CPU_CONFIG 0x000 ++#define MV64460_CPU_MODE 0x120 ++#define MV64460_CPU_MASTER_CONTROL 0x160 ++#define MV64460_CPU_CROSS_BAR_CONTROL_LOW 0x150 ++#define MV64460_CPU_CROSS_BAR_CONTROL_HIGH 0x158 ++#define MV64460_CPU_CROSS_BAR_TIMEOUT 0x168 ++ ++/****************************************/ ++/* SMP RegisterS */ ++/****************************************/ ++ ++#define MV64460_SMP_WHO_AM_I 0x200 ++#define MV64460_SMP_CPU0_DOORBELL 0x214 ++#define MV64460_SMP_CPU0_DOORBELL_CLEAR 0x21C ++#define MV64460_SMP_CPU1_DOORBELL 0x224 ++#define MV64460_SMP_CPU1_DOORBELL_CLEAR 0x22C ++#define MV64460_SMP_CPU0_DOORBELL_MASK 0x234 ++#define MV64460_SMP_CPU1_DOORBELL_MASK 0x23C ++#define MV64460_SMP_SEMAPHOR0 0x244 ++#define MV64460_SMP_SEMAPHOR1 0x24c ++#define MV64460_SMP_SEMAPHOR2 0x254 ++#define MV64460_SMP_SEMAPHOR3 0x25c ++#define MV64460_SMP_SEMAPHOR4 0x264 ++#define MV64460_SMP_SEMAPHOR5 0x26c ++#define MV64460_SMP_SEMAPHOR6 0x274 ++#define MV64460_SMP_SEMAPHOR7 0x27c ++ ++/****************************************/ ++/* CPU Sync Barrier Register */ ++/****************************************/ ++ ++#define MV64460_CPU_0_SYNC_BARRIER_TRIGGER 0x0c0 ++#define MV64460_CPU_0_SYNC_BARRIER_VIRTUAL 0x0c8 ++#define MV64460_CPU_1_SYNC_BARRIER_TRIGGER 0x0d0 ++#define MV64460_CPU_1_SYNC_BARRIER_VIRTUAL 0x0d8 ++ ++/****************************************/ ++/* CPU Access Protect */ ++/****************************************/ ++ ++#define MV64460_CPU_PROTECT_WINDOW_0_BASE_ADDR 0x180 ++#define MV64460_CPU_PROTECT_WINDOW_0_SIZE 0x188 ++#define MV64460_CPU_PROTECT_WINDOW_1_BASE_ADDR 0x190 ++#define MV64460_CPU_PROTECT_WINDOW_1_SIZE 0x198 ++#define MV64460_CPU_PROTECT_WINDOW_2_BASE_ADDR 0x1a0 ++#define MV64460_CPU_PROTECT_WINDOW_2_SIZE 0x1a8 ++#define MV64460_CPU_PROTECT_WINDOW_3_BASE_ADDR 0x1b0 ++#define MV64460_CPU_PROTECT_WINDOW_3_SIZE 0x1b8 ++ ++ ++/****************************************/ ++/* CPU Error Report */ ++/****************************************/ ++ ++#define MV64460_CPU_ERROR_ADDR_LOW 0x070 ++#define MV64460_CPU_ERROR_ADDR_HIGH 0x078 ++#define MV64460_CPU_ERROR_DATA_LOW 0x128 ++#define MV64460_CPU_ERROR_DATA_HIGH 0x130 ++#define MV64460_CPU_ERROR_PARITY 0x138 ++#define MV64460_CPU_ERROR_CAUSE 0x140 ++#define MV64460_CPU_ERROR_MASK 0x148 ++ ++/****************************************/ ++/* CPU Interface Debug Registers */ ++/****************************************/ ++ ++#define MV64460_PUNIT_SLAVE_DEBUG_LOW 0x360 ++#define MV64460_PUNIT_SLAVE_DEBUG_HIGH 0x368 ++#define MV64460_PUNIT_MASTER_DEBUG_LOW 0x370 ++#define MV64460_PUNIT_MASTER_DEBUG_HIGH 0x378 ++#define MV64460_PUNIT_MMASK 0x3e4 ++ ++/****************************************/ ++/* Integrated SRAM Registers */ ++/****************************************/ ++ ++#define MV64460_SRAM_CONFIG 0x380 ++#define MV64460_SRAM_TEST_MODE 0X3F4 ++#define MV64460_SRAM_ERROR_CAUSE 0x388 ++#define MV64460_SRAM_ERROR_ADDR 0x390 ++#define MV64460_SRAM_ERROR_ADDR_HIGH 0X3F8 ++#define MV64460_SRAM_ERROR_DATA_LOW 0x398 ++#define MV64460_SRAM_ERROR_DATA_HIGH 0x3a0 ++#define MV64460_SRAM_ERROR_DATA_PARITY 0x3a8 ++ ++/****************************************/ ++/* SDRAM Configuration */ ++/****************************************/ ++ ++#define MV64460_SDRAM_CONFIG 0x1400 ++#define MV64460_D_UNIT_CONTROL_LOW 0x1404 ++#define MV64460_D_UNIT_CONTROL_HIGH 0x1424 ++#define MV64460_D_UNIT_MMASK 0x14B0 ++#define MV64460_SDRAM_TIMING_CONTROL_LOW 0x1408 ++#define MV64460_SDRAM_TIMING_CONTROL_HIGH 0x140c ++#define MV64460_SDRAM_ADDR_CONTROL 0x1410 ++#define MV64460_SDRAM_OPEN_PAGES_CONTROL 0x1414 ++#define MV64460_SDRAM_OPERATION 0x1418 ++#define MV64460_SDRAM_MODE 0x141c ++#define MV64460_EXTENDED_DRAM_MODE 0x1420 ++#define MV64460_SDRAM_CROSS_BAR_CONTROL_LOW 0x1430 ++#define MV64460_SDRAM_CROSS_BAR_CONTROL_HIGH 0x1434 ++#define MV64460_SDRAM_CROSS_BAR_TIMEOUT 0x1438 ++#define MV64460_SDRAM_ADDR_CTRL_PADS_CALIBRATION 0x14c0 ++#define MV64460_SDRAM_DATA_PADS_CALIBRATION 0x14c4 ++ ++/****************************************/ ++/* SDRAM Error Report */ ++/****************************************/ ++ ++#define MV64460_SDRAM_ERROR_DATA_LOW 0x1444 ++#define MV64460_SDRAM_ERROR_DATA_HIGH 0x1440 ++#define MV64460_SDRAM_ERROR_ADDR 0x1450 ++#define MV64460_SDRAM_RECEIVED_ECC 0x1448 ++#define MV64460_SDRAM_CALCULATED_ECC 0x144c ++#define MV64460_SDRAM_ECC_CONTROL 0x1454 ++#define MV64460_SDRAM_ECC_ERROR_COUNTER 0x1458 ++ ++/******************************************/ ++/* Controlled Delay Line (CDL) Registers */ ++/******************************************/ ++ ++#define MV64460_DFCDL_CONFIG0 0x1480 ++#define MV64460_DFCDL_CONFIG1 0x1484 ++#define MV64460_DLL_WRITE 0x1488 ++#define MV64460_DLL_READ 0x148c ++#define MV64460_SRAM_ADDR 0x1490 ++#define MV64460_SRAM_DATA0 0x1494 ++#define MV64460_SRAM_DATA1 0x1498 ++#define MV64460_SRAM_DATA2 0x149c ++#define MV64460_DFCL_PROBE 0x14a0 ++ ++/******************************************/ ++/* Debug Registers */ ++/******************************************/ ++ ++#define MV64460_DUNIT_DEBUG_LOW 0x1460 ++#define MV64460_DUNIT_DEBUG_HIGH 0x1464 ++#define MV64460_DUNIT_MMASK 0X1b40 ++ ++/****************************************/ ++/* Device Parameters */ ++/****************************************/ ++ ++#define MV64460_DEVICE_BANK0_PARAMETERS 0x45c ++#define MV64460_DEVICE_BANK1_PARAMETERS 0x460 ++#define MV64460_DEVICE_BANK2_PARAMETERS 0x464 ++#define MV64460_DEVICE_BANK3_PARAMETERS 0x468 ++#define MV64460_DEVICE_BOOT_BANK_PARAMETERS 0x46c ++#define MV64460_DEVICE_INTERFACE_CONTROL 0x4c0 ++#define MV64460_DEVICE_INTERFACE_CROSS_BAR_CONTROL_LOW 0x4c8 ++#define MV64460_DEVICE_INTERFACE_CROSS_BAR_CONTROL_HIGH 0x4cc ++#define MV64460_DEVICE_INTERFACE_CROSS_BAR_TIMEOUT 0x4c4 ++ ++/****************************************/ ++/* Device interrupt registers */ ++/****************************************/ ++ ++#define MV64460_DEVICE_INTERRUPT_CAUSE 0x4d0 ++#define MV64460_DEVICE_INTERRUPT_MASK 0x4d4 ++#define MV64460_DEVICE_ERROR_ADDR 0x4d8 ++#define MV64460_DEVICE_ERROR_DATA 0x4dc ++#define MV64460_DEVICE_ERROR_PARITY 0x4e0 ++ ++/****************************************/ ++/* Device debug registers */ ++/****************************************/ ++ ++#define MV64460_DEVICE_DEBUG_LOW 0x4e4 ++#define MV64460_DEVICE_DEBUG_HIGH 0x4e8 ++#define MV64460_RUNIT_MMASK 0x4f0 ++ ++/****************************************/ ++/* PCI Slave Address Decoding registers */ ++/****************************************/ ++ ++#define MV64460_PCI_0_CS_0_BANK_SIZE 0xc08 ++#define MV64460_PCI_1_CS_0_BANK_SIZE 0xc88 ++#define MV64460_PCI_0_CS_1_BANK_SIZE 0xd08 ++#define MV64460_PCI_1_CS_1_BANK_SIZE 0xd88 ++#define MV64460_PCI_0_CS_2_BANK_SIZE 0xc0c ++#define MV64460_PCI_1_CS_2_BANK_SIZE 0xc8c ++#define MV64460_PCI_0_CS_3_BANK_SIZE 0xd0c ++#define MV64460_PCI_1_CS_3_BANK_SIZE 0xd8c ++#define MV64460_PCI_0_DEVCS_0_BANK_SIZE 0xc10 ++#define MV64460_PCI_1_DEVCS_0_BANK_SIZE 0xc90 ++#define MV64460_PCI_0_DEVCS_1_BANK_SIZE 0xd10 ++#define MV64460_PCI_1_DEVCS_1_BANK_SIZE 0xd90 ++#define MV64460_PCI_0_DEVCS_2_BANK_SIZE 0xd18 ++#define MV64460_PCI_1_DEVCS_2_BANK_SIZE 0xd98 ++#define MV64460_PCI_0_DEVCS_3_BANK_SIZE 0xc14 ++#define MV64460_PCI_1_DEVCS_3_BANK_SIZE 0xc94 ++#define MV64460_PCI_0_DEVCS_BOOT_BANK_SIZE 0xd14 ++#define MV64460_PCI_1_DEVCS_BOOT_BANK_SIZE 0xd94 ++#define MV64460_PCI_0_P2P_MEM0_BAR_SIZE 0xd1c ++#define MV64460_PCI_1_P2P_MEM0_BAR_SIZE 0xd9c ++#define MV64460_PCI_0_P2P_MEM1_BAR_SIZE 0xd20 ++#define MV64460_PCI_1_P2P_MEM1_BAR_SIZE 0xda0 ++#define MV64460_PCI_0_P2P_I_O_BAR_SIZE 0xd24 ++#define MV64460_PCI_1_P2P_I_O_BAR_SIZE 0xda4 ++#define MV64460_PCI_0_CPU_BAR_SIZE 0xd28 ++#define MV64460_PCI_1_CPU_BAR_SIZE 0xda8 ++#define MV64460_PCI_0_INTERNAL_SRAM_BAR_SIZE 0xe00 ++#define MV64460_PCI_1_INTERNAL_SRAM_BAR_SIZE 0xe80 ++#define MV64460_PCI_0_EXPANSION_ROM_BAR_SIZE 0xd2c ++#define MV64460_PCI_1_EXPANSION_ROM_BAR_SIZE 0xd9c ++#define MV64460_PCI_0_BASE_ADDR_REG_ENABLE 0xc3c ++#define MV64460_PCI_1_BASE_ADDR_REG_ENABLE 0xcbc ++#define MV64460_PCI_0_CS_0_BASE_ADDR_REMAP 0xc48 ++#define MV64460_PCI_1_CS_0_BASE_ADDR_REMAP 0xcc8 ++#define MV64460_PCI_0_CS_1_BASE_ADDR_REMAP 0xd48 ++#define MV64460_PCI_1_CS_1_BASE_ADDR_REMAP 0xdc8 ++#define MV64460_PCI_0_CS_2_BASE_ADDR_REMAP 0xc4c ++#define MV64460_PCI_1_CS_2_BASE_ADDR_REMAP 0xccc ++#define MV64460_PCI_0_CS_3_BASE_ADDR_REMAP 0xd4c ++#define MV64460_PCI_1_CS_3_BASE_ADDR_REMAP 0xdcc ++#define MV64460_PCI_0_CS_0_BASE_HIGH_ADDR_REMAP 0xF04 ++#define MV64460_PCI_1_CS_0_BASE_HIGH_ADDR_REMAP 0xF84 ++#define MV64460_PCI_0_CS_1_BASE_HIGH_ADDR_REMAP 0xF08 ++#define MV64460_PCI_1_CS_1_BASE_HIGH_ADDR_REMAP 0xF88 ++#define MV64460_PCI_0_CS_2_BASE_HIGH_ADDR_REMAP 0xF0C ++#define MV64460_PCI_1_CS_2_BASE_HIGH_ADDR_REMAP 0xF8C ++#define MV64460_PCI_0_CS_3_BASE_HIGH_ADDR_REMAP 0xF10 ++#define MV64460_PCI_1_CS_3_BASE_HIGH_ADDR_REMAP 0xF90 ++#define MV64460_PCI_0_DEVCS_0_BASE_ADDR_REMAP 0xc50 ++#define MV64460_PCI_1_DEVCS_0_BASE_ADDR_REMAP 0xcd0 ++#define MV64460_PCI_0_DEVCS_1_BASE_ADDR_REMAP 0xd50 ++#define MV64460_PCI_1_DEVCS_1_BASE_ADDR_REMAP 0xdd0 ++#define MV64460_PCI_0_DEVCS_2_BASE_ADDR_REMAP 0xd58 ++#define MV64460_PCI_1_DEVCS_2_BASE_ADDR_REMAP 0xdd8 ++#define MV64460_PCI_0_DEVCS_3_BASE_ADDR_REMAP 0xc54 ++#define MV64460_PCI_1_DEVCS_3_BASE_ADDR_REMAP 0xcd4 ++#define MV64460_PCI_0_DEVCS_BOOTCS_BASE_ADDR_REMAP 0xd54 ++#define MV64460_PCI_1_DEVCS_BOOTCS_BASE_ADDR_REMAP 0xdd4 ++#define MV64460_PCI_0_P2P_MEM0_BASE_ADDR_REMAP_LOW 0xd5c ++#define MV64460_PCI_1_P2P_MEM0_BASE_ADDR_REMAP_LOW 0xddc ++#define MV64460_PCI_0_P2P_MEM0_BASE_ADDR_REMAP_HIGH 0xd60 ++#define MV64460_PCI_1_P2P_MEM0_BASE_ADDR_REMAP_HIGH 0xde0 ++#define MV64460_PCI_0_P2P_MEM1_BASE_ADDR_REMAP_LOW 0xd64 ++#define MV64460_PCI_1_P2P_MEM1_BASE_ADDR_REMAP_LOW 0xde4 ++#define MV64460_PCI_0_P2P_MEM1_BASE_ADDR_REMAP_HIGH 0xd68 ++#define MV64460_PCI_1_P2P_MEM1_BASE_ADDR_REMAP_HIGH 0xde8 ++#define MV64460_PCI_0_P2P_I_O_BASE_ADDR_REMAP 0xd6c ++#define MV64460_PCI_1_P2P_I_O_BASE_ADDR_REMAP 0xdec ++#define MV64460_PCI_0_CPU_BASE_ADDR_REMAP_LOW 0xd70 ++#define MV64460_PCI_1_CPU_BASE_ADDR_REMAP_LOW 0xdf0 ++#define MV64460_PCI_0_CPU_BASE_ADDR_REMAP_HIGH 0xd74 ++#define MV64460_PCI_1_CPU_BASE_ADDR_REMAP_HIGH 0xdf4 ++#define MV64460_PCI_0_INTEGRATED_SRAM_BASE_ADDR_REMAP 0xf00 ++#define MV64460_PCI_1_INTEGRATED_SRAM_BASE_ADDR_REMAP 0xf80 ++#define MV64460_PCI_0_EXPANSION_ROM_BASE_ADDR_REMAP 0xf38 ++#define MV64460_PCI_1_EXPANSION_ROM_BASE_ADDR_REMAP 0xfb8 ++#define MV64460_PCI_0_ADDR_DECODE_CONTROL 0xd3c ++#define MV64460_PCI_1_ADDR_DECODE_CONTROL 0xdbc ++#define MV64460_PCI_0_HEADERS_RETARGET_CONTROL 0xF40 ++#define MV64460_PCI_1_HEADERS_RETARGET_CONTROL 0xFc0 ++#define MV64460_PCI_0_HEADERS_RETARGET_BASE 0xF44 ++#define MV64460_PCI_1_HEADERS_RETARGET_BASE 0xFc4 ++#define MV64460_PCI_0_HEADERS_RETARGET_HIGH 0xF48 ++#define MV64460_PCI_1_HEADERS_RETARGET_HIGH 0xFc8 ++ ++/***********************************/ ++/* PCI Control Register Map */ ++/***********************************/ ++ ++#define MV64460_PCI_0_DLL_STATUS_AND_COMMAND 0x1d20 ++#define MV64460_PCI_1_DLL_STATUS_AND_COMMAND 0x1da0 ++#define MV64460_PCI_0_MPP_PADS_DRIVE_CONTROL 0x1d1C ++#define MV64460_PCI_1_MPP_PADS_DRIVE_CONTROL 0x1d9C ++#define MV64460_PCI_0_COMMAND 0xc00 ++#define MV64460_PCI_1_COMMAND 0xc80 ++#define MV64460_PCI_0_MODE 0xd00 ++#define MV64460_PCI_1_MODE 0xd80 ++#define MV64460_PCI_0_RETRY 0xc04 ++#define MV64460_PCI_1_RETRY 0xc84 ++#define MV64460_PCI_0_READ_BUFFER_DISCARD_TIMER 0xd04 ++#define MV64460_PCI_1_READ_BUFFER_DISCARD_TIMER 0xd84 ++#define MV64460_PCI_0_MSI_TRIGGER_TIMER 0xc38 ++#define MV64460_PCI_1_MSI_TRIGGER_TIMER 0xcb8 ++#define MV64460_PCI_0_ARBITER_CONTROL 0x1d00 ++#define MV64460_PCI_1_ARBITER_CONTROL 0x1d80 ++#define MV64460_PCI_0_CROSS_BAR_CONTROL_LOW 0x1d08 ++#define MV64460_PCI_1_CROSS_BAR_CONTROL_LOW 0x1d88 ++#define MV64460_PCI_0_CROSS_BAR_CONTROL_HIGH 0x1d0c ++#define MV64460_PCI_1_CROSS_BAR_CONTROL_HIGH 0x1d8c ++#define MV64460_PCI_0_CROSS_BAR_TIMEOUT 0x1d04 ++#define MV64460_PCI_1_CROSS_BAR_TIMEOUT 0x1d84 ++#define MV64460_PCI_0_SYNC_BARRIER_TRIGGER_REG 0x1D18 ++#define MV64460_PCI_1_SYNC_BARRIER_TRIGGER_REG 0x1D98 ++#define MV64460_PCI_0_SYNC_BARRIER_VIRTUAL_REG 0x1d10 ++#define MV64460_PCI_1_SYNC_BARRIER_VIRTUAL_REG 0x1d90 ++#define MV64460_PCI_0_P2P_CONFIG 0x1d14 ++#define MV64460_PCI_1_P2P_CONFIG 0x1d94 ++ ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_0_LOW 0x1e00 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_0_HIGH 0x1e04 ++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_0 0x1e08 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_1_LOW 0x1e10 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_1_HIGH 0x1e14 ++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_1 0x1e18 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_2_LOW 0x1e20 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_2_HIGH 0x1e24 ++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_2 0x1e28 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_3_LOW 0x1e30 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_3_HIGH 0x1e34 ++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_3 0x1e38 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_4_LOW 0x1e40 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_4_HIGH 0x1e44 ++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_4 0x1e48 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_5_LOW 0x1e50 ++#define MV64460_PCI_0_ACCESS_CONTROL_BASE_5_HIGH 0x1e54 ++#define MV64460_PCI_0_ACCESS_CONTROL_SIZE_5 0x1e58 ++ ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_0_LOW 0x1e80 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_0_HIGH 0x1e84 ++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_0 0x1e88 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_1_LOW 0x1e90 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_1_HIGH 0x1e94 ++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_1 0x1e98 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_2_LOW 0x1ea0 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_2_HIGH 0x1ea4 ++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_2 0x1ea8 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_3_LOW 0x1eb0 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_3_HIGH 0x1eb4 ++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_3 0x1eb8 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_4_LOW 0x1ec0 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_4_HIGH 0x1ec4 ++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_4 0x1ec8 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_5_LOW 0x1ed0 ++#define MV64460_PCI_1_ACCESS_CONTROL_BASE_5_HIGH 0x1ed4 ++#define MV64460_PCI_1_ACCESS_CONTROL_SIZE_5 0x1ed8 ++ ++/****************************************/ ++/* PCI Configuration Access Registers */ ++/****************************************/ ++ ++#define MV64460_PCI_0_CONFIG_ADDR 0xcf8 ++#define MV64460_PCI_0_CONFIG_DATA_VIRTUAL_REG 0xcfc ++#define MV64460_PCI_1_CONFIG_ADDR 0xc78 ++#define MV64460_PCI_1_CONFIG_DATA_VIRTUAL_REG 0xc7c ++#define MV64460_PCI_0_INTERRUPT_ACKNOWLEDGE_VIRTUAL_REG 0xc34 ++#define MV64460_PCI_1_INTERRUPT_ACKNOWLEDGE_VIRTUAL_REG 0xcb4 ++ ++/****************************************/ ++/* PCI Error Report Registers */ ++/****************************************/ ++ ++#define MV64460_PCI_0_SERR_MASK 0xc28 ++#define MV64460_PCI_1_SERR_MASK 0xca8 ++#define MV64460_PCI_0_ERROR_ADDR_LOW 0x1d40 ++#define MV64460_PCI_1_ERROR_ADDR_LOW 0x1dc0 ++#define MV64460_PCI_0_ERROR_ADDR_HIGH 0x1d44 ++#define MV64460_PCI_1_ERROR_ADDR_HIGH 0x1dc4 ++#define MV64460_PCI_0_ERROR_ATTRIBUTE 0x1d48 ++#define MV64460_PCI_1_ERROR_ATTRIBUTE 0x1dc8 ++#define MV64460_PCI_0_ERROR_COMMAND 0x1d50 ++#define MV64460_PCI_1_ERROR_COMMAND 0x1dd0 ++#define MV64460_PCI_0_ERROR_CAUSE 0x1d58 ++#define MV64460_PCI_1_ERROR_CAUSE 0x1dd8 ++#define MV64460_PCI_0_ERROR_MASK 0x1d5c ++#define MV64460_PCI_1_ERROR_MASK 0x1ddc ++ ++/****************************************/ ++/* PCI Debug Registers */ ++/****************************************/ ++ ++#define MV64460_PCI_0_MMASK 0X1D24 ++#define MV64460_PCI_1_MMASK 0X1DA4 ++ ++/*********************************************/ ++/* PCI Configuration, Function 0, Registers */ ++/*********************************************/ ++ ++#define MV64460_PCI_DEVICE_AND_VENDOR_ID 0x000 ++#define MV64460_PCI_STATUS_AND_COMMAND 0x004 ++#define MV64460_PCI_CLASS_CODE_AND_REVISION_ID 0x008 ++#define MV64460_PCI_BIST_HEADER_TYPE_LATENCY_TIMER_CACHE_LINE 0x00C ++ ++#define MV64460_PCI_SCS_0_BASE_ADDR_LOW 0x010 ++#define MV64460_PCI_SCS_0_BASE_ADDR_HIGH 0x014 ++#define MV64460_PCI_SCS_1_BASE_ADDR_LOW 0x018 ++#define MV64460_PCI_SCS_1_BASE_ADDR_HIGH 0x01C ++#define MV64460_PCI_INTERNAL_REG_MEM_MAPPED_BASE_ADDR_LOW 0x020 ++#define MV64460_PCI_INTERNAL_REG_MEM_MAPPED_BASE_ADDR_HIGH 0x024 ++#define MV64460_PCI_SUBSYSTEM_ID_AND_SUBSYSTEM_VENDOR_ID 0x02c ++#define MV64460_PCI_EXPANSION_ROM_BASE_ADDR_REG 0x030 ++#define MV64460_PCI_CAPABILTY_LIST_POINTER 0x034 ++#define MV64460_PCI_INTERRUPT_PIN_AND_LINE 0x03C ++ /* capability list */ ++#define MV64460_PCI_POWER_MANAGEMENT_CAPABILITY 0x040 ++#define MV64460_PCI_POWER_MANAGEMENT_STATUS_AND_CONTROL 0x044 ++#define MV64460_PCI_VPD_ADDR 0x048 ++#define MV64460_PCI_VPD_DATA 0x04c ++#define MV64460_PCI_MSI_MESSAGE_CONTROL 0x050 ++#define MV64460_PCI_MSI_MESSAGE_ADDR 0x054 ++#define MV64460_PCI_MSI_MESSAGE_UPPER_ADDR 0x058 ++#define MV64460_PCI_MSI_MESSAGE_DATA 0x05c ++#define MV64460_PCI_X_COMMAND 0x060 ++#define MV64460_PCI_X_STATUS 0x064 ++#define MV64460_PCI_COMPACT_PCI_HOT_SWAP 0x068 ++ ++/***********************************************/ ++/* PCI Configuration, Function 1, Registers */ ++/***********************************************/ ++ ++#define MV64460_PCI_SCS_2_BASE_ADDR_LOW 0x110 ++#define MV64460_PCI_SCS_2_BASE_ADDR_HIGH 0x114 ++#define MV64460_PCI_SCS_3_BASE_ADDR_LOW 0x118 ++#define MV64460_PCI_SCS_3_BASE_ADDR_HIGH 0x11c ++#define MV64460_PCI_INTERNAL_SRAM_BASE_ADDR_LOW 0x120 ++#define MV64460_PCI_INTERNAL_SRAM_BASE_ADDR_HIGH 0x124 ++ ++/***********************************************/ ++/* PCI Configuration, Function 2, Registers */ ++/***********************************************/ ++ ++#define MV64460_PCI_DEVCS_0_BASE_ADDR_LOW 0x210 ++#define MV64460_PCI_DEVCS_0_BASE_ADDR_HIGH 0x214 ++#define MV64460_PCI_DEVCS_1_BASE_ADDR_LOW 0x218 ++#define MV64460_PCI_DEVCS_1_BASE_ADDR_HIGH 0x21c ++#define MV64460_PCI_DEVCS_2_BASE_ADDR_LOW 0x220 ++#define MV64460_PCI_DEVCS_2_BASE_ADDR_HIGH 0x224 ++ ++/***********************************************/ ++/* PCI Configuration, Function 3, Registers */ ++/***********************************************/ ++ ++#define MV64460_PCI_DEVCS_3_BASE_ADDR_LOW 0x310 ++#define MV64460_PCI_DEVCS_3_BASE_ADDR_HIGH 0x314 ++#define MV64460_PCI_BOOT_CS_BASE_ADDR_LOW 0x318 ++#define MV64460_PCI_BOOT_CS_BASE_ADDR_HIGH 0x31c ++#define MV64460_PCI_CPU_BASE_ADDR_LOW 0x220 ++#define MV64460_PCI_CPU_BASE_ADDR_HIGH 0x224 ++ ++/***********************************************/ ++/* PCI Configuration, Function 4, Registers */ ++/***********************************************/ ++ ++#define MV64460_PCI_P2P_MEM0_BASE_ADDR_LOW 0x410 ++#define MV64460_PCI_P2P_MEM0_BASE_ADDR_HIGH 0x414 ++#define MV64460_PCI_P2P_MEM1_BASE_ADDR_LOW 0x418 ++#define MV64460_PCI_P2P_MEM1_BASE_ADDR_HIGH 0x41c ++#define MV64460_PCI_P2P_I_O_BASE_ADDR 0x420 ++#define MV64460_PCI_INTERNAL_REGS_I_O_MAPPED_BASE_ADDR 0x424 ++ ++/****************************************/ ++/* Messaging Unit Registers (I20) */ ++/****************************************/ ++ ++#define MV64460_I2O_INBOUND_MESSAGE_REG0_PCI_0_SIDE 0x010 ++#define MV64460_I2O_INBOUND_MESSAGE_REG1_PCI_0_SIDE 0x014 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_PCI_0_SIDE 0x018 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_PCI_0_SIDE 0x01C ++#define MV64460_I2O_INBOUND_DOORBELL_REG_PCI_0_SIDE 0x020 ++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_PCI_0_SIDE 0x024 ++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_PCI_0_SIDE 0x028 ++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_PCI_0_SIDE 0x02C ++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_PCI_0_SIDE 0x030 ++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_PCI_0_SIDE 0x034 ++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_0_SIDE 0x040 ++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_0_SIDE 0x044 ++#define MV64460_I2O_QUEUE_CONTROL_REG_PCI_0_SIDE 0x050 ++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_PCI_0_SIDE 0x054 ++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_PCI_0_SIDE 0x060 ++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_PCI_0_SIDE 0x064 ++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_PCI_0_SIDE 0x068 ++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_PCI_0_SIDE 0x06C ++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_PCI_0_SIDE 0x070 ++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_PCI_0_SIDE 0x074 ++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_PCI_0_SIDE 0x0F8 ++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_PCI_0_SIDE 0x0FC ++ ++#define MV64460_I2O_INBOUND_MESSAGE_REG0_PCI_1_SIDE 0x090 ++#define MV64460_I2O_INBOUND_MESSAGE_REG1_PCI_1_SIDE 0x094 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_PCI_1_SIDE 0x098 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_PCI_1_SIDE 0x09C ++#define MV64460_I2O_INBOUND_DOORBELL_REG_PCI_1_SIDE 0x0A0 ++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_PCI_1_SIDE 0x0A4 ++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_PCI_1_SIDE 0x0A8 ++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_PCI_1_SIDE 0x0AC ++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_PCI_1_SIDE 0x0B0 ++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_PCI_1_SIDE 0x0B4 ++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_1_SIDE 0x0C0 ++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_PCI_1_SIDE 0x0C4 ++#define MV64460_I2O_QUEUE_CONTROL_REG_PCI_1_SIDE 0x0D0 ++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_PCI_1_SIDE 0x0D4 ++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_PCI_1_SIDE 0x0E0 ++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_PCI_1_SIDE 0x0E4 ++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_PCI_1_SIDE 0x0E8 ++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_PCI_1_SIDE 0x0EC ++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_PCI_1_SIDE 0x0F0 ++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_PCI_1_SIDE 0x0F4 ++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_PCI_1_SIDE 0x078 ++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_PCI_1_SIDE 0x07C ++ ++#define MV64460_I2O_INBOUND_MESSAGE_REG0_CPU0_SIDE 0x1C10 ++#define MV64460_I2O_INBOUND_MESSAGE_REG1_CPU0_SIDE 0x1C14 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_CPU0_SIDE 0x1C18 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_CPU0_SIDE 0x1C1C ++#define MV64460_I2O_INBOUND_DOORBELL_REG_CPU0_SIDE 0x1C20 ++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_CPU0_SIDE 0x1C24 ++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_CPU0_SIDE 0x1C28 ++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_CPU0_SIDE 0x1C2C ++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_CPU0_SIDE 0x1C30 ++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_CPU0_SIDE 0x1C34 ++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_CPU0_SIDE 0x1C40 ++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_CPU0_SIDE 0x1C44 ++#define MV64460_I2O_QUEUE_CONTROL_REG_CPU0_SIDE 0x1C50 ++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_CPU0_SIDE 0x1C54 ++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_CPU0_SIDE 0x1C60 ++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_CPU0_SIDE 0x1C64 ++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_CPU0_SIDE 0x1C68 ++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_CPU0_SIDE 0x1C6C ++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_CPU0_SIDE 0x1C70 ++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_CPU0_SIDE 0x1C74 ++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_CPU0_SIDE 0x1CF8 ++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_CPU0_SIDE 0x1CFC ++#define MV64460_I2O_INBOUND_MESSAGE_REG0_CPU1_SIDE 0x1C90 ++#define MV64460_I2O_INBOUND_MESSAGE_REG1_CPU1_SIDE 0x1C94 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG0_CPU1_SIDE 0x1C98 ++#define MV64460_I2O_OUTBOUND_MESSAGE_REG1_CPU1_SIDE 0x1C9C ++#define MV64460_I2O_INBOUND_DOORBELL_REG_CPU1_SIDE 0x1CA0 ++#define MV64460_I2O_INBOUND_INTERRUPT_CAUSE_REG_CPU1_SIDE 0x1CA4 ++#define MV64460_I2O_INBOUND_INTERRUPT_MASK_REG_CPU1_SIDE 0x1CA8 ++#define MV64460_I2O_OUTBOUND_DOORBELL_REG_CPU1_SIDE 0x1CAC ++#define MV64460_I2O_OUTBOUND_INTERRUPT_CAUSE_REG_CPU1_SIDE 0x1CB0 ++#define MV64460_I2O_OUTBOUND_INTERRUPT_MASK_REG_CPU1_SIDE 0x1CB4 ++#define MV64460_I2O_INBOUND_QUEUE_PORT_VIRTUAL_REG_CPU1_SIDE 0x1CC0 ++#define MV64460_I2O_OUTBOUND_QUEUE_PORT_VIRTUAL_REG_CPU1_SIDE 0x1CC4 ++#define MV64460_I2O_QUEUE_CONTROL_REG_CPU1_SIDE 0x1CD0 ++#define MV64460_I2O_QUEUE_BASE_ADDR_REG_CPU1_SIDE 0x1CD4 ++#define MV64460_I2O_INBOUND_FREE_HEAD_POINTER_REG_CPU1_SIDE 0x1CE0 ++#define MV64460_I2O_INBOUND_FREE_TAIL_POINTER_REG_CPU1_SIDE 0x1CE4 ++#define MV64460_I2O_INBOUND_POST_HEAD_POINTER_REG_CPU1_SIDE 0x1CE8 ++#define MV64460_I2O_INBOUND_POST_TAIL_POINTER_REG_CPU1_SIDE 0x1CEC ++#define MV64460_I2O_OUTBOUND_FREE_HEAD_POINTER_REG_CPU1_SIDE 0x1CF0 ++#define MV64460_I2O_OUTBOUND_FREE_TAIL_POINTER_REG_CPU1_SIDE 0x1CF4 ++#define MV64460_I2O_OUTBOUND_POST_HEAD_POINTER_REG_CPU1_SIDE 0x1C78 ++#define MV64460_I2O_OUTBOUND_POST_TAIL_POINTER_REG_CPU1_SIDE 0x1C7C ++ ++/****************************************/ ++/* Ethernet Unit Registers */ ++/****************************************/ ++ ++#define MV64460_ETH_PHY_ADDR_REG 0x2000 ++#define MV64460_ETH_SMI_REG 0x2004 ++#define MV64460_ETH_UNIT_DEFAULT_ADDR_REG 0x2008 ++#define MV64460_ETH_UNIT_DEFAULTID_REG 0x200c ++#define MV64460_ETH_UNIT_INTERRUPT_CAUSE_REG 0x2080 ++#define MV64460_ETH_UNIT_INTERRUPT_MASK_REG 0x2084 ++#define MV64460_ETH_UNIT_INTERNAL_USE_REG 0x24fc ++#define MV64460_ETH_UNIT_ERROR_ADDR_REG 0x2094 ++#define MV64460_ETH_BAR_0 0x2200 ++#define MV64460_ETH_BAR_1 0x2208 ++#define MV64460_ETH_BAR_2 0x2210 ++#define MV64460_ETH_BAR_3 0x2218 ++#define MV64460_ETH_BAR_4 0x2220 ++#define MV64460_ETH_BAR_5 0x2228 ++#define MV64460_ETH_SIZE_REG_0 0x2204 ++#define MV64460_ETH_SIZE_REG_1 0x220c ++#define MV64460_ETH_SIZE_REG_2 0x2214 ++#define MV64460_ETH_SIZE_REG_3 0x221c ++#define MV64460_ETH_SIZE_REG_4 0x2224 ++#define MV64460_ETH_SIZE_REG_5 0x222c ++#define MV64460_ETH_HEADERS_RETARGET_BASE_REG 0x2230 ++#define MV64460_ETH_HEADERS_RETARGET_CONTROL_REG 0x2234 ++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_0 0x2280 ++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_1 0x2284 ++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_2 0x2288 ++#define MV64460_ETH_HIGH_ADDR_REMAP_REG_3 0x228c ++#define MV64460_ETH_BASE_ADDR_ENABLE_REG 0x2290 ++#define MV64460_ETH_ACCESS_PROTECTION_REG(port) (0x2294 + (port<<2)) ++#define MV64460_ETH_MIB_COUNTERS_BASE(port) (0x3000 + (port<<7)) ++#define MV64460_ETH_PORT_CONFIG_REG(port) (0x2400 + (port<<10)) ++#define MV64460_ETH_PORT_CONFIG_EXTEND_REG(port) (0x2404 + (port<<10)) ++#define MV64460_ETH_MII_SERIAL_PARAMETRS_REG(port) (0x2408 + (port<<10)) ++#define MV64460_ETH_GMII_SERIAL_PARAMETRS_REG(port) (0x240c + (port<<10)) ++#define MV64460_ETH_VLAN_ETHERTYPE_REG(port) (0x2410 + (port<<10)) ++#define MV64460_ETH_MAC_ADDR_LOW(port) (0x2414 + (port<<10)) ++#define MV64460_ETH_MAC_ADDR_HIGH(port) (0x2418 + (port<<10)) ++#define MV64460_ETH_SDMA_CONFIG_REG(port) (0x241c + (port<<10)) ++#define MV64460_ETH_DSCP_0(port) (0x2420 + (port<<10)) ++#define MV64460_ETH_DSCP_1(port) (0x2424 + (port<<10)) ++#define MV64460_ETH_DSCP_2(port) (0x2428 + (port<<10)) ++#define MV64460_ETH_DSCP_3(port) (0x242c + (port<<10)) ++#define MV64460_ETH_DSCP_4(port) (0x2430 + (port<<10)) ++#define MV64460_ETH_DSCP_5(port) (0x2434 + (port<<10)) ++#define MV64460_ETH_DSCP_6(port) (0x2438 + (port<<10)) ++#define MV64460_ETH_PORT_SERIAL_CONTROL_REG(port) (0x243c + (port<<10)) ++#define MV64460_ETH_VLAN_PRIORITY_TAG_TO_PRIORITY(port) (0x2440 + (port<<10)) ++#define MV64460_ETH_PORT_STATUS_REG(port) (0x2444 + (port<<10)) ++#define MV64460_ETH_TRANSMIT_QUEUE_COMMAND_REG(port) (0x2448 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_FIXED_PRIORITY(port) (0x244c + (port<<10)) ++#define MV64460_ETH_PORT_TX_TOKEN_BUCKET_RATE_CONFIG(port) (0x2450 + (port<<10)) ++#define MV64460_ETH_MAXIMUM_TRANSMIT_UNIT(port) (0x2458 + (port<<10)) ++#define MV64460_ETH_PORT_MAXIMUM_TOKEN_BUCKET_SIZE(port) (0x245c + (port<<10)) ++#define MV64460_ETH_INTERRUPT_CAUSE_REG(port) (0x2460 + (port<<10)) ++#define MV64460_ETH_INTERRUPT_CAUSE_EXTEND_REG(port) (0x2464 + (port<<10)) ++#define MV64460_ETH_INTERRUPT_MASK_REG(port) (0x2468 + (port<<10)) ++#define MV64460_ETH_INTERRUPT_EXTEND_MASK_REG(port) (0x246c + (port<<10)) ++#define MV64460_ETH_RX_FIFO_URGENT_THRESHOLD_REG(port) (0x2470 + (port<<10)) ++#define MV64460_ETH_TX_FIFO_URGENT_THRESHOLD_REG(port) (0x2474 + (port<<10)) ++#define MV64460_ETH_RX_MINIMAL_FRAME_SIZE_REG(port) (0x247c + (port<<10)) ++#define MV64460_ETH_RX_DISCARDED_FRAMES_COUNTER(port) (0x2484 + (port<<10) ++#define MV64460_ETH_PORT_DEBUG_0_REG(port) (0x248c + (port<<10)) ++#define MV64460_ETH_PORT_DEBUG_1_REG(port) (0x2490 + (port<<10)) ++#define MV64460_ETH_PORT_INTERNAL_ADDR_ERROR_REG(port) (0x2494 + (port<<10)) ++#define MV64460_ETH_INTERNAL_USE_REG(port) (0x24fc + (port<<10)) ++#define MV64460_ETH_RECEIVE_QUEUE_COMMAND_REG(port) (0x2680 + (port<<10)) ++#define MV64460_ETH_CURRENT_SERVED_TX_DESC_PTR(port) (0x2684 + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_0(port) (0x260c + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_1(port) (0x261c + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_2(port) (0x262c + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_3(port) (0x263c + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_4(port) (0x264c + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_5(port) (0x265c + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_6(port) (0x266c + (port<<10)) ++#define MV64460_ETH_RX_CURRENT_QUEUE_DESC_PTR_7(port) (0x267c + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_0(port) (0x26c0 + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_1(port) (0x26c4 + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_2(port) (0x26c8 + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_3(port) (0x26cc + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_4(port) (0x26d0 + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_5(port) (0x26d4 + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_6(port) (0x26d8 + (port<<10)) ++#define MV64460_ETH_TX_CURRENT_QUEUE_DESC_PTR_7(port) (0x26dc + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_COUNT(port) (0x2700 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_1_TOKEN_BUCKET_COUNT(port) (0x2710 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_2_TOKEN_BUCKET_COUNT(port) (0x2720 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_3_TOKEN_BUCKET_COUNT(port) (0x2730 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_4_TOKEN_BUCKET_COUNT(port) (0x2740 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_5_TOKEN_BUCKET_COUNT(port) (0x2750 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_6_TOKEN_BUCKET_COUNT(port) (0x2760 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_7_TOKEN_BUCKET_COUNT(port) (0x2770 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_0_TOKEN_BUCKET_CONFIG(port) (0x2704 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_1_TOKEN_BUCKET_CONFIG(port) (0x2714 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_2_TOKEN_BUCKET_CONFIG(port) (0x2724 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_3_TOKEN_BUCKET_CONFIG(port) (0x2734 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_4_TOKEN_BUCKET_CONFIG(port) (0x2744 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_5_TOKEN_BUCKET_CONFIG(port) (0x2754 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_6_TOKEN_BUCKET_CONFIG(port) (0x2764 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_7_TOKEN_BUCKET_CONFIG(port) (0x2774 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_0_ARBITER_CONFIG(port) (0x2708 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_1_ARBITER_CONFIG(port) (0x2718 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_2_ARBITER_CONFIG(port) (0x2728 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_3_ARBITER_CONFIG(port) (0x2738 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_4_ARBITER_CONFIG(port) (0x2748 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_5_ARBITER_CONFIG(port) (0x2758 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_6_ARBITER_CONFIG(port) (0x2768 + (port<<10)) ++#define MV64460_ETH_TX_QUEUE_7_ARBITER_CONFIG(port) (0x2778 + (port<<10)) ++#define MV64460_ETH_PORT_TX_TOKEN_BUCKET_COUNT(port) (0x2780 + (port<<10)) ++#define MV64460_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(port) (0x3400 + (port<<10)) ++#define MV64460_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE(port) (0x3500 + (port<<10)) ++#define MV64460_ETH_DA_FILTER_UNICAST_TABLE_BASE(port) (0x3600 + (port<<10)) ++ ++/*******************************************/ ++/* CUNIT Registers */ ++/*******************************************/ ++ ++ /* Address Decoding Register Map */ ++ ++#define MV64460_CUNIT_BASE_ADDR_REG0 0xf200 ++#define MV64460_CUNIT_BASE_ADDR_REG1 0xf208 ++#define MV64460_CUNIT_BASE_ADDR_REG2 0xf210 ++#define MV64460_CUNIT_BASE_ADDR_REG3 0xf218 ++#define MV64460_CUNIT_SIZE0 0xf204 ++#define MV64460_CUNIT_SIZE1 0xf20c ++#define MV64460_CUNIT_SIZE2 0xf214 ++#define MV64460_CUNIT_SIZE3 0xf21c ++#define MV64460_CUNIT_HIGH_ADDR_REMAP_REG0 0xf240 ++#define MV64460_CUNIT_HIGH_ADDR_REMAP_REG1 0xf244 ++#define MV64460_CUNIT_BASE_ADDR_ENABLE_REG 0xf250 ++#define MV64460_MPSC0_ACCESS_PROTECTION_REG 0xf254 ++#define MV64460_MPSC1_ACCESS_PROTECTION_REG 0xf258 ++#define MV64460_CUNIT_INTERNAL_SPACE_BASE_ADDR_REG 0xf25C ++ ++ /* Error Report Registers */ ++ ++#define MV64460_CUNIT_INTERRUPT_CAUSE_REG 0xf310 ++#define MV64460_CUNIT_INTERRUPT_MASK_REG 0xf314 ++#define MV64460_CUNIT_ERROR_ADDR 0xf318 ++ ++ /* Cunit Control Registers */ ++ ++#define MV64460_CUNIT_ARBITER_CONTROL_REG 0xf300 ++#define MV64460_CUNIT_CONFIG_REG 0xb40c ++#define MV64460_CUNIT_CRROSBAR_TIMEOUT_REG 0xf304 ++ ++ /* Cunit Debug Registers */ ++ ++#define MV64460_CUNIT_DEBUG_LOW 0xf340 ++#define MV64460_CUNIT_DEBUG_HIGH 0xf344 ++#define MV64460_CUNIT_MMASK 0xf380 ++ ++ /* Cunit Base Address Enable Window Bits*/ ++#define MV64460_CUNIT_BASE_ADDR_WIN_0_BIT 0x0 ++#define MV64460_CUNIT_BASE_ADDR_WIN_1_BIT 0x1 ++#define MV64460_CUNIT_BASE_ADDR_WIN_2_BIT 0x2 ++#define MV64460_CUNIT_BASE_ADDR_WIN_3_BIT 0x3 ++ ++ /* MPSCs Clocks Routing Registers */ ++ ++#define MV64460_MPSC_ROUTING_REG 0xb400 ++#define MV64460_MPSC_RX_CLOCK_ROUTING_REG 0xb404 ++#define MV64460_MPSC_TX_CLOCK_ROUTING_REG 0xb408 ++ ++ /* MPSCs Interrupts Registers */ ++ ++#define MV64460_MPSC_CAUSE_REG(port) (0xb804 + (port<<3)) ++#define MV64460_MPSC_MASK_REG(port) (0xb884 + (port<<3)) ++ ++#define MV64460_MPSC_MAIN_CONFIG_LOW(port) (0x8000 + (port<<12)) ++#define MV64460_MPSC_MAIN_CONFIG_HIGH(port) (0x8004 + (port<<12)) ++#define MV64460_MPSC_PROTOCOL_CONFIG(port) (0x8008 + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG1(port) (0x800c + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG2(port) (0x8010 + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG3(port) (0x8014 + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG4(port) (0x8018 + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG5(port) (0x801c + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG6(port) (0x8020 + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG7(port) (0x8024 + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG8(port) (0x8028 + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG9(port) (0x802c + (port<<12)) ++#define MV64460_MPSC_CHANNEL_REG10(port) (0x8030 + (port<<12)) ++ ++ /* MPSC0 Registers */ ++ ++ ++/***************************************/ ++/* SDMA Registers */ ++/***************************************/ ++ ++#define MV64460_SDMA_CONFIG_REG(channel) (0x4000 + (channel<<13)) ++#define MV64460_SDMA_COMMAND_REG(channel) (0x4008 + (channel<<13)) ++#define MV64460_SDMA_CURRENT_RX_DESCRIPTOR_POINTER(channel) (0x4810 + (channel<<13)) ++#define MV64460_SDMA_CURRENT_TX_DESCRIPTOR_POINTER(channel) (0x4c10 + (channel<<13)) ++#define MV64460_SDMA_FIRST_TX_DESCRIPTOR_POINTER(channel) (0x4c14 + (channel<<13)) ++ ++#define MV64460_SDMA_CAUSE_REG 0xb800 ++#define MV64460_SDMA_MASK_REG 0xb880 ++ ++ ++/****************************************/ ++/* SDMA Address Space Targets */ ++/****************************************/ ++ ++#define MV64460_SDMA_DRAM_CS_0_TARGET 0x0e00 ++#define MV64460_SDMA_DRAM_CS_1_TARGET 0x0d00 ++#define MV64460_SDMA_DRAM_CS_2_TARGET 0x0b00 ++#define MV64460_SDMA_DRAM_CS_3_TARGET 0x0700 ++ ++#define MV64460_SDMA_DEV_CS_0_TARGET 0x1e01 ++#define MV64460_SDMA_DEV_CS_1_TARGET 0x1d01 ++#define MV64460_SDMA_DEV_CS_2_TARGET 0x1b01 ++#define MV64460_SDMA_DEV_CS_3_TARGET 0x1701 ++ ++#define MV64460_SDMA_BOOT_CS_TARGET 0x0f00 ++ ++#define MV64460_SDMA_SRAM_TARGET 0x0003 ++#define MV64460_SDMA_60X_BUS_TARGET 0x4003 ++ ++#define MV64460_PCI_0_TARGET 0x0003 ++#define MV64460_PCI_1_TARGET 0x0004 ++ ++ ++/* Devices BAR and size registers */ ++ ++#define MV64460_DEV_CS0_BASE_ADDR 0x028 ++#define MV64460_DEV_CS0_SIZE 0x030 ++#define MV64460_DEV_CS1_BASE_ADDR 0x228 ++#define MV64460_DEV_CS1_SIZE 0x230 ++#define MV64460_DEV_CS2_BASE_ADDR 0x248 ++#define MV64460_DEV_CS2_SIZE 0x250 ++#define MV64460_DEV_CS3_BASE_ADDR 0x038 ++#define MV64460_DEV_CS3_SIZE 0x040 ++#define MV64460_BOOTCS_BASE_ADDR 0x238 ++#define MV64460_BOOTCS_SIZE 0x240 ++ ++/* SDMA Window access protection */ ++#define MV64460_SDMA_WIN_ACCESS_NOT_ALLOWED 0 ++#define MV64460_SDMA_WIN_ACCESS_READ_ONLY 1 ++#define MV64460_SDMA_WIN_ACCESS_FULL 2 ++ ++/* BRG Interrupts */ ++ ++#define MV64460_BRG_CONFIG_REG(brg) (0xb200 + (brg<<3)) ++#define MV64460_BRG_BAUDE_TUNING_REG(brg) (0xb204 + (brg<<3)) ++#define MV64460_BRG_CAUSE_REG 0xb834 ++#define MV64460_BRG_MASK_REG 0xb8b4 ++ ++/****************************************/ ++/* DMA Channel Control */ ++/****************************************/ ++ ++#define MV64460_DMA_CHANNEL0_CONTROL 0x840 ++#define MV64460_DMA_CHANNEL0_CONTROL_HIGH 0x880 ++#define MV64460_DMA_CHANNEL1_CONTROL 0x844 ++#define MV64460_DMA_CHANNEL1_CONTROL_HIGH 0x884 ++#define MV64460_DMA_CHANNEL2_CONTROL 0x848 ++#define MV64460_DMA_CHANNEL2_CONTROL_HIGH 0x888 ++#define MV64460_DMA_CHANNEL3_CONTROL 0x84C ++#define MV64460_DMA_CHANNEL3_CONTROL_HIGH 0x88C ++ ++ ++/****************************************/ ++/* IDMA Registers */ ++/****************************************/ ++ ++#define MV64460_DMA_CHANNEL0_BYTE_COUNT 0x800 ++#define MV64460_DMA_CHANNEL1_BYTE_COUNT 0x804 ++#define MV64460_DMA_CHANNEL2_BYTE_COUNT 0x808 ++#define MV64460_DMA_CHANNEL3_BYTE_COUNT 0x80C ++#define MV64460_DMA_CHANNEL0_SOURCE_ADDR 0x810 ++#define MV64460_DMA_CHANNEL1_SOURCE_ADDR 0x814 ++#define MV64460_DMA_CHANNEL2_SOURCE_ADDR 0x818 ++#define MV64460_DMA_CHANNEL3_SOURCE_ADDR 0x81c ++#define MV64460_DMA_CHANNEL0_DESTINATION_ADDR 0x820 ++#define MV64460_DMA_CHANNEL1_DESTINATION_ADDR 0x824 ++#define MV64460_DMA_CHANNEL2_DESTINATION_ADDR 0x828 ++#define MV64460_DMA_CHANNEL3_DESTINATION_ADDR 0x82C ++#define MV64460_DMA_CHANNEL0_NEXT_DESCRIPTOR_POINTER 0x830 ++#define MV64460_DMA_CHANNEL1_NEXT_DESCRIPTOR_POINTER 0x834 ++#define MV64460_DMA_CHANNEL2_NEXT_DESCRIPTOR_POINTER 0x838 ++#define MV64460_DMA_CHANNEL3_NEXT_DESCRIPTOR_POINTER 0x83C ++#define MV64460_DMA_CHANNEL0_CURRENT_DESCRIPTOR_POINTER 0x870 ++#define MV64460_DMA_CHANNEL1_CURRENT_DESCRIPTOR_POINTER 0x874 ++#define MV64460_DMA_CHANNEL2_CURRENT_DESCRIPTOR_POINTER 0x878 ++#define MV64460_DMA_CHANNEL3_CURRENT_DESCRIPTOR_POINTER 0x87C ++ ++ /* IDMA Address Decoding Base Address Registers */ ++ ++#define MV64460_DMA_BASE_ADDR_REG0 0xa00 ++#define MV64460_DMA_BASE_ADDR_REG1 0xa08 ++#define MV64460_DMA_BASE_ADDR_REG2 0xa10 ++#define MV64460_DMA_BASE_ADDR_REG3 0xa18 ++#define MV64460_DMA_BASE_ADDR_REG4 0xa20 ++#define MV64460_DMA_BASE_ADDR_REG5 0xa28 ++#define MV64460_DMA_BASE_ADDR_REG6 0xa30 ++#define MV64460_DMA_BASE_ADDR_REG7 0xa38 ++ ++ /* IDMA Address Decoding Size Address Register */ ++ ++#define MV64460_DMA_SIZE_REG0 0xa04 ++#define MV64460_DMA_SIZE_REG1 0xa0c ++#define MV64460_DMA_SIZE_REG2 0xa14 ++#define MV64460_DMA_SIZE_REG3 0xa1c ++#define MV64460_DMA_SIZE_REG4 0xa24 ++#define MV64460_DMA_SIZE_REG5 0xa2c ++#define MV64460_DMA_SIZE_REG6 0xa34 ++#define MV64460_DMA_SIZE_REG7 0xa3C ++ ++ /* IDMA Address Decoding High Address Remap and Access ++ Protection Registers */ ++ ++#define MV64460_DMA_HIGH_ADDR_REMAP_REG0 0xa60 ++#define MV64460_DMA_HIGH_ADDR_REMAP_REG1 0xa64 ++#define MV64460_DMA_HIGH_ADDR_REMAP_REG2 0xa68 ++#define MV64460_DMA_HIGH_ADDR_REMAP_REG3 0xa6C ++#define MV64460_DMA_BASE_ADDR_ENABLE_REG 0xa80 ++#define MV64460_DMA_CHANNEL0_ACCESS_PROTECTION_REG 0xa70 ++#define MV64460_DMA_CHANNEL1_ACCESS_PROTECTION_REG 0xa74 ++#define MV64460_DMA_CHANNEL2_ACCESS_PROTECTION_REG 0xa78 ++#define MV64460_DMA_CHANNEL3_ACCESS_PROTECTION_REG 0xa7c ++#define MV64460_DMA_ARBITER_CONTROL 0x860 ++#define MV64460_DMA_CROSS_BAR_TIMEOUT 0x8d0 ++ ++ /* IDMA Headers Retarget Registers */ ++ ++#define MV64460_DMA_HEADERS_RETARGET_CONTROL 0xa84 ++#define MV64460_DMA_HEADERS_RETARGET_BASE 0xa88 ++ ++ /* IDMA Interrupt Register */ ++ ++#define MV64460_DMA_INTERRUPT_CAUSE_REG 0x8c0 ++#define MV64460_DMA_INTERRUPT_CAUSE_MASK 0x8c4 ++#define MV64460_DMA_ERROR_ADDR 0x8c8 ++#define MV64460_DMA_ERROR_SELECT 0x8cc ++ ++ /* IDMA Debug Register ( for internal use ) */ ++ ++#define MV64460_DMA_DEBUG_LOW 0x8e0 ++#define MV64460_DMA_DEBUG_HIGH 0x8e4 ++#define MV64460_DMA_SPARE 0xA8C ++ ++/****************************************/ ++/* Timer_Counter */ ++/****************************************/ ++ ++#define MV64460_TIMER_COUNTER0 0x850 ++#define MV64460_TIMER_COUNTER1 0x854 ++#define MV64460_TIMER_COUNTER2 0x858 ++#define MV64460_TIMER_COUNTER3 0x85C ++#define MV64460_TIMER_COUNTER_0_3_CONTROL 0x864 ++#define MV64460_TIMER_COUNTER_0_3_INTERRUPT_CAUSE 0x868 ++#define MV64460_TIMER_COUNTER_0_3_INTERRUPT_MASK 0x86c ++ ++/****************************************/ ++/* Watchdog registers */ ++/****************************************/ ++ ++#define MV64460_WATCHDOG_CONFIG_REG 0xb410 ++#define MV64460_WATCHDOG_VALUE_REG 0xb414 ++ ++/****************************************/ ++/* I2C Registers */ ++/****************************************/ ++ ++#define MV64460_I2C_SLAVE_ADDR 0xc000 ++#define MV64460_I2C_EXTENDED_SLAVE_ADDR 0xc010 ++#define MV64460_I2C_DATA 0xc004 ++#define MV64460_I2C_CONTROL 0xc008 ++#define MV64460_I2C_STATUS_BAUDE_RATE 0xc00C ++#define MV64460_I2C_SOFT_RESET 0xc01c ++ ++/****************************************/ ++/* GPP Interface Registers */ ++/****************************************/ ++ ++#define MV64460_GPP_IO_CONTROL 0xf100 ++#define MV64460_GPP_LEVEL_CONTROL 0xf110 ++#define MV64460_GPP_VALUE 0xf104 ++#define MV64460_GPP_INTERRUPT_CAUSE 0xf108 ++#define MV64460_GPP_INTERRUPT_MASK0 0xf10c ++#define MV64460_GPP_INTERRUPT_MASK1 0xf114 ++#define MV64460_GPP_VALUE_SET 0xf118 ++#define MV64460_GPP_VALUE_CLEAR 0xf11c ++ ++/****************************************/ ++/* Interrupt Controller Registers */ ++/****************************************/ ++ ++/****************************************/ ++/* Interrupts */ ++/****************************************/ ++ ++#define MV64460_MAIN_INTERRUPT_CAUSE_LOW 0x004 ++#define MV64460_MAIN_INTERRUPT_CAUSE_HIGH 0x00c ++#define MV64460_CPU_INTERRUPT0_MASK_LOW 0x014 ++#define MV64460_CPU_INTERRUPT0_MASK_HIGH 0x01c ++#define MV64460_CPU_INTERRUPT0_SELECT_CAUSE 0x024 ++#define MV64460_CPU_INTERRUPT1_MASK_LOW 0x034 ++#define MV64460_CPU_INTERRUPT1_MASK_HIGH 0x03c ++#define MV64460_CPU_INTERRUPT1_SELECT_CAUSE 0x044 ++#define MV64460_INTERRUPT0_MASK_0_LOW 0x054 ++#define MV64460_INTERRUPT0_MASK_0_HIGH 0x05c ++#define MV64460_INTERRUPT0_SELECT_CAUSE 0x064 ++#define MV64460_INTERRUPT1_MASK_0_LOW 0x074 ++#define MV64460_INTERRUPT1_MASK_0_HIGH 0x07c ++#define MV64460_INTERRUPT1_SELECT_CAUSE 0x084 ++ ++/****************************************/ ++/* MPP Interface Registers */ ++/****************************************/ ++ ++#define MV64460_MPP_CONTROL0 0xf000 ++#define MV64460_MPP_CONTROL1 0xf004 ++#define MV64460_MPP_CONTROL2 0xf008 ++#define MV64460_MPP_CONTROL3 0xf00c ++ ++/****************************************/ ++/* Serial Initialization registers */ ++/****************************************/ ++ ++#define MV64460_SERIAL_INIT_LAST_DATA 0xf324 ++#define MV64460_SERIAL_INIT_CONTROL 0xf328 ++#define MV64460_SERIAL_INIT_STATUS 0xf32c ++ ++ ++#endif /* __INCgt64460rh */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/p3mx.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/p3mx.c +--- u-boot-1.1.6/board/prodrive/p3mx/p3mx.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/p3mx.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,809 @@ ++/* ++ * (C) Copyright 2006 ++ * Stefan Roese, DENX Software Engineering, sr@denx.de. ++ * ++ * Based on original work by ++ * Roel Loeffen, (C) Copyright 2006 Prodrive B.V. ++ * Josh Huber, (C) Copyright 2001 Mission Critical Linux, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ * ++ * modifications for the DB64360 eval board based by Ingo.Assmus@keymile.com ++ * modifications for the cpci750 by reinhard.arlt@esd-electronics.com ++ * modifications for the P3M750 by roel.loeffen@prodrive.nl ++ */ ++ ++/* ++ * p3m750.c - main board support/init for the Prodrive p3m750/p3m7448. ++ */ ++ ++#include <common.h> ++#include <74xx_7xx.h> ++#include "../../Marvell/include/memory.h" ++#include "../../Marvell/include/pci.h" ++#include "../../Marvell/include/mv_gen_reg.h" ++#include <net.h> ++#include <i2c.h> ++ ++#include "eth.h" ++#include "mpsc.h" ++#include "64460.h" ++#include "mv_regs.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#undef DEBUG ++/*#define DEBUG */ ++ ++#ifdef CONFIG_PCI ++#define MAP_PCI ++#endif /* of CONFIG_PCI */ ++ ++#ifdef DEBUG ++#define DP(x) x ++#else ++#define DP(x) ++#endif ++ ++extern void flush_data_cache (void); ++extern void invalidate_l1_instruction_cache (void); ++extern flash_info_t flash_info[]; ++ ++/* ------------------------------------------------------------------------- */ ++ ++/* this is the current GT register space location */ ++/* it starts at CFG_DFL_GT_REGS but moves later to CFG_GT_REGS */ ++ ++/* Unfortunately, we cant change it while we are in flash, so we initialize it ++ * to the "final" value. This means that any debug_led calls before ++ * board_early_init_f wont work right (like in cpu_init_f). ++ * See also my_remap_gt_regs below. (NTL) ++ */ ++ ++void board_prebootm_init (void); ++unsigned int INTERNAL_REG_BASE_ADDR = CFG_GT_REGS; ++int display_mem_map (void); ++ ++/* ------------------------------------------------------------------------- */ ++ ++/* ++ * This is a version of the GT register space remapping function that ++ * doesn't touch globals (meaning, it's ok to run from flash.) ++ * ++ * Unfortunately, this has the side effect that a writable ++ * INTERNAL_REG_BASE_ADDR is impossible. Oh well. ++ */ ++ ++void my_remap_gt_regs (u32 cur_loc, u32 new_loc) ++{ ++ u32 temp; ++ ++ /* check and see if it's already moved */ ++ temp = in_le32 ((u32 *) (new_loc + INTERNAL_SPACE_DECODE)); ++ if ((temp & 0xffff) == new_loc >> 16) ++ return; ++ ++ temp = (in_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE)) & ++ 0xffff0000) | (new_loc >> 16); ++ ++ out_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE), temp); ++ ++ while (GTREGREAD (INTERNAL_SPACE_DECODE) != temp); ++} ++ ++#ifdef CONFIG_PCI ++ ++static void gt_pci_config (void) ++{ ++ unsigned int stat; ++ unsigned int val = 0x00fff864; /* DINK32: BusNum 23:16, DevNum 15:11, */ ++ /* FuncNum 10:8, RegNum 7:2 */ ++ ++ /* ++ * In PCIX mode devices provide their own bus and device numbers. ++ * We query the Discovery II's ++ * config registers by writing ones to the bus and device. ++ * We then update the Virtual register with the correct value for the ++ * bus and device. ++ */ ++ if ((GTREGREAD (PCI_0_MODE) & (BIT4 | BIT5)) != 0) { /* if PCI-X */ ++ GT_REG_WRITE (PCI_0_CONFIG_ADDR, BIT31 | val); ++ ++ GT_REG_READ (PCI_0_CONFIG_DATA_VIRTUAL_REG, &stat); ++ ++ GT_REG_WRITE (PCI_0_CONFIG_ADDR, BIT31 | val); ++ GT_REG_WRITE (PCI_0_CONFIG_DATA_VIRTUAL_REG, ++ (stat & 0xffff0000) | CFG_PCI_IDSEL); ++ ++ } ++ if ((GTREGREAD (PCI_1_MODE) & (BIT4 | BIT5)) != 0) { /* if PCI-X */ ++ GT_REG_WRITE (PCI_1_CONFIG_ADDR, BIT31 | val); ++ GT_REG_READ (PCI_1_CONFIG_DATA_VIRTUAL_REG, &stat); ++ ++ GT_REG_WRITE (PCI_1_CONFIG_ADDR, BIT31 | val); ++ GT_REG_WRITE (PCI_1_CONFIG_DATA_VIRTUAL_REG, ++ (stat & 0xffff0000) | CFG_PCI_IDSEL); ++ } ++ ++ /* Enable master */ ++ PCI_MASTER_ENABLE (0, SELF); ++ PCI_MASTER_ENABLE (1, SELF); ++ ++ /* Enable PCI0/1 Mem0 and IO 0 disable all others */ ++ GT_REG_READ (BASE_ADDR_ENABLE, &stat); ++ stat |= (1 << 11) | (1 << 12) | (1 << 13) | (1 << 16) | (1 << 17) | ++ (1 << 18); ++ stat &= ~((1 << 9) | (1 << 10) | (1 << 14) | (1 << 15)); ++ GT_REG_WRITE (BASE_ADDR_ENABLE, stat); ++ ++ /* ronen: ++ * add write to pci remap registers for 64460. ++ * in 64360 when writing to pci base go and overide remap automaticaly, ++ * in 64460 it doesn't ++ */ ++ GT_REG_WRITE (PCI_0_IO_BASE_ADDR, CFG_PCI0_IO_SPACE >> 16); ++ GT_REG_WRITE (PCI_0I_O_ADDRESS_REMAP, CFG_PCI0_IO_SPACE_PCI >> 16); ++ GT_REG_WRITE (PCI_0_IO_SIZE, (CFG_PCI0_IO_SIZE - 1) >> 16); ++ ++ GT_REG_WRITE (PCI_0_MEMORY0_BASE_ADDR, CFG_PCI0_MEM_BASE >> 16); ++ GT_REG_WRITE (PCI_0MEMORY0_ADDRESS_REMAP, CFG_PCI0_MEM_BASE >> 16); ++ GT_REG_WRITE (PCI_0_MEMORY0_SIZE, (CFG_PCI0_MEM_SIZE - 1) >> 16); ++ ++ GT_REG_WRITE (PCI_1_IO_BASE_ADDR, CFG_PCI1_IO_SPACE >> 16); ++ GT_REG_WRITE (PCI_1I_O_ADDRESS_REMAP, CFG_PCI1_IO_SPACE_PCI >> 16); ++ GT_REG_WRITE (PCI_1_IO_SIZE, (CFG_PCI1_IO_SIZE - 1) >> 16); ++ ++ GT_REG_WRITE (PCI_1_MEMORY0_BASE_ADDR, CFG_PCI1_MEM_BASE >> 16); ++ GT_REG_WRITE (PCI_1MEMORY0_ADDRESS_REMAP, CFG_PCI1_MEM_BASE >> 16); ++ GT_REG_WRITE (PCI_1_MEMORY0_SIZE, (CFG_PCI1_MEM_SIZE - 1) >> 16); ++ ++ /* PCI interface settings */ ++ /* Timeout set to retry forever */ ++ GT_REG_WRITE (PCI_0TIMEOUT_RETRY, 0x0); ++ GT_REG_WRITE (PCI_1TIMEOUT_RETRY, 0x0); ++ ++ /* ronen - enable only CS0 and Internal reg!! */ ++ GT_REG_WRITE (PCI_0BASE_ADDRESS_REGISTERS_ENABLE, 0xfffffdfe); ++ GT_REG_WRITE (PCI_1BASE_ADDRESS_REGISTERS_ENABLE, 0xfffffdfe); ++ ++ /* ronen: ++ * update the pci internal registers base address. ++ */ ++#ifdef MAP_PCI ++ for (stat = 0; stat <= PCI_HOST1; stat++) ++ pciWriteConfigReg (stat, ++ PCI_INTERNAL_REGISTERS_MEMORY_MAPPED_BASE_ADDRESS, ++ SELF, CFG_GT_REGS); ++#endif ++ ++} ++#endif ++ ++/* Setup CPU interface paramaters */ ++static void gt_cpu_config (void) ++{ ++ cpu_t cpu = get_cpu_type (); ++ ulong tmp; ++ ++ /* cpu configuration register */ ++ tmp = GTREGREAD (CPU_CONFIGURATION); ++ /* set the SINGLE_CPU bit see MV64460 */ ++#ifndef CFG_GT_DUAL_CPU /* SINGLE_CPU seems to cause JTAG problems */ ++ tmp |= CPU_CONF_SINGLE_CPU; ++#endif ++ tmp &= ~CPU_CONF_AACK_DELAY_2; ++ tmp |= CPU_CONF_DP_VALID; ++ tmp |= CPU_CONF_AP_VALID; ++ tmp |= CPU_CONF_PIPELINE; ++ GT_REG_WRITE (CPU_CONFIGURATION, tmp); /* Marvell (VXWorks) writes 0x20220FF */ ++ ++ /* CPU master control register */ ++ tmp = GTREGREAD (CPU_MASTER_CONTROL); ++ tmp |= CPU_MAST_CTL_ARB_EN; ++ ++ if ((cpu == CPU_7400) || ++ (cpu == CPU_7410) || (cpu == CPU_7455) || (cpu == CPU_7450)) { ++ ++ tmp |= CPU_MAST_CTL_CLEAN_BLK; ++ tmp |= CPU_MAST_CTL_FLUSH_BLK; ++ ++ } else { ++ /* cleanblock must be cleared for CPUs ++ * that do not support this command (603e, 750) ++ * see Res#1 */ ++ tmp &= ~CPU_MAST_CTL_CLEAN_BLK; ++ tmp &= ~CPU_MAST_CTL_FLUSH_BLK; ++ } ++ GT_REG_WRITE (CPU_MASTER_CONTROL, tmp); ++} ++ ++/* ++ * board_early_init_f. ++ * ++ * set up gal. device mappings, etc. ++ */ ++int board_early_init_f (void) ++{ ++ /* set up the GT the way the kernel wants it ++ * the call to move the GT register space will obviously ++ * fail if it has already been done, but we're going to assume ++ * that if it's not at the power-on location, it's where we put ++ * it last time. (huber) ++ */ ++ ++ my_remap_gt_regs (CFG_DFL_GT_REGS, CFG_GT_REGS); ++ ++#ifdef CONFIG_PCI ++ gt_pci_config (); ++#endif ++ /* mask all external interrupt sources */ ++ GT_REG_WRITE (CPU_INTERRUPT_MASK_REGISTER_LOW, 0); ++ GT_REG_WRITE (CPU_INTERRUPT_MASK_REGISTER_HIGH, 0); ++ /* new in >MV6436x */ ++ GT_REG_WRITE (CPU_INTERRUPT_1_MASK_REGISTER_LOW, 0); ++ GT_REG_WRITE (CPU_INTERRUPT_1_MASK_REGISTER_HIGH, 0); ++ /* --------------------- */ ++ GT_REG_WRITE (PCI_0INTERRUPT_CAUSE_MASK_REGISTER_LOW, 0); ++ GT_REG_WRITE (PCI_0INTERRUPT_CAUSE_MASK_REGISTER_HIGH, 0); ++ GT_REG_WRITE (PCI_1INTERRUPT_CAUSE_MASK_REGISTER_LOW, 0); ++ GT_REG_WRITE (PCI_1INTERRUPT_CAUSE_MASK_REGISTER_HIGH, 0); ++ ++ /* Device and Boot bus settings ++ */ ++ memoryMapDeviceSpace(DEVICE0, 0, 0); ++ GT_REG_WRITE(DEVICE_BANK0PARAMETERS, 0); ++ memoryMapDeviceSpace(DEVICE1, 0, 0); ++ GT_REG_WRITE(DEVICE_BANK1PARAMETERS, 0); ++ memoryMapDeviceSpace(DEVICE2, 0, 0); ++ GT_REG_WRITE(DEVICE_BANK2PARAMETERS, 0); ++ memoryMapDeviceSpace(DEVICE3, 0, 0); ++ GT_REG_WRITE(DEVICE_BANK3PARAMETERS, 0); ++ ++ GT_REG_WRITE(DEVICE_BOOT_BANK_PARAMETERS, CFG_BOOT_PAR); ++ ++ gt_cpu_config(); ++ ++ /* MPP setup */ ++ GT_REG_WRITE (MPP_CONTROL0, CFG_MPP_CONTROL_0); ++ GT_REG_WRITE (MPP_CONTROL1, CFG_MPP_CONTROL_1); ++ GT_REG_WRITE (MPP_CONTROL2, CFG_MPP_CONTROL_2); ++ GT_REG_WRITE (MPP_CONTROL3, CFG_MPP_CONTROL_3); ++ ++ GT_REG_WRITE (GPP_LEVEL_CONTROL, CFG_GPP_LEVEL_CONTROL); ++ ++ return 0; ++} ++ ++/* various things to do after relocation */ ++ ++int misc_init_r () ++{ ++ u8 val; ++ ++ icache_enable (); ++#ifdef CFG_L2 ++ l2cache_enable (); ++#endif ++#ifdef CONFIG_MPSC ++ mpsc_sdma_init (); ++ mpsc_init2 (); ++#endif ++ ++ /* ++ * Enable trickle changing in RTC upon powerup ++ * No diode, 250 ohm series resistor ++ */ ++ val = 0xa5; ++ i2c_write(CFG_I2C_RTC_ADDR, 8, 1, &val, 1); ++ ++ return 0; ++} ++ ++int board_early_init_r(void) ++{ ++ /* now relocate the debug serial driver */ ++ mpsc_putchar += gd->reloc_off; ++ mpsc_getchar += gd->reloc_off; ++ mpsc_test_char += gd->reloc_off; ++ ++ return 0; ++} ++ ++void after_reloc (ulong dest_addr, gd_t * gd) ++{ ++ memoryMapDeviceSpace (BOOT_DEVICE, CFG_BOOT_SPACE, CFG_BOOT_SIZE); ++ ++/* display_mem_map(); */ ++ ++ /* now, jump to the main U-Boot board init code */ ++ board_init_r (gd, dest_addr); ++ /* NOTREACHED */ ++} ++ ++/* ++ * Check Board Identity: ++ * right now, assume borad type. (there is just one...after all) ++ */ ++ ++int checkboard (void) ++{ ++ char *s = getenv("serial#"); ++ ++ printf("Board: %s", CFG_BOARD_NAME); ++ ++ if (s != NULL) { ++ puts(", serial# "); ++ puts(s); ++ } ++ putc('\n'); ++ ++ return (0); ++} ++ ++/* utility functions */ ++void debug_led (int led, int mode) ++{ ++} ++ ++int display_mem_map (void) ++{ ++ int i, j; ++ unsigned int base, size, width; ++ ++ /* SDRAM */ ++ printf ("SD (DDR) RAM\n"); ++ for (i = 0; i <= BANK3; i++) { ++ base = memoryGetBankBaseAddress (i); ++ size = memoryGetBankSize (i); ++ if (size != 0) ++ printf ("BANK%d: base - 0x%08x\tsize - %dM bytes\n", ++ i, base, size >> 20); ++ } ++#ifdef CONFIG_PCI ++ /* CPU's PCI windows */ ++ for (i = 0; i <= PCI_HOST1; i++) { ++ printf ("\nCPU's PCI %d windows\n", i); ++ base = pciGetSpaceBase (i, PCI_IO); ++ size = pciGetSpaceSize (i, PCI_IO); ++ printf (" IO: base - 0x%08x\tsize - %dM bytes\n", base, ++ size >> 20); ++ /* ronen currently only first PCI MEM is used 3 */ ++ for (j = 0; j <= PCI_REGION0; j++) { ++ base = pciGetSpaceBase (i, j); ++ size = pciGetSpaceSize (i, j); ++ printf ("MEMORY %d: base - 0x%08x\tsize - %dM bytes\n", ++ j, base, size >> 20); ++ } ++ } ++#endif /* of CONFIG_PCI */ ++ ++ /* Bootrom */ ++ base = memoryGetDeviceBaseAddress (BOOT_DEVICE); /* Boot */ ++ size = memoryGetDeviceSize (BOOT_DEVICE); ++ width = memoryGetDeviceWidth (BOOT_DEVICE) * 8; ++ printf (" BOOT: base - 0x%08x size - %dM bytes\twidth - %d bits\t- FLASH\n", ++ base, size >> 20, width); ++ ++ return (0); ++} ++ ++/* DRAM check routines copied from gw8260 */ ++ ++#if defined (CFG_DRAM_TEST) ++ ++/*********************************************************************/ ++/* NAME: move64() - moves a double word (64-bit) */ ++/* */ ++/* DESCRIPTION: */ ++/* this function performs a double word move from the data at */ ++/* the source pointer to the location at the destination pointer. */ ++/* */ ++/* INPUTS: */ ++/* unsigned long long *src - pointer to data to move */ ++/* */ ++/* OUTPUTS: */ ++/* unsigned long long *dest - pointer to locate to move data */ ++/* */ ++/* RETURNS: */ ++/* None */ ++/* */ ++/* RESTRICTIONS/LIMITATIONS: */ ++/* May cloober fr0. */ ++/* */ ++/*********************************************************************/ ++static void move64 (unsigned long long *src, unsigned long long *dest) ++{ ++ asm ("lfd 0, 0(3)\n\t" /* fpr0 = *scr */ ++ "stfd 0, 0(4)" /* *dest = fpr0 */ ++ : : : "fr0"); /* Clobbers fr0 */ ++ return; ++} ++ ++ ++#if defined (CFG_DRAM_TEST_DATA) ++ ++unsigned long long pattern[] = { ++ 0xaaaaaaaaaaaaaaaaULL, ++ 0xccccccccccccccccULL, ++ 0xf0f0f0f0f0f0f0f0ULL, ++ 0xff00ff00ff00ff00ULL, ++ 0xffff0000ffff0000ULL, ++ 0xffffffff00000000ULL, ++ 0x00000000ffffffffULL, ++ 0x0000ffff0000ffffULL, ++ 0x00ff00ff00ff00ffULL, ++ 0x0f0f0f0f0f0f0f0fULL, ++ 0x3333333333333333ULL, ++ 0x5555555555555555ULL ++}; ++ ++/*********************************************************************/ ++/* NAME: mem_test_data() - test data lines for shorts and opens */ ++/* */ ++/* DESCRIPTION: */ ++/* Tests data lines for shorts and opens by forcing adjacent data */ ++/* to opposite states. Because the data lines could be routed in */ ++/* an arbitrary manner the must ensure test patterns ensure that */ ++/* every case is tested. By using the following series of binary */ ++/* patterns every combination of adjacent bits is test regardless */ ++/* of routing. */ ++/* */ ++/* ...101010101010101010101010 */ ++/* ...110011001100110011001100 */ ++/* ...111100001111000011110000 */ ++/* ...111111110000000011111111 */ ++/* */ ++/* Carrying this out, gives us six hex patterns as follows: */ ++/* */ ++/* 0xaaaaaaaaaaaaaaaa */ ++/* 0xcccccccccccccccc */ ++/* 0xf0f0f0f0f0f0f0f0 */ ++/* 0xff00ff00ff00ff00 */ ++/* 0xffff0000ffff0000 */ ++/* 0xffffffff00000000 */ ++/* */ ++/* The number test patterns will always be given by: */ ++/* */ ++/* log(base 2)(number data bits) = log2 (64) = 6 */ ++/* */ ++/* To test for short and opens to other signals on our boards. we */ ++/* simply */ ++/* test with the 1's complemnt of the paterns as well. */ ++/* */ ++/* OUTPUTS: */ ++/* Displays failing test pattern */ ++/* */ ++/* RETURNS: */ ++/* 0 - Passed test */ ++/* 1 - Failed test */ ++/* */ ++/* RESTRICTIONS/LIMITATIONS: */ ++/* Assumes only one one SDRAM bank */ ++/* */ ++/*********************************************************************/ ++int mem_test_data (void) ++{ ++ unsigned long long *pmem = (unsigned long long *) CFG_MEMTEST_START; ++ unsigned long long temp64 = 0; ++ int num_patterns = sizeof (pattern) / sizeof (pattern[0]); ++ int i; ++ unsigned int hi, lo; ++ ++ for (i = 0; i < num_patterns; i++) { ++ move64 (&(pattern[i]), pmem); ++ move64 (pmem, &temp64); ++ ++ /* hi = (temp64>>32) & 0xffffffff; */ ++ /* lo = temp64 & 0xffffffff; */ ++ /* printf("\ntemp64 = 0x%08x%08x", hi, lo); */ ++ ++ hi = (pattern[i] >> 32) & 0xffffffff; ++ lo = pattern[i] & 0xffffffff; ++ /* printf("\npattern[%d] = 0x%08x%08x", i, hi, lo); */ ++ ++ if (temp64 != pattern[i]) { ++ printf ("\n Data Test Failed, pattern 0x%08x%08x", ++ hi, lo); ++ return 1; ++ } ++ } ++ ++ return 0; ++} ++#endif /* CFG_DRAM_TEST_DATA */ ++ ++#if defined (CFG_DRAM_TEST_ADDRESS) ++/*********************************************************************/ ++/* NAME: mem_test_address() - test address lines */ ++/* */ ++/* DESCRIPTION: */ ++/* This function performs a test to verify that each word im */ ++/* memory is uniquly addressable. The test sequence is as follows: */ ++/* */ ++/* 1) write the address of each word to each word. */ ++/* 2) verify that each location equals its address */ ++/* */ ++/* OUTPUTS: */ ++/* Displays failing test pattern and address */ ++/* */ ++/* RETURNS: */ ++/* 0 - Passed test */ ++/* 1 - Failed test */ ++/* */ ++/* RESTRICTIONS/LIMITATIONS: */ ++/* */ ++/* */ ++/*********************************************************************/ ++int mem_test_address (void) ++{ ++ volatile unsigned int *pmem = ++ (volatile unsigned int *) CFG_MEMTEST_START; ++ const unsigned int size = (CFG_MEMTEST_END - CFG_MEMTEST_START) / 4; ++ unsigned int i; ++ ++ /* write address to each location */ ++ for (i = 0; i < size; i++) ++ pmem[i] = i; ++ ++ /* verify each loaction */ ++ for (i = 0; i < size; i++) { ++ if (pmem[i] != i) { ++ printf ("\n Address Test Failed at 0x%x", i); ++ return 1; ++ } ++ } ++ return 0; ++} ++#endif /* CFG_DRAM_TEST_ADDRESS */ ++ ++#if defined (CFG_DRAM_TEST_WALK) ++/*********************************************************************/ ++/* NAME: mem_march() - memory march */ ++/* */ ++/* DESCRIPTION: */ ++/* Marches up through memory. At each location verifies rmask if */ ++/* read = 1. At each location write wmask if write = 1. Displays */ ++/* failing address and pattern. */ ++/* */ ++/* INPUTS: */ ++/* volatile unsigned long long * base - start address of test */ ++/* unsigned int size - number of dwords(64-bit) to test */ ++/* unsigned long long rmask - read verify mask */ ++/* unsigned long long wmask - wrtie verify mask */ ++/* short read - verifies rmask if read = 1 */ ++/* short write - writes wmask if write = 1 */ ++/* */ ++/* OUTPUTS: */ ++/* Displays failing test pattern and address */ ++/* */ ++/* RETURNS: */ ++/* 0 - Passed test */ ++/* 1 - Failed test */ ++/* */ ++/* RESTRICTIONS/LIMITATIONS: */ ++/* */ ++/* */ ++/*********************************************************************/ ++int mem_march (volatile unsigned long long *base, ++ unsigned int size, ++ unsigned long long rmask, ++ unsigned long long wmask, short read, short write) ++{ ++ unsigned int i; ++ unsigned long long temp = 0; ++ unsigned int hitemp, lotemp, himask, lomask; ++ ++ for (i = 0; i < size; i++) { ++ if (read != 0) { ++ /* temp = base[i]; */ ++ move64 ((unsigned long long *) &(base[i]), &temp); ++ if (rmask != temp) { ++ hitemp = (temp >> 32) & 0xffffffff; ++ lotemp = temp & 0xffffffff; ++ himask = (rmask >> 32) & 0xffffffff; ++ lomask = rmask & 0xffffffff; ++ ++ printf ("\n Walking one's test failed: address = 0x%08x," "\n\texpected 0x%08x%08x, found 0x%08x%08x", i << 3, himask, lomask, hitemp, lotemp); ++ return 1; ++ } ++ } ++ if (write != 0) { ++ /* base[i] = wmask; */ ++ move64 (&wmask, (unsigned long long *) &(base[i])); ++ } ++ } ++ return 0; ++} ++#endif /* CFG_DRAM_TEST_WALK */ ++ ++/*********************************************************************/ ++/* NAME: mem_test_walk() - a simple walking ones test */ ++/* */ ++/* DESCRIPTION: */ ++/* Performs a walking ones through entire physical memory. The */ ++/* test uses as series of memory marches, mem_march(), to verify */ ++/* and write the test patterns to memory. The test sequence is as */ ++/* follows: */ ++/* 1) march writing 0000...0001 */ ++/* 2) march verifying 0000...0001 , writing 0000...0010 */ ++/* 3) repeat step 2 shifting masks left 1 bit each time unitl */ ++/* the write mask equals 1000...0000 */ ++/* 4) march verifying 1000...0000 */ ++/* The test fails if any of the memory marches return a failure. */ ++/* */ ++/* OUTPUTS: */ ++/* Displays which pass on the memory test is executing */ ++/* */ ++/* RETURNS: */ ++/* 0 - Passed test */ ++/* 1 - Failed test */ ++/* */ ++/* RESTRICTIONS/LIMITATIONS: */ ++/* */ ++/* */ ++/*********************************************************************/ ++int mem_test_walk (void) ++{ ++ unsigned long long mask; ++ volatile unsigned long long *pmem = ++ (volatile unsigned long long *) CFG_MEMTEST_START; ++ const unsigned long size = (CFG_MEMTEST_END - CFG_MEMTEST_START) / 8; ++ ++ unsigned int i; ++ ++ mask = 0x01; ++ ++ printf ("Initial Pass"); ++ mem_march (pmem, size, 0x0, 0x1, 0, 1); ++ ++ printf ("\b\b\b\b\b\b\b\b\b\b\b\b"); ++ printf (" "); ++ printf (" "); ++ printf ("\b\b\b\b\b\b\b\b\b\b\b\b"); ++ ++ for (i = 0; i < 63; i++) { ++ printf ("Pass %2d", i + 2); ++ if (mem_march (pmem, size, mask, mask << 1, 1, 1) != 0) { ++ /*printf("mask: 0x%x, pass: %d, ", mask, i); */ ++ return 1; ++ } ++ mask = mask << 1; ++ printf ("\b\b\b\b\b\b\b"); ++ } ++ ++ printf ("Last Pass"); ++ if (mem_march (pmem, size, 0, mask, 0, 1) != 0) { ++ /* printf("mask: 0x%x", mask); */ ++ return 1; ++ } ++ printf ("\b\b\b\b\b\b\b\b\b"); ++ printf (" "); ++ printf ("\b\b\b\b\b\b\b\b\b"); ++ ++ return 0; ++} ++ ++/*********************************************************************/ ++/* NAME: testdram() - calls any enabled memory tests */ ++/* */ ++/* DESCRIPTION: */ ++/* Runs memory tests if the environment test variables are set to */ ++/* 'y'. */ ++/* */ ++/* INPUTS: */ ++/* testdramdata - If set to 'y', data test is run. */ ++/* testdramaddress - If set to 'y', address test is run. */ ++/* testdramwalk - If set to 'y', walking ones test is run */ ++/* */ ++/* OUTPUTS: */ ++/* None */ ++/* */ ++/* RETURNS: */ ++/* 0 - Passed test */ ++/* 1 - Failed test */ ++/* */ ++/* RESTRICTIONS/LIMITATIONS: */ ++/* */ ++/* */ ++/*********************************************************************/ ++int testdram (void) ++{ ++ char *s; ++ int rundata = 0; ++ int runaddress = 0; ++ int runwalk = 0; ++ ++#ifdef CFG_DRAM_TEST_DATA ++ s = getenv ("testdramdata"); ++ rundata = (s && (*s == 'y')) ? 1 : 0; ++#endif ++#ifdef CFG_DRAM_TEST_ADDRESS ++ s = getenv ("testdramaddress"); ++ runaddress = (s && (*s == 'y')) ? 1 : 0; ++#endif ++#ifdef CFG_DRAM_TEST_WALK ++ s = getenv ("testdramwalk"); ++ runwalk = (s && (*s == 'y')) ? 1 : 0; ++#endif ++ ++ if ((rundata == 1) || (runaddress == 1) || (runwalk == 1)) ++ printf ("Testing RAM from 0x%08x to 0x%08x ... " ++ "(don't panic... that will take a moment !!!!)\n", ++ CFG_MEMTEST_START, CFG_MEMTEST_END); ++#ifdef CFG_DRAM_TEST_DATA ++ if (rundata == 1) { ++ printf ("Test DATA ... "); ++ if (mem_test_data () == 1) { ++ printf ("failed \n"); ++ return 1; ++ } else ++ printf ("ok \n"); ++ } ++#endif ++#ifdef CFG_DRAM_TEST_ADDRESS ++ if (runaddress == 1) { ++ printf ("Test ADDRESS ... "); ++ if (mem_test_address () == 1) { ++ printf ("failed \n"); ++ return 1; ++ } else ++ printf ("ok \n"); ++ } ++#endif ++#ifdef CFG_DRAM_TEST_WALK ++ if (runwalk == 1) { ++ printf ("Test WALKING ONEs ... "); ++ if (mem_test_walk () == 1) { ++ printf ("failed \n"); ++ return 1; ++ } else ++ printf ("ok \n"); ++ } ++#endif ++ if ((rundata == 1) || (runaddress == 1) || (runwalk == 1)) ++ printf ("passed\n"); ++ return 0; ++ ++} ++#endif /* CFG_DRAM_TEST */ ++ ++/* ronen - the below functions are used by the bootm function */ ++/* - we map the base register to fbe00000 (same mapping as in the LSP) */ ++/* - we turn off the RX gig dmas - to prevent the dma from overunning */ ++/* the kernel data areas. */ ++/* - we diable and invalidate the icache and dcache. */ ++void my_remap_gt_regs_bootm (u32 cur_loc, u32 new_loc) ++{ ++ u32 temp; ++ ++ temp = in_le32 ((u32 *) (new_loc + INTERNAL_SPACE_DECODE)); ++ if ((temp & 0xffff) == new_loc >> 16) ++ return; ++ ++ temp = (in_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE)) & ++ 0xffff0000) | (new_loc >> 16); ++ ++ out_le32 ((u32 *) (cur_loc + INTERNAL_SPACE_DECODE), temp); ++ ++ while ((WORD_SWAP (*((volatile unsigned int *) (NONE_CACHEABLE | ++ new_loc | ++ (INTERNAL_SPACE_DECODE))))) ++ != temp); ++ ++} +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/pci.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/pci.c +--- u-boot-1.1.6/board/prodrive/p3mx/pci.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/pci.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,1025 @@ ++/* ++ * (C) Copyright 2000 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ * ++ */ ++/* PCI.c - PCI functions */ ++ ++ ++#include <common.h> ++#ifdef CONFIG_PCI ++#include <pci.h> ++ ++#ifdef CONFIG_PCI_PNP ++void pciauto_config_init(struct pci_controller *hose); ++int pciauto_region_allocate(struct pci_region* res, unsigned int size, unsigned int *bar); ++#endif ++ ++#include "../../Marvell/include/pci.h" ++ ++#undef DEBUG ++#undef IDE_SET_NATIVE_MODE ++static unsigned int local_buses[] = { 0, 0 }; ++ ++static const unsigned char pci_irq_swizzle[2][PCI_MAX_DEVICES] = { ++ {0, 0, 0, 0, 0, 0, 0, 27, 27, [9 ... PCI_MAX_DEVICES - 1] = 0 }, ++ {0, 0, 0, 0, 0, 0, 0, 29, 29, [9 ... PCI_MAX_DEVICES - 1] = 0 }, ++}; ++ ++#ifdef CONFIG_USE_CPCIDVI ++typedef struct { ++ unsigned int base; ++ unsigned int init; ++} GT_CPCIDVI_ROM_T; ++ ++static GT_CPCIDVI_ROM_T gt_cpcidvi_rom = {0, 0}; ++#endif ++ ++#ifdef DEBUG ++static const unsigned int pci_bus_list[] = { PCI_0_MODE, PCI_1_MODE }; ++static void gt_pci_bus_mode_display (PCI_HOST host) ++{ ++ unsigned int mode; ++ ++ ++ mode = (GTREGREAD (pci_bus_list[host]) & (BIT4 | BIT5)) >> 4; ++ switch (mode) { ++ case 0: ++ printf ("PCI %d bus mode: Conventional PCI\n", host); ++ break; ++ case 1: ++ printf ("PCI %d bus mode: 66 Mhz PCIX\n", host); ++ break; ++ case 2: ++ printf ("PCI %d bus mode: 100 Mhz PCIX\n", host); ++ break; ++ case 3: ++ printf ("PCI %d bus mode: 133 Mhz PCIX\n", host); ++ break; ++ default: ++ printf ("Unknown BUS %d\n", mode); ++ } ++} ++#endif ++ ++static const unsigned int pci_p2p_configuration_reg[] = { ++ PCI_0P2P_CONFIGURATION, PCI_1P2P_CONFIGURATION ++}; ++ ++static const unsigned int pci_configuration_address[] = { ++ PCI_0CONFIGURATION_ADDRESS, PCI_1CONFIGURATION_ADDRESS ++}; ++ ++static const unsigned int pci_configuration_data[] = { ++ PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER, ++ PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER ++}; ++ ++static const unsigned int pci_error_cause_reg[] = { ++ PCI_0ERROR_CAUSE, PCI_1ERROR_CAUSE ++}; ++ ++static const unsigned int pci_arbiter_control[] = { ++ PCI_0ARBITER_CONTROL, PCI_1ARBITER_CONTROL ++}; ++ ++static const unsigned int pci_address_space_en[] = { ++ PCI_0_BASE_ADDR_REG_ENABLE, PCI_1_BASE_ADDR_REG_ENABLE ++}; ++ ++static const unsigned int pci_snoop_control_base_0_low[] = { ++ PCI_0SNOOP_CONTROL_BASE_0_LOW, PCI_1SNOOP_CONTROL_BASE_0_LOW ++}; ++static const unsigned int pci_snoop_control_top_0[] = { ++ PCI_0SNOOP_CONTROL_TOP_0, PCI_1SNOOP_CONTROL_TOP_0 ++}; ++ ++static const unsigned int pci_access_control_base_0_low[] = { ++ PCI_0ACCESS_CONTROL_BASE_0_LOW, PCI_1ACCESS_CONTROL_BASE_0_LOW ++}; ++static const unsigned int pci_access_control_top_0[] = { ++ PCI_0ACCESS_CONTROL_TOP_0, PCI_1ACCESS_CONTROL_TOP_0 ++}; ++ ++static const unsigned int pci_scs_bank_size[2][4] = { ++ {PCI_0SCS_0_BANK_SIZE, PCI_0SCS_1_BANK_SIZE, ++ PCI_0SCS_2_BANK_SIZE, PCI_0SCS_3_BANK_SIZE}, ++ {PCI_1SCS_0_BANK_SIZE, PCI_1SCS_1_BANK_SIZE, ++ PCI_1SCS_2_BANK_SIZE, PCI_1SCS_3_BANK_SIZE} ++}; ++ ++static const unsigned int pci_p2p_configuration[] = { ++ PCI_0P2P_CONFIGURATION, PCI_1P2P_CONFIGURATION ++}; ++ ++ ++/******************************************************************** ++* pciWriteConfigReg - Write to a PCI configuration register ++* - Make sure the GT is configured as a master before writing ++* to another device on the PCI. ++* - The function takes care of Big/Little endian conversion. ++* ++* ++* Inputs: unsigned int regOffset: The register offset as it apears in the GT spec ++* (or any other PCI device spec) ++* pciDevNum: The device number needs to be addressed. ++* ++* Configuration Address 0xCF8: ++* ++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number ++* |congif|Reserved| Bus |Device|Function|Register|00| ++* |Enable| |Number|Number| Number | Number | | <=field Name ++* ++*********************************************************************/ ++void pciWriteConfigReg (PCI_HOST host, unsigned int regOffset, ++ unsigned int pciDevNum, unsigned int data) ++{ ++ volatile unsigned int DataForAddrReg; ++ unsigned int functionNum; ++ unsigned int busNum = 0; ++ unsigned int addr; ++ ++ if (pciDevNum > 32) /* illegal device Number */ ++ return; ++ if (pciDevNum == SELF) { /* configure our configuration space. */ ++ pciDevNum = ++ (GTREGREAD (pci_p2p_configuration_reg[host]) >> 24) & ++ 0x1f; ++ busNum = GTREGREAD (pci_p2p_configuration_reg[host]) & ++ 0xff0000; ++ } ++ functionNum = regOffset & 0x00000700; ++ pciDevNum = pciDevNum << 11; ++ regOffset = regOffset & 0xfc; ++ DataForAddrReg = ++ (regOffset | pciDevNum | functionNum | busNum) | BIT31; ++ GT_REG_WRITE (pci_configuration_address[host], DataForAddrReg); ++ GT_REG_READ (pci_configuration_address[host], &addr); ++ if (addr != DataForAddrReg) ++ return; ++ GT_REG_WRITE (pci_configuration_data[host], data); ++} ++ ++/******************************************************************** ++* pciReadConfigReg - Read from a PCI0 configuration register ++* - Make sure the GT is configured as a master before reading ++* from another device on the PCI. ++* - The function takes care of Big/Little endian conversion. ++* INPUTS: regOffset: The register offset as it apears in the GT spec (or PCI ++* spec) ++* pciDevNum: The device number needs to be addressed. ++* RETURNS: data , if the data == 0xffffffff check the master abort bit in the ++* cause register to make sure the data is valid ++* ++* Configuration Address 0xCF8: ++* ++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number ++* |congif|Reserved| Bus |Device|Function|Register|00| ++* |Enable| |Number|Number| Number | Number | | <=field Name ++* ++*********************************************************************/ ++unsigned int pciReadConfigReg (PCI_HOST host, unsigned int regOffset, ++ unsigned int pciDevNum) ++{ ++ volatile unsigned int DataForAddrReg; ++ unsigned int data; ++ unsigned int functionNum; ++ unsigned int busNum = 0; ++ ++ if (pciDevNum > 32) /* illegal device Number */ ++ return 0xffffffff; ++ if (pciDevNum == SELF) { /* configure our configuration space. */ ++ pciDevNum = ++ (GTREGREAD (pci_p2p_configuration_reg[host]) >> 24) & ++ 0x1f; ++ busNum = GTREGREAD (pci_p2p_configuration_reg[host]) & ++ 0xff0000; ++ } ++ functionNum = regOffset & 0x00000700; ++ pciDevNum = pciDevNum << 11; ++ regOffset = regOffset & 0xfc; ++ DataForAddrReg = ++ (regOffset | pciDevNum | functionNum | busNum) | BIT31; ++ GT_REG_WRITE (pci_configuration_address[host], DataForAddrReg); ++ GT_REG_READ (pci_configuration_address[host], &data); ++ if (data != DataForAddrReg) ++ return 0xffffffff; ++ GT_REG_READ (pci_configuration_data[host], &data); ++ return data; ++} ++ ++/******************************************************************** ++* pciOverBridgeWriteConfigReg - Write to a PCI configuration register where ++* the agent is placed on another Bus. For more ++* information read P2P in the PCI spec. ++* ++* Inputs: unsigned int regOffset - The register offset as it apears in the ++* GT spec (or any other PCI device spec). ++* unsigned int pciDevNum - The device number needs to be addressed. ++* unsigned int busNum - On which bus does the Target agent connect ++* to. ++* unsigned int data - data to be written. ++* ++* Configuration Address 0xCF8: ++* ++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number ++* |congif|Reserved| Bus |Device|Function|Register|01| ++* |Enable| |Number|Number| Number | Number | | <=field Name ++* ++* The configuration Address is configure as type-I (bits[1:0] = '01') due to ++* PCI spec referring to P2P. ++* ++*********************************************************************/ ++void pciOverBridgeWriteConfigReg (PCI_HOST host, ++ unsigned int regOffset, ++ unsigned int pciDevNum, ++ unsigned int busNum, unsigned int data) ++{ ++ unsigned int DataForReg; ++ unsigned int functionNum; ++ ++ functionNum = regOffset & 0x00000700; ++ pciDevNum = pciDevNum << 11; ++ regOffset = regOffset & 0xff; ++ busNum = busNum << 16; ++ if (pciDevNum == SELF) { /* This board */ ++ DataForReg = (regOffset | pciDevNum | functionNum) | BIT0; ++ } else { ++ DataForReg = (regOffset | pciDevNum | functionNum | busNum) | ++ BIT31 | BIT0; ++ } ++ GT_REG_WRITE (pci_configuration_address[host], DataForReg); ++ GT_REG_WRITE (pci_configuration_data[host], data); ++} ++ ++ ++/******************************************************************** ++* pciOverBridgeReadConfigReg - Read from a PCIn configuration register where ++* the agent target locate on another PCI bus. ++* - Make sure the GT is configured as a master ++* before reading from another device on the PCI. ++* - The function takes care of Big/Little endian ++* conversion. ++* INPUTS: regOffset: The register offset as it apears in the GT spec (or PCI ++* spec). (configuration register offset.) ++* pciDevNum: The device number needs to be addressed. ++* busNum: the Bus number where the agent is place. ++* RETURNS: data , if the data == 0xffffffff check the master abort bit in the ++* cause register to make sure the data is valid ++* ++* Configuration Address 0xCF8: ++* ++* 31 30 24 23 16 15 11 10 8 7 2 0 <=bit Number ++* |congif|Reserved| Bus |Device|Function|Register|01| ++* |Enable| |Number|Number| Number | Number | | <=field Name ++* ++*********************************************************************/ ++unsigned int pciOverBridgeReadConfigReg (PCI_HOST host, ++ unsigned int regOffset, ++ unsigned int pciDevNum, ++ unsigned int busNum) ++{ ++ unsigned int DataForReg; ++ unsigned int data; ++ unsigned int functionNum; ++ ++ functionNum = regOffset & 0x00000700; ++ pciDevNum = pciDevNum << 11; ++ regOffset = regOffset & 0xff; ++ busNum = busNum << 16; ++ if (pciDevNum == SELF) { /* This board */ ++ DataForReg = (regOffset | pciDevNum | functionNum) | BIT31; ++ } else { /* agent on another bus */ ++ ++ DataForReg = (regOffset | pciDevNum | functionNum | busNum) | ++ BIT0 | BIT31; ++ } ++ GT_REG_WRITE (pci_configuration_address[host], DataForReg); ++ GT_REG_READ (pci_configuration_data[host], &data); ++ return data; ++} ++ ++ ++/******************************************************************** ++* pciGetRegOffset - Gets the register offset for this region config. ++* ++* INPUT: Bus, Region - The bus and region we ask for its base address. ++* OUTPUT: N/A ++* RETURNS: PCI register base address ++*********************************************************************/ ++static unsigned int pciGetRegOffset (PCI_HOST host, PCI_REGION region) ++{ ++ switch (host) { ++ case PCI_HOST0: ++ switch (region) { ++ case PCI_IO: ++ return PCI_0I_O_LOW_DECODE_ADDRESS; ++ case PCI_REGION0: ++ return PCI_0MEMORY0_LOW_DECODE_ADDRESS; ++ case PCI_REGION1: ++ return PCI_0MEMORY1_LOW_DECODE_ADDRESS; ++ case PCI_REGION2: ++ return PCI_0MEMORY2_LOW_DECODE_ADDRESS; ++ case PCI_REGION3: ++ return PCI_0MEMORY3_LOW_DECODE_ADDRESS; ++ } ++ case PCI_HOST1: ++ switch (region) { ++ case PCI_IO: ++ return PCI_1I_O_LOW_DECODE_ADDRESS; ++ case PCI_REGION0: ++ return PCI_1MEMORY0_LOW_DECODE_ADDRESS; ++ case PCI_REGION1: ++ return PCI_1MEMORY1_LOW_DECODE_ADDRESS; ++ case PCI_REGION2: ++ return PCI_1MEMORY2_LOW_DECODE_ADDRESS; ++ case PCI_REGION3: ++ return PCI_1MEMORY3_LOW_DECODE_ADDRESS; ++ } ++ } ++ return PCI_0MEMORY0_LOW_DECODE_ADDRESS; ++} ++ ++static unsigned int pciGetRemapOffset (PCI_HOST host, PCI_REGION region) ++{ ++ switch (host) { ++ case PCI_HOST0: ++ switch (region) { ++ case PCI_IO: ++ return PCI_0I_O_ADDRESS_REMAP; ++ case PCI_REGION0: ++ return PCI_0MEMORY0_ADDRESS_REMAP; ++ case PCI_REGION1: ++ return PCI_0MEMORY1_ADDRESS_REMAP; ++ case PCI_REGION2: ++ return PCI_0MEMORY2_ADDRESS_REMAP; ++ case PCI_REGION3: ++ return PCI_0MEMORY3_ADDRESS_REMAP; ++ } ++ case PCI_HOST1: ++ switch (region) { ++ case PCI_IO: ++ return PCI_1I_O_ADDRESS_REMAP; ++ case PCI_REGION0: ++ return PCI_1MEMORY0_ADDRESS_REMAP; ++ case PCI_REGION1: ++ return PCI_1MEMORY1_ADDRESS_REMAP; ++ case PCI_REGION2: ++ return PCI_1MEMORY2_ADDRESS_REMAP; ++ case PCI_REGION3: ++ return PCI_1MEMORY3_ADDRESS_REMAP; ++ } ++ } ++ return PCI_0MEMORY0_ADDRESS_REMAP; ++} ++ ++/******************************************************************** ++* pciGetBaseAddress - Gets the base address of a PCI. ++* - If the PCI size is 0 then this base address has no meaning!!! ++* ++* ++* INPUT: Bus, Region - The bus and region we ask for its base address. ++* OUTPUT: N/A ++* RETURNS: PCI base address. ++*********************************************************************/ ++unsigned int pciGetBaseAddress (PCI_HOST host, PCI_REGION region) ++{ ++ unsigned int regBase; ++ unsigned int regEnd; ++ unsigned int regOffset = pciGetRegOffset (host, region); ++ ++ GT_REG_READ (regOffset, ®Base); ++ GT_REG_READ (regOffset + 8, ®End); ++ ++ if (regEnd <= regBase) ++ return 0xffffffff; /* ERROR !!! */ ++ ++ regBase = regBase << 16; ++ return regBase; ++} ++ ++bool pciMapSpace (PCI_HOST host, PCI_REGION region, unsigned int remapBase, ++ unsigned int bankBase, unsigned int bankLength) ++{ ++ unsigned int low = 0xfff; ++ unsigned int high = 0x0; ++ unsigned int regOffset = pciGetRegOffset (host, region); ++ unsigned int remapOffset = pciGetRemapOffset (host, region); ++ ++ if (bankLength != 0) { ++ low = (bankBase >> 16) & 0xffff; ++ high = ((bankBase + bankLength) >> 16) - 1; ++ } ++ ++ GT_REG_WRITE (regOffset, low | (1 << 24)); /* no swapping */ ++ GT_REG_WRITE (regOffset + 8, high); ++ ++ if (bankLength != 0) { /* must do AFTER writing maps */ ++ GT_REG_WRITE (remapOffset, remapBase >> 16); /* sorry, 32 bits only. ++ dont support upper 32 ++ in this driver */ ++ } ++ return true; ++} ++ ++unsigned int pciGetSpaceBase (PCI_HOST host, PCI_REGION region) ++{ ++ unsigned int low; ++ unsigned int regOffset = pciGetRegOffset (host, region); ++ ++ GT_REG_READ (regOffset, &low); ++ return (low & 0xffff) << 16; ++} ++ ++unsigned int pciGetSpaceSize (PCI_HOST host, PCI_REGION region) ++{ ++ unsigned int low, high; ++ unsigned int regOffset = pciGetRegOffset (host, region); ++ ++ GT_REG_READ (regOffset, &low); ++ GT_REG_READ (regOffset + 8, &high); ++ return ((high & 0xffff) + 1) << 16; ++} ++ ++ ++/* ronen - 7/Dec/03*/ ++/******************************************************************** ++* gtPciDisable/EnableInternalBAR - This function enable/disable PCI BARS. ++* Inputs: one of the PCI BAR ++*********************************************************************/ ++void gtPciEnableInternalBAR (PCI_HOST host, PCI_INTERNAL_BAR pciBAR) ++{ ++ RESET_REG_BITS (pci_address_space_en[host], BIT0 << pciBAR); ++} ++ ++void gtPciDisableInternalBAR (PCI_HOST host, PCI_INTERNAL_BAR pciBAR) ++{ ++ SET_REG_BITS (pci_address_space_en[host], BIT0 << pciBAR); ++} ++ ++/******************************************************************** ++* pciMapMemoryBank - Maps PCI_host memory bank "bank" for the slave. ++* ++* Inputs: base and size of PCI SCS ++*********************************************************************/ ++void pciMapMemoryBank (PCI_HOST host, MEMORY_BANK bank, ++ unsigned int pciDramBase, unsigned int pciDramSize) ++{ ++ /*ronen different function for 3rd bank. */ ++ unsigned int offset = (bank < 2) ? bank * 8 : 0x100 + (bank - 2) * 8; ++ ++ pciDramBase = pciDramBase & 0xfffff000; ++ pciDramBase = pciDramBase | (pciReadConfigReg (host, ++ PCI_SCS_0_BASE_ADDRESS ++ + offset, ++ SELF) & 0x00000fff); ++ pciWriteConfigReg (host, PCI_SCS_0_BASE_ADDRESS + offset, SELF, ++ pciDramBase); ++ if (pciDramSize == 0) ++ pciDramSize++; ++ GT_REG_WRITE (pci_scs_bank_size[host][bank], pciDramSize - 1); ++ gtPciEnableInternalBAR (host, bank); ++} ++ ++/******************************************************************** ++* pciSetRegionFeatures - This function modifys one of the 8 regions with ++* feature bits given as an input. ++* - Be advised to check the spec before modifying them. ++* Inputs: PCI_PROTECT_REGION region - one of the eight regions. ++* unsigned int features - See file: pci.h there are defintion for those ++* region features. ++* unsigned int baseAddress - The region base Address. ++* unsigned int topAddress - The region top Address. ++* Returns: false if one of the parameters is erroneous true otherwise. ++*********************************************************************/ ++bool pciSetRegionFeatures (PCI_HOST host, PCI_ACCESS_REGIONS region, ++ unsigned int features, unsigned int baseAddress, ++ unsigned int regionLength) ++{ ++ unsigned int accessLow; ++ unsigned int accessHigh; ++ unsigned int accessTop = baseAddress + regionLength; ++ ++ if (regionLength == 0) { /* close the region. */ ++ pciDisableAccessRegion (host, region); ++ return true; ++ } ++ /* base Address is store is bits [11:0] */ ++ accessLow = (baseAddress & 0xfff00000) >> 20; ++ /* All the features are update according to the defines in pci.h (to be on ++ the safe side we disable bits: [11:0] */ ++ accessLow = accessLow | (features & 0xfffff000); ++ /* write to the Low Access Region register */ ++ GT_REG_WRITE (pci_access_control_base_0_low[host] + 0x10 * region, ++ accessLow); ++ ++ accessHigh = (accessTop & 0xfff00000) >> 20; ++ ++ /* write to the High Access Region register */ ++ GT_REG_WRITE (pci_access_control_top_0[host] + 0x10 * region, ++ accessHigh - 1); ++ return true; ++} ++ ++/******************************************************************** ++* pciDisableAccessRegion - Disable The given Region by writing MAX size ++* to its low Address and MIN size to its high Address. ++* ++* Inputs: PCI_ACCESS_REGIONS region - The region we to be Disabled. ++* Returns: N/A. ++*********************************************************************/ ++void pciDisableAccessRegion (PCI_HOST host, PCI_ACCESS_REGIONS region) ++{ ++ /* writing back the registers default values. */ ++ GT_REG_WRITE (pci_access_control_base_0_low[host] + 0x10 * region, ++ 0x01001fff); ++ GT_REG_WRITE (pci_access_control_top_0[host] + 0x10 * region, 0); ++} ++ ++/******************************************************************** ++* pciArbiterEnable - Enables PCI-0`s Arbitration mechanism. ++* ++* Inputs: N/A ++* Returns: true. ++*********************************************************************/ ++bool pciArbiterEnable (PCI_HOST host) ++{ ++ unsigned int regData; ++ ++ GT_REG_READ (pci_arbiter_control[host], ®Data); ++ GT_REG_WRITE (pci_arbiter_control[host], regData | BIT31); ++ return true; ++} ++ ++/******************************************************************** ++* pciArbiterDisable - Disable PCI-0`s Arbitration mechanism. ++* ++* Inputs: N/A ++* Returns: true ++*********************************************************************/ ++bool pciArbiterDisable (PCI_HOST host) ++{ ++ unsigned int regData; ++ ++ GT_REG_READ (pci_arbiter_control[host], ®Data); ++ GT_REG_WRITE (pci_arbiter_control[host], regData & 0x7fffffff); ++ return true; ++} ++ ++/******************************************************************** ++* pciSetArbiterAgentsPriority - Priority setup for the PCI agents (Hi or Low) ++* ++* Inputs: PCI_AGENT_PRIO internalAgent - priotity for internal agent. ++* PCI_AGENT_PRIO externalAgent0 - priotity for external#0 agent. ++* PCI_AGENT_PRIO externalAgent1 - priotity for external#1 agent. ++* PCI_AGENT_PRIO externalAgent2 - priotity for external#2 agent. ++* PCI_AGENT_PRIO externalAgent3 - priotity for external#3 agent. ++* PCI_AGENT_PRIO externalAgent4 - priotity for external#4 agent. ++* PCI_AGENT_PRIO externalAgent5 - priotity for external#5 agent. ++* Returns: true ++*********************************************************************/ ++bool pciSetArbiterAgentsPriority (PCI_HOST host, PCI_AGENT_PRIO internalAgent, ++ PCI_AGENT_PRIO externalAgent0, ++ PCI_AGENT_PRIO externalAgent1, ++ PCI_AGENT_PRIO externalAgent2, ++ PCI_AGENT_PRIO externalAgent3, ++ PCI_AGENT_PRIO externalAgent4, ++ PCI_AGENT_PRIO externalAgent5) ++{ ++ unsigned int regData; ++ unsigned int writeData; ++ ++ GT_REG_READ (pci_arbiter_control[host], ®Data); ++ writeData = (internalAgent << 7) + (externalAgent0 << 8) + ++ (externalAgent1 << 9) + (externalAgent2 << 10) + ++ (externalAgent3 << 11) + (externalAgent4 << 12) + ++ (externalAgent5 << 13); ++ regData = (regData & 0xffffc07f) | writeData; ++ GT_REG_WRITE (pci_arbiter_control[host], regData & regData); ++ return true; ++} ++ ++/******************************************************************** ++* pciParkingDisable - Park on last option disable, with this function you can ++* disable the park on last mechanism for each agent. ++* disabling this option for all agents results parking ++* on the internal master. ++* ++* Inputs: PCI_AGENT_PARK internalAgent - parking Disable for internal agent. ++* PCI_AGENT_PARK externalAgent0 - parking Disable for external#0 agent. ++* PCI_AGENT_PARK externalAgent1 - parking Disable for external#1 agent. ++* PCI_AGENT_PARK externalAgent2 - parking Disable for external#2 agent. ++* PCI_AGENT_PARK externalAgent3 - parking Disable for external#3 agent. ++* PCI_AGENT_PARK externalAgent4 - parking Disable for external#4 agent. ++* PCI_AGENT_PARK externalAgent5 - parking Disable for external#5 agent. ++* Returns: true ++*********************************************************************/ ++bool pciParkingDisable (PCI_HOST host, PCI_AGENT_PARK internalAgent, ++ PCI_AGENT_PARK externalAgent0, ++ PCI_AGENT_PARK externalAgent1, ++ PCI_AGENT_PARK externalAgent2, ++ PCI_AGENT_PARK externalAgent3, ++ PCI_AGENT_PARK externalAgent4, ++ PCI_AGENT_PARK externalAgent5) ++{ ++ unsigned int regData; ++ unsigned int writeData; ++ ++ GT_REG_READ (pci_arbiter_control[host], ®Data); ++ writeData = (internalAgent << 14) + (externalAgent0 << 15) + ++ (externalAgent1 << 16) + (externalAgent2 << 17) + ++ (externalAgent3 << 18) + (externalAgent4 << 19) + ++ (externalAgent5 << 20); ++ regData = (regData & ~(0x7f << 14)) | writeData; ++ GT_REG_WRITE (pci_arbiter_control[host], regData); ++ return true; ++} ++ ++/******************************************************************** ++* pciEnableBrokenAgentDetection - A master is said to be broken if it fails to ++* respond to grant assertion within a window specified in ++* the input value: 'brokenValue'. ++* ++* Inputs: unsigned char brokenValue - A value which limits the Master to hold the ++* grant without asserting frame. ++* Returns: Error for illegal broken value otherwise true. ++*********************************************************************/ ++bool pciEnableBrokenAgentDetection (PCI_HOST host, unsigned char brokenValue) ++{ ++ unsigned int data; ++ unsigned int regData; ++ ++ if (brokenValue > 0xf) ++ return false; /* brokenValue must be 4 bit */ ++ data = brokenValue << 3; ++ GT_REG_READ (pci_arbiter_control[host], ®Data); ++ regData = (regData & 0xffffff87) | data; ++ GT_REG_WRITE (pci_arbiter_control[host], regData | BIT1); ++ return true; ++} ++ ++/******************************************************************** ++* pciDisableBrokenAgentDetection - This function disable the Broken agent ++* Detection mechanism. ++* NOTE: This operation may cause a dead lock on the ++* pci0 arbitration. ++* ++* Inputs: N/A ++* Returns: true. ++*********************************************************************/ ++bool pciDisableBrokenAgentDetection (PCI_HOST host) ++{ ++ unsigned int regData; ++ ++ GT_REG_READ (pci_arbiter_control[host], ®Data); ++ regData = regData & 0xfffffffd; ++ GT_REG_WRITE (pci_arbiter_control[host], regData); ++ return true; ++} ++ ++/******************************************************************** ++* pciP2PConfig - This function set the PCI_n P2P configurate. ++* For more information on the P2P read PCI spec. ++* ++* Inputs: unsigned int SecondBusLow - Secondery PCI interface Bus Range Lower ++* Boundry. ++* unsigned int SecondBusHigh - Secondry PCI interface Bus Range upper ++* Boundry. ++* unsigned int busNum - The CPI bus number to which the PCI interface ++* is connected. ++* unsigned int devNum - The PCI interface's device number. ++* ++* Returns: true. ++*********************************************************************/ ++bool pciP2PConfig (PCI_HOST host, unsigned int SecondBusLow, ++ unsigned int SecondBusHigh, ++ unsigned int busNum, unsigned int devNum) ++{ ++ unsigned int regData; ++ ++ regData = (SecondBusLow & 0xff) | ((SecondBusHigh & 0xff) << 8) | ++ ((busNum & 0xff) << 16) | ((devNum & 0x1f) << 24); ++ GT_REG_WRITE (pci_p2p_configuration[host], regData); ++ return true; ++} ++ ++/******************************************************************** ++* pciSetRegionSnoopMode - This function modifys one of the 4 regions which ++* supports Cache Coherency in the PCI_n interface. ++* Inputs: region - One of the four regions. ++* snoopType - There is four optional Types: ++* 1. No Snoop. ++* 2. Snoop to WT region. ++* 3. Snoop to WB region. ++* 4. Snoop & Invalidate to WB region. ++* baseAddress - Base Address of this region. ++* regionLength - Region length. ++* Returns: false if one of the parameters is wrong otherwise return true. ++*********************************************************************/ ++bool pciSetRegionSnoopMode (PCI_HOST host, PCI_SNOOP_REGION region, ++ PCI_SNOOP_TYPE snoopType, ++ unsigned int baseAddress, ++ unsigned int regionLength) ++{ ++ unsigned int snoopXbaseAddress; ++ unsigned int snoopXtopAddress; ++ unsigned int data; ++ unsigned int snoopHigh = baseAddress + regionLength; ++ ++ if ((region > PCI_SNOOP_REGION3) || (snoopType > PCI_SNOOP_WB)) ++ return false; ++ snoopXbaseAddress = ++ pci_snoop_control_base_0_low[host] + 0x10 * region; ++ snoopXtopAddress = pci_snoop_control_top_0[host] + 0x10 * region; ++ if (regionLength == 0) { /* closing the region */ ++ GT_REG_WRITE (snoopXbaseAddress, 0x0000ffff); ++ GT_REG_WRITE (snoopXtopAddress, 0); ++ return true; ++ } ++ baseAddress = baseAddress & 0xfff00000; /* Granularity of 1MByte */ ++ data = (baseAddress >> 20) | snoopType << 12; ++ GT_REG_WRITE (snoopXbaseAddress, data); ++ snoopHigh = (snoopHigh & 0xfff00000) >> 20; ++ GT_REG_WRITE (snoopXtopAddress, snoopHigh - 1); ++ return true; ++} ++ ++static int gt_read_config_dword (struct pci_controller *hose, ++ pci_dev_t dev, int offset, u32 * value) ++{ ++ int bus = PCI_BUS (dev); ++ ++ if ((bus == local_buses[0]) || (bus == local_buses[1])) { ++ *value = pciReadConfigReg ((PCI_HOST) hose->cfg_addr, offset, ++ PCI_DEV (dev)); ++ } else { ++ *value = pciOverBridgeReadConfigReg ((PCI_HOST) hose-> ++ cfg_addr, offset, ++ PCI_DEV (dev), bus); ++ } ++ ++ return 0; ++} ++ ++static int gt_write_config_dword (struct pci_controller *hose, ++ pci_dev_t dev, int offset, u32 value) ++{ ++ int bus = PCI_BUS (dev); ++ ++ if ((bus == local_buses[0]) || (bus == local_buses[1])) { ++ pciWriteConfigReg ((PCI_HOST) hose->cfg_addr, offset, ++ PCI_DEV (dev), value); ++ } else { ++ pciOverBridgeWriteConfigReg ((PCI_HOST) hose->cfg_addr, ++ offset, PCI_DEV (dev), bus, ++ value); ++ } ++ return 0; ++} ++ ++ ++static void gt_setup_ide (struct pci_controller *hose, ++ pci_dev_t dev, struct pci_config_table *entry) ++{ ++ static const int ide_bar[] = { 8, 4, 8, 4, 0, 0 }; ++ u32 bar_response, bar_value; ++ int bar; ++ ++ for (bar = 0; bar < 6; bar++) { ++ /*ronen different function for 3rd bank. */ ++ unsigned int offset = ++ (bar < 2) ? bar * 8 : 0x100 + (bar - 2) * 8; ++ ++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0 + offset, ++ 0x0); ++ pci_hose_read_config_dword (hose, dev, PCI_BASE_ADDRESS_0 + offset, ++ &bar_response); ++ ++ pciauto_region_allocate (bar_response & ++ PCI_BASE_ADDRESS_SPACE_IO ? hose-> ++ pci_io : hose->pci_mem, ide_bar[bar], ++ &bar_value); ++ ++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0 + bar * 4, ++ bar_value); ++ } ++} ++ ++#ifdef CONFIG_USE_CPCIDVI ++static void gt_setup_cpcidvi (struct pci_controller *hose, ++ pci_dev_t dev, struct pci_config_table *entry) ++{ ++ u32 bar_value, pci_response; ++ ++ pci_hose_read_config_dword (hose, dev, PCI_COMMAND, &pci_response); ++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0, 0xffffffff); ++ pci_hose_read_config_dword (hose, dev, PCI_BASE_ADDRESS_0, &pci_response); ++ pciauto_region_allocate (hose->pci_mem, 0x01000000, &bar_value); ++ pci_hose_write_config_dword (hose, dev, PCI_BASE_ADDRESS_0, (bar_value & 0xffffff00)); ++ pci_hose_write_config_dword (hose, dev, PCI_ROM_ADDRESS, 0x0); ++ pciauto_region_allocate (hose->pci_mem, 0x40000, &bar_value); ++ pci_hose_write_config_dword (hose, dev, PCI_ROM_ADDRESS, (bar_value & 0xffffff00) | 0x01); ++ gt_cpcidvi_rom.base = bar_value & 0xffffff00; ++ gt_cpcidvi_rom.init = 1; ++} ++ ++unsigned char gt_cpcidvi_in8(unsigned int offset) ++{ ++ unsigned char data; ++ ++ if (gt_cpcidvi_rom.init == 0) { ++ return(0); ++ } ++ data = in8((offset & 0x04) + 0x3f000 + gt_cpcidvi_rom.base); ++ return(data); ++} ++ ++void gt_cpcidvi_out8(unsigned int offset, unsigned char data) ++{ ++ unsigned int off; ++ ++ if (gt_cpcidvi_rom.init == 0) { ++ return; ++ } ++ off = data; ++ off = ((off << 3) & 0x7f8) + (offset & 0x4) + 0x3e000 + gt_cpcidvi_rom.base; ++ in8(off); ++ return; ++} ++#endif ++ ++/* TODO BJW: Change this for DB64360. This was pulled from the EV64260 */ ++/* and is curently not called *. */ ++#if 0 ++static void gt_fixup_irq (struct pci_controller *hose, pci_dev_t dev) ++{ ++ unsigned char pin, irq; ++ ++ pci_read_config_byte (dev, PCI_INTERRUPT_PIN, &pin); ++ ++ if (pin == 1) { /* only allow INT A */ ++ irq = pci_irq_swizzle[(PCI_HOST) hose-> ++ cfg_addr][PCI_DEV (dev)]; ++ if (irq) ++ pci_write_config_byte (dev, PCI_INTERRUPT_LINE, irq); ++ } ++} ++#endif ++ ++struct pci_config_table gt_config_table[] = { ++#ifdef CONFIG_USE_CPCIDVI ++ {PCI_VENDOR_ID_CT, PCI_DEVICE_ID_CT_69030, PCI_CLASS_DISPLAY_VGA, ++ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, gt_setup_cpcidvi}, ++#endif ++ {PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE, ++ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, gt_setup_ide}, ++ {} ++}; ++ ++struct pci_controller pci0_hose = { ++/* fixup_irq: gt_fixup_irq, */ ++ config_table:gt_config_table, ++}; ++ ++struct pci_controller pci1_hose = { ++/* fixup_irq: gt_fixup_irq, */ ++ config_table:gt_config_table, ++}; ++ ++void pci_init_board (void) ++{ ++ unsigned int command; ++#ifdef CONFIG_PCI_PNP ++ unsigned int bar; ++#endif ++#ifdef DEBUG ++ gt_pci_bus_mode_display (PCI_HOST0); ++#endif ++#ifdef CONFIG_USE_CPCIDVI ++ gt_cpcidvi_rom.init = 0; ++ gt_cpcidvi_rom.base = 0; ++#endif ++ ++ pci0_hose.config_table = gt_config_table; ++ pci1_hose.config_table = gt_config_table; ++ ++#ifdef CONFIG_USE_CPCIDVI ++ gt_config_table[0].config_device = gt_setup_cpcidvi; ++#endif ++ gt_config_table[1].config_device = gt_setup_ide; ++ ++ pci0_hose.first_busno = 0; ++ pci0_hose.last_busno = 0xff; ++ local_buses[0] = pci0_hose.first_busno; ++ ++ /* PCI memory space */ ++ pci_set_region (pci0_hose.regions + 0, ++ CFG_PCI0_0_MEM_SPACE, ++ CFG_PCI0_0_MEM_SPACE, ++ CFG_PCI0_MEM_SIZE, PCI_REGION_MEM); ++ ++ /* PCI I/O space */ ++ pci_set_region (pci0_hose.regions + 1, ++ CFG_PCI0_IO_SPACE_PCI, ++ CFG_PCI0_IO_SPACE, CFG_PCI0_IO_SIZE, PCI_REGION_IO); ++ ++ pci_set_ops (&pci0_hose, ++ pci_hose_read_config_byte_via_dword, ++ pci_hose_read_config_word_via_dword, ++ gt_read_config_dword, ++ pci_hose_write_config_byte_via_dword, ++ pci_hose_write_config_word_via_dword, ++ gt_write_config_dword); ++ pci0_hose.region_count = 2; ++ ++ pci0_hose.cfg_addr = (unsigned int *) PCI_HOST0; ++ ++ pci_register_hose (&pci0_hose); ++ pciArbiterDisable(PCI_HOST0); /* on PMC modules no arbiter is used */ ++ pciParkingDisable (PCI_HOST0, 1, 1, 1, 1, 1, 1, 1); ++ command = pciReadConfigReg (PCI_HOST0, PCI_COMMAND, SELF); ++ command |= PCI_COMMAND_MASTER; ++ pciWriteConfigReg (PCI_HOST0, PCI_COMMAND, SELF, command); ++ command = pciReadConfigReg (PCI_HOST0, PCI_COMMAND, SELF); ++ command |= PCI_COMMAND_MEMORY; ++ pciWriteConfigReg (PCI_HOST0, PCI_COMMAND, SELF, command); ++ ++#ifdef CONFIG_PCI_PNP ++ pciauto_config_init(&pci0_hose); ++ pciauto_region_allocate(pci0_hose.pci_io, 0x400, &bar); ++#endif ++#ifdef CONFIG_PCI_SCAN_SHOW ++ printf("PCI: Bus Dev VenId DevId Class Int\n"); ++#endif ++ pci0_hose.last_busno = pci_hose_scan_bus (&pci0_hose, pci0_hose.first_busno); ++ ++#ifdef DEBUG ++ gt_pci_bus_mode_display (PCI_HOST1); ++#endif ++ pci1_hose.first_busno = pci0_hose.last_busno + 1; ++ pci1_hose.last_busno = 0xff; ++ pci1_hose.current_busno = pci1_hose.first_busno; ++ local_buses[1] = pci1_hose.first_busno; ++ ++ /* PCI memory space */ ++ pci_set_region (pci1_hose.regions + 0, ++ CFG_PCI1_0_MEM_SPACE, ++ CFG_PCI1_0_MEM_SPACE, ++ CFG_PCI1_MEM_SIZE, PCI_REGION_MEM); ++ ++ /* PCI I/O space */ ++ pci_set_region (pci1_hose.regions + 1, ++ CFG_PCI1_IO_SPACE_PCI, ++ CFG_PCI1_IO_SPACE, CFG_PCI1_IO_SIZE, PCI_REGION_IO); ++ ++ pci_set_ops (&pci1_hose, ++ pci_hose_read_config_byte_via_dword, ++ pci_hose_read_config_word_via_dword, ++ gt_read_config_dword, ++ pci_hose_write_config_byte_via_dword, ++ pci_hose_write_config_word_via_dword, ++ gt_write_config_dword); ++ ++ pci1_hose.region_count = 2; ++ ++ pci1_hose.cfg_addr = (unsigned int *) PCI_HOST1; ++ ++ pci_register_hose (&pci1_hose); ++ ++ pciArbiterEnable (PCI_HOST1); ++ pciParkingDisable (PCI_HOST1, 1, 1, 1, 1, 1, 1, 1); ++ ++ command = pciReadConfigReg (PCI_HOST1, PCI_COMMAND, SELF); ++ command |= PCI_COMMAND_MASTER; ++ pciWriteConfigReg (PCI_HOST1, PCI_COMMAND, SELF, command); ++ ++#ifdef CONFIG_PCI_PNP ++ pciauto_config_init(&pci1_hose); ++ pciauto_region_allocate(pci1_hose.pci_io, 0x400, &bar); ++#endif ++ pci1_hose.last_busno = pci_hose_scan_bus (&pci1_hose, pci1_hose.first_busno); ++ ++ command = pciReadConfigReg (PCI_HOST1, PCI_COMMAND, SELF); ++ command |= PCI_COMMAND_MEMORY; ++ pciWriteConfigReg (PCI_HOST1, PCI_COMMAND, SELF, command); ++ ++} ++#endif /* of CONFIG_PCI */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/ppc_error_no.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/ppc_error_no.h +--- u-boot-1.1.6/board/prodrive/p3mx/ppc_error_no.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/ppc_error_no.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,164 @@ ++/* ++ * (C) Copyright 2003 ++ * Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ * BK Id: SCCS/s.errno.h 1.9 06/05/01 21:45:21 paulus ++ */ ++#ifndef _MV_PPC_ERRNO_H ++#define _MV_PPC_ERRNO_H ++ ++#define EPERM 1 /* Operation not permitted */ ++#define ENOENT 2 /* No such file or directory */ ++#define ESRCH 3 /* No such process */ ++#define EINTR 4 /* Interrupted system call */ ++#define EIO 5 /* I/O error */ ++#define ENXIO 6 /* No such device or address */ ++#define E2BIG 7 /* Arg list too long */ ++#define ENOEXEC 8 /* Exec format error */ ++#define EBADF 9 /* Bad file number */ ++#define ECHILD 10 /* No child processes */ ++#define EAGAIN 11 /* Try again */ ++#define ENOMEM 12 /* Out of memory */ ++#define EACCES 13 /* Permission denied */ ++#define EFAULT 14 /* Bad address */ ++#define ENOTBLK 15 /* Block device required */ ++#define EBUSY 16 /* Device or resource busy */ ++#define EEXIST 17 /* File exists */ ++#define EXDEV 18 /* Cross-device link */ ++#define ENODEV 19 /* No such device */ ++#define ENOTDIR 20 /* Not a directory */ ++#define EISDIR 21 /* Is a directory */ ++#define EINVAL 22 /* Invalid argument */ ++#define ENFILE 23 /* File table overflow */ ++#define EMFILE 24 /* Too many open files */ ++#define ENOTTY 25 /* Not a typewriter */ ++#define ETXTBSY 26 /* Text file busy */ ++#define EFBIG 27 /* File too large */ ++#define ENOSPC 28 /* No space left on device */ ++#define ESPIPE 29 /* Illegal seek */ ++#define EROFS 30 /* Read-only file system */ ++#define EMLINK 31 /* Too many links */ ++#define EPIPE 32 /* Broken pipe */ ++#define EDOM 33 /* Math argument out of domain of func */ ++#define ERANGE 34 /* Math result not representable */ ++#define EDEADLK 35 /* Resource deadlock would occur */ ++#define ENAMETOOLONG 36 /* File name too long */ ++#define ENOLCK 37 /* No record locks available */ ++#define ENOSYS 38 /* Function not implemented */ ++#define ENOTEMPTY 39 /* Directory not empty */ ++#define ELOOP 40 /* Too many symbolic links encountered */ ++#define EWOULDBLOCK EAGAIN /* Operation would block */ ++#define ENOMSG 42 /* No message of desired type */ ++#define EIDRM 43 /* Identifier removed */ ++#define ECHRNG 44 /* Channel number out of range */ ++#define EL2NSYNC 45 /* Level 2 not synchronized */ ++#define EL3HLT 46 /* Level 3 halted */ ++#define EL3RST 47 /* Level 3 reset */ ++#define ELNRNG 48 /* Link number out of range */ ++#define EUNATCH 49 /* Protocol driver not attached */ ++#define ENOCSI 50 /* No CSI structure available */ ++#define EL2HLT 51 /* Level 2 halted */ ++#define EBADE 52 /* Invalid exchange */ ++#define EBADR 53 /* Invalid request descriptor */ ++#define EXFULL 54 /* Exchange full */ ++#define ENOANO 55 /* No anode */ ++#define EBADRQC 56 /* Invalid request code */ ++#define EBADSLT 57 /* Invalid slot */ ++#define EDEADLOCK 58 /* File locking deadlock error */ ++#define EBFONT 59 /* Bad font file format */ ++#define ENOSTR 60 /* Device not a stream */ ++#define ENODATA 61 /* No data available */ ++#define ETIME 62 /* Timer expired */ ++#define ENOSR 63 /* Out of streams resources */ ++#define ENONET 64 /* Machine is not on the network */ ++#define ENOPKG 65 /* Package not installed */ ++#define EREMOTE 66 /* Object is remote */ ++#define ENOLINK 67 /* Link has been severed */ ++#define EADV 68 /* Advertise error */ ++#define ESRMNT 69 /* Srmount error */ ++#define ECOMM 70 /* Communication error on send */ ++#define EPROTO 71 /* Protocol error */ ++#define EMULTIHOP 72 /* Multihop attempted */ ++#define EDOTDOT 73 /* RFS specific error */ ++#define EBADMSG 74 /* Not a data message */ ++#define EOVERFLOW 75 /* Value too large for defined data type */ ++#define ENOTUNIQ 76 /* Name not unique on network */ ++#define EBADFD 77 /* File descriptor in bad state */ ++#define EREMCHG 78 /* Remote address changed */ ++#define ELIBACC 79 /* Can not access a needed shared library */ ++#define ELIBBAD 80 /* Accessing a corrupted shared library */ ++#define ELIBSCN 81 /* .lib section in a.out corrupted */ ++#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ ++#define ELIBEXEC 83 /* Cannot exec a shared library directly */ ++#define EILSEQ 84 /* Illegal byte sequence */ ++#define ERESTART 85 /* Interrupted system call should be restarted */ ++#define ESTRPIPE 86 /* Streams pipe error */ ++#define EUSERS 87 /* Too many users */ ++#define ENOTSOCK 88 /* Socket operation on non-socket */ ++#define EDESTADDRREQ 89 /* Destination address required */ ++#define EMSGSIZE 90 /* Message too long */ ++#define EPROTOTYPE 91 /* Protocol wrong type for socket */ ++#define ENOPROTOOPT 92 /* Protocol not available */ ++#define EPROTONOSUPPORT 93 /* Protocol not supported */ ++#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ ++#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ ++#define EPFNOSUPPORT 96 /* Protocol family not supported */ ++#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ ++#define EADDRINUSE 98 /* Address already in use */ ++#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ ++#define ENETDOWN 100 /* Network is down */ ++#define ENETUNREACH 101 /* Network is unreachable */ ++#define ENETRESET 102 /* Network dropped connection because of reset */ ++#define ECONNABORTED 103 /* Software caused connection abort */ ++#define ECONNRESET 104 /* Connection reset by peer */ ++#define ENOBUFS 105 /* No buffer space available */ ++#define EISCONN 106 /* Transport endpoint is already connected */ ++#define ENOTCONN 107 /* Transport endpoint is not connected */ ++#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ ++#define ETOOMANYREFS 109 /* Too many references: cannot splice */ ++#define ETIMEDOUT 110 /* Connection timed out */ ++#define ECONNREFUSED 111 /* Connection refused */ ++#define EHOSTDOWN 112 /* Host is down */ ++#define EHOSTUNREACH 113 /* No route to host */ ++#define EALREADY 114 /* Operation already in progress */ ++#define EINPROGRESS 115 /* Operation now in progress */ ++#define ESTALE 116 /* Stale NFS file handle */ ++#define EUCLEAN 117 /* Structure needs cleaning */ ++#define ENOTNAM 118 /* Not a XENIX named type file */ ++#define ENAVAIL 119 /* No XENIX semaphores available */ ++#define EISNAM 120 /* Is a named type file */ ++#define EREMOTEIO 121 /* Remote I/O error */ ++#define EDQUOT 122 /* Quota exceeded */ ++ ++#define ENOMEDIUM 123 /* No medium found */ ++#define EMEDIUMTYPE 124 /* Wrong medium type */ ++ ++/* Should never be seen by user programs */ ++#define ERESTARTSYS 512 ++#define ERESTARTNOINTR 513 ++#define ERESTARTNOHAND 514 /* restart if no handler.. */ ++#define ENOIOCTLCMD 515 /* No ioctl command */ ++ ++#define _LAST_ERRNO 515 ++ ++#endif +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/sdram_init.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/sdram_init.c +--- u-boot-1.1.6/board/prodrive/p3mx/sdram_init.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/sdram_init.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,434 @@ ++/* ++ * (C) Copyright 2001 ++ * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/************************************************************************* ++ * adaption for the Marvell DB64460 Board ++ * Ingo Assmus (ingo.assmus@keymile.com) ++ *************************************************************************/ ++ ++/* sdram_init.c - automatic memory sizing */ ++ ++#include <common.h> ++#include <74xx_7xx.h> ++#include "../../Marvell/include/memory.h" ++#include "../../Marvell/include/pci.h" ++#include "../../Marvell/include/mv_gen_reg.h" ++#include <net.h> ++ ++#include "eth.h" ++#include "mpsc.h" ++#include "../../Marvell/common/i2c.h" ++#include "64460.h" ++#include "mv_regs.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#undef DEBUG ++#define MAP_PCI ++ ++#ifdef DEBUG ++#define DP(x) x ++#else ++#define DP(x) ++#endif ++ ++int set_dfcdlInit (void); /* setup delay line of Mv64460 */ ++int mvDmaIsChannelActive (int); ++int mvDmaSetMemorySpace (ulong, ulong, ulong, ulong, ulong); ++int mvDmaTransfer (int, ulong, ulong, ulong, ulong); ++ ++#define D_CACHE_FLUSH_LINE(addr, offset) \ ++ { \ ++ __asm__ __volatile__ ("dcbf %0,%1" : : "r" (addr), "r" (offset)); \ ++ } ++ ++int memory_map_bank (unsigned int bankNo, ++ unsigned int bankBase, unsigned int bankLength) ++{ ++#ifdef MAP_PCI ++ PCI_HOST host; ++#endif ++ ++#ifdef DEBUG ++ if (bankLength > 0) { ++ printf ("mapping bank %d at %08x - %08x\n", ++ bankNo, bankBase, bankBase + bankLength - 1); ++ } else { ++ printf ("unmapping bank %d\n", bankNo); ++ } ++#endif ++ ++ memoryMapBank (bankNo, bankBase, bankLength); ++ ++#ifdef MAP_PCI ++ for (host = PCI_HOST0; host <= PCI_HOST1; host++) { ++ const int features = ++ PREFETCH_ENABLE | ++ DELAYED_READ_ENABLE | ++ AGGRESSIVE_PREFETCH | ++ READ_LINE_AGGRESSIVE_PREFETCH | ++ READ_MULTI_AGGRESSIVE_PREFETCH | ++ MAX_BURST_4 | PCI_NO_SWAP; ++ ++ pciMapMemoryBank (host, bankNo, bankBase, bankLength); ++ ++ pciSetRegionSnoopMode (host, bankNo, PCI_SNOOP_WB, bankBase, ++ bankLength); ++ ++ pciSetRegionFeatures (host, bankNo, features, bankBase, ++ bankLength); ++ } ++#endif ++ ++ return 0; ++} ++ ++/* ++ * Check memory range for valid RAM. A simple memory test determines ++ * the actually available RAM size between addresses `base' and ++ * `base + maxsize'. Some (not all) hardware errors are detected: ++ * - short between address lines ++ * - short between data lines ++ */ ++long int dram_size (long int *base, long int maxsize) ++{ ++ volatile long int *addr, *b = base; ++ long int cnt, val, save1, save2; ++ ++#define STARTVAL (1<<20) /* start test at 1M */ ++ for (cnt = STARTVAL / sizeof (long); cnt < maxsize / sizeof (long); ++ cnt <<= 1) { ++ addr = base + cnt; /* pointer arith! */ ++ ++ save1 = *addr; /* save contents of addr */ ++ save2 = *b; /* save contents of base */ ++ ++ *addr = cnt; /* write cnt to addr */ ++ *b = 0; /* put null at base */ ++ ++ /* check at base address */ ++ if ((*b) != 0) { ++ *addr = save1; /* restore *addr */ ++ *b = save2; /* restore *b */ ++ return (0); ++ } ++ val = *addr; /* read *addr */ ++ val = *addr; /* read *addr */ ++ ++ *addr = save1; ++ *b = save2; ++ ++ if (val != cnt) { ++ DP (printf ++ ("Found %08x at Address %08x (failure)\n", ++ (unsigned int) val, (unsigned int) addr)); ++ /* fix boundary condition.. STARTVAL means zero */ ++ if (cnt == STARTVAL / sizeof (long)) ++ cnt = 0; ++ return (cnt * sizeof (long)); ++ } ++ } ++ ++ return maxsize; ++} ++ ++#define SDRAM_NORMAL 0x0 ++#define SDRAM_PRECHARGE_ALL 0x1 ++#define SDRAM_REFRESH_ALL 0x2 ++#define SDRAM_MODE_REG_SETUP 0x3 ++#define SDRAM_XTEN_MODE_REG_SETUP 0x4 ++#define SDRAM_NOP 0x5 ++#define SDRAM_SELF_REFRESH 0x7 ++ ++long int initdram (int board_type) ++{ ++ int tmp; ++ int start; ++ ulong size; ++ ulong memSpaceAttr; ++ ulong dest; ++ ++ /* first disable all banks */ ++ memory_map_bank(0, 0, 0); ++ memory_map_bank(1, 0, 0); ++ memory_map_bank(2, 0, 0); ++ memory_map_bank(3, 0, 0); ++ ++ /* calibrate delay lines */ ++ set_dfcdlInit(); ++ ++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_NOP); /* 0x1418 */ ++ do { ++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION); ++ } while(tmp != 0x0); ++ ++ /* SDRAM controller configuration */ ++#ifdef CONFIG_MV64460_ECC ++ GT_REG_WRITE(MV64460_SDRAM_CONFIG, 0x58201400); /* 0x1400 */ ++#else ++ GT_REG_WRITE(MV64460_SDRAM_CONFIG, 0x58200400); /* 0x1400 */ ++#endif ++ GT_REG_WRITE(MV64460_D_UNIT_CONTROL_LOW, 0xC3000540); /* 0x1404 */ ++ GT_REG_WRITE(MV64460_D_UNIT_CONTROL_HIGH, 0x0300F777); /* 0x1424 */ ++ GT_REG_WRITE(MV64460_SDRAM_TIMING_CONTROL_LOW, 0x01712220); /* 0x1408 */ ++ GT_REG_WRITE(MV64460_SDRAM_TIMING_CONTROL_HIGH, 0x0000005D); /* 0x140C */ ++ GT_REG_WRITE(MV64460_SDRAM_ADDR_CONTROL, 0x00000012); /* 0x1410 */ ++ GT_REG_WRITE(MV64460_SDRAM_OPEN_PAGES_CONTROL, 0x00000001); /* 0x1414 */ ++ ++ /* SDRAM drive strength */ ++ GT_REG_WRITE(MV64460_SDRAM_ADDR_CTRL_PADS_CALIBRATION, 0x80000000); /* 0x14C0 */ ++ GT_REG_WRITE(MV64460_SDRAM_ADDR_CTRL_PADS_CALIBRATION, 0x80000008); /* 0x14C0 */ ++ GT_REG_WRITE(MV64460_SDRAM_DATA_PADS_CALIBRATION, 0x80000000); /* 0x14C4 */ ++ GT_REG_WRITE(MV64460_SDRAM_DATA_PADS_CALIBRATION, 0x80000008); /* 0x14C4 */ ++ ++ /* setup SDRAM device registers */ ++ ++ /* precharge all */ ++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_PRECHARGE_ALL); /* 0x1418 */ ++ do { ++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION); ++ } while(tmp != 0x0); ++ ++ /* enable DLL */ ++ GT_REG_WRITE(MV64460_EXTENDED_DRAM_MODE, 0x00000000); /* 0x1420 */ ++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_XTEN_MODE_REG_SETUP); /* 0x1418 */ ++ do { ++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION); ++ } while(tmp != 0x0); ++ ++ /* reset DLL */ ++ GT_REG_WRITE(MV64460_SDRAM_MODE, 0x00000132); /* 0x141C */ ++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_MODE_REG_SETUP); /* 0x1418 */ ++ do { ++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION); ++ } while(tmp != 0x0); ++ ++ /* precharge all */ ++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_PRECHARGE_ALL); /* 0x1418 */ ++ do { ++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION); ++ } while(tmp != 0x0); ++ ++ /* wait for 2 auto refresh commands */ ++ udelay(20); ++ ++ /* un-reset DLL */ ++ GT_REG_WRITE(MV64460_SDRAM_MODE, 0x00000032); /* 0x141C */ ++ GT_REG_WRITE(MV64460_SDRAM_OPERATION, SDRAM_MODE_REG_SETUP); /* 0x1418 */ ++ do { ++ tmp = GTREGREAD(MV64460_SDRAM_OPERATION); ++ } while(tmp != 0x0); ++ ++ /* wait 200 cycles */ ++ udelay(2); /* FIXME make this dynamic for the system clock */ ++ ++ /* SDRAM init done */ ++ memory_map_bank(0, CFG_SDRAM_BASE, (256 << 20)); ++#ifdef CFG_SDRAM1_BASE ++ memory_map_bank(1, CFG_SDRAM1_BASE, (256 << 20)); ++#endif ++ ++ /* DUNIT_MMASK: enable SnoopHitEn bit to avoid errata CPU-#4 ++ */ ++ tmp = GTREGREAD(MV64460_D_UNIT_MMASK); /* 0x14B0 */ ++ GT_REG_WRITE(MV64460_D_UNIT_MMASK, tmp | 0x2); ++ ++ start = (0 << 20); ++#ifdef CONFIG_P3M750 ++ size = (512 << 20); ++#elif defined (CONFIG_P3M7448) ++ size = (128 << 20); ++#endif ++ ++#ifdef CONFIG_MV64460_ECC ++ memSpaceAttr = ((~(BIT0 << 0)) & 0xf) << 8; ++ mvDmaSetMemorySpace (0, 0, memSpaceAttr, start, size); ++ for (dest = start; dest < start + size; dest += _8M) { ++ mvDmaTransfer (0, start, dest, _8M, ++ BIT8 /*DMA_DTL_128BYTES */ | ++ BIT3 /*DMA_HOLD_SOURCE_ADDR */ | ++ BIT11 /*DMA_BLOCK_TRANSFER_MODE */ ); ++ while (mvDmaIsChannelActive (0)); ++ } ++#endif ++ ++ return (size); ++} ++ ++void board_add_ram_info(int use_default) ++{ ++ u32 val; ++ ++ puts(" (CL="); ++ switch ((GTREGREAD(MV64460_SDRAM_MODE) >> 4) & 0x7) { ++ case 0x2: ++ puts("2"); ++ break; ++ case 0x3: ++ puts("3"); ++ break; ++ case 0x5: ++ puts("1.5"); ++ break; ++ case 0x6: ++ puts("2.5"); ++ break; ++ } ++ ++ val = GTREGREAD(MV64460_SDRAM_CONFIG); ++ ++ puts(", ECC "); ++ if (val & 0x00001000) ++ puts("enabled)"); ++ else ++ puts("not enabled)"); ++} ++ ++/* ++ * mvDmaIsChannelActive - Check if IDMA channel is active ++ * ++ * channel = IDMA channel number from 0 to 7 ++ */ ++int mvDmaIsChannelActive (int channel) ++{ ++ ulong data; ++ ++ data = GTREGREAD (MV64460_DMA_CHANNEL0_CONTROL + 4 * channel); ++ if (data & BIT14) /* activity status */ ++ return 1; ++ ++ return 0; ++} ++ ++/* ++ * mvDmaSetMemorySpace - Set a DMA memory window for the DMA's address decoding ++ * map. ++ * ++ * memSpace = IDMA memory window number from 0 to 7 ++ * trg_if = Target interface: ++ * 0x0 DRAM ++ * 0x1 Device Bus ++ * 0x2 Integrated SDRAM (or CPU bus 60x only) ++ * 0x3 PCI0 ++ * 0x4 PCI1 ++ * attr = IDMA attributes (see MV datasheet) ++ * base_addr = Sets up memory window for transfers ++ * ++ */ ++int mvDmaSetMemorySpace (ulong memSpace, ++ ulong trg_if, ++ ulong attr, ulong base_addr, ulong size) ++{ ++ ulong temp; ++ ++ /* The base address must be aligned to the size. */ ++ if (base_addr % size != 0) ++ return 0; ++ ++ if (size >= 0x10000) { /* 64K */ ++ size &= 0xffff0000; ++ base_addr = (base_addr & 0xffff0000); ++ /* Set the new attributes */ ++ GT_REG_WRITE (MV64460_DMA_BASE_ADDR_REG0 + memSpace * 8, ++ (base_addr | trg_if | attr)); ++ GT_REG_WRITE ((MV64460_DMA_SIZE_REG0 + memSpace * 8), ++ (size - 1) & 0xffff0000); ++ temp = GTREGREAD (MV64460_DMA_BASE_ADDR_ENABLE_REG); ++ GT_REG_WRITE (DMA_BASE_ADDR_ENABLE_REG, ++ (temp & ~(BIT0 << memSpace))); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++/* ++ * mvDmaTransfer - Transfer data from src_addr to dst_addr on one of the 4 ++ * DMA channels. ++ * ++ * channel = IDMA channel number from 0 to 3 ++ * destAddr = Destination address ++ * sourceAddr = Source address ++ * size = Size in bytes ++ * command = See MV datasheet ++ * ++ */ ++int mvDmaTransfer (int channel, ulong sourceAddr, ++ ulong destAddr, ulong size, ulong command) ++{ ++ ulong engOffReg = 0; /* Engine Offset Register */ ++ ++ if (size > 0xffff) ++ command = command | BIT31; /* DMA_16M_DESCRIPTOR_MODE */ ++ command = command | ((command >> 6) & 0x7); ++ engOffReg = channel * 4; ++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_BYTE_COUNT + engOffReg, size); ++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_SOURCE_ADDR + engOffReg, sourceAddr); ++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_DESTINATION_ADDR + engOffReg, destAddr); ++ command = command | ++ BIT12 | /* DMA_CHANNEL_ENABLE */ ++ BIT9; /* DMA_NON_CHAIN_MODE */ ++ /* Activate DMA channel By writting to mvDmaControlRegister */ ++ GT_REG_WRITE (MV64460_DMA_CHANNEL0_CONTROL + engOffReg, command); ++ return 1; ++} ++ ++/**************************************************************************************** ++ * SDRAM INIT * ++ * This procedure detect all Sdram types: 64, 128, 256, 512 Mbit, 1Gbit and 2Gb * ++ * This procedure fits only the Atlantis * ++ * * ++ ***************************************************************************************/ ++ ++/**************************************************************************************** ++ * DFCDL initialize MV643xx Design Considerations * ++ * * ++ ***************************************************************************************/ ++int set_dfcdlInit (void) ++{ ++ int i; ++ ++ /* Values from MV64460 User Manual */ ++ unsigned int dfcdl_tbl[] = { 0x00000000, 0x00000001, 0x00000042, 0x00000083, ++ 0x000000c4, 0x00000105, 0x00000146, 0x00000187, ++ 0x000001c8, 0x00000209, 0x0000024a, 0x0000028b, ++ 0x000002cc, 0x0000030d, 0x0000034e, 0x0000038f, ++ 0x000003d0, 0x00000411, 0x00000452, 0x00000493, ++ 0x000004d4, 0x00000515, 0x00000556, 0x00000597, ++ 0x000005d8, 0x00000619, 0x0000065a, 0x0000069b, ++ 0x000006dc, 0x0000071d, 0x0000075e, 0x0000079f, ++ 0x000007e0, 0x00000821, 0x00000862, 0x000008a3, ++ 0x000008e4, 0x00000925, 0x00000966, 0x000009a7, ++ 0x000009e8, 0x00000a29, 0x00000a6a, 0x00000aab, ++ 0x00000aec, 0x00000b2d, 0x00000b6e, 0x00000baf, ++ 0x00000bf0, 0x00000c31, 0x00000c72, 0x00000cb3, ++ 0x00000cf4, 0x00000d35, 0x00000d76, 0x00000db7, ++ 0x00000df8, 0x00000e39, 0x00000e7a, 0x00000ebb, ++ 0x00000efc, 0x00000f3d, 0x00000f7e, 0x00000fbf }; ++ ++ for (i = 0; i < 64; i++) ++ GT_REG_WRITE (SRAM_DATA0, dfcdl_tbl[i]); ++ GT_REG_WRITE (DFCDL_CONFIG0, 0x00300000); /* enable dynamic delay line updating */ ++ ++ return (0); ++} +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/serial.c u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.c +--- u-boot-1.1.6/board/prodrive/p3mx/serial.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,107 @@ ++/* ++ * (C) Copyright 2001 ++ * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc. ++ * ++ * modified for marvell db64360 eval board by ++ * Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ * modified for cpci750 board by ++ * Reinhard Arlt <reinhard.arlt@esd-electronics.com> ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ * serial.c - serial support for esd cpci750 board ++ */ ++ ++/* supports the MPSC */ ++ ++#include <common.h> ++#include <command.h> ++#include "../../Marvell/include/memory.h" ++#include "serial.h" ++ ++#include "mpsc.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++int serial_init (void) ++{ ++ mpsc_init (gd->baudrate); ++ ++ return (0); ++} ++ ++void serial_putc (const char c) ++{ ++ if (c == '\n') ++ mpsc_putchar ('\r'); ++ ++ mpsc_putchar (c); ++} ++ ++int serial_getc (void) ++{ ++ return mpsc_getchar (); ++} ++ ++int serial_tstc (void) ++{ ++ return mpsc_test_char (); ++} ++ ++void serial_setbrg (void) ++{ ++ galbrg_set_baudrate (CONFIG_MPSC_PORT, gd->baudrate); ++} ++ ++ ++void serial_puts (const char *s) ++{ ++ while (*s) { ++ serial_putc (*s++); ++ } ++} ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++void kgdb_serial_init (void) ++{ ++} ++ ++void putDebugChar (int c) ++{ ++ serial_putc (c); ++} ++ ++void putDebugStr (const char *str) ++{ ++ serial_puts (str); ++} ++ ++int getDebugChar (void) ++{ ++ return serial_getc (); ++} ++ ++void kgdb_interruptible (int yes) ++{ ++ return; ++} ++#endif /* CFG_CMD_KGDB */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/serial.h u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.h +--- u-boot-1.1.6/board/prodrive/p3mx/serial.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/serial.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,89 @@ ++/* ++ * (C) Copyright 2001 ++ * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc. ++ * ++ * modified for marvell db64360 eval board by ++ * Ingo Assmus <ingo.assmus@keymile.com> ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* serial.h - mostly useful for DUART serial_init in serial.c */ ++ ++#ifndef __SERIAL_H__ ++#define __SERIAL_H__ ++ ++#if 0 ++ ++#define B230400 1 ++#define B115200 2 ++#define B57600 4 ++#define B38400 82 ++#define B19200 163 ++#define B9600 24 ++#define B4800 651 ++#define B2400 1302 ++#define B1200 2604 ++#define B600 5208 ++#define B300 10417 ++#define B150 20833 ++#define B110 28409 ++#define BDEFAULT B115200 ++ ++ /* this stuff is important to initialize ++ the DUART channels */ ++ ++#define Scale 0x01L /* distance between port addresses */ ++#define COM1 0x000003f8 /* Keyboard */ ++#define COM2 0x000002f8 /* Host */ ++ ++ ++/* Port Definitions relative to base COM port addresses */ ++#define DataIn (0x00*Scale) /* data input port */ ++#define DataOut (0x00*Scale) /* data output port */ ++#define BaudLsb (0x00*Scale) /* baud rate divisor least significant byte */ ++#define BaudMsb (0x01*Scale) /* baud rate divisor most significant byte */ ++#define Ier (0x01*Scale) /* interrupt enable register */ ++#define Iir (0x02*Scale) /* interrupt identification register */ ++#define Lcr (0x03*Scale) /* line control register */ ++#define Mcr (0x04*Scale) /* modem control register */ ++#define Lsr (0x05*Scale) /* line status register */ ++#define Msr (0x06*Scale) /* modem status register */ ++ ++/* Bit Definitions for above ports */ ++#define LcrDlab 0x80 /* b7: enable baud rate divisor registers */ ++#define LcrDflt 0x03 /* b6-0: no parity, 1 stop, 8 data */ ++ ++#define McrRts 0x02 /* b1: request to send (I am ready to xmit) */ ++#define McrDtr 0x01 /* b0: data terminal ready (I am alive ready to rcv) */ ++#define McrDflt (McrRts|McrDtr) ++ ++#define LsrTxD 0x6000 /* b5: transmit holding register empty (i.e. xmit OK!)*/ ++ /* b6: transmitter empty */ ++#define LsrRxD 0x0100 /* b0: received data ready (i.e. got a byte!) */ ++ ++#define MsrRi 0x0040 /* b6: ring indicator (other guy is ready to rcv) */ ++#define MsrDsr 0x0020 /* b5: data set ready (other guy is alive ready to rcv */ ++#define MsrCts 0x0010 /* b4: clear to send (other guy is ready to rcv) */ ++ ++#define IerRda 0xf /* b0: Enable received data available interrupt */ ++ ++#endif ++ ++#endif /* __SERIAL_H__ */ +diff -Naupr u-boot-1.1.6/board/prodrive/p3mx/u-boot.lds u-boot-1.1.6-fsl-1/board/prodrive/p3mx/u-boot.lds +--- u-boot-1.1.6/board/prodrive/p3mx/u-boot.lds 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/prodrive/p3mx/u-boot.lds 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,138 @@ ++/* ++ * (C) Copyright 2001 ++ * Josh Huber <huber@mclx.com>, Mission Critical Linux, Inc. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ * u-boot.lds - linker script for U-Boot on the Galileo Eval Board. ++ */ ++ ++OUTPUT_ARCH(powerpc) ++SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); ++/* Do we need any of these for elf? ++ __DYNAMIC = 0; */ ++SECTIONS ++{ ++ /* Read-only sections, merged into text segment: */ ++ . = + SIZEOF_HEADERS; ++ .interp : { *(.interp) } ++ .hash : { *(.hash) } ++ .dynsym : { *(.dynsym) } ++ .dynstr : { *(.dynstr) } ++ .rel.text : { *(.rel.text) } ++ .rela.text : { *(.rela.text) } ++ .rel.data : { *(.rel.data) } ++ .rela.data : { *(.rela.data) } ++ .rel.rodata : { *(.rel.rodata) } ++ .rela.rodata : { *(.rela.rodata) } ++ .rel.got : { *(.rel.got) } ++ .rela.got : { *(.rela.got) } ++ .rel.ctors : { *(.rel.ctors) } ++ .rela.ctors : { *(.rela.ctors) } ++ .rel.dtors : { *(.rel.dtors) } ++ .rela.dtors : { *(.rela.dtors) } ++ .rel.bss : { *(.rel.bss) } ++ .rela.bss : { *(.rela.bss) } ++ .rel.plt : { *(.rel.plt) } ++ .rela.plt : { *(.rela.plt) } ++ .init : { *(.init) } ++ .plt : { *(.plt) } ++ .text : ++ { ++ cpu/74xx_7xx/start.o (.text) ++ ++/* store the environment in a seperate sector in the boot flash */ ++/* . = env_offset; */ ++/* common/environment.o(.text) */ ++ ++ *(.text) ++ *(.fixup) ++ *(.got1) ++ } ++ _etext = .; ++ PROVIDE (etext = .); ++ .rodata : ++ { ++ *(.rodata) ++ *(.rodata1) ++ *(.rodata.str1.4) ++ *(.eh_frame) ++ } ++ .fini : { *(.fini) } =0 ++ .ctors : { *(.ctors) } ++ .dtors : { *(.dtors) } ++ ++ /* Read-write section, merged into data segment: */ ++ . = (. + 0x00FF) & 0xFFFFFF00; ++ _erotext = .; ++ PROVIDE (erotext = .); ++ .reloc : ++ { ++ *(.got) ++ _GOT2_TABLE_ = .; ++ *(.got2) ++ _FIXUP_TABLE_ = .; ++ *(.fixup) ++ } ++ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2; ++ __fixup_entries = (. - _FIXUP_TABLE_)>>2; ++ ++ .data : ++ { ++ *(.data) ++ *(.data1) ++ *(.sdata) ++ *(.sdata2) ++ *(.dynamic) ++ CONSTRUCTORS ++ } ++ _edata = .; ++ PROVIDE (edata = .); ++ ++ . = .; ++ __u_boot_cmd_start = .; ++ .u_boot_cmd : { *(.u_boot_cmd) } ++ __u_boot_cmd_end = .; ++ ++ ++ . = .; ++ __start___ex_table = .; ++ __ex_table : { *(__ex_table) } ++ __stop___ex_table = .; ++ ++ . = ALIGN(256); ++ __init_begin = .; ++ .text.init : { *(.text.init) } ++ .data.init : { *(.data.init) } ++ . = ALIGN(256); ++ __init_end = .; ++ ++ __bss_start = .; ++ .bss : ++ { ++ *(.sbss) *(.scommon) ++ *(.dynbss) ++ *(.bss) ++ *(COMMON) ++ } ++ _end = . ; ++ PROVIDE (end = .); ++} +diff -Naupr u-boot-1.1.6/board/tqm5200/cam5200_flash.c u-boot-1.1.6-fsl-1/board/tqm5200/cam5200_flash.c +--- u-boot-1.1.6/board/tqm5200/cam5200_flash.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/tqm5200/cam5200_flash.c 2006-11-30 12:34:13.000000000 -0600 +@@ -759,7 +759,7 @@ unsigned long flash_init(void) + + if (flash_info[i].flash_id == FLASH_UNKNOWN) { + printf("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n", +- i, size_b[i], size_b[i] << 20); ++ i+1, size_b[i], size_b[i] << 20); + flash_info[i].sector_count = -1; + flash_info[i].size = 0; + } +diff -Naupr u-boot-1.1.6/board/tqm5200/tqm5200.c u-boot-1.1.6-fsl-1/board/tqm5200/tqm5200.c +--- u-boot-1.1.6/board/tqm5200/tqm5200.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/tqm5200/tqm5200.c 2006-11-30 12:34:13.000000000 -0600 +@@ -289,7 +289,7 @@ int checkboard (void) + #elif defined(CONFIG_TB5200) + # define CARRIER_NAME "TB5200" + #elif defined(CONFIG_CAM5200) +-# define CARRIER_NAME "Cam5200" ++# define CARRIER_NAME "CAM5200" + #elif defined(CONFIG_FO300) + # define CARRIER_NAME "FO300" + #else +@@ -341,9 +341,7 @@ void pci_init_board(void) + #define SM501_GPIO_DATA_DIR_HIGH 0x0001000CUL + #define SM501_GPIO_DATA_HIGH 0x00010004UL + #define SM501_GPIO_51 0x00080000UL +-#else +-#define GPIO_PSC1_4 0x01000000UL +-#endif ++#endif /* CONFIG MINIFAP */ + + void init_ide_reset (void) + { +@@ -381,9 +379,9 @@ void ide_set_reset (int idereset) + } + #else + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + } else { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + #endif + } +diff -Naupr u-boot-1.1.6/board/tqm834x/pci.c u-boot-1.1.6-fsl-1/board/tqm834x/pci.c +--- u-boot-1.1.6/board/tqm834x/pci.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/tqm834x/pci.c 2006-11-10 11:24:29.000000000 -0600 +@@ -69,17 +69,17 @@ void + pci_init_board(void) + { + volatile immap_t * immr; +- volatile clk8349_t * clk; +- volatile law8349_t * pci_law; +- volatile pot8349_t * pci_pot; +- volatile pcictrl8349_t * pci_ctrl; +- volatile pciconf8349_t * pci_conf; ++ volatile clk83xx_t * clk; ++ volatile law83xx_t * pci_law; ++ volatile pot83xx_t * pci_pot; ++ volatile pcictrl83xx_t * pci_ctrl; ++ volatile pciconf83xx_t * pci_conf; + u16 reg16; + u32 reg32; + struct pci_controller * hose; + +- immr = (immap_t *)CFG_IMMRBAR; +- clk = (clk8349_t *)&immr->clk; ++ immr = (immap_t *)CFG_IMMR; ++ clk = (clk83xx_t *)&immr->clk; + pci_law = immr->sysconf.pcilaw; + pci_pot = immr->ios.pot; + pci_ctrl = immr->pci_ctrl; +@@ -186,8 +186,8 @@ pci_init_board(void) + hose->region_count = 3; + + pci_setup_indirect(hose, +- (CFG_IMMRBAR+0x8300), +- (CFG_IMMRBAR+0x8304)); ++ (CFG_IMMR+0x8300), ++ (CFG_IMMR+0x8304)); + + pci_register_hose(hose); + +diff -Naupr u-boot-1.1.6/board/tqm834x/tqm834x.c u-boot-1.1.6-fsl-1/board/tqm834x/tqm834x.c +--- u-boot-1.1.6/board/tqm834x/tqm834x.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/tqm834x/tqm834x.c 2006-11-10 11:24:29.000000000 -0600 +@@ -69,7 +69,7 @@ static void set_cs_config(short cs, long + static void set_ddr_config(void); + + /* Local variable */ +-static volatile immap_t *im = (immap_t *)CFG_IMMRBAR; ++static volatile immap_t *im = (immap_t *)CFG_IMMR; + + /************************************************************************** + * Board initialzation after relocation to RAM. Used to detect the number +@@ -147,7 +147,7 @@ int checkboard (void) + volatile immap_t * immr; + u32 w, f; + +- immr = (immap_t *)CFG_IMMRBAR; ++ immr = (immap_t *)CFG_IMMR; + if (!(immr->reset.rcwh & RCWH_PCIHOST)) { + printf("PCI: NOT in host mode..?!\n"); + return 0; +diff -Naupr u-boot-1.1.6/board/v38b/ethaddr.c u-boot-1.1.6-fsl-1/board/v38b/ethaddr.c +--- u-boot-1.1.6/board/v38b/ethaddr.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/v38b/ethaddr.c 2006-11-10 11:24:29.000000000 -0600 +@@ -1,5 +1,4 @@ + /* +- * + * (C) Copyright 2006 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * +@@ -25,48 +24,13 @@ + #include <common.h> + #include <mpc5xxx.h> + +-#define GPIO_ENABLE (MPC5XXX_WU_GPIO) +- +-/* Open Drain Emulation Register */ +-#define GPIO_ODR (MPC5XXX_WU_GPIO + 0x04) +- +-/* Data Direction Register */ +-#define GPIO_DDR (MPC5XXX_WU_GPIO + 0x08) +- +-/* Data Value Out Register */ +-#define GPIO_DVOR (MPC5XXX_WU_GPIO + 0x0C) +- +-/* Interrupt Enable Register */ +-#define GPIO_IER (MPC5XXX_WU_GPIO + 0x10) +- +-/* Individual Interrupt Enable Register */ +-#define GPIO_IIER (MPC5XXX_WU_GPIO + 0x14) +- +-/* Interrupt Type Register */ +-#define GPIO_ITR (MPC5XXX_WU_GPIO + 0x18) +- +-/* Master Enable Register */ +-#define GPIO_MER (MPC5XXX_WU_GPIO + 0x1C) +- +-/* Data Input Value Register */ +-#define GPIO_DIVR (MPC5XXX_WU_GPIO + 0x20) +- +-/* Status Register */ +-#define GPIO_SR (MPC5XXX_WU_GPIO + 0x24) +- +-#define PSC6_0 0x10000000 +-#define WKUP_7 0x80000000 +- +-/* For NS4 A/B board define WKUP_7, for V38B board PSC_6 */ +-#define GPIO_PIN PSC6_0 ++/* For the V38B board the pin is GPIO_PSC_6 */ ++#define GPIO_PIN GPIO_PSC6_0 + + #define NO_ERROR 0 + #define ERR_NO_NUMBER 1 + #define ERR_BAD_NUMBER 2 + +-typedef volatile unsigned long GPIO_REG; +-typedef GPIO_REG *GPIO_REG_PTR; +- + static int is_high(void); + static int check_device(void); + static void io_out(int value); +@@ -79,33 +43,34 @@ static void write_byte(unsigned char com + void read_2501_memory(unsigned char *psernum, unsigned char *perr); + void board_get_enetaddr(uchar *enetaddr); + ++ + static int is_high() + { +- return (* ((vu_long *) GPIO_DIVR) & GPIO_PIN); ++ return (*((vu_long *) MPC5XXX_WU_GPIO_DATA_I) & GPIO_PIN); + } + + static void io_out(int value) + { + if (value) +- *((vu_long *) GPIO_DVOR) |= GPIO_PIN; ++ *((vu_long *) MPC5XXX_WU_GPIO_DATA_O) |= GPIO_PIN; + else +- *((vu_long *) GPIO_DVOR) &= ~GPIO_PIN; ++ *((vu_long *) MPC5XXX_WU_GPIO_DATA_O) &= ~GPIO_PIN; + } + + static void io_input() + { +- *((vu_long *) GPIO_DDR) &= ~GPIO_PIN; ++ *((vu_long *) MPC5XXX_WU_GPIO_DIR) &= ~GPIO_PIN; + udelay(3); /* allow input to settle */ + } + + static void io_output() + { +- *((vu_long *) GPIO_DDR) |= GPIO_PIN; ++ *((vu_long *) MPC5XXX_WU_GPIO_DIR) |= GPIO_PIN; + } + + static void init_gpio() + { +- *((vu_long *) GPIO_ENABLE) |= GPIO_PIN; /* Enable appropriate pin */ ++ *((vu_long *) MPC5XXX_WU_GPIO_ENABLE) |= GPIO_PIN; /* Enable appropriate pin */ + } + + void read_2501_memory(unsigned char *psernum, unsigned char *perr) +@@ -117,8 +82,8 @@ void read_2501_memory(unsigned char *pse + *perr = 0; + crcval = 0; + +- for (i=0; i<NBYTES; i++) +- ++ for (i = 0; i < NBYTES; i++) ++ buf[i] = 0; + + if (!check_device()) + *perr = ERR_NO_NUMBER; +@@ -130,10 +95,10 @@ void read_2501_memory(unsigned char *pse + write_byte(0x00); + read_byte(&crcval); /* Read CRC of address and command */ + +- for (i=0; i<NBYTES; i++) +- read_byte( &buf[i] ); ++ for (i = 0; i < NBYTES; i++) ++ read_byte(&buf[i]); + } +- if (strncmp((const char*) &buf[11], "MAREL IEEE 802.3", 16)) { ++ if (strncmp((const char *) &buf[11], "MAREL IEEE 802.3", 16)) { + *perr = ERR_BAD_NUMBER; + psernum[0] = 0x00; + psernum[1] = 0xE0; +@@ -141,8 +106,7 @@ void read_2501_memory(unsigned char *pse + psernum[3] = 0xFF; + psernum[4] = 0xFF; + psernum[5] = 0xFF; +- } +- else { ++ } else { + psernum[0] = 0x00; + psernum[1] = 0xE0; + psernum[2] = 0xEE; +@@ -173,27 +137,23 @@ static void write_byte(unsigned char com + { + char i; + +- for (i=0; i<8; i++) { ++ for (i = 0; i < 8; i++) { + /* 1 us to 15 us low pulse starts bit slot */ + /* Start with high pulse for 3 us */ + io_input(); +- + udelay(3); + + io_out(0); + io_output(); +- + udelay(3); + + if (command & 0x01) { + /* 60 us high for 1-bit */ + io_input(); + udelay(60); +- } +- else { ++ } else + /* 60 us low for 0-bit */ + udelay(60); +- } + /* Leave pin as input */ + io_input(); + +@@ -201,11 +161,11 @@ static void write_byte(unsigned char com + } + } + +-static void read_byte(unsigned char *data) ++static void read_byte(unsigned char *data) + { + unsigned char i, rdat = 0; + +- for (i=0; i<8; i++) { ++ for (i = 0; i < 8; i++) { + /* read one bit from one-wire device */ + + /* 1 - 15 us low starts bit slot */ +@@ -233,22 +193,21 @@ static void read_byte(unsigned char *da + + void board_get_enetaddr(uchar *enetaddr) + { +- unsigned char sn[6], err=NO_ERROR; ++ unsigned char sn[6], err = NO_ERROR; + + init_gpio(); + + read_2501_memory(sn, &err); + + if (err == NO_ERROR) { +- sprintf(enetaddr, "%02x:%02x:%02x:%02x:%02x:%02x", ++ sprintf((char *)enetaddr, "%02x:%02x:%02x:%02x:%02x:%02x", + sn[0], sn[1], sn[2], sn[3], sn[4], sn[5]); + printf("MAC address: %s\n", enetaddr); +- setenv("ethaddr", enetaddr); +- } +- else { +- sprintf(enetaddr, "00:01:02:03:04:05"); ++ setenv("ethaddr", (char *)enetaddr); ++ } else { ++ sprintf((char *)enetaddr, "00:01:02:03:04:05"); + printf("Error reading MAC address.\n"); + printf("Setting default to %s\n", enetaddr); +- setenv("ethaddr", enetaddr); ++ setenv("ethaddr", (char *)enetaddr); + } + } +diff -Naupr u-boot-1.1.6/board/v38b/u-boot.lds u-boot-1.1.6-fsl-1/board/v38b/u-boot.lds +--- u-boot-1.1.6/board/v38b/u-boot.lds 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/v38b/u-boot.lds 2006-11-10 11:24:29.000000000 -0600 +@@ -61,6 +61,7 @@ SECTIONS + *(.rodata) + *(.rodata1) + *(.rodata.str1.4) ++ *(.eh_frame) + } + .fini : { *(.fini) } =0 + .ctors : { *(.ctors) } +@@ -93,11 +94,13 @@ SECTIONS + _edata = .; + PROVIDE (edata = .); + ++ . = .; + __u_boot_cmd_start = .; + .u_boot_cmd : { *(.u_boot_cmd) } + __u_boot_cmd_end = .; + + ++ . = .; + __start___ex_table = .; + __ex_table : { *(__ex_table) } + __stop___ex_table = .; +diff -Naupr u-boot-1.1.6/board/v38b/v38b.c u-boot-1.1.6-fsl-1/board/v38b/v38b.c +--- u-boot-1.1.6/board/v38b/v38b.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/board/v38b/v38b.c 2006-11-10 11:24:29.000000000 -0600 +@@ -28,43 +28,44 @@ + #include <mpc5xxx.h> + #include <asm/processor.h> + ++ + #ifndef CFG_RAMBOOT + static void sdram_start(int hi_addr) + { + long hi_addr_bit = hi_addr ? 0x01000000 : 0; + + /* unlock mode register */ +- *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000000 | hi_addr_bit; ++ *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000000 | hi_addr_bit; + __asm__ volatile ("sync"); + + /* precharge all banks */ +- *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit; ++ *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit; + __asm__ volatile ("sync"); + + #if SDRAM_DDR + /* set mode register: extended mode */ +- *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_EMODE; ++ *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_EMODE; + __asm__ volatile ("sync"); + + /* set mode register: reset DLL */ +- *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000; ++ *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_MODE | 0x04000000; + __asm__ volatile ("sync"); + #endif /* SDRAM_DDR */ + + /* precharge all banks */ +- *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit; ++ *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000002 | hi_addr_bit; + __asm__ volatile ("sync"); + + /* auto refresh */ +- *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 | hi_addr_bit; ++ *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | 0x80000004 | hi_addr_bit; + __asm__ volatile ("sync"); + + /* set mode register */ +- *(vu_long *)MPC5XXX_SDRAM_MODE = SDRAM_MODE; ++ *(vu_long *) MPC5XXX_SDRAM_MODE = SDRAM_MODE; + __asm__ volatile ("sync"); + + /* normal operation */ +- *(vu_long *)MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit; ++ *(vu_long *) MPC5XXX_SDRAM_CTRL = SDRAM_CONTROL | hi_addr_bit; + __asm__ volatile ("sync"); + } + #endif /* !CFG_RAMBOOT */ +@@ -80,18 +81,18 @@ long int initdram(int board_type) + ulong test1, test2; + + /* setup SDRAM chip selects */ +- *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x0000001e; /* 2G at 0x0 */ +- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = 0x80000000; /* disabled */ ++ *(vu_long *) MPC5XXX_SDRAM_CS0CFG = 0x0000001e; /* 2G at 0x0 */ ++ *(vu_long *) MPC5XXX_SDRAM_CS1CFG = 0x80000000; /* disabled */ + __asm__ volatile ("sync"); + + /* setup config registers */ +- *(vu_long *)MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1; +- *(vu_long *)MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2; ++ *(vu_long *) MPC5XXX_SDRAM_CONFIG1 = SDRAM_CONFIG1; ++ *(vu_long *) MPC5XXX_SDRAM_CONFIG2 = SDRAM_CONFIG2; + __asm__ volatile ("sync"); + + #if SDRAM_DDR + /* set tap delay */ +- *(vu_long *)MPC5XXX_CDM_PORCFG = SDRAM_TAPDELAY; ++ *(vu_long *) MPC5XXX_CDM_PORCFG = SDRAM_TAPDELAY; + __asm__ volatile ("sync"); + #endif /* SDRAM_DDR */ + +@@ -112,20 +113,20 @@ long int initdram(int board_type) + + /* set SDRAM CS0 size according to the amount of RAM found */ + if (dramsize > 0) +- *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0x13 + __builtin_ffs(dramsize >> 20) - 1; ++ *(vu_long *) MPC5XXX_SDRAM_CS0CFG = 0x13 + __builtin_ffs(dramsize >> 20) - 1; + else +- *(vu_long *)MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */ ++ *(vu_long *) MPC5XXX_SDRAM_CS0CFG = 0; /* disabled */ + + /* let SDRAM CS1 start right after CS0 */ +- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001e;/* 2G */ ++ *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize + 0x0000001e;/* 2G */ + + /* find RAM size using SDRAM CS1 only */ + if (!dramsize) + sdram_start(0); +- test2 = test1 = get_ram_size((long *)(CFG_SDRAM_BASE + dramsize), 0x80000000); ++ test2 = test1 = get_ram_size((long *) (CFG_SDRAM_BASE + dramsize), 0x80000000); + if (!dramsize) { + sdram_start(1); +- test2 = get_ram_size((long *)(CFG_SDRAM_BASE + dramsize), 0x80000000); ++ test2 = get_ram_size((long *) (CFG_SDRAM_BASE + dramsize), 0x80000000); + } + if (test1 > test2) { + sdram_start(0); +@@ -139,22 +140,22 @@ long int initdram(int board_type) + + /* set SDRAM CS1 size according to the amount of RAM found */ + if (dramsize2 > 0) +- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize ++ *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize + | (0x13 + __builtin_ffs(dramsize2 >> 20) - 1); + else +- *(vu_long *)MPC5XXX_SDRAM_CS1CFG = dramsize; /* disabled */ ++ *(vu_long *) MPC5XXX_SDRAM_CS1CFG = dramsize; /* disabled */ + + #else /* CFG_RAMBOOT */ + + /* retrieve size of memory connected to SDRAM CS0 */ +- dramsize = *(vu_long *)MPC5XXX_SDRAM_CS0CFG & 0xFF; ++ dramsize = *(vu_long *) MPC5XXX_SDRAM_CS0CFG & 0xFF; + if (dramsize >= 0x13) + dramsize = (1 << (dramsize - 0x13)) << 20; + else + dramsize = 0; + + /* retrieve size of memory connected to SDRAM CS1 */ +- dramsize2 = *(vu_long *)MPC5XXX_SDRAM_CS1CFG & 0xFF; ++ dramsize2 = *(vu_long *) MPC5XXX_SDRAM_CS1CFG & 0xFF; + if (dramsize2 >= 0x13) + dramsize2 = (1 << (dramsize2 - 0x13)) << 20; + else +@@ -176,7 +177,7 @@ long int initdram(int board_type) + if ((SVR_MJREV(svr) >= 2) && + (PVR_MAJ(pvr) == 1) && (PVR_MIN(pvr) == 4)) { + +- *(vu_long *)MPC5XXX_SDRAM_SDELAY = 0x04; ++ *(vu_long *) MPC5XXX_SDRAM_SDELAY = 0x04; + __asm__ volatile ("sync"); + } + +@@ -194,27 +195,42 @@ int checkboard (void) + int board_early_init_r(void) + { + /* +- * Now, when we are in RAM, enable flash write access for detection process. +- * Note that CS_BOOT cannot be cleared when executing in flash. ++ * Now, when we are in RAM, enable flash write access for the ++ * detection process. Note that CS_BOOT cannot be cleared when ++ * executing in flash. ++ */ ++ *(vu_long *) MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */ ++ ++#ifdef CONFIG_HW_WATCHDOG ++ /* ++ * Enable and configure the direction (output) of PSC3_9 - watchdog ++ * reset input. Refer to 7.3.2.2.[1,3,4] of the MPC5200B User's ++ * Manual. ++ */ ++ *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC3_9; ++ *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC3_9; ++#endif /* CONFIG_HW_WATCHDOG */ ++ ++ /* ++ * Enable GPIO_WKUP_7 to "read the status of the actual power ++ * situation". Default direction is input, so no need to set it ++ * explicitly. + */ +- *(vu_long *)MPC5XXX_BOOTCS_CFG &= ~0x1; /* clear RO */ ++ *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_WKUP_7; + return 0; + } + + + #if defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) +- +-#define GPIO_PSC1_4 0x01000000UL +- + void init_ide_reset(void) + { + debug("init_ide_reset\n"); + + /* Configure PSC1_4 as GPIO output for ATA reset */ + *(vu_long *) MPC5XXX_WU_GPIO_ENABLE |= GPIO_PSC1_4; +- *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DIR |= GPIO_PSC1_4; + /* Deassert reset */ +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + + +@@ -223,30 +239,22 @@ void ide_set_reset(int idereset) + debug("ide_reset(%d)\n", idereset); + + if (idereset) { +- *(vu_long *) MPC5XXX_WU_GPIO_DATA &= ~GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O &= ~GPIO_PSC1_4; + /* Make a delay. MPC5200 spec says 25 usec min */ + udelay(500000); + } else +- *(vu_long *) MPC5XXX_WU_GPIO_DATA |= GPIO_PSC1_4; ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O |= GPIO_PSC1_4; + } + #endif /* defined (CFG_CMD_IDE) && defined (CONFIG_IDE_RESET) */ + + +-void led_d4_on(void) +-{ +- /* TIMER7 as GPIO output low */ +- *(vu_long *) (MPC5XXX_GPT + 0x70) |= 0x24; +-} +- +- +-void led_d4_off(void) +-{ +- /* TIMER7 as GPIO output high */ +- *(vu_long *) (MPC5XXX_GPT + 0x70) |= 0x34; +-} +- +- ++#ifdef CONFIG_HW_WATCHDOG + void hw_watchdog_reset(void) + { +-/* TODO fill this in */ ++ /* ++ * MarelV38B has a TPS3705 watchdog. Spec says that to kick the dog ++ * we need a positive or negative transition on WDI i.e., our PSC3_9. ++ */ ++ *(vu_long *) MPC5XXX_WU_GPIO_DATA_O ^= GPIO_PSC3_9; + } ++#endif /* CONFIG_HW_WATCHDOG */ +diff -Naupr u-boot-1.1.6/CHANGELOG u-boot-1.1.6-fsl-1/CHANGELOG +--- u-boot-1.1.6/CHANGELOG 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/CHANGELOG 2006-12-06 10:33:48.000000000 -0600 +@@ -1,3 +1,737 @@ ++commit 8d9a8610b8256331132227e9e6585c6bd5742787 ++Author: Wolfgang Denk <wd@pollux.denx.de> ++Date: Thu Nov 30 01:54:07 2006 +0100 ++ ++ Code cleanup. Update CHANGELOG. ++ ++commit 726e90aacf0b1ecb0e7055be574622fbe3e450ba ++Author: Grant Likely <grant.likely@secretlab.ca> ++Date: Wed Nov 29 16:23:42 2006 +0100 ++ ++ [PATCH] [MPC52xx] Use IPB bus frequency for SOC peripherals ++ ++ The soc node of the mpc52xx needs to be loaded with the IPB bus frequency, ++ not the XLB frequency. ++ ++ This patch depends on the previous patches for MPC52xx device tree support ++ ++ Signed-off-by: Grant Likely <grant.likely@secretlab.ca> ++ Signed-off-by: Sylvain Munaut <tnt@246tNt.com> ++ ++commit 1eac2a71417b6675b11aace72102a2e7fde8f5c6 ++Author: Stefan Roese <sr@denx.de> ++Date: Wed Nov 29 15:42:37 2006 +0100 ++ ++ [PATCH] Add support for Prodrive P3M750 & P3M7448 (P3Mx) boards ++ ++ This patch adds support for the Prodrive P3M750 (PPC750 & MV64460) ++ and the P3M7448 (MPC7448 & MV64460) PMC modules. Both modules are ++ quite similar and share the same board directory "prodrive/p3mx" ++ and the same config file "p3mx.h". ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 1bdd46832aeb569f5e04b1f20f64318525b6525a ++Author: Stefan Roese <sr@denx.de> ++Date: Wed Nov 29 12:53:15 2006 +0100 ++ ++ [PATCH] common/cmd_elf.c: Enable loadaddr as parameter in bootvx command ++ ++ In the bootvx command the load address was only read from the env ++ variable "loadaddr" and not optionally passed as paramter as described ++ in the help. This is fixed with this patch. The behaviour is now the ++ same as in the bootelf command. ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 4e26f1074c3ac1bd8fd094f0dc4a1c4a0b15a592 ++Author: Stefan Roese <sr@denx.de> ++Date: Wed Nov 29 12:03:57 2006 +0100 ++ ++ [PATCH] include/ppc440.h minor error affecting interrupts ++ ++ Fixed include/ppc440.c for UIC address Bug ++ ++ Corrects bug affecting the addresses for the universal interrupt ++ controller UIC2 and UIC3 on the PPC440 Epx, GRx, and SPE chips. ++ ++ Signed-off-by: Jeff Mann <mannj@embeddedplanet.com> ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 1939d969443ccf316cab2bf32ab1027d4db5ba1a ++Author: Joakim Tjernlund <Joakim.Tjernlund@transmode.se> ++Date: Tue Nov 28 16:17:27 2006 -0600 ++ ++ Make fsl-i2c not conflict with SOFT I2C ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit 14198bf768fdc958e3c1afd2404e5262208e98d7 ++Author: Joakim Tjernlund <Joakim.Tjernlund@transmode.se> ++Date: Tue Nov 28 16:17:18 2006 -0600 ++ ++ Fix I2C master address initialization. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit cf3d045e51ca8dcc6cf759827140861d6ac25c04 ++Author: Kim Phillips <kim.phillips@freescale.com> ++Date: Tue Nov 28 23:31:19 2006 -0600 ++ ++ Assign maintainers for mpc8349emds and mpc8360emds ++ ++ Dave for mpc8360emds, and me for mpc8349emds. ++ ++commit 1aa934c81b77f2080d3ca4b226eab67b17a33961 ++Author: Kim Phillips <kim.phillips@freescale.com> ++Date: Tue Nov 28 23:28:33 2006 -0600 ++ ++ Eliminate gcc 4 'used uninitialized' warnings in drivers/qe/uccf.c ++ ++ give initial values for reg_num, shift, p_cmxucr in ucc_set_clk_src ++ since they are passed by reference to ucc_get_cmxucr_reg and assigned. ++ ++commit e857a5bdb3954b896c0920cb9d8d2b1b9c107ce5 ++Author: Timur Tabi <timur@freescale.com> ++Date: Tue Nov 28 12:09:35 2006 -0600 ++ ++ mpc83xx: Miscellaneous code style fixes ++ ++ Implement various code style fixes and similar changes. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit e59581c56ab5d6e0207ddac3b2c1d55cb36ec706 ++Author: Stefan Roese <sr@denx.de> ++Date: Tue Nov 28 17:55:49 2006 +0100 ++ ++ [PATCH] Enable the IceCube/lite5200 variants to pass a device tree to Linux. ++ ++ This patch adds the code and configuration necessary to boot with an ++ arch/powerpc Linux kernel. ++ ++ Signed-off-by: Grant Likely <grant.likely@gmail.com> ++ Acked-by: Jon Loeliger <jdl@freescale.com> ++ ++commit e732faec95a83cb468b4850ae807c8301dde8f6a ++Author: Stefan Roese <sr@denx.de> ++Date: Tue Nov 28 16:09:24 2006 +0100 ++ ++ [PATCH] PPC4xx: 440SP Rev. C detection added ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit e7f3e9ff01fbd7fa72eb42a9675fbed6bc4736b0 ++Author: Stefan Roese <sr@denx.de> ++Date: Tue Nov 28 11:04:45 2006 +0100 ++ ++ [PATCH] nand: Fix patch merge problem ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 4f4b602ec7524a032bdf3c6d28c7f525a4a67eaa ++Author: Wolfgang Denk <wd@pollux.denx.de> ++Date: Mon Nov 27 22:53:53 2006 +0100 ++ ++ Update CHANGELOG ++ ++commit f6e495f54cdb8fe340b9c03deab40ad746d52fae ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 17:43:25 2006 +0100 ++ ++ [PATCH] 4xx_enet.c: Correct the setting of zmiifer register ++ ++ Patch below corrects the setting of the zmiifer register, it was ++ overwritting the register rather than ORing the settings. ++ ++ Signed-off-by: Neil Wilson <NWilson@airspan.com> ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit d1a72545296800b7e219f93104ad5836f0003d66 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 17:34:10 2006 +0100 ++ ++ [PATCH] Select NAND embedded environment from board configuration ++ ++ The current NAND Bootloader setup forces the environment ++ variables to be in line with the bootloader. This change ++ enables the configuration to be made in the board include ++ file instead so that it can be individually enabled. ++ ++ Signed-off-by: Nick Spence <nick.spence@freescale.com> ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 15784862857c3c2214498defcfed84ff137fb81e ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 17:22:19 2006 +0100 ++ ++ [PATCH] nand_wait() timeout fixes ++ ++ Two fixes for the nand_wait() function in ++ drivers/nand/nand_base.c: ++ ++ 1. Use correct timeouts. The original timeouts in Linux ++ source are 400ms and 20ms not 40s and 20s ++ ++ 2. Return correct error value in case of timeout. 0 is ++ interpreted as OK. ++ ++ Signed-off-by: Rui Sousa <rui.sousa@laposte.net> ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit da5553b095bf04f4f109ad7e565dae3aba47b230 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 17:04:06 2006 +0100 ++ ++ [PATCH] Allow CONFIG_OF_FLAT_TREE to boot a non-arch/powerpc kernel ++ ++ This patch allows an arch/ppc kernel to be booted by just passing 1 or 2 ++ arguments to bootm. It removes the getenv("disable_of") test that used ++ to be used for this purpose. ++ ++ Signed-off-by: Grant Likely <grant.likely@secretlab.ca> ++ Acked-by: Jon Loeliger <jdl@freescale.com> ++ ++commit a9398e018593782c5fa7d0741955fc1256b34c1e ++Author: Wolfgang Denk <wd@pollux.denx.de> ++Date: Mon Nov 27 15:32:42 2006 +0100 ++ ++ Minor code cleanup. Update CHANGELOG. ++ ++commit 1729b92cde575476684bffe819d0b7791b57bff2 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 14:52:04 2006 +0100 ++ ++ [PATCH] 4xx: Fix problem with board specific reset code (now for real) ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit cc5ee8a92a0e3ca6f727af71b8fd206460c7afd7 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 14:49:51 2006 +0100 ++ ++ [PATCH] alpr: remove unused board specific flash driver ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 1f94d162e2b5f0edc28d9fb11482502c44d218e1 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 14:48:41 2006 +0100 ++ ++ [PATCH] 4xx: Fix problem with board specific reset code ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit ec0c2ec725aec9524a177a77ce75559e644a931a ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 14:46:06 2006 +0100 ++ ++ [PATCH] Remove testing 4xx enet PHY setup ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 1c2ce2262069510f31c7d3fd7efd3d58b8c0c148 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 27 14:12:17 2006 +0100 ++ ++ [PATCH] Update Prodrive ALPR board support (440GX) ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 78d620ebb5871d252270dedfad60c6568993b780 ++Author: Wolfgang Denk <wd@atlas.denx.de> ++Date: Thu Nov 23 22:58:58 2006 +0100 ++ ++ Updates for TQM5200 modules: ++ - fix off-by-one error in board/tqm5200/cam5200_flash.c error message ++ - simplify "udate" definitions ++ ++commit 2053283304eeddf250d109e6791eb6fa4cad14f7 ++Author: Stefan Roese <sr@denx.de> ++Date: Wed Nov 22 13:20:50 2006 +0100 ++ ++ [PATCH] PPC4xx start.S: Fix for processor errata ++ ++ Fixed cpu/ppc4xx/start.S for 440EPx Errata: further corrects PPC440EPx ++ errata 1.12: 440_33 by moving patch up in code. ++ ++ Signed-off-by: Jeff Mann <mannj@embeddedplanet.com> ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit 4ef6251403f637841000e0fef9e832aa01339822 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 20 20:39:52 2006 +0100 ++ ++ [PATCH] Update AMCC Sequoia config file to support 64MByte NOR FLASH ++ ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit e4bbd8da164b976d38616bd9c69c5e86e193cdf0 ++Author: Wolfgang Denk <wd@pollux.denx.de> ++Date: Mon Nov 20 10:28:30 2006 +0100 ++ ++ Update CHANGELOG ++ ++commit 260421a21e934a68d31fb6125b0fbd2631a8ca20 ++Author: Stefan Roese <sr@denx.de> ++Date: Mon Nov 13 13:55:24 2006 +0100 ++ ++ [PATCH] CFI driver AMD Command Set Top boot geometry reversal, etc. [Updated] ++ ++ * Adds support for AMD command set Top Boot flash geometry reversal ++ * Adds support for reading JEDEC Manufacturer ID and Device ID ++ * Adds support for displaying command set, manufacturer id and ++ device ids (flinfo) ++ * Makes flinfo output to be consistent when CFG_FLASH_EMPTY_INFO defined ++ * Removes outdated change history (refer to git log instead) ++ ++ Signed-off-by: Tolunay Orkun <listmember@orkun.us> ++ Signed-off-by: Stefan Roese <sr@denx.de> ++ ++commit b21b511d4c50408f4853f46f06b601272196223f ++Author: Wolfgang Denk <wd@pollux.denx.de> ++Date: Sun Nov 12 21:13:23 2006 +0100 ++ ++ Update CHANGELOG ++ ++commit ce3f1a40c507afbab06c5eb58ccdc6713eda3245 ++Author: Bartlomiej Sieka <tur@semihalf.com> ++Date: Sat Nov 11 22:48:22 2006 +0100 ++ ++ Disable the watchdog in the default config for the V38B board. ++ ++commit 44a47e6db2694841211f1c8fdbafd36992e9cd1a ++Author: Bartlomiej Sieka <tur@semihalf.com> ++Date: Sat Nov 11 22:43:00 2006 +0100 ++ ++ Change the GPIO pin multiplexing configuration for V38B. The USB GPIO pin ++ group is enabled for USB earlier (in cpu_init_f() instead of ++ usb_lowlevel_init()). ++ ++commit 91650b3e4de688038d4f71279c44858e3e2c6870 ++Author: Wolfgang Denk <wd@pollux.denx.de> ++Date: Mon Nov 6 17:06:36 2006 +0100 ++ ++ Sequential accesses to non-existent memory must be synchronized, ++ at least on G2 cores. ++ ++ This fixes get_ram_size() problems on MPC5200 Rev. B boards. ++ ++commit be5e61815d5a1fac290ce9c0ef09cb6a8e4288fa ++Author: Timur Tabi <timur@freescale.com> ++Date: Fri Nov 3 19:15:00 2006 -0600 ++ ++ mpc83xx: Update 83xx to use fsl_i2c.c ++ ++ Update the 83xx tree to use I2C support in drivers/fsl_i2c.c. Delete ++ cpu/mpc83xx/i2c.c, include/asm-ppc/i2c.h, and all references to those files. ++ Added multiple I2C bus support to fsl_i2c.c. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit d239d74b1c937984bc519083a8e7de373a390f06 ++Author: Timur Tabi <timur@freescale.com> ++Date: Fri Nov 3 12:00:28 2006 -0600 ++ ++ mpc83xx: Replace CFG_IMMRBAR with CFG_IMMR ++ ++ Replace all instances of CFG_IMMRBAR with CFG_IMMR, so that the 83xx ++ tree matches the other 8xxx trees. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit f7fb2e703ec9688541416962724adff70a7322cb ++Author: Kim Phillips <kim.phillips@freescale.com> ++Date: Thu Nov 2 19:47:11 2006 -0600 ++ ++ mpc83xx: Lindent and clean up cpu/mpc83xx/speed.c ++ ++commit 90f30a710a3c619b5405860a686c4ddfc495d4b6 ++Author: Dave Liu <daveliu@freescale.com> ++Date: Thu Nov 2 18:05:50 2006 -0600 ++ ++ mpc83xx: Fix the incorrect dcbz operation ++ ++ The 834x rev1.x silicon has one CPU5 errata. ++ ++ The issue is when the data cache locked with ++ HID0[DLOCK], the dcbz instruction looks like no-op inst. ++ ++ The right behavior of the data cache is when the data cache ++ Locked with HID0[DLOCK], the dcbz instruction allocates ++ new tags in cache. ++ ++ The 834x rev3.0 and later and 8360 have not this bug inside. ++ ++ So, when 834x rev3.0/8360 are working with ECC, the dcbz ++ instruction will corrupt the stack in cache, the processor will ++ checkstop reset. ++ ++ However, the 834x rev1.x can work with ECC with these code, ++ because the sillicon has this cache bug. The dcbz will not ++ corrupt the stack in cache. ++ Really, it is the fault code running on fault sillicon. ++ ++ This patch fix the incorrect dcbz operation. Instead of ++ CPU FP writing to initialise the ECC. ++ ++ CHANGELOG: ++ * Fix the incorrect dcbz operation instead of CPU FP ++ writing to initialise the ECC memory. Otherwise, it ++ will corrupt the stack in cache, The processor will checkstop ++ reset. ++ ++ Signed-off-by: Dave Liu <daveliu@freescale.com> ++ ++commit bf0b542d6773a5a1cbce77691f009b06d9aeb57d ++Author: Kim Phillips <kim.phillips@freescale.com> ++Date: Wed Nov 1 00:10:40 2006 -0600 ++ ++ mpc83xx: add OF_FLAT_TREE bits to 83xx boards ++ ++ add ft_pci_setup, OF_CPU, OF_SOC, OF_TBCLK, and ++ STDOUT_PATH configuration bits to mpc8349emds, ++ mpc8349itx, and mpc8360emds board code. ++ ++ redo environment to use bootm with the fdtaddr ++ for booting ARCH=powerpc kernels by default, ++ and provide default fdtaddr values. ++ ++commit 48041365b3420589ad464ebc7752e0053538b729 ++Author: Kim Phillips <kim.phillips@freescale.com> ++Date: Wed Nov 1 00:07:25 2006 -0600 ++ ++ mpc83xx: change ft code to modify local-mac-address property ++ ++ Update 83xx OF code to update local-mac-address properties ++ for ethernet instead of the obsolete 'address' property. ++ ++commit 9ca880a250870a7d55754291b5591d2b5fe89b54 ++Author: Timur Tabi <timur@freescale.com> ++Date: Tue Oct 31 21:23:16 2006 -0600 ++ ++ mpc83xx: Fix dual I2C support for the MPC8349ITX, MPC8349EMDS, TQM834x, and MPC8360EMDS ++ ++ This patch also adds an improved I2C set_speed(), which handles all clock ++ frequencies. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit ac4b5622ce050b5ee1e154b98df630d778661632 ++Author: Dave Liu <daveliu@freescale.com> ++Date: Tue Oct 31 19:54:59 2006 -0600 ++ ++ mpc83xx: add the README.mpc8360emds ++ ++ add doc/README.mpc8360emds to accompany the new board support ++ ++commit 7737d5c658c606f999dfbe3e86b0fed49e5c50ef ++Author: Dave Liu <daveliu@freescale.com> ++Date: Fri Nov 3 12:11:15 2006 -0600 ++ ++ mpc83xx: add QE ethernet support ++ ++ this patch adds support for the QUICC Engine based UCC gigabit ethernet device. ++ ++commit 5f8204394e39bbe8cd9f08b8f8d145b6c01f7c73 ++Author: Dave Liu <daveliu@freescale.com> ++Date: Fri Nov 3 19:33:44 2006 -0600 ++ ++ mpc83xx: Add MPC8360EMDS basic board support ++ ++ Add support for the Freescale MPC8360EMDS board. ++ Includes DDR, DUART, Local Bus, PCI. ++ ++commit 23892e49352de74f7fac36ff90bb1be143d195e3 ++Author: Dave Liu <daveliu@freescale.com> ++Date: Tue Oct 31 19:30:40 2006 -0600 ++ ++ mpc83xx: add the QUICC Engine (QE) immap file ++ ++ common QE immap file. Also required for 8360. ++ ++commit b701652a4992bdcc62fb1a6038a85beef9e55da4 ++Author: Dave Liu <daveliu@freescale.com> ++Date: Tue Oct 31 19:25:38 2006 -0600 ++ ++ mpc83xx: Add 8360 specifics to 83xx immap ++ ++ Mainly add QE device dependencies, with appropriate 8360 protection. ++ Lindent also run. ++ ++commit 988833324a7fda482c8ac3ca23eb539f8232e404 ++Author: Timur Tabi <timur@freescale.com> ++Date: Tue Oct 31 19:14:41 2006 -0600 ++ ++ mpc83xx: Fix PCI, USB, bootargs for MPC8349E-mITX ++ ++ PREREQUISITE PATCHES: ++ ++ * This patch can only be applied after the following patches have been applied: ++ ++ 1) DNX#2006092142000015 "Add support for the MPC8349E-mITX 1/2" ++ 2) DNX#2006092142000024 "Add support for the MPC8349E-mITX 2/2" ++ ++ CHANGELOG: ++ ++ * For the 8349E-mITX, fix some size values in pci_init_board(), enable ++ the clock for the 2nd USB board (Linux kernel will hang otherwise), ++ and fix the CONFIG_BOOTARGS macro. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit 2ad6b513b31070bd0c003792ed1c3e7f5d740357 ++Author: Timur Tabi <timur@freescale.com> ++Date: Tue Oct 31 18:44:42 2006 -0600 ++ ++ mpc83xx: Add support for the MPC8349E-mITX ++ ++ PREREQUISITE PATCHES: ++ ++ * This patch can only be applied after the following patches have been applied: ++ ++ 1) DNX#2006090742000024 "Add support for multiple I2C buses" ++ 2) DNX#2006090742000033 "Multi-bus I2C implementation of MPC834x" ++ 3) DNX#2006091242000041 "Additional MPC8349 support for multibus i2c" ++ 4) DNX#2006091242000078 "Add support for variable flash memory sizes on 83xx systems" ++ 5) DNX#2006091242000069 "Add support for Errata DDR6 on MPC 834x systems" ++ ++ CHANGELOG: ++ ++ * Add support for the Freescale MPC8349E-mITX reference design platform. ++ The second TSEC (Vitesse 7385 switch) is not supported at this time. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit 183da6d9b446cc12123455844ad1187e2375626f ++Author: Ben Warren <bwarren@qstreams.com> ++Date: Tue Sep 12 10:15:53 2006 -0400 ++ ++ Additional MPC8349 support for multibus i2c ++ ++ Hello, ++ ++ Here is a patch for a file that was accidentally left out of a previous ++ attempt. ++ ++ It accompanies the patch with ticket DNX#2006090742000024 ++ ++ CHANGELOG: ++ Change PCI initialization to use new multi-bus I2C API. ++ ++ regards, ++ Ben ++ ++commit b24f119d672b709d153ff2ac091d4aa63ec6877d ++Author: Ben Warren <bwarren@qstreams.com> ++Date: Thu Sep 7 16:51:04 2006 -0400 ++ ++ Multi-bus I2C implementation of MPC834x ++ ++ Hello, ++ ++ Attached is a patch implementing multiple I2C buses on the MPC834x CPU ++ family and the MPC8349EMDS board in particular. ++ This patch requires Patch 1 (Add support for multiple I2C buses). ++ Testing was performed on a 533MHz board. ++ ++ /*** Note: This patch replaces ticket DNX#2006083042000027 ***/ ++ ++ Signed-off-by: Ben Warren <bwarren@qstreams.com> ++ ++ CHANGELOG: ++ Implemented driver-level code to support two I2C buses on the ++ MPC834x CPU family and the MPC8349EMDS board. Available I2C bus speeds ++ are 50kHz, 100kHz and 400kHz on each bus. ++ ++ regards, ++ Ben ++ ++commit bb99ad6d8257bf828f150d40f507b30d80a4a7ae ++Author: Ben Warren <bwarren@qstreams.com> ++Date: Thu Sep 7 16:50:54 2006 -0400 ++ ++ Add support for multiple I2C buses ++ ++ Hello, ++ ++ Attached is a patch providing support for multiple I2C buses at the ++ command level. The second part of the patch includes an implementation ++ for the MPC834x CPU and MPC8349EMDS board. ++ ++ /*** Note: This patch replaces ticket DNX#2006083042000018 ***/ ++ ++ Signed-off-by: Ben Warren <bwarren@qstreams.com> ++ ++ Overview: ++ ++ 1. Include new 'i2c' command (based on USB implementation) using ++ CONFIG_I2C_CMD_TREE. ++ ++ 2. Allow multiple buses by defining CONFIG_I2C_MULTI_BUS. Note that ++ the commands to change bus number and speed are only available under the ++ new 'i2c' command mentioned in the first bullet. ++ ++ 3. The option CFG_I2C_NOPROBES has been expanded to work in multi-bus ++ systems. When CONFIG_I2C_MULTI_BUS is used, this option takes the form ++ of an array of bus-device pairs. Otherwise, it is an array of uchar. ++ ++ CHANGELOG: ++ Added new 'i2c' master command for all I2C interaction. This is ++ conditionally compiled with CONFIG_I2C_CMD_TREE. New commands added for ++ setting I2C bus speed as well as changing the active bus if the board ++ has more than one (conditionally compiled with ++ CONFIG_I2C_MULTI_BUS). Updated NOPROBE logic to handle multiple buses. ++ Updated README. ++ ++ regards, ++ Ben ++ ++commit bed85caf872714ebf53013967a695c9d63acfc68 ++Author: Timur Tabi <timur@freescale.com> ++Date: Tue Oct 31 18:13:36 2006 -0600 ++ ++ mpc83xx: Add support for Errata DDR6 on MPC 834x systems ++ ++ CHANGELOG: ++ ++ * Errata DDR6, which affects all current MPC 834x processors, lists changes ++ required to maintain compatibility with various types of DDR memory. This ++ patch implements those changes. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit afd6e470f639883002c7c59d562690a5cb0f4865 ++Author: Timur Tabi <timur@freescale.com> ++Date: Wed Oct 25 18:45:23 2006 -0500 ++ ++ mpc83xx: fix TQM build by defining a CFG_FLASH_SIZE for it ++ ++commit 31068b7c4abeefcb2c8fd4fbeccc8ec6c6d0475a ++Author: Timur Tabi <timur@freescale.com> ++Date: Tue Aug 22 17:07:00 2006 -0500 ++ ++ mpc83xx: Add support for variable flash memory sizes on 83xx systems ++ ++ CHANGELOG: ++ ++ * On 83xx systems, use the CFG_FLASH_SIZE macro to program the LBC local access ++ window registers, instead of using a hard-coded value of 8MB. ++ ++ Signed-off-by: Timur Tabi <timur@freescale.com> ++ ++commit 2fc34ae66e73fa7841d1a006dc1b5dcbc1f78965 ++Author: Tanya Jiang <tanya.jiang@freescale.com> ++Date: Thu Aug 3 18:38:13 2006 +0800 ++ ++ mpc83xx: Unified TQM834x variable names with 83xx and consolidated macros ++ ++ Unified TQM834x variable names with 83xx and consolidated macro ++ in preparation for the 8360 and other upcoming 83xx devices. ++ ++ Signed-off-by: Tanya Jiang <tanya.jiang@freescale.com> ++ ++commit f6eda7f80ccc13d658020268c507d7173cf2e8aa ++Author: Dave Liu <daveliu@freescale.com> ++Date: Wed Oct 25 14:41:21 2006 -0500 ++ ++ mpc83xx: Changed to unified mpx83xx names and added common 83xx changes ++ ++ Incorporated the common unified variable names and the changes in preparation ++ for releasing mpc8360 patches. ++ ++ Signed-off-by: Dave Liu <daveliu@freescale.com> ++ ++commit 3894c46c27c64891f93ac04edde86a9fa9758d92 ++Author: Tanya Jiang <tanya.jiang@freescale.com> ++Date: Thu Aug 3 18:36:02 2006 +0800 ++ ++ mpc83xx: Fix missing build for mpc8349emds pci.c ++ ++ Make pci build for mpc8349emds ++ ++ Signed-off-by: Tanya Jiang <tanya.jiang@freescale.com> ++ ++commit 09a81ff740b29deea1e2ab08a3c2ac136c2e6219 ++Author: Tanya Jiang <tanya.jiang@freescale.com> ++Date: Thu Aug 3 18:39:49 2006 +0800 ++ ++ mpc83xx: Removed unused file resetvec.S for mpc83xx cpu ++ ++ Removed unused file resetvec.S for mpc83xx cpu ++ ++ Signed-off-by: Tanya Jiang <tanya.jiang@freescale.com> ++ ++commit 04f899fc465c3e44f2b55ecc70618f5696fc0ddf ++Author: Nick Spence <Nick.Spence@freescale.com> ++Date: Sat Sep 30 00:32:59 2006 -0700 ++ ++ NAND Flash verify across block boundaries ++ ++ This patch addresses a problem when CONFIG_MTD_NAND_VERIFY_WRITE is ++ defined ++ and the write crosses a block boundary. The pointer to the verification ++ buffer (bufstart) is not being updated to reflect the starting of the ++ new ++ block so the verification of the second block fails. ++ ++ CHANGELOG: ++ ++ * Fix NAND FLASH page verification across block boundaries ++ ++commit f484dc791a3932537213c43c654cc1295c64b84c ++Author: Nick Spence <nick.spence@freescale.com> ++Date: Thu Sep 7 07:39:46 2006 -0700 ++ ++ Added RGMII support to the TSECs and Marvell 881111 Phy ++ ++ Added a phy initialization to adjust the RGMII RX and TX timing ++ Always set the R100 bit in 100 BaseT mode regardless of the TSEC mode ++ ++ Signed-off-by: Nick Spence <nick.spence@freescale.com> ++ ++commit c59200443072353044aa4bf737a5a60f9a9af231 ++Author: Wolfgang Denk <wd@pollux.denx.de> ++Date: Thu Nov 2 15:15:01 2006 +0100 ++ ++ Release U-Boot 1.1.6 ++ ++commit 25721b5cec2be4bce79cfade17ec8f6aa1e67526 ++Author: Bartlomiej Sieka <tur@semihalf.com> ++Date: Wed Nov 1 02:04:38 2006 +0100 ++ ++ Finish up support for MarelV38B board ++ - add watchdog support ++ - enable GPIO_WKUP_7 pin for input ++ - code cleanup ++ ++commit ffa150bc90c943ca265170bd1be3f293674dd5c7 ++Author: Bartlomiej Sieka <tur@semihalf.com> ++Date: Wed Nov 1 01:45:46 2006 +0100 ++ ++ - Fix issues related to the use of ELDK 4 when compiling for MarelV38B: ++ * remove warnings when compiling ethaddr.c ++ * adjust linker script (fixes a crash resulting from incorrect ++ definition of __u_boot_cmd_start) ++ - Some MarelV38B code cleanup. ++ ++commit dae80f3caf9754a6dd3ddf3cf903d0c46cbd4385 ++Author: Bartlomiej Sieka <tur@semihalf.com> ++Date: Wed Nov 1 01:38:16 2006 +0100 ++ ++ - Add MPC5XXX register definition MPC5XXX_WU_GPIO_DATA_I and change the ++ MPC5XXX_WU_GPIO_DATA macro to MPC5XXX_WU_GPIO_DATA_O (per MPC5200 User's ++ Manual). Replace the uses of MPC5XXX_WU_GPIO_DATA with ++ MPC5XXX_WU_GPIO_DATA_O for affected boards. ++ ++ - Add defintions for some MPC5XXX GPIO pins. ++ ++commit 82d9c9ec29a1bec1b03ba616425ebaed231072c8 ++Author: Bartlomiej Sieka <tur@semihalf.com> ++Date: Wed Nov 1 01:34:29 2006 +0100 ++ ++ Changed MarelV38B board make target to lowercase. Config file cleanup. ++ + commit 1954be6e9c9421b45d0a9d05b10356acc7563150 + Author: Wolfgang Denk <wd@pollux.denx.de> + Date: Sun Oct 29 01:03:51 2006 +0200 +@@ -451,6 +1185,34 @@ Date: Tue Oct 10 17:02:22 2006 -0500 + + Fix whitespace and 80-col issues. + ++commit 5c912cb1c31266c66ca59b36f9b6f87296421d75 ++Author: Stefan Roese <sr@denx.de> ++Date: Sat Oct 7 11:36:51 2006 +0200 ++ ++ CFG_NAND_QUIET_TEST added to not warn upon missing NAND device ++ Patch by Stefan Roese, 07 Oct 2006 ++ ++commit 5bc528fa4da751d472397b308137238a6465afd2 ++Author: Stefan Roese <sr@denx.de> ++Date: Sat Oct 7 11:35:25 2006 +0200 ++ ++ Update ALPR code (NAND support working now) ++ Patch by Stefan Roese, 07 Oct 2006 ++ ++commit 77d5034847d328753b80c46b83f960a14a26f40e ++Author: Stefan Roese <sr@denx.de> ++Date: Sat Oct 7 11:33:03 2006 +0200 ++ ++ Remove compile warnings in fpga code ++ Patch by Stefan Roese, 07 Oct 2006 ++ ++commit f3443867e90d2979a7dd1c65b0d537777e1f9850 ++Author: Stefan Roese <sr@denx.de> ++Date: Sat Oct 7 11:30:52 2006 +0200 ++ ++ Add CONFIG_BOARD_RESET to configure board specific reset function ++ Patch by Stefan Roese, 07 Oct 2006 ++ + commit f55df18187e7a45cb73fec4370d12135e6691ae1 + Author: John Traill <john.traill@freescale.com> + Date: Fri Sep 29 08:23:12 2006 +0100 +@@ -683,6 +1445,21 @@ Date: Wed Aug 16 10:54:09 2006 -0500 + + Signed-off-by: Matthew McClintock <msm@freescale.com> + ++commit 899620c2d66d4eef3b2a0034d062e71d45d886c9 ++Author: Stefan Roese <sr@denx.de> ++Date: Tue Aug 15 14:22:35 2006 +0200 ++ ++ Add initial support for the ALPR board from Prodrive ++ NAND needs some additional testing ++ Patch by Heiko Schocher, 15 Aug 2006 ++ ++commit f0ff4692ff3372dec55074a8eb444943ab095abb ++Author: Stefan Roese <sr@denx.de> ++Date: Tue Aug 15 14:15:51 2006 +0200 ++ ++ Add FPGA Altera Cyclone 2 support ++ Patch by Heiko Schocher, 15 Aug 2006 ++ + commit fecf1c7e4de1b2779edc18742b91c22bdc32b68b + Author: Jon Loeliger <jdl@freescale.com> + Date: Mon Aug 14 15:33:38 2006 -0500 +diff -Naupr u-boot-1.1.6/common/altera.c u-boot-1.1.6-fsl-1/common/altera.c +--- u-boot-1.1.6/common/altera.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/altera.c 2006-11-30 12:34:13.000000000 -0600 +@@ -50,15 +50,20 @@ int altera_load( Altera_desc *desc, void + { + int ret_val = FPGA_FAIL; /* assume a failure */ + +- if (!altera_validate (desc, __FUNCTION__)) { ++ if (!altera_validate (desc, (char *)__FUNCTION__)) { + printf ("%s: Invalid device descriptor\n", __FUNCTION__); + } else { + switch (desc->family) { + case Altera_ACEX1K: ++ case Altera_CYC2: + #if (CONFIG_FPGA & CFG_ACEX1K) + PRINTF ("%s: Launching the ACEX1K Loader...\n", + __FUNCTION__); + ret_val = ACEX1K_load (desc, buf, bsize); ++#elif (CONFIG_FPGA & CFG_CYCLON2) ++ PRINTF ("%s: Launching the CYCLON II Loader...\n", ++ __FUNCTION__); ++ ret_val = CYC2_load (desc, buf, bsize); + #else + printf ("%s: No support for ACEX1K devices.\n", + __FUNCTION__); +@@ -78,7 +83,7 @@ int altera_dump( Altera_desc *desc, void + { + int ret_val = FPGA_FAIL; /* assume a failure */ + +- if (!altera_validate (desc, __FUNCTION__)) { ++ if (!altera_validate (desc, (char *)__FUNCTION__)) { + printf ("%s: Invalid device descriptor\n", __FUNCTION__); + } else { + switch (desc->family) { +@@ -106,13 +111,16 @@ int altera_info( Altera_desc *desc ) + { + int ret_val = FPGA_FAIL; + +- if (altera_validate (desc, __FUNCTION__)) { ++ if (altera_validate (desc, (char *)__FUNCTION__)) { + printf ("Family: \t"); + switch (desc->family) { + case Altera_ACEX1K: + printf ("ACEX1K\n"); + break; + /* Add new family types here */ ++ case Altera_CYC2: ++ printf ("CYCLON II\n"); ++ break; + default: + printf ("Unknown family type, %d\n", desc->family); + } +@@ -147,8 +155,11 @@ int altera_info( Altera_desc *desc ) + printf ("Device Function Table @ 0x%p\n", desc->iface_fns); + switch (desc->family) { + case Altera_ACEX1K: ++ case Altera_CYC2: + #if (CONFIG_FPGA & CFG_ACEX1K) + ACEX1K_info (desc); ++#elif (CONFIG_FPGA & CFG_CYCLON2) ++ CYC2_info (desc); + #else + /* just in case */ + printf ("%s: No support for ACEX1K devices.\n", +@@ -176,7 +187,7 @@ int altera_reloc( Altera_desc *desc, ulo + { + int ret_val = FPGA_FAIL; /* assume a failure */ + +- if (!altera_validate (desc, __FUNCTION__)) { ++ if (!altera_validate (desc, (char *)__FUNCTION__)) { + printf ("%s: Invalid device descriptor\n", __FUNCTION__); + } else { + switch (desc->family) { +@@ -188,6 +199,14 @@ int altera_reloc( Altera_desc *desc, ulo + __FUNCTION__); + #endif + break; ++ case Altera_CYC2: ++#if (CONFIG_FPGA & CFG_CYCLON2) ++ ret_val = CYC2_reloc (desc, reloc_offset); ++#else ++ printf ("%s: No support for CYCLON II devices.\n", ++ __FUNCTION__); ++#endif ++ break; + /* Add new family types here */ + default: + printf ("%s: Unsupported family type, %d\n", +diff -Naupr u-boot-1.1.6/common/cmd_bootm.c u-boot-1.1.6-fsl-1/common/cmd_bootm.c +--- u-boot-1.1.6/common/cmd_bootm.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/cmd_bootm.c 2006-11-30 12:34:13.000000000 -0600 +@@ -833,10 +833,6 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl + printf ("ERROR: flat device tree size does not agree with image\n"); + return; + } +- +- } else if (getenv("disable_of") == NULL) { +- printf ("ERROR: bootm needs flat device tree as third argument\n"); +- return; + } + #endif + if (!data) { +@@ -913,23 +909,11 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl + + SHOW_BOOT_PROGRESS (15); + +-#ifndef CONFIG_OF_FLAT_TREE +- + #if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500) + unlock_ram_in_cache(); + #endif + +- /* +- * Linux Kernel Parameters: +- * r3: ptr to board info data +- * r4: initrd_start or 0 if no initrd +- * r5: initrd_end - unused if r4 is 0 +- * r6: Start of command line string +- * r7: End of command line string +- */ +- (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end); +- +-#else /* CONFIG_OF_FLAT_TREE */ ++#ifdef CONFIG_OF_FLAT_TREE + /* move of_flat_tree if needed */ + if (of_data) { + ulong of_start, of_len; +@@ -948,30 +932,36 @@ do_bootm_linux (cmd_tbl_t *cmdtp, int fl + of_start, of_start + of_len - 1); + memmove ((void *)of_start, (void *)of_data, of_len); + } ++#endif + +- ft_setup(of_flat_tree, kbd, initrd_start, initrd_end); +- /* ft_dump_blob(of_flat_tree); */ +- +-#if defined(CFG_INIT_RAM_LOCK) && !defined(CONFIG_E500) +- unlock_ram_in_cache(); ++ /* ++ * Linux Kernel Parameters (passing board info data): ++ * r3: ptr to board info data ++ * r4: initrd_start or 0 if no initrd ++ * r5: initrd_end - unused if r4 is 0 ++ * r6: Start of command line string ++ * r7: End of command line string ++ */ ++#ifdef CONFIG_OF_FLAT_TREE ++ if (!of_flat_tree) /* no device tree; boot old style */ + #endif ++ (*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end); ++ /* does not return */ ++ ++#ifdef CONFIG_OF_FLAT_TREE + /* +- * Linux Kernel Parameters: ++ * Linux Kernel Parameters (passing device tree): + * r3: ptr to OF flat tree, followed by the board info data + * r4: physical pointer to the kernel itself + * r5: NULL + * r6: NULL + * r7: NULL + */ +- if (getenv("disable_of") != NULL) +- (*kernel) ((bd_t *)of_flat_tree, initrd_start, initrd_end, +- cmd_start, cmd_end); +- else { +- ft_setup(of_flat_tree, kbd, initrd_start, initrd_end); +- /* ft_dump_blob(of_flat_tree); */ +- (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0); +- } +-#endif /* CONFIG_OF_FLAT_TREE */ ++ ft_setup(of_flat_tree, kbd, initrd_start, initrd_end); ++ /* ft_dump_blob(of_flat_tree); */ ++ ++ (*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0); ++#endif + } + #endif /* CONFIG_PPC */ + +diff -Naupr u-boot-1.1.6/common/cmd_elf.c u-boot-1.1.6-fsl-1/common/cmd_elf.c +--- u-boot-1.1.6/common/cmd_elf.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/cmd_elf.c 2006-12-06 10:33:49.000000000 -0600 +@@ -79,7 +79,7 @@ int do_bootelf (cmd_tbl_t *cmdtp, int fl + * be either an ELF image or a raw binary. Will attempt to setup the + * bootline and other parameters correctly. + * ====================================================================== */ +-int do_bootvx ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) ++int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + { + unsigned long addr; /* Address of image */ + unsigned long bootaddr; /* Address to put the bootline */ +@@ -96,12 +96,10 @@ int do_bootvx ( cmd_tbl_t *cmdtp, int fl + * If we don't know where the image is then we're done. + */ + +- if ((tmp = getenv ("loadaddr")) != NULL) { +- addr = simple_strtoul (tmp, NULL, 16); +- } else { +- puts ("No load address provided\n"); +- return 1; +- } ++ if (argc < 2) ++ addr = load_addr; ++ else ++ addr = simple_strtoul (argv[1], NULL, 16); + + #if (CONFIG_COMMANDS & CFG_CMD_NET) + /* Check to see if we need to tftp the image ourselves before starting */ +diff -Naupr u-boot-1.1.6/common/cmd_fpga.c u-boot-1.1.6-fsl-1/common/cmd_fpga.c +--- u-boot-1.1.6/common/cmd_fpga.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/cmd_fpga.c 2006-11-30 12:34:13.000000000 -0600 +@@ -55,6 +55,7 @@ static int fpga_get_op (char *opstr); + #define FPGA_LOAD 1 + #define FPGA_LOADB 2 + #define FPGA_DUMP 3 ++#define FPGA_LOADMK 4 + + /* Convert bitstream data and load into the fpga */ + int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size) +@@ -251,6 +252,23 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag + rc = fpga_loadbitstream(dev, fpga_data, data_size); + break; + ++ case FPGA_LOADMK: ++ { ++ image_header_t header; ++ image_header_t *hdr = &header; ++ ulong data; ++ ++ memmove (&header, (char *)fpga_data, sizeof(image_header_t)); ++ if (ntohl(hdr->ih_magic) != IH_MAGIC) { ++ puts ("Bad Magic Number\n"); ++ return 1; ++ } ++ data = ((ulong)fpga_data + sizeof(image_header_t)); ++ data_size = ntohl(hdr->ih_size); ++ rc = fpga_load (dev, (void *)data, data_size); ++ } ++ break; ++ + case FPGA_DUMP: + rc = fpga_dump (dev, fpga_data, data_size); + break; +@@ -282,6 +300,8 @@ static int fpga_get_op (char *opstr) + op = FPGA_LOADB; + } else if (!strcmp ("load", opstr)) { + op = FPGA_LOAD; ++ } else if (!strcmp ("loadmk", opstr)) { ++ op = FPGA_LOADMK; + } else if (!strcmp ("dump", opstr)) { + op = FPGA_DUMP; + } +@@ -299,5 +319,6 @@ U_BOOT_CMD (fpga, 6, 1, do_fpga, + "\tinfo\tlist known device information\n" + "\tload\tLoad device from memory buffer\n" + "\tloadb\tLoad device from bitstream buffer (Xilinx devices only)\n" ++ "\tloadmk\tLoad device generated with mkimage\n" + "\tdump\tLoad device to memory buffer\n"); + #endif /* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */ +diff -Naupr u-boot-1.1.6/common/cmd_i2c.c u-boot-1.1.6-fsl-1/common/cmd_i2c.c +--- u-boot-1.1.6/common/cmd_i2c.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/cmd_i2c.c 2006-11-30 12:34:13.000000000 -0600 +@@ -101,8 +101,31 @@ static uchar i2c_mm_last_chip; + static uint i2c_mm_last_addr; + static uint i2c_mm_last_alen; + ++/* If only one I2C bus is present, the list of devices to ignore when ++ * the probe command is issued is represented by a 1D array of addresses. ++ * When multiple buses are present, the list is an array of bus-address ++ * pairs. The following macros take care of this */ ++ + #if defined(CFG_I2C_NOPROBES) ++#if defined(CONFIG_I2C_MULTI_BUS) ++static struct ++{ ++ uchar bus; ++ uchar addr; ++} i2c_no_probes[] = CFG_I2C_NOPROBES; ++#define GET_BUS_NUM i2c_get_bus_num() ++#define COMPARE_BUS(b,i) (i2c_no_probes[(i)].bus == (b)) ++#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)].addr == (a)) ++#define NO_PROBE_ADDR(i) i2c_no_probes[(i)].addr ++#else /* single bus */ + static uchar i2c_no_probes[] = CFG_I2C_NOPROBES; ++#define GET_BUS_NUM 0 ++#define COMPARE_BUS(b,i) ((b) == 0) /* Make compiler happy */ ++#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)] == (a)) ++#define NO_PROBE_ADDR(i) i2c_no_probes[(i)] ++#endif /* CONFIG_MULTI_BUS */ ++ ++#define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0])) + #endif + + static int +@@ -151,7 +174,7 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int fl + */ + addr = simple_strtoul(argv[2], NULL, 16); + alen = 1; +- for(j = 0; j < 8; j++) { ++ for (j = 0; j < 8; j++) { + if (argv[2][j] == '.') { + alen = argv[2][j+1] - '0'; + if (alen > 4) { +@@ -159,9 +182,8 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int fl + return 1; + } + break; +- } else if (argv[2][j] == '\0') { ++ } else if (argv[2][j] == '\0') + break; +- } + } + + /* +@@ -185,9 +207,9 @@ int do_i2c_md ( cmd_tbl_t *cmdtp, int fl + + linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes; + +- if(i2c_read(chip, addr, alen, linebuf, linebytes) != 0) { ++ if (i2c_read(chip, addr, alen, linebuf, linebytes) != 0) + puts ("Error reading the chip.\n"); +- } else { ++ else { + printf("%04x:", addr); + cp = linebuf; + for (j=0; j<linebytes; j++) { +@@ -256,17 +278,16 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int fl + */ + addr = simple_strtoul(argv[2], NULL, 16); + alen = 1; +- for(j = 0; j < 8; j++) { ++ for (j = 0; j < 8; j++) { + if (argv[2][j] == '.') { + alen = argv[2][j+1] - '0'; +- if(alen > 4) { ++ if (alen > 4) { + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } + break; +- } else if (argv[2][j] == '\0') { ++ } else if (argv[2][j] == '\0') + break; +- } + } + + /* +@@ -277,16 +298,14 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int fl + /* + * Optional count + */ +- if(argc == 5) { ++ if (argc == 5) + count = simple_strtoul(argv[4], NULL, 16); +- } else { ++ else + count = 1; +- } + + while (count-- > 0) { +- if(i2c_write(chip, addr++, alen, &byte, 1) != 0) { ++ if (i2c_write(chip, addr++, alen, &byte, 1) != 0) + puts ("Error writing the chip.\n"); +- } + /* + * Wait for the write to complete. The write can take + * up to 10mSec (we allow a little more time). +@@ -303,9 +322,9 @@ int do_i2c_mw ( cmd_tbl_t *cmdtp, int fl + #endif + + #if 0 +- for(timeout = 0; timeout < 10; timeout++) { ++ for (timeout = 0; timeout < 10; timeout++) { + udelay(2000); +- if(i2c_probe(chip) == 0) ++ if (i2c_probe(chip) == 0) + break; + } + #endif +@@ -346,17 +365,16 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int fl + */ + addr = simple_strtoul(argv[2], NULL, 16); + alen = 1; +- for(j = 0; j < 8; j++) { ++ for (j = 0; j < 8; j++) { + if (argv[2][j] == '.') { + alen = argv[2][j+1] - '0'; +- if(alen > 4) { ++ if (alen > 4) { + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } + break; +- } else if (argv[2][j] == '\0') { ++ } else if (argv[2][j] == '\0') + break; +- } + } + + /* +@@ -371,19 +389,16 @@ int do_i2c_crc (cmd_tbl_t *cmdtp, int fl + */ + crc = 0; + err = 0; +- while(count-- > 0) { +- if(i2c_read(chip, addr, alen, &byte, 1) != 0) { ++ while (count-- > 0) { ++ if (i2c_read(chip, addr, alen, &byte, 1) != 0) + err++; +- } + crc = crc32 (crc, &byte, 1); + addr++; + } +- if(err > 0) +- { ++ if (err > 0) + puts ("Error reading the chip,\n"); +- } else { ++ else + printf ("%08lx\n", crc); +- } + + return 0; + } +@@ -441,17 +456,16 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl + */ + addr = simple_strtoul(argv[2], NULL, 16); + alen = 1; +- for(j = 0; j < 8; j++) { ++ for (j = 0; j < 8; j++) { + if (argv[2][j] == '.') { + alen = argv[2][j+1] - '0'; +- if(alen > 4) { ++ if (alen > 4) { + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } + break; +- } else if (argv[2][j] == '\0') { ++ } else if (argv[2][j] == '\0') + break; +- } + } + } + +@@ -461,17 +475,16 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl + */ + do { + printf("%08lx:", addr); +- if(i2c_read(chip, addr, alen, (uchar *)&data, size) != 0) { ++ if (i2c_read(chip, addr, alen, (uchar *)&data, size) != 0) + puts ("\nError reading the chip,\n"); +- } else { ++ else { + data = cpu_to_be32(data); +- if(size == 1) { ++ if (size == 1) + printf(" %02lx", (data >> 24) & 0x000000FF); +- } else if(size == 2) { ++ else if (size == 2) + printf(" %04lx", (data >> 16) & 0x0000FFFF); +- } else { ++ else + printf(" %08lx", data); +- } + } + + nbytes = readline (" ? "); +@@ -488,19 +501,17 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl + #endif + } + #ifdef CONFIG_BOOT_RETRY_TIME +- else if (nbytes == -2) { ++ else if (nbytes == -2) + break; /* timed out, exit the command */ +- } + #endif + else { + char *endp; + + data = simple_strtoul(console_buffer, &endp, 16); +- if(size == 1) { ++ if (size == 1) + data = data << 24; +- } else if(size == 2) { ++ else if (size == 2) + data = data << 16; +- } + data = be32_to_cpu(data); + nbytes = endp - console_buffer; + if (nbytes) { +@@ -510,9 +521,8 @@ mod_i2c_mem(cmd_tbl_t *cmdtp, int incrfl + */ + reset_cmd_timeout(); + #endif +- if(i2c_write(chip, addr, alen, (uchar *)&data, size) != 0) { ++ if (i2c_write(chip, addr, alen, (uchar *)&data, size) != 0) + puts ("Error writing the chip.\n"); +- } + #ifdef CFG_EEPROM_PAGE_WRITE_DELAY_MS + udelay(CFG_EEPROM_PAGE_WRITE_DELAY_MS * 1000); + #endif +@@ -538,14 +548,15 @@ int do_i2c_probe (cmd_tbl_t *cmdtp, int + int j; + #if defined(CFG_I2C_NOPROBES) + int k, skip; +-#endif ++ uchar bus = GET_BUS_NUM; ++#endif /* NOPROBES */ + + puts ("Valid chip addresses:"); +- for(j = 0; j < 128; j++) { ++ for (j = 0; j < 128; j++) { + #if defined(CFG_I2C_NOPROBES) + skip = 0; +- for (k = 0; k < sizeof(i2c_no_probes); k++){ +- if (j == i2c_no_probes[k]){ ++ for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) { ++ if (COMPARE_BUS(bus, k) && COMPARE_ADDR(j, k)) { + skip = 1; + break; + } +@@ -553,16 +564,17 @@ int do_i2c_probe (cmd_tbl_t *cmdtp, int + if (skip) + continue; + #endif +- if(i2c_probe(j) == 0) { ++ if (i2c_probe(j) == 0) + printf(" %02X", j); +- } + } + putc ('\n'); + + #if defined(CFG_I2C_NOPROBES) + puts ("Excluded chip addresses:"); +- for( k = 0; k < sizeof(i2c_no_probes); k++ ) +- printf(" %02X", i2c_no_probes[k] ); ++ for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) { ++ if (COMPARE_BUS(bus,k)) ++ printf(" %02X", NO_PROBE_ADDR(k)); ++ } + putc ('\n'); + #endif + +@@ -601,7 +613,7 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int fl + */ + addr = simple_strtoul(argv[2], NULL, 16); + alen = 1; +- for(j = 0; j < 8; j++) { ++ for (j = 0; j < 8; j++) { + if (argv[2][j] == '.') { + alen = argv[2][j+1] - '0'; + if (alen > 4) { +@@ -609,9 +621,8 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int fl + return 1; + } + break; +- } else if (argv[2][j] == '\0') { ++ } else if (argv[2][j] == '\0') + break; +- } + } + + /* +@@ -619,24 +630,21 @@ int do_i2c_loop(cmd_tbl_t *cmdtp, int fl + */ + length = 1; + length = simple_strtoul(argv[3], NULL, 16); +- if(length > sizeof(bytes)) { ++ if (length > sizeof(bytes)) + length = sizeof(bytes); +- } + + /* + * The delay time (uSec) is optional. + */ + delay = 1000; +- if (argc > 3) { ++ if (argc > 3) + delay = simple_strtoul(argv[4], NULL, 10); +- } + /* + * Run the loop... + */ +- while(1) { +- if(i2c_read(chip, addr, alen, bytes, length) != 0) { ++ while (1) { ++ if (i2c_read(chip, addr, alen, bytes, length) != 0) + puts ("Error reading the chip.\n"); +- } + udelay(delay); + } + +@@ -671,7 +679,7 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl + */ + chip = simple_strtoul(argv[1], NULL, 16); + +- if(i2c_read(chip, 0, 1, data, sizeof(data)) != 0) { ++ if (i2c_read(chip, 0, 1, data, sizeof(data)) != 0) { + puts ("No SDRAM Serial Presence Detect found.\n"); + return 1; + } +@@ -680,7 +688,7 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl + for (j = 0; j < 63; j++) { + cksum += data[j]; + } +- if(cksum != data[63]) { ++ if (cksum != data[63]) { + printf ("WARNING: Configuration data checksum failure:\n" + " is 0x%02x, calculated 0x%02x\n", + data[63], cksum); +@@ -696,17 +704,15 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl + default: puts ("unknown\n"); break; + } + puts ("Row address bits "); +- if((data[3] & 0x00F0) == 0) { ++ if ((data[3] & 0x00F0) == 0) + printf("%d\n", data[3] & 0x0F); +- } else { ++ else + printf("%d/%d\n", data[3] & 0x0F, (data[3] >> 4) & 0x0F); +- } + puts ("Column address bits "); +- if((data[4] & 0x00F0) == 0) { ++ if ((data[4] & 0x00F0) == 0) + printf("%d\n", data[4] & 0x0F); +- } else { ++ else + printf("%d/%d\n", data[4] & 0x0F, (data[4] >> 4) & 0x0F); +- } + printf("Module rows %d\n", data[5]); + printf("Module data width %d bits\n", (data[7] << 8) | data[6]); + puts ("Interface signal levels "); +@@ -729,11 +735,10 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl + case 2: puts ("ECC\n"); break; + default: puts ("unknown\n"); break; + } +- if((data[12] & 0x80) == 0) { ++ if ((data[12] & 0x80) == 0) + puts ("No self refresh, rate "); +- } else { ++ else + puts ("Self refresh, rate "); +- } + switch(data[12] & 0x7F) { + case 0: puts ("15.625uS\n"); break; + case 1: puts ("3.9uS\n"); break; +@@ -744,17 +749,16 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl + default: puts ("unknown\n"); break; + } + printf("SDRAM width (primary) %d\n", data[13] & 0x7F); +- if((data[13] & 0x80) != 0) { ++ if ((data[13] & 0x80) != 0) { + printf(" (second bank) %d\n", + 2 * (data[13] & 0x7F)); + } +- if(data[14] != 0) { ++ if (data[14] != 0) { + printf("EDC width %d\n", + data[14] & 0x7F); +- if((data[14] & 0x80) != 0) { ++ if ((data[14] & 0x80) != 0) + printf(" (second bank) %d\n", + 2 * (data[14] & 0x7F)); +- } + } + printf("Min clock delay, back-to-back random column addresses %d\n", + data[15]); +@@ -852,18 +856,18 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl + (data[35] & 0x80) ? '-' : '+', + (data[35] >> 4) & 0x07, data[35] & 0x0F); + puts ("Manufacturer's JEDEC ID "); +- for(j = 64; j <= 71; j++) ++ for (j = 64; j <= 71; j++) + printf("%02X ", data[j]); + putc ('\n'); + printf("Manufacturing Location %02X\n", data[72]); + puts ("Manufacturer's Part Number "); +- for(j = 73; j <= 90; j++) ++ for (j = 73; j <= 90; j++) + printf("%02X ", data[j]); + putc ('\n'); + printf("Revision Code %02X %02X\n", data[91], data[92]); + printf("Manufacturing Date %02X %02X\n", data[93], data[94]); + puts ("Assembly Serial Number "); +- for(j = 95; j <= 98; j++) ++ for (j = 95; j <= 98; j++) + printf("%02X ", data[j]); + putc ('\n'); + printf("Speed rating PC%d\n", +@@ -873,6 +877,74 @@ int do_sdram ( cmd_tbl_t *cmdtp, int fl + } + #endif /* CFG_CMD_SDRAM */ + ++#if defined(CONFIG_I2C_CMD_TREE) ++#if defined(CONFIG_I2C_MULTI_BUS) ++int do_i2c_bus_num(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ++{ ++ int bus_idx, ret=0; ++ ++ if (argc == 1) ++ /* querying current setting */ ++ printf("Current bus is %d\n", i2c_get_bus_num()); ++ else { ++ bus_idx = simple_strtoul(argv[1], NULL, 10); ++ printf("Setting bus to %d\n", bus_idx); ++ ret = i2c_set_bus_num(bus_idx); ++ if (ret) ++ printf("Failure changing bus number (%d)\n", ret); ++ } ++ return ret; ++} ++#endif /* CONFIG_I2C_MULTI_BUS */ ++ ++int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ++{ ++ int speed, ret=0; ++ ++ if (argc == 1) ++ /* querying current speed */ ++ printf("Current bus speed=%d\n", i2c_get_bus_speed()); ++ else { ++ speed = simple_strtoul(argv[1], NULL, 10); ++ printf("Setting bus speed to %d Hz\n", speed); ++ ret = i2c_set_bus_speed(speed); ++ if (ret) ++ printf("Failure changing bus speed (%d)\n", ret); ++ } ++ return ret; ++} ++ ++int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ++{ ++#if defined(CONFIG_I2C_MULTI_BUS) ++ if (!strncmp(argv[1], "de", 2)) ++ return do_i2c_bus_num(cmdtp, flag, --argc, ++argv); ++#endif /* CONFIG_I2C_MULTI_BUS */ ++ if (!strncmp(argv[1], "sp", 2)) ++ return do_i2c_bus_speed(cmdtp, flag, --argc, ++argv); ++ if (!strncmp(argv[1], "md", 2)) ++ return do_i2c_md(cmdtp, flag, --argc, ++argv); ++ if (!strncmp(argv[1], "mm", 2)) ++ return do_i2c_mm(cmdtp, flag, --argc, ++argv); ++ if (!strncmp(argv[1], "mw", 2)) ++ return do_i2c_mw(cmdtp, flag, --argc, ++argv); ++ if (!strncmp(argv[1], "nm", 2)) ++ return do_i2c_nm(cmdtp, flag, --argc, ++argv); ++ if (!strncmp(argv[1], "cr", 2)) ++ return do_i2c_crc(cmdtp, flag, --argc, ++argv); ++ if (!strncmp(argv[1], "pr", 2)) ++ return do_i2c_probe(cmdtp, flag, --argc, ++argv); ++ if (!strncmp(argv[1], "lo", 2)) ++ return do_i2c_loop(cmdtp, flag, --argc, ++argv); ++#if (CONFIG_COMMANDS & CFG_CMD_SDRAM) ++ if (!strncmp(argv[1], "sd", 2)) ++ return do_sdram(cmdtp, flag, --argc, ++argv); ++#endif /* CFG_CMD_SDRAM */ ++ else ++ printf ("Usage:\n%s\n", cmdtp->usage); ++ return 0; ++} ++#endif /* CONFIG_I2C_CMD_TREE */ + + /***************************************************/ + +@@ -930,4 +1002,26 @@ U_BOOT_CMD( + " (valid chip values 50..57)\n" + ); + #endif ++ ++#if defined(CONFIG_I2C_CMD_TREE) ++U_BOOT_CMD( ++ i2c, 6, 1, do_i2c, ++ "i2c - I2C sub-system\n", ++#if defined(CONFIG_I2C_MULTI_BUS) ++ "dev [dev] - show or set current I2C bus\n" ++#endif /* CONFIG_I2C_MULTI_BUS */ ++ "i2c speed [speed] - show or set I2C bus speed\n" ++ "i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n" ++ "i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n" ++ "i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n" ++ "i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n" ++ "i2c crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n" ++ "i2c probe - show devices on the I2C bus\n" ++ "i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device\n" ++#if (CONFIG_COMMANDS & CFG_CMD_SDRAM) ++ "i2c sdram chip - print SDRAM configuration information\n" ++#endif /* CFG_CMD_SDRAM */ ++); ++#endif /* CONFIG_I2C_CMD_TREE */ ++ + #endif /* CFG_CMD_I2C */ +diff -Naupr u-boot-1.1.6/common/cmd_nand.c u-boot-1.1.6-fsl-1/common/cmd_nand.c +--- u-boot-1.1.6/common/cmd_nand.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/cmd_nand.c 2006-12-06 10:33:49.000000000 -0600 +@@ -684,178 +684,182 @@ extern int nand_write_oob(struct nand_ch + size_t len, size_t *retlen, const u_char *buf); + + +-int do_nand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) ++int do_nand (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) + { +- int rcode = 0; ++ int rcode = 0; + +- switch (argc) { +- case 0: +- case 1: +- printf ("Usage:\n%s\n", cmdtp->usage); +- return 1; +- case 2: +- if (strcmp(argv[1],"info") == 0) { +- int i; +- +- putc ('\n'); +- +- for (i=0; i<CFG_MAX_NAND_DEVICE; ++i) { +- if(nand_dev_desc[i].ChipID == NAND_ChipID_UNKNOWN) +- continue; /* list only known devices */ +- printf ("Device %d: ", i); +- nand_print(&nand_dev_desc[i]); +- } +- return 0; ++ switch (argc) { ++ case 0: ++ case 1: ++ printf ("Usage:\n%s\n", cmdtp->usage); ++ return 1; ++ case 2: ++ if (strcmp (argv[1], "info") == 0) { ++ int i; + +- } else if (strcmp(argv[1],"device") == 0) { +- if ((curr_device < 0) || (curr_device >= CFG_MAX_NAND_DEVICE)) { +- puts ("\nno devices available\n"); +- return 1; +- } +- printf ("\nDevice %d: ", curr_device); +- nand_print(&nand_dev_desc[curr_device]); +- return 0; +- +- } else if (strcmp(argv[1],"bad") == 0) { +- if ((curr_device < 0) || (curr_device >= CFG_MAX_NAND_DEVICE)) { +- puts ("\nno devices available\n"); +- return 1; +- } +- printf ("\nDevice %d bad blocks:\n", curr_device); +- nand_print_bad(&nand_dev_desc[curr_device]); +- return 0; ++ putc ('\n'); + +- } +- printf ("Usage:\n%s\n", cmdtp->usage); +- return 1; +- case 3: +- if (strcmp(argv[1],"device") == 0) { +- int dev = (int)simple_strtoul(argv[2], NULL, 10); +- +- printf ("\nDevice %d: ", dev); +- if (dev >= CFG_MAX_NAND_DEVICE) { +- puts ("unknown device\n"); +- return 1; +- } +- nand_print(&nand_dev_desc[dev]); +- /*nand_print (dev);*/ ++ for (i = 0; i < CFG_MAX_NAND_DEVICE; ++i) { ++ if (nand_dev_desc[i].ChipID == ++ NAND_ChipID_UNKNOWN) ++ continue; /* list only known devices */ ++ printf ("Device %d: ", i); ++ nand_print (&nand_dev_desc[i]); ++ } ++ return 0; ++ ++ } else if (strcmp (argv[1], "device") == 0) { ++ if ((curr_device < 0) ++ || (curr_device >= CFG_MAX_NAND_DEVICE)) { ++ puts ("\nno devices available\n"); ++ return 1; ++ } ++ printf ("\nDevice %d: ", curr_device); ++ nand_print (&nand_dev_desc[curr_device]); ++ return 0; ++ ++ } else if (strcmp (argv[1], "bad") == 0) { ++ if ((curr_device < 0) ++ || (curr_device >= CFG_MAX_NAND_DEVICE)) { ++ puts ("\nno devices available\n"); ++ return 1; ++ } ++ printf ("\nDevice %d bad blocks:\n", curr_device); ++ nand_print_bad (&nand_dev_desc[curr_device]); ++ return 0; + +- if (nand_dev_desc[dev].ChipID == NAND_ChipID_UNKNOWN) { +- return 1; + } ++ printf ("Usage:\n%s\n", cmdtp->usage); ++ return 1; ++ case 3: ++ if (strcmp (argv[1], "device") == 0) { ++ int dev = (int) simple_strtoul (argv[2], NULL, 10); + +- curr_device = dev; ++ printf ("\nDevice %d: ", dev); ++ if (dev >= CFG_MAX_NAND_DEVICE) { ++ puts ("unknown device\n"); ++ return 1; ++ } ++ nand_print (&nand_dev_desc[dev]); ++ /*nand_print (dev); */ + +- puts ("... is now current device\n"); ++ if (nand_dev_desc[dev].ChipID == NAND_ChipID_UNKNOWN) { ++ return 1; ++ } + +- return 0; +- } +- else if (strcmp(argv[1],"erase") == 0 && strcmp(argv[2], "clean") == 0) { +- struct nand_chip* nand = &nand_dev_desc[curr_device]; +- ulong off = 0; +- ulong size = nand->totlen; +- int ret; ++ curr_device = dev; + +- printf ("\nNAND erase: device %d offset %ld, size %ld ... ", +- curr_device, off, size); ++ puts ("... is now current device\n"); + +- ret = nand_legacy_erase (nand, off, size, 1); ++ return 0; ++ } else if (strcmp (argv[1], "erase") == 0 ++ && strcmp (argv[2], "clean") == 0) { ++ struct nand_chip *nand = &nand_dev_desc[curr_device]; ++ ulong off = 0; ++ ulong size = nand->totlen; ++ int ret; + +- printf("%s\n", ret ? "ERROR" : "OK"); ++ printf ("\nNAND erase: device %d offset %ld, size %ld ... ", curr_device, off, size); + +- return ret; +- } ++ ret = nand_legacy_erase (nand, off, size, 1); + +- printf ("Usage:\n%s\n", cmdtp->usage); +- return 1; +- default: +- /* at least 4 args */ +- +- if (strncmp(argv[1], "read", 4) == 0 || +- strncmp(argv[1], "write", 5) == 0) { +- ulong addr = simple_strtoul(argv[2], NULL, 16); +- ulong off = simple_strtoul(argv[3], NULL, 16); +- ulong size = simple_strtoul(argv[4], NULL, 16); +- int cmd = (strncmp(argv[1], "read", 4) == 0) ? +- NANDRW_READ : NANDRW_WRITE; +- int ret, total; +- char* cmdtail = strchr(argv[1], '.'); ++ printf ("%s\n", ret ? "ERROR" : "OK"); + +- if (cmdtail && !strncmp(cmdtail, ".oob", 2)) { +- /* read out-of-band data */ +- if (cmd & NANDRW_READ) { +- ret = nand_read_oob(nand_dev_desc + curr_device, +- off, size, (size_t *)&total, +- (u_char*)addr); +- } +- else { +- ret = nand_write_oob(nand_dev_desc + curr_device, +- off, size, (size_t *)&total, +- (u_char*)addr); +- } + return ret; + } +- else if (cmdtail && !strncmp(cmdtail, ".jffs2", 2)) +- cmd |= NANDRW_JFFS2; /* skip bad blocks */ +- else if (cmdtail && !strncmp(cmdtail, ".jffs2s", 2)) { +- cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */ +- if (cmd & NANDRW_READ) +- cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */ +- } ++ ++ printf ("Usage:\n%s\n", cmdtp->usage); ++ return 1; ++ default: ++ /* at least 4 args */ ++ ++ if (strncmp (argv[1], "read", 4) == 0 || ++ strncmp (argv[1], "write", 5) == 0) { ++ ulong addr = simple_strtoul (argv[2], NULL, 16); ++ ulong off = simple_strtoul (argv[3], NULL, 16); ++ ulong size = simple_strtoul (argv[4], NULL, 16); ++ int cmd = (strncmp (argv[1], "read", 4) == 0) ? ++ NANDRW_READ : NANDRW_WRITE; ++ int ret, total; ++ char *cmdtail = strchr (argv[1], '.'); ++ ++ if (cmdtail && !strncmp (cmdtail, ".oob", 2)) { ++ /* read out-of-band data */ ++ if (cmd & NANDRW_READ) { ++ ret = nand_read_oob (nand_dev_desc + curr_device, ++ off, size, (size_t *) & total, ++ (u_char *) addr); ++ } else { ++ ret = nand_write_oob (nand_dev_desc + curr_device, ++ off, size, (size_t *) & total, ++ (u_char *) addr); ++ } ++ return ret; ++ } else if (cmdtail && !strncmp (cmdtail, ".jffs2", 2)) ++ cmd |= NANDRW_JFFS2; /* skip bad blocks */ ++ else if (cmdtail && !strncmp (cmdtail, ".jffs2s", 2)) { ++ cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */ ++ if (cmd & NANDRW_READ) ++ cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */ ++ } + #ifdef SXNI855T +- /* need ".e" same as ".j" for compatibility with older units */ +- else if (cmdtail && !strcmp(cmdtail, ".e")) +- cmd |= NANDRW_JFFS2; /* skip bad blocks */ ++ /* need ".e" same as ".j" for compatibility with older units */ ++ else if (cmdtail && !strcmp (cmdtail, ".e")) ++ cmd |= NANDRW_JFFS2; /* skip bad blocks */ + #endif + #ifdef CFG_NAND_SKIP_BAD_DOT_I +- /* need ".i" same as ".jffs2s" for compatibility with older units (esd) */ +- /* ".i" for image -> read skips bad block (no 0xff) */ +- else if (cmdtail && !strcmp(cmdtail, ".i")) { +- cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */ +- if (cmd & NANDRW_READ) +- cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */ +- } ++ /* need ".i" same as ".jffs2s" for compatibility with older units (esd) */ ++ /* ".i" for image -> read skips bad block (no 0xff) */ ++ else if (cmdtail && !strcmp (cmdtail, ".i")) { ++ cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */ ++ if (cmd & NANDRW_READ) ++ cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */ ++ } + #endif /* CFG_NAND_SKIP_BAD_DOT_I */ +- else if (cmdtail) { +- printf ("Usage:\n%s\n", cmdtp->usage); +- return 1; +- } ++ else if (cmdtail) { ++ printf ("Usage:\n%s\n", cmdtp->usage); ++ return 1; ++ } + +- printf ("\nNAND %s: device %d offset %ld, size %ld ...\n", +- (cmd & NANDRW_READ) ? "read" : "write", +- curr_device, off, size); +- +- ret = nand_legacy_rw(nand_dev_desc + curr_device, cmd, off, size, +- (size_t *)&total, (u_char*)addr); +- +- printf (" %d bytes %s: %s\n", total, +- (cmd & NANDRW_READ) ? "read" : "written", +- ret ? "ERROR" : "OK"); +- +- return ret; +- } else if (strcmp(argv[1],"erase") == 0 && +- (argc == 4 || strcmp("clean", argv[2]) == 0)) { +- int clean = argc == 5; +- ulong off = simple_strtoul(argv[2 + clean], NULL, 16); +- ulong size = simple_strtoul(argv[3 + clean], NULL, 16); +- int ret; +- +- printf ("\nNAND erase: device %d offset %ld, size %ld ...\n", +- curr_device, off, size); ++ printf ("\nNAND %s: device %d offset %ld, size %ld ...\n", ++ (cmd & NANDRW_READ) ? "read" : "write", ++ curr_device, off, size); ++ ++ ret = nand_legacy_rw (nand_dev_desc + curr_device, ++ cmd, off, size, ++ (size_t *) & total, ++ (u_char *) addr); ++ ++ printf (" %d bytes %s: %s\n", total, ++ (cmd & NANDRW_READ) ? "read" : "written", ++ ret ? "ERROR" : "OK"); + +- ret = nand_legacy_erase (nand_dev_desc + curr_device, +- off, size, clean); ++ return ret; ++ } else if (strcmp (argv[1], "erase") == 0 && ++ (argc == 4 || strcmp ("clean", argv[2]) == 0)) { ++ int clean = argc == 5; ++ ulong off = ++ simple_strtoul (argv[2 + clean], NULL, 16); ++ ulong size = ++ simple_strtoul (argv[3 + clean], NULL, 16); ++ int ret; + +- printf("%s\n", ret ? "ERROR" : "OK"); ++ printf ("\nNAND erase: device %d offset %ld, size %ld ...\n", ++ curr_device, off, size); + +- return ret; +- } else { +- printf ("Usage:\n%s\n", cmdtp->usage); +- rcode = 1; +- } ++ ret = nand_legacy_erase (nand_dev_desc + curr_device, ++ off, size, clean); + +- return rcode; +- } ++ printf ("%s\n", ret ? "ERROR" : "OK"); ++ ++ return ret; ++ } else { ++ printf ("Usage:\n%s\n", cmdtp->usage); ++ rcode = 1; ++ } ++ ++ return rcode; ++ } + } + + U_BOOT_CMD( +diff -Naupr u-boot-1.1.6/common/cyclon2.c u-boot-1.1.6-fsl-1/common/cyclon2.c +--- u-boot-1.1.6/common/cyclon2.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/cyclon2.c 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,305 @@ ++/* ++ * (C) Copyright 2006 ++ * Heiko Schocher, hs@denx.de ++ * Based on ACE1XK.c ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ * ++ */ ++ ++#include <common.h> /* core U-Boot definitions */ ++#include <altera.h> ++#include <ACEX1K.h> /* ACEX device family */ ++ ++#if (CONFIG_FPGA & (CFG_ALTERA | CFG_CYCLON2)) ++ ++/* Define FPGA_DEBUG to get debug printf's */ ++#ifdef FPGA_DEBUG ++#define PRINTF(fmt,args...) printf (fmt ,##args) ++#else ++#define PRINTF(fmt,args...) ++#endif ++ ++/* Note: The assumption is that we cannot possibly run fast enough to ++ * overrun the device (the Slave Parallel mode can free run at 50MHz). ++ * If there is a need to operate slower, define CONFIG_FPGA_DELAY in ++ * the board config file to slow things down. ++ */ ++#ifndef CONFIG_FPGA_DELAY ++#define CONFIG_FPGA_DELAY() ++#endif ++ ++#ifndef CFG_FPGA_WAIT ++#define CFG_FPGA_WAIT CFG_HZ/10 /* 100 ms */ ++#endif ++ ++static int CYC2_ps_load( Altera_desc *desc, void *buf, size_t bsize ); ++static int CYC2_ps_dump( Altera_desc *desc, void *buf, size_t bsize ); ++/* static int CYC2_ps_info( Altera_desc *desc ); */ ++static int CYC2_ps_reloc( Altera_desc *desc, ulong reloc_offset ); ++ ++/* ------------------------------------------------------------------------- */ ++/* CYCLON2 Generic Implementation */ ++int CYC2_load (Altera_desc * desc, void *buf, size_t bsize) ++{ ++ int ret_val = FPGA_FAIL; ++ ++ switch (desc->iface) { ++ case passive_serial: ++ PRINTF ("%s: Launching Passive Serial Loader\n", __FUNCTION__); ++ ret_val = CYC2_ps_load (desc, buf, bsize); ++ break; ++ ++ /* Add new interface types here */ ++ ++ default: ++ printf ("%s: Unsupported interface type, %d\n", ++ __FUNCTION__, desc->iface); ++ } ++ ++ return ret_val; ++} ++ ++int CYC2_dump (Altera_desc * desc, void *buf, size_t bsize) ++{ ++ int ret_val = FPGA_FAIL; ++ ++ switch (desc->iface) { ++ case passive_serial: ++ PRINTF ("%s: Launching Passive Serial Dump\n", __FUNCTION__); ++ ret_val = CYC2_ps_dump (desc, buf, bsize); ++ break; ++ ++ /* Add new interface types here */ ++ ++ default: ++ printf ("%s: Unsupported interface type, %d\n", ++ __FUNCTION__, desc->iface); ++ } ++ ++ return ret_val; ++} ++ ++int CYC2_info( Altera_desc *desc ) ++{ ++ return FPGA_SUCCESS; ++} ++ ++int CYC2_reloc (Altera_desc * desc, ulong reloc_offset) ++{ ++ int ret_val = FPGA_FAIL; /* assume a failure */ ++ ++ if (desc->family != Altera_CYC2) { ++ printf ("%s: Unsupported family type, %d\n", ++ __FUNCTION__, desc->family); ++ return FPGA_FAIL; ++ } else ++ switch (desc->iface) { ++ case passive_serial: ++ ret_val = CYC2_ps_reloc (desc, reloc_offset); ++ break; ++ ++ /* Add new interface types here */ ++ ++ default: ++ printf ("%s: Unsupported interface type, %d\n", ++ __FUNCTION__, desc->iface); ++ } ++ ++ return ret_val; ++} ++ ++/* ------------------------------------------------------------------------- */ ++/* CYCLON2 Passive Serial Generic Implementation */ ++static int CYC2_ps_load (Altera_desc * desc, void *buf, size_t bsize) ++{ ++ int ret_val = FPGA_FAIL; /* assume the worst */ ++ Altera_CYC2_Passive_Serial_fns *fn = desc->iface_fns; ++ int ret = 0; ++ ++ PRINTF ("%s: start with interface functions @ 0x%p\n", ++ __FUNCTION__, fn); ++ ++ if (fn) { ++ int cookie = desc->cookie; /* make a local copy */ ++ unsigned long ts; /* timestamp */ ++ ++ PRINTF ("%s: Function Table:\n" ++ "ptr:\t0x%p\n" ++ "struct: 0x%p\n" ++ "config:\t0x%p\n" ++ "status:\t0x%p\n" ++ "write:\t0x%p\n" ++ "done:\t0x%p\n\n", ++ __FUNCTION__, &fn, fn, fn->config, fn->status, ++ fn->write, fn->done); ++#ifdef CFG_FPGA_PROG_FEEDBACK ++ printf ("Loading FPGA Device %d...", cookie); ++#endif ++ ++ /* ++ * Run the pre configuration function if there is one. ++ */ ++ if (*fn->pre) { ++ (*fn->pre) (cookie); ++ } ++ ++ /* Establish the initial state */ ++ (*fn->config) (TRUE, TRUE, cookie); /* Assert nCONFIG */ ++ ++ udelay(2); /* T_cfg > 2us */ ++ ++ /* Wait for nSTATUS to be asserted */ ++ ts = get_timer (0); /* get current time */ ++ do { ++ CONFIG_FPGA_DELAY (); ++ if (get_timer (ts) > CFG_FPGA_WAIT) { /* check the time */ ++ puts ("** Timeout waiting for STATUS to go high.\n"); ++ (*fn->abort) (cookie); ++ return FPGA_FAIL; ++ } ++ } while (!(*fn->status) (cookie)); ++ ++ /* Get ready for the burn */ ++ CONFIG_FPGA_DELAY (); ++ ++ ret = (*fn->write) (buf, bsize, TRUE, cookie); ++ if (ret) { ++ puts ("** Write failed.\n"); ++ (*fn->abort) (cookie); ++ return FPGA_FAIL; ++ } ++#ifdef CFG_FPGA_PROG_FEEDBACK ++ puts(" OK? ..."); ++#endif ++ ++ CONFIG_FPGA_DELAY (); ++ ++#ifdef CFG_FPGA_PROG_FEEDBACK ++ putc (' '); /* terminate the dotted line */ ++#endif ++ ++ /* ++ * Checking FPGA's CONF_DONE signal - correctly booted ? ++ */ ++ ++ if ( ! (*fn->done) (cookie) ) { ++ puts ("** Booting failed! CONF_DONE is still deasserted.\n"); ++ (*fn->abort) (cookie); ++ return (FPGA_FAIL); ++ } ++#ifdef CFG_FPGA_PROG_FEEDBACK ++ puts(" OK\n"); ++#endif ++ ++ ret_val = FPGA_SUCCESS; ++ ++#ifdef CFG_FPGA_PROG_FEEDBACK ++ if (ret_val == FPGA_SUCCESS) { ++ puts ("Done.\n"); ++ } ++ else { ++ puts ("Fail.\n"); ++ } ++#endif ++ (*fn->post) (cookie); ++ ++ } else { ++ printf ("%s: NULL Interface function table!\n", __FUNCTION__); ++ } ++ ++ return ret_val; ++} ++ ++static int CYC2_ps_dump (Altera_desc * desc, void *buf, size_t bsize) ++{ ++ /* Readback is only available through the Slave Parallel and */ ++ /* boundary-scan interfaces. */ ++ printf ("%s: Passive Serial Dumping is unavailable\n", ++ __FUNCTION__); ++ return FPGA_FAIL; ++} ++ ++static int CYC2_ps_reloc (Altera_desc * desc, ulong reloc_offset) ++{ ++ int ret_val = FPGA_FAIL; /* assume the worst */ ++ Altera_CYC2_Passive_Serial_fns *fn_r, *fn = ++ (Altera_CYC2_Passive_Serial_fns *) (desc->iface_fns); ++ ++ if (fn) { ++ ulong addr; ++ ++ /* Get the relocated table address */ ++ addr = (ulong) fn + reloc_offset; ++ fn_r = (Altera_CYC2_Passive_Serial_fns *) addr; ++ ++ if (!fn_r->relocated) { ++ ++ if (memcmp (fn_r, fn, ++ sizeof (Altera_CYC2_Passive_Serial_fns)) ++ == 0) { ++ /* good copy of the table, fix the descriptor pointer */ ++ desc->iface_fns = fn_r; ++ } else { ++ PRINTF ("%s: Invalid function table at 0x%p\n", ++ __FUNCTION__, fn_r); ++ return FPGA_FAIL; ++ } ++ ++ PRINTF ("%s: Relocating descriptor at 0x%p\n", __FUNCTION__, ++ desc); ++ ++ addr = (ulong) (fn->pre) + reloc_offset; ++ fn_r->pre = (Altera_pre_fn) addr; ++ ++ addr = (ulong) (fn->config) + reloc_offset; ++ fn_r->config = (Altera_config_fn) addr; ++ ++ addr = (ulong) (fn->status) + reloc_offset; ++ fn_r->status = (Altera_status_fn) addr; ++ ++ addr = (ulong) (fn->done) + reloc_offset; ++ fn_r->done = (Altera_done_fn) addr; ++ ++ addr = (ulong) (fn->write) + reloc_offset; ++ fn_r->write = (Altera_write_fn) addr; ++ ++ addr = (ulong) (fn->abort) + reloc_offset; ++ fn_r->abort = (Altera_abort_fn) addr; ++ ++ addr = (ulong) (fn->post) + reloc_offset; ++ fn_r->post = (Altera_post_fn) addr; ++ ++ fn_r->relocated = TRUE; ++ ++ } else { ++ /* this table has already been moved */ ++ /* XXX - should check to see if the descriptor is correct */ ++ desc->iface_fns = fn_r; ++ } ++ ++ ret_val = FPGA_SUCCESS; ++ } else { ++ printf ("%s: NULL Interface function table!\n", __FUNCTION__); ++ } ++ ++ return ret_val; ++} ++ ++#endif /* (CONFIG_FPGA & (CFG_ALTERA | CFG_CYCLON2)) */ +diff -Naupr u-boot-1.1.6/common/fpga.c u-boot-1.1.6-fsl-1/common/fpga.c +--- u-boot-1.1.6/common/fpga.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/fpga.c 2006-11-30 12:34:13.000000000 -0600 +@@ -139,7 +139,7 @@ static int fpga_dev_info( int devnum ) + printf( "Xilinx Device\nDescriptor @ 0x%p\n", desc ); + ret_val = xilinx_info( desc->devdesc ); + #else +- fpga_no_sup( __FUNCTION__, "Xilinx devices" ); ++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" ); + #endif + break; + case fpga_altera: +@@ -178,7 +178,7 @@ int fpga_reloc( fpga_type devtype, void + #if CONFIG_FPGA & CFG_FPGA_XILINX + ret_val = xilinx_reloc( desc, reloc_off ); + #else +- fpga_no_sup( __FUNCTION__, "Xilinx devices" ); ++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" ); + #endif + break; + case fpga_altera: +@@ -271,7 +271,7 @@ int fpga_load( int devnum, void *buf, si + #if CONFIG_FPGA & CFG_FPGA_XILINX + ret_val = xilinx_load( desc->devdesc, buf, bsize ); + #else +- fpga_no_sup( __FUNCTION__, "Xilinx devices" ); ++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" ); + #endif + break; + case fpga_altera: +@@ -304,7 +304,7 @@ int fpga_dump( int devnum, void *buf, si + #if CONFIG_FPGA & CFG_FPGA_XILINX + ret_val = xilinx_dump( desc->devdesc, buf, bsize ); + #else +- fpga_no_sup( __FUNCTION__, "Xilinx devices" ); ++ fpga_no_sup( (char *)__FUNCTION__, "Xilinx devices" ); + #endif + break; + case fpga_altera: +diff -Naupr u-boot-1.1.6/common/Makefile u-boot-1.1.6-fsl-1/common/Makefile +--- u-boot-1.1.6/common/Makefile 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/Makefile 2006-11-30 12:34:13.000000000 -0600 +@@ -41,7 +41,7 @@ COBJS = main.o ACEX1K.o altera.o bedbug. + cmd_pci.o cmd_pcmcia.o cmd_portio.o \ + cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o \ + cmd_usb.o cmd_vfd.o \ +- command.o console.o devices.o dlmalloc.o docecc.o \ ++ command.o console.o cyclon2.o devices.o dlmalloc.o docecc.o \ + environment.o env_common.o \ + env_nand.o env_dataflash.o env_flash.o env_eeprom.o \ + env_nvram.o env_nowhere.o \ +diff -Naupr u-boot-1.1.6/common/memsize.c u-boot-1.1.6-fsl-1/common/memsize.c +--- u-boot-1.1.6/common/memsize.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/common/memsize.c 2006-11-30 12:34:13.000000000 -0600 +@@ -21,6 +21,16 @@ + * MA 02111-1307 USA + */ + ++#include <config.h> ++#ifdef __PPC__ ++/* ++ * At least on G2 PowerPC cores, sequential accesses to non-existent ++ * memory must be synchronized. ++ */ ++# include <asm/io.h> /* for sync() */ ++#else ++# define sync() /* nothing */ ++#endif + + /* + * Check memory range for valid RAM. A simple memory test determines +@@ -38,20 +48,27 @@ long get_ram_size(volatile long *base, l + + for (cnt = (maxsize / sizeof (long)) >> 1; cnt > 0; cnt >>= 1) { + addr = base + cnt; /* pointer arith! */ ++ sync (); + save[i++] = *addr; ++ sync (); + *addr = ~cnt; + } + + addr = base; ++ sync (); + save[i] = *addr; ++ sync (); + *addr = 0; + ++ sync (); + if ((val = *addr) != 0) { + /* Restore the original data before leaving the function. + */ ++ sync (); + *addr = save[i]; + for (cnt = 1; cnt < maxsize / sizeof(long); cnt <<= 1) { + addr = base + cnt; ++ sync (); + *addr = save[--i]; + } + return (0); +diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/cpu.c u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu.c +--- u-boot-1.1.6/cpu/74xx_7xx/cpu.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu.c 2006-12-06 10:33:49.000000000 -0600 +@@ -101,6 +101,10 @@ get_cpu_type(void) + type = CPU_7457; + break; + ++ case 0x8004: ++ type = CPU_7448; ++ break; ++ + default: + break; + } +@@ -152,6 +156,10 @@ int checkcpu (void) + str = "MPC7410"; + break; + ++ case CPU_7448: ++ str = "MPC7448"; ++ break; ++ + case CPU_7450: + str = "MPC7450"; + break; +@@ -221,7 +229,7 @@ soft_restart(unsigned long addr) + void + do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + { +- ulong addr; ++ ulong addr; + /* flush and disable I/D cache */ + __asm__ __volatile__ ("mfspr 3, 1008" ::: "r3"); + __asm__ __volatile__ ("ori 5, 5, 0xcc00" ::: "r5"); +diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/cpu_init.c u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu_init.c +--- u-boot-1.1.6/cpu/74xx_7xx/cpu_init.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/cpu_init.c 2006-12-06 10:33:49.000000000 -0600 +@@ -43,6 +43,7 @@ cpu_init_f (void) + case CPU_7450: + case CPU_7455: + case CPU_7457: ++ case CPU_7448: + /* enable the timebase bit in HID0 */ + set_hid0(get_hid0() | 0x4000000); + break; +diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/speed.c u-boot-1.1.6-fsl-1/cpu/74xx_7xx/speed.c +--- u-boot-1.1.6/cpu/74xx_7xx/speed.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/speed.c 2006-12-06 10:33:49.000000000 -0600 +@@ -91,6 +91,7 @@ int get_clocks (void) + + /* calculate the clock frequency based upon the CPU type */ + switch (get_cpu_type()) { ++ case CPU_7448: + case CPU_7455: + case CPU_7457: + /* +diff -Naupr u-boot-1.1.6/cpu/74xx_7xx/start.S u-boot-1.1.6-fsl-1/cpu/74xx_7xx/start.S +--- u-boot-1.1.6/cpu/74xx_7xx/start.S 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/74xx_7xx/start.S 2006-12-06 10:33:49.000000000 -0600 +@@ -44,7 +44,8 @@ + + #if !defined(CONFIG_DB64360) && \ + !defined(CONFIG_DB64460) && \ +- !defined(CONFIG_CPCI750) ++ !defined(CONFIG_CPCI750) && \ ++ !defined(CONFIG_P3Mx) + #include <galileo/gt64260R.h> + #endif + +@@ -270,7 +271,7 @@ in_flash: + * gt-regs BAT can be reused after board_init_f calls + * board_early_init_f (EVB only). + */ +-#if !defined(CONFIG_BAB7xx) && !defined(CONFIG_ELPPC) ++#if !defined(CONFIG_BAB7xx) && !defined(CONFIG_ELPPC) && !defined(CONFIG_P3Mx) + /* enable address translation */ + bl enable_addr_trans + sync +@@ -757,7 +758,8 @@ in_ram: + defined(CONFIG_DB64360) || \ + defined(CONFIG_DB64460) || \ + defined(CONFIG_CPCI750) || \ +- defined(CONFIG_PPMC7XX) ++ defined(CONFIG_PPMC7XX) || \ ++ defined(CONFIG_P3Mx) + mr r4, r9 /* Use RAM copy of the global data */ + #endif + bl after_reloc +diff -Naupr u-boot-1.1.6/cpu/mpc5xxx/cpu.c u-boot-1.1.6-fsl-1/cpu/mpc5xxx/cpu.c +--- u-boot-1.1.6/cpu/mpc5xxx/cpu.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc5xxx/cpu.c 2006-12-06 10:33:49.000000000 -0600 +@@ -31,6 +31,10 @@ + #include <mpc5xxx.h> + #include <asm/processor.h> + ++#if defined(CONFIG_OF_FLAT_TREE) ++#include <ft_build.h> ++#endif ++ + DECLARE_GLOBAL_DATA_PTR; + + int checkcpu (void) +@@ -102,3 +106,26 @@ unsigned long get_tbclk (void) + } + + /* ------------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_OF_FLAT_TREE ++void ++ft_cpu_setup(void *blob, bd_t *bd) ++{ ++ u32 *p; ++ int len; ++ ++ /* Core XLB bus frequency */ ++ p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len); ++ if (p != NULL) ++ *p = cpu_to_be32(bd->bi_busfreq); ++ ++ /* SOC peripherals use the IPB bus frequency */ ++ p = ft_get_prop(blob, "/" OF_SOC "/bus-frequency", &len); ++ if (p != NULL) ++ *p = cpu_to_be32(bd->bi_ipbfreq); ++ ++ p = ft_get_prop(blob, "/" OF_SOC "/ethernet@3000/mac-address", &len); ++ if (p != NULL) ++ memcpy(p, bd->bi_enetaddr, 6); ++} ++#endif +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/cpu.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu.c +--- u-boot-1.1.6/cpu/mpc83xx/cpu.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu.c 2006-11-30 12:34:13.000000000 -0600 +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004 Freescale Semiconductor, Inc. ++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc. + * + * See file CREDITS for list of people who contributed to this + * project. +@@ -18,11 +18,6 @@ + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA +- * +- * Change log: +- * +- * 20050101: Eran Liberty (liberty@freescale.com) +- * Initial file creating (porting from 85XX & 8260) + */ + + /* +@@ -43,35 +38,140 @@ DECLARE_GLOBAL_DATA_PTR; + + int checkcpu(void) + { ++ volatile immap_t *immr; + ulong clock = gd->cpu_clk; + u32 pvr = get_pvr(); ++ u32 spridr; + char buf[32]; + ++ immr = (immap_t *)CFG_IMMR; ++ + if ((pvr & 0xFFFF0000) != PVR_83xx) { + puts("Not MPC83xx Family!!!\n"); + return -1; + } + +- puts("CPU: MPC83xx, "); +- switch(pvr) { +- case PVR_8349_REV10: ++ spridr = immr->sysconf.spridr; ++ puts("CPU: "); ++ switch(spridr) { ++ case SPR_8349E_REV10: ++ case SPR_8349E_REV11: ++ puts("MPC8349E, "); ++ break; ++ case SPR_8349_REV10: ++ case SPR_8349_REV11: ++ puts("MPC8349, "); ++ break; ++ case SPR_8347E_REV10_TBGA: ++ case SPR_8347E_REV11_TBGA: ++ case SPR_8347E_REV10_PBGA: ++ case SPR_8347E_REV11_PBGA: ++ puts("MPC8347E, "); ++ break; ++ case SPR_8347_REV10_TBGA: ++ case SPR_8347_REV11_TBGA: ++ case SPR_8347_REV10_PBGA: ++ case SPR_8347_REV11_PBGA: ++ puts("MPC8347, "); ++ break; ++ case SPR_8343E_REV10: ++ case SPR_8343E_REV11: ++ puts("MPC8343E, "); + break; +- case PVR_8349_REV11: ++ case SPR_8343_REV10: ++ case SPR_8343_REV11: ++ puts("MPC8343, "); ++ break; ++ case SPR_8360E_REV10: ++ case SPR_8360E_REV11: ++ case SPR_8360E_REV12: ++ puts("MPC8360E, "); ++ break; ++ case SPR_8360_REV10: ++ case SPR_8360_REV11: ++ case SPR_8360_REV12: ++ puts("MPC8360, "); + break; + default: + puts("Rev: Unknown\n"); + return -1; /* Not sure what this is */ + } +- printf("Rev: %d.%d at %s MHz\n", (pvr & 0xf0) >> 4, +- (pvr & 0x0f), strmhz(buf, clock)); + ++#if defined(CONFIG_MPC8349) ++ printf("Rev: %02x at %s MHz\n", (spridr & 0x0000FFFF)>>4 |(spridr & 0x0000000F), strmhz(buf, clock)); ++#else ++ printf("Rev: %02x at %s MHz\n", spridr & 0x0000FFFF, strmhz(buf, clock)); ++#endif + return 0; + } + + ++/* ++ * Program a UPM with the code supplied in the table. ++ * ++ * The 'dummy' variable is used to increment the MAD. 'dummy' is ++ * supposed to be a pointer to the memory of the device being ++ * programmed by the UPM. The data in the MDR is written into ++ * memory and the MAD is incremented every time there's a read ++ * from 'dummy'. Unfortunately, the current prototype for this ++ * function doesn't allow for passing the address of this ++ * device, and changing the prototype will break a number lots ++ * of other code, so we need to use a round-about way of finding ++ * the value for 'dummy'. ++ * ++ * The value can be extracted from the base address bits of the ++ * Base Register (BR) associated with the specific UPM. To find ++ * that BR, we need to scan all 8 BRs until we find the one that ++ * has its MSEL bits matching the UPM we want. Once we know the ++ * right BR, we can extract the base address bits from it. ++ * ++ * The MxMR and the BR and OR of the chosen bank should all be ++ * configured before calling this function. ++ * ++ * Parameters: ++ * upm: 0=UPMA, 1=UPMB, 2=UPMC ++ * table: Pointer to an array of values to program ++ * size: Number of elements in the array. Must be 64 or less. ++ */ + void upmconfig (uint upm, uint *table, uint size) + { +- hang(); /* FIXME: upconfig() needed? */ ++#if defined(CONFIG_MPC834X) ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; ++ volatile lbus83xx_t *lbus = &immap->lbus; ++ volatile uchar *dummy = NULL; ++ const u32 msel = (upm + 4) << BR_MSEL_SHIFT; /* What the MSEL field in BRn should be */ ++ volatile u32 *mxmr = &lbus->mamr + upm; /* Pointer to mamr, mbmr, or mcmr */ ++ uint i; ++ ++ /* Scan all the banks to determine the base address of the device */ ++ for (i = 0; i < 8; i++) { ++ if ((lbus->bank[i].br & BR_MSEL) == msel) { ++ dummy = (uchar *) (lbus->bank[i].br & BR_BA); ++ break; ++ } ++ } ++ ++ if (!dummy) { ++ printf("Error: %s() could not find matching BR\n", __FUNCTION__); ++ hang(); ++ } ++ ++ /* Set the OP field in the MxMR to "write" and the MAD field to 000000 */ ++ *mxmr = (*mxmr & 0xCFFFFFC0) | 0x10000000; ++ ++ for (i = 0; i < size; i++) { ++ lbus->mdr = table[i]; ++ __asm__ __volatile__ ("sync"); ++ *dummy; /* Write the value to memory and increment MAD */ ++ __asm__ __volatile__ ("sync"); ++ } ++ ++ /* Set the OP field in the MxMR to "normal" and the MAD field to 000000 */ ++ *mxmr &= 0xCFFFFFC0; ++#else ++ printf("Error: %s() not defined for this configuration.\n", __FUNCTION__); ++ hang(); ++#endif + } + + +@@ -83,7 +183,7 @@ do_reset (cmd_tbl_t * cmdtp, int flag, i + ulong addr; + #endif + +- volatile immap_t *immap = (immap_t *) CFG_IMMRBAR; ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; + + #ifdef MPC83xx_RESET + /* Interrupts and MMU off */ +@@ -150,9 +250,21 @@ unsigned long get_tbclk(void) + #if defined(CONFIG_WATCHDOG) + void watchdog_reset (void) + { +- hang(); /* FIXME: implement watchdog_reset()? */ ++#ifdef CONFIG_MPC834X ++ int re_enable = disable_interrupts(); ++ ++ /* Reset the 83xx watchdog */ ++ volatile immap_t *immr = (immap_t *) CFG_IMMR; ++ immr->wdt.swsrr = 0x556c; ++ immr->wdt.swsrr = 0xaa39; ++ ++ if (re_enable) ++ enable_interrupts (); ++#else ++ hang(); ++#endif + } +-#endif /* CONFIG_WATCHDOG */ ++#endif + + #if defined(CONFIG_OF_FLAT_TREE) + void +@@ -180,12 +292,12 @@ ft_cpu_setup(void *blob, bd_t *bd) + *p = cpu_to_be32(clock); + + #ifdef CONFIG_MPC83XX_TSEC1 +- p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/address", &len); ++ p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/local-mac-address", &len); + memcpy(p, bd->bi_enetaddr, 6); + #endif + + #ifdef CONFIG_MPC83XX_TSEC2 +- p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/address", &len); ++ p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/local-mac-address", &len); + memcpy(p, bd->bi_enet1addr, 6); + #endif + } +@@ -194,8 +306,8 @@ ft_cpu_setup(void *blob, bd_t *bd) + #if defined(CONFIG_DDR_ECC) + void dma_init(void) + { +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile dma8349_t *dma = &immap->dma; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile dma83xx_t *dma = &immap->dma; + volatile u32 status = swab32(dma->dmasr0); + volatile u32 dmamr0 = swab32(dma->dmamr0); + +@@ -225,8 +337,8 @@ void dma_init(void) + + uint dma_check(void) + { +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile dma8349_t *dma = &immap->dma; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile dma83xx_t *dma = &immap->dma; + volatile u32 status = swab32(dma->dmasr0); + volatile u32 byte_count = swab32(dma->dmabcr0); + +@@ -244,8 +356,8 @@ uint dma_check(void) + + int dma_xfer(void *dest, u32 count, void *src) + { +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile dma8349_t *dma = &immap->dma; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile dma83xx_t *dma = &immap->dma; + volatile u32 dmamr0; + + /* initialize DMASARn, DMADAR and DMAABCRn */ +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/cpu_init.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu_init.c +--- u-boot-1.1.6/cpu/mpc83xx/cpu_init.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/cpu_init.c 2006-11-30 12:34:13.000000000 -0600 +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004 Freescale Semiconductor, Inc. ++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc. + * + * See file CREDITS for list of people who contributed to this + * project. +@@ -18,11 +18,6 @@ + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA +- * +- * Change log: +- * +- * 20050101: Eran Liberty (liberty@freescale.com) +- * Initial file creating (porting from 85XX & 8260) + */ + + #include <common.h> +@@ -31,6 +26,30 @@ + + DECLARE_GLOBAL_DATA_PTR; + ++#ifdef CONFIG_QE ++extern qe_iop_conf_t qe_iop_conf_tab[]; ++extern void qe_config_iopin(u8 port, u8 pin, int dir, ++ int open_drain, int assign); ++extern void qe_init(uint qe_base); ++extern void qe_reset(void); ++ ++static void config_qe_ioports(void) ++{ ++ u8 port, pin; ++ int dir, open_drain, assign; ++ int i; ++ ++ for (i = 0; qe_iop_conf_tab[i].assign != QE_IOP_TAB_END; i++) { ++ port = qe_iop_conf_tab[i].port; ++ pin = qe_iop_conf_tab[i].pin; ++ dir = qe_iop_conf_tab[i].dir; ++ open_drain = qe_iop_conf_tab[i].open_drain; ++ assign = qe_iop_conf_tab[i].assign; ++ qe_config_iopin(port, pin, dir, open_drain, assign); ++ } ++} ++#endif ++ + /* + * Breathe some life into the CPU... + * +@@ -46,6 +65,37 @@ void cpu_init_f (volatile immap_t * im) + /* Clear initial global data */ + memset ((void *) gd, 0, sizeof (gd_t)); + ++ /* system performance tweaking */ ++ ++#ifdef CFG_ACR_PIPE_DEP ++ /* Arbiter pipeline depth */ ++ im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) | (3 << ACR_PIPE_DEP_SHIFT); ++#endif ++ ++#ifdef CFG_SPCR_TSEC1EP ++ /* TSEC1 Emergency priority */ ++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC1EP) | (3 << SPCR_TSEC1EP_SHIFT); ++#endif ++ ++#ifdef CFG_SPCR_TSEC2EP ++ /* TSEC2 Emergency priority */ ++ im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_TSEC2EP) | (3 << SPCR_TSEC2EP_SHIFT); ++#endif ++ ++#ifdef CFG_SCCR_TSEC1CM ++ /* TSEC1 clock mode */ ++ im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC1CM) | (1 << SCCR_TSEC1CM_SHIFT); ++#endif ++#ifdef CFG_SCCR_TSEC2CM ++ /* TSEC2 & I2C1 clock mode */ ++ im->clk.sccr = (im->clk.sccr & ~SCCR_TSEC2CM) | (1 << SCCR_TSEC2CM_SHIFT); ++#endif ++ ++#ifdef CFG_ACR_RPTCNT ++ /* Arbiter repeat count */ ++ im->arbiter.acr = ((im->arbiter.acr & ~(ACR_RPTCNT)) | (3 << ACR_RPTCNT_SHIFT)); ++#endif ++ + /* RSR - Reset Status Register - clear all status (4.6.1.3) */ + gd->reset_status = im->reset.rsr; + im->reset.rsr = ~(RSR_RES); +@@ -69,6 +119,10 @@ void cpu_init_f (volatile immap_t * im) + #ifdef CFG_SICRL + im->sysconf.sicrl = CFG_SICRL; + #endif ++#ifdef CONFIG_QE ++ /* Config QE ioports */ ++ config_qe_ioports(); ++#endif + + /* + * Memory Controller: +@@ -157,12 +211,12 @@ void cpu_init_f (volatile immap_t * im) + #endif + } + +- +-/* +- * Initialize higher level parts of CPU like time base and timers. +- */ +- + int cpu_init_r (void) + { ++#ifdef CONFIG_QE ++ uint qe_base = CFG_IMMR + 0x00100000; /* QE immr base */ ++ qe_init(qe_base); ++ qe_reset(); ++#endif + return 0; + } +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/i2c.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/i2c.c +--- u-boot-1.1.6/cpu/mpc83xx/i2c.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/i2c.c 1969-12-31 18:00:00.000000000 -0600 +@@ -1,253 +0,0 @@ +-/* +- * (C) Copyright 2003,Motorola Inc. +- * Xianghua Xiao <x.xiao@motorola.com> +- * Adapted for Motorola 85xx chip. +- * +- * (C) Copyright 2003 +- * Gleb Natapov <gnatapov@mrv.com> +- * Some bits are taken from linux driver writen by adrian@humboldt.co.uk +- * +- * Hardware I2C driver for MPC107 PCI bridge. +- * +- * See file CREDITS for list of people who contributed to this +- * project. +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License as +- * published by the Free Software Foundation; either version 2 of +- * the License, or (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, +- * MA 02111-1307 USA +- * +- * Change log: +- * +- * 20050101: Eran Liberty (liberty@freescale.com) +- * Initial file creating (porting from 85XX & 8260) +- */ +- +-#include <common.h> +-#include <command.h> +-#include <asm/io.h> +- +-#ifdef CONFIG_HARD_I2C +-#include <i2c.h> +-#include <asm/i2c.h> +- +-#if defined(CONFIG_MPC8349EMDS) || defined(CONFIG_TQM834X) +-i2c_t * mpc8349_i2c = (i2c_t*)(CFG_IMMRBAR + CFG_I2C_OFFSET); +-#endif +- +-void +-i2c_init(int speed, int slaveadd) +-{ +- /* stop I2C controller */ +- writeb(0x00 , &I2C->cr); +- +- /* set clock */ +- writeb(0x3f, &I2C->fdr); +- +- /* set default filter */ +- writeb(0x10,&I2C->dfsrr); +- +- /* write slave address */ +- writeb(slaveadd, &I2C->adr); +- +- /* clear status register */ +- writeb(0x00, &I2C->sr); +- +- /* start I2C controller */ +- writeb(I2C_CR_MEN, &I2C->cr); +-} +- +-static __inline__ int +-i2c_wait4bus (void) +-{ +- ulong timeval = get_timer (0); +- while (readb(&I2C->sr) & I2C_SR_MBB) { +- if (get_timer (timeval) > I2C_TIMEOUT) { +- return -1; +- } +- } +- return 0; +-} +- +-static __inline__ int +-i2c_wait (int write) +-{ +- u32 csr; +- ulong timeval = get_timer(0); +- do { +- csr = readb(&I2C->sr); +- +- if (!(csr & I2C_SR_MIF)) +- continue; +- +- writeb(0x0, &I2C->sr); +- +- if (csr & I2C_SR_MAL) { +- debug("i2c_wait: MAL\n"); +- return -1; +- } +- +- if (!(csr & I2C_SR_MCF)) { +- debug("i2c_wait: unfinished\n"); +- return -1; +- } +- +- if (write == I2C_WRITE && (csr & I2C_SR_RXAK)) { +- debug("i2c_wait: No RXACK\n"); +- return -1; +- } +- +- return 0; +- } while (get_timer (timeval) < I2C_TIMEOUT); +- +- debug("i2c_wait: timed out\n"); +- return -1; +-} +- +-static __inline__ int +-i2c_write_addr (u8 dev, u8 dir, int rsta) +-{ +- writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX | +- (rsta?I2C_CR_RSTA:0), +- &I2C->cr); +- +- writeb((dev << 1) | dir, &I2C->dr); +- +- if (i2c_wait (I2C_WRITE) < 0) +- return 0; +- return 1; +-} +- +-static __inline__ int +-__i2c_write (u8 *data, int length) +-{ +- int i; +- +- writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX, +- &I2C->cr); +- +- for (i=0; i < length; i++) { +- writeb(data[i], &I2C->dr); +- +- if (i2c_wait (I2C_WRITE) < 0) +- break; +- } +- return i; +-} +- +-static __inline__ int +-__i2c_read (u8 *data, int length) +-{ +- int i; +- +- writeb(I2C_CR_MEN | I2C_CR_MSTA | +- ((length == 1) ? I2C_CR_TXAK : 0), +- &I2C->cr); +- +- /* dummy read */ +- readb(&I2C->dr); +- +- for (i=0; i < length; i++) { +- if (i2c_wait (I2C_READ) < 0) +- break; +- +- /* Generate ack on last next to last byte */ +- if (i == length - 2) +- writeb(I2C_CR_MEN | I2C_CR_MSTA | +- I2C_CR_TXAK, +- &I2C->cr); +- +- /* Generate stop on last byte */ +- if (i == length - 1) +- writeb(I2C_CR_MEN | I2C_CR_TXAK, &I2C->cr); +- +- data[i] = readb(&I2C->dr); +- } +- return i; +-} +- +-int +-i2c_read (u8 dev, uint addr, int alen, u8 *data, int length) +-{ +- int i = 0; +- u8 *a = (u8*)&addr; +- +- if (i2c_wait4bus () < 0) +- goto exit; +- +- if (i2c_write_addr (dev, I2C_WRITE, 0) == 0) +- goto exit; +- +- if (__i2c_write (&a[4 - alen], alen) != alen) +- goto exit; +- +- if (i2c_write_addr (dev, I2C_READ, 1) == 0) +- goto exit; +- +- i = __i2c_read (data, length); +- +- exit: +- writeb(I2C_CR_MEN, &I2C->cr); +- return !(i == length); +-} +- +-int +-i2c_write (u8 dev, uint addr, int alen, u8 *data, int length) +-{ +- int i = 0; +- u8 *a = (u8*)&addr; +- +- if (i2c_wait4bus () < 0) +- goto exit; +- +- if (i2c_write_addr (dev, I2C_WRITE, 0) == 0) +- goto exit; +- +- if (__i2c_write (&a[4 - alen], alen) != alen) +- goto exit; +- +- i = __i2c_write (data, length); +- +- exit: +- writeb(I2C_CR_MEN, &I2C->cr); +- return !(i == length); +-} +- +-int i2c_probe (uchar chip) +-{ +- int tmp; +- +- /* +- * Try to read the first location of the chip. The underlying +- * driver doesn't appear to support sending just the chip address +- * and looking for an <ACK> back. +- */ +- udelay(10000); +- return i2c_read (chip, 0, 1, (uchar *)&tmp, 1); +-} +- +-uchar i2c_reg_read (uchar i2c_addr, uchar reg) +-{ +- uchar buf[1]; +- +- i2c_read (i2c_addr, reg, 1, buf, 1); +- +- return (buf[0]); +-} +- +-void i2c_reg_write (uchar i2c_addr, uchar reg, uchar val) +-{ +- i2c_write (i2c_addr, reg, 1, &val, 1); +-} +- +-#endif /* CONFIG_HARD_I2C */ +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/interrupts.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/interrupts.c +--- u-boot-1.1.6/cpu/mpc83xx/interrupts.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/interrupts.c 2006-11-30 12:34:13.000000000 -0600 +@@ -21,13 +21,6 @@ + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA +- * +- * Change log: +- * +- * Hacked for MPC8260 by Murray.Jensen@cmst.csiro.au, 22-Oct-00 +- * +- * 20050101: Eran Liberty (liberty@freescale.com) +- * Initial file creating (porting from 85XX & 8260) + */ + + #include <common.h> +@@ -45,7 +38,7 @@ struct irq_action { + + int interrupt_init_cpu (unsigned *decrementer_count) + { +- volatile immap_t *immr = (immap_t *) CFG_IMMRBAR; ++ volatile immap_t *immr = (immap_t *) CFG_IMMR; + + *decrementer_count = (gd->bus_clk / 4) / CFG_HZ; + +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/Makefile u-boot-1.1.6-fsl-1/cpu/mpc83xx/Makefile +--- u-boot-1.1.6/cpu/mpc83xx/Makefile 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/Makefile 2006-11-10 11:24:29.000000000 -0600 +@@ -27,9 +27,9 @@ include $(TOPDIR)/config.mk + + LIB = $(obj)lib$(CPU).a + +-START = start.o resetvec.o ++START = start.o + COBJS = traps.o cpu.o cpu_init.o speed.o interrupts.o \ +- i2c.o spd_sdram.o ++ spd_sdram.o qe_io.o + + SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) + OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/qe_io.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/qe_io.c +--- u-boot-1.1.6/cpu/mpc83xx/qe_io.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/qe_io.c 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,85 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * based on source code of Shlomi Gridish ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include "common.h" ++#include "asm/errno.h" ++#include "asm/io.h" ++#include "asm/immap_83xx.h" ++ ++#if defined(CONFIG_QE) ++#define NUM_OF_PINS 32 ++void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign) ++{ ++ u32 pin_2bit_mask; ++ u32 pin_2bit_dir; ++ u32 pin_2bit_assign; ++ u32 pin_1bit_mask; ++ u32 tmp_val; ++ volatile immap_t *im = (volatile immap_t *)CFG_IMMR; ++ volatile gpio83xx_t *par_io =(volatile gpio83xx_t *)&im->gpio; ++ ++ /* Caculate pin location and 2bit mask and dir */ ++ pin_2bit_mask = (u32)(0x3 << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2)); ++ pin_2bit_dir = (u32)(dir << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2)); ++ ++ /* Setup the direction */ ++ tmp_val = (pin > (NUM_OF_PINS/2) - 1) ? \ ++ in_be32(&par_io->ioport[port].dir2) : ++ in_be32(&par_io->ioport[port].dir1); ++ ++ if (pin > (NUM_OF_PINS/2) -1) { ++ out_be32(&par_io->ioport[port].dir2, ~pin_2bit_mask & tmp_val); ++ out_be32(&par_io->ioport[port].dir2, pin_2bit_dir | tmp_val); ++ } else { ++ out_be32(&par_io->ioport[port].dir1, ~pin_2bit_mask & tmp_val); ++ out_be32(&par_io->ioport[port].dir1, pin_2bit_dir | tmp_val); ++ } ++ ++ /* Calculate pin location for 1bit mask */ ++ pin_1bit_mask = (u32)(1 << (NUM_OF_PINS - (pin+1))); ++ ++ /* Setup the open drain */ ++ tmp_val = in_be32(&par_io->ioport[port].podr); ++ if (open_drain) { ++ out_be32(&par_io->ioport[port].podr, pin_1bit_mask | tmp_val); ++ } else { ++ out_be32(&par_io->ioport[port].podr, ~pin_1bit_mask & tmp_val); ++ } ++ ++ /* Setup the assignment */ ++ tmp_val = (pin > (NUM_OF_PINS/2) - 1) ? ++ in_be32(&par_io->ioport[port].ppar2): ++ in_be32(&par_io->ioport[port].ppar1); ++ pin_2bit_assign = (u32)(assign ++ << (NUM_OF_PINS - (pin%(NUM_OF_PINS/2)+1)*2)); ++ ++ /* Clear and set 2 bits mask */ ++ if (pin > (NUM_OF_PINS/2) - 1) { ++ out_be32(&par_io->ioport[port].ppar2, ~pin_2bit_mask & tmp_val); ++ out_be32(&par_io->ioport[port].ppar2, pin_2bit_assign | tmp_val); ++ } else { ++ out_be32(&par_io->ioport[port].ppar1, ~pin_2bit_mask & tmp_val); ++ out_be32(&par_io->ioport[port].ppar1, pin_2bit_assign | tmp_val); ++ } ++} ++ ++#endif /* CONFIG_QE */ +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/resetvec.S u-boot-1.1.6-fsl-1/cpu/mpc83xx/resetvec.S +--- u-boot-1.1.6/cpu/mpc83xx/resetvec.S 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/resetvec.S 1969-12-31 18:00:00.000000000 -0600 +@@ -1,6 +0,0 @@ +- .section .resetvec,"ax" +-#ifndef FIXME +-#if 0 +- b _start_e500 +-#endif +-#endif +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/spd_sdram.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/spd_sdram.c +--- u-boot-1.1.6/cpu/mpc83xx/spd_sdram.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/spd_sdram.c 2006-12-06 10:33:49.000000000 -0600 +@@ -1,8 +1,10 @@ + /* ++ * (C) Copyright 2006 Freescale Semiconductor, Inc. ++ * + * (C) Copyright 2006 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * +- * Copyright 2004 Freescale Semiconductor. ++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc. + * (C) Copyright 2003 Motorola Inc. + * Xianghua Xiao (X.Xiao@motorola.com) + * +@@ -23,11 +25,6 @@ + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA +- * +- * Change log: +- * +- * 20050101: Eran Liberty (liberty@freescale.com) +- * Initial file creating (porting from 85XX & 8260) + */ + + #include <common.h> +@@ -39,7 +36,9 @@ + + #ifdef CONFIG_SPD_EEPROM + +-#if defined(CONFIG_DDR_ECC) ++DECLARE_GLOBAL_DATA_PTR; ++ ++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) + extern void dma_init(void); + extern uint dma_check(void); + extern int dma_xfer(void *dest, uint count, void *src); +@@ -52,16 +51,16 @@ extern int dma_xfer(void *dest, uint cou + /* + * Convert picoseconds into clock cycles (rounding up if needed). + */ +- + int + picos_to_clk(int picos) + { ++ unsigned int ddr_bus_clk; + int clks; + +- clks = picos / (2000000000 / (get_bus_freq(0) / 1000)); +- if (picos % (2000000000 / (get_bus_freq(0) / 1000)) != 0) { +- clks++; +- } ++ ddr_bus_clk = gd->ddr_clk >> 1; ++ clks = picos / ((1000000000 / ddr_bus_clk) * 1000); ++ if (picos % ((1000000000 / ddr_bus_clk) * 1000) != 0) ++ clks++; + + return clks; + } +@@ -103,33 +102,72 @@ static void spd_debug(spd_eeprom_t *spd) + + long int spd_sdram() + { +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile ddr8349_t *ddr = &immap->ddr; +- volatile law8349_t *ecm = &immap->sysconf.ddrlaw[0]; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile ddr83xx_t *ddr = &immap->ddr; ++ volatile law83xx_t *ecm = &immap->sysconf.ddrlaw[0]; + spd_eeprom_t spd; +- unsigned tmp, tmp1; + unsigned int memsize; + unsigned int law_size; +- unsigned char caslat; +- unsigned int trfc, trfc_clk, trfc_low; ++ unsigned char caslat, caslat_ctrl; ++ unsigned char burstlen; ++ unsigned int max_bus_clk; ++ unsigned int max_data_rate, effective_data_rate; ++ unsigned int ddrc_clk; ++ unsigned int refresh_clk; ++ unsigned sdram_cfg; ++ unsigned int ddrc_ecc_enable; + ++ /* Read SPD parameters with I2C */ + CFG_READ_SPD(SPD_EEPROM_ADDRESS, 0, 1, (uchar *) & spd, sizeof (spd)); + #ifdef SPD_DEBUG + spd_debug(&spd); + #endif ++ /* Check the memory type */ ++ if (spd.mem_type != SPD_MEMTYPE_DDR) { ++ printf("DDR: Module mem type is %02X\n", spd.mem_type); ++ return 0; ++ } ++ ++ /* Check the number of physical bank */ + if (spd.nrows > 2) { +- puts("DDR:Only two chip selects are supported on ADS.\n"); ++ printf("DDR: The number of physical bank is %02X\n", spd.nrows); + return 0; + } + +- if (spd.nrow_addr < 12 +- || spd.nrow_addr > 14 +- || spd.ncol_addr < 8 +- || spd.ncol_addr > 11) { +- puts("DDR:Row or Col number unsupported.\n"); ++ /* Check if the number of row of the module is in the range of DDRC */ ++ if (spd.nrow_addr < 12 || spd.nrow_addr > 14) { ++ printf("DDR: Row number is out of range of DDRC, row=%02X\n", ++ spd.nrow_addr); + return 0; + } + ++ /* Check if the number of col of the module is in the range of DDRC */ ++ if (spd.ncol_addr < 8 || spd.ncol_addr > 11) { ++ printf("DDR: Col number is out of range of DDRC, col=%02X\n", ++ spd.ncol_addr); ++ return 0; ++ } ++ /* Setup DDR chip select register */ ++#ifdef CFG_83XX_DDR_USES_CS0 ++ ddr->csbnds[0].csbnds = (banksize(spd.row_dens) >> 24) - 1; ++ ddr->cs_config[0] = ( 1 << 31 ++ | (spd.nrow_addr - 12) << 8 ++ | (spd.ncol_addr - 8) ); ++ debug("\n"); ++ debug("cs0_bnds = 0x%08x\n",ddr->csbnds[0].csbnds); ++ debug("cs0_config = 0x%08x\n",ddr->cs_config[0]); ++ ++ if (spd.nrows == 2) { ++ ddr->csbnds[1].csbnds = ( (banksize(spd.row_dens) >> 8) ++ | ((banksize(spd.row_dens) >> 23) - 1) ); ++ ddr->cs_config[1] = ( 1<<31 ++ | (spd.nrow_addr-12) << 8 ++ | (spd.ncol_addr-8) ); ++ debug("cs1_bnds = 0x%08x\n",ddr->csbnds[1].csbnds); ++ debug("cs1_config = 0x%08x\n",ddr->cs_config[1]); ++ } ++ ++#else + ddr->csbnds[2].csbnds = (banksize(spd.row_dens) >> 24) - 1; + ddr->cs_config[2] = ( 1 << 31 + | (spd.nrow_addr - 12) << 8 +@@ -147,6 +185,7 @@ long int spd_sdram() + debug("cs3_bnds = 0x%08x\n",ddr->csbnds[3].csbnds); + debug("cs3_config = 0x%08x\n",ddr->cs_config[3]); + } ++#endif + + if (spd.mem_type != 0x07) { + puts("No DDR module found!\n"); +@@ -172,56 +211,136 @@ long int spd_sdram() + debug("DDR:ar=0x%08x\n", ecm->ar); + + /* +- * find the largest CAS +- */ +- if(spd.cas_lat & 0x40) { +- caslat = 7; +- } else if (spd.cas_lat & 0x20) { +- caslat = 6; +- } else if (spd.cas_lat & 0x10) { +- caslat = 5; +- } else if (spd.cas_lat & 0x08) { +- caslat = 4; +- } else if (spd.cas_lat & 0x04) { +- caslat = 3; +- } else if (spd.cas_lat & 0x02) { +- caslat = 2; +- } else if (spd.cas_lat & 0x01) { +- caslat = 1; +- } else { +- puts("DDR:no valid CAS Latency information.\n"); ++ * Find the largest CAS by locating the highest 1 bit ++ * in the spd.cas_lat field. Translate it to a DDR ++ * controller field value: ++ * ++ * CAS Lat DDR I Ctrl ++ * Clocks SPD Bit Value ++ * -------+--------+--------- ++ * 1.0 0 001 ++ * 1.5 1 010 ++ * 2.0 2 011 ++ * 2.5 3 100 ++ * 3.0 4 101 ++ * 3.5 5 110 ++ * 4.0 6 111 ++ */ ++ caslat = __ilog2(spd.cas_lat); ++ ++ if (caslat > 6 ) { ++ printf("DDR: Invalid SPD CAS Latency, caslat=%02X\n", ++ spd.cas_lat); + return 0; + } +- +- tmp = 20000 / (((spd.clk_cycle & 0xF0) >> 4) * 10 +- + (spd.clk_cycle & 0x0f)); +- debug("DDR:Module maximum data rate is: %dMhz\n", tmp); +- +- tmp1 = get_bus_freq(0) / 1000000; +- if (tmp1 < 230 && tmp1 >= 90 && tmp >= 230) { +- /* 90~230 range, treated as DDR 200 */ +- if (spd.clk_cycle3 == 0xa0) +- caslat -= 2; +- else if(spd.clk_cycle2 == 0xa0) +- caslat--; +- } else if (tmp1 < 280 && tmp1 >= 230 && tmp >= 280) { +- /* 230-280 range, treated as DDR 266 */ +- if (spd.clk_cycle3 == 0x75) +- caslat -= 2; +- else if (spd.clk_cycle2 == 0x75) +- caslat--; +- } else if (tmp1 < 350 && tmp1 >= 280 && tmp >= 350) { +- /* 280~350 range, treated as DDR 333 */ +- if (spd.clk_cycle3 == 0x60) +- caslat -= 2; +- else if (spd.clk_cycle2 == 0x60) +- caslat--; +- } else if (tmp1 < 90 || tmp1 >= 350) { +- /* DDR rate out-of-range */ +- puts("DDR:platform frequency is not fit for DDR rate\n"); +- return 0; ++ max_bus_clk = 1000 *10 / (((spd.clk_cycle & 0xF0) >> 4) * 10 ++ + (spd.clk_cycle & 0x0f)); ++ max_data_rate = max_bus_clk * 2; ++ ++ debug("DDR:Module maximum data rate is: %dMhz\n", max_data_rate); ++ ++ ddrc_clk = gd->ddr_clk / 1000000; ++ ++ if (max_data_rate >= 390) { /* it is DDR 400 */ ++ if (ddrc_clk <= 410 && ddrc_clk > 350) { ++ /* DDR controller clk at 350~410 */ ++ effective_data_rate = 400; /* 5ns */ ++ caslat = caslat; ++ } else if (ddrc_clk <= 350 && ddrc_clk > 280) { ++ /* DDR controller clk at 280~350 */ ++ effective_data_rate = 333; /* 6ns */ ++ if (spd.clk_cycle2 == 0x60) ++ caslat = caslat - 1; ++ else ++ caslat = caslat; ++ } else if (ddrc_clk <= 280 && ddrc_clk > 230) { ++ /* DDR controller clk at 230~280 */ ++ effective_data_rate = 266; /* 7.5ns */ ++ if (spd.clk_cycle3 == 0x75) ++ caslat = caslat - 2; ++ else if (spd.clk_cycle2 == 0x60) ++ caslat = caslat - 1; ++ else ++ caslat = caslat; ++ } else if (ddrc_clk <= 230 && ddrc_clk > 90) { ++ /* DDR controller clk at 90~230 */ ++ effective_data_rate = 200; /* 10ns */ ++ if (spd.clk_cycle3 == 0x75) ++ caslat = caslat - 2; ++ else if (spd.clk_cycle2 == 0x60) ++ caslat = caslat - 1; ++ else ++ caslat = caslat; ++ } ++ } else if (max_data_rate >= 323) { /* it is DDR 333 */ ++ if (ddrc_clk <= 350 && ddrc_clk > 280) { ++ /* DDR controller clk at 280~350 */ ++ effective_data_rate = 333; /* 6ns */ ++ caslat = caslat; ++ } else if (ddrc_clk <= 280 && ddrc_clk > 230) { ++ /* DDR controller clk at 230~280 */ ++ effective_data_rate = 266; /* 7.5ns */ ++ if (spd.clk_cycle2 == 0x75) ++ caslat = caslat - 1; ++ else ++ caslat = caslat; ++ } else if (ddrc_clk <= 230 && ddrc_clk > 90) { ++ /* DDR controller clk at 90~230 */ ++ effective_data_rate = 200; /* 10ns */ ++ if (spd.clk_cycle3 == 0xa0) ++ caslat = caslat - 2; ++ else if (spd.clk_cycle2 == 0x75) ++ caslat = caslat - 1; ++ else ++ caslat = caslat; ++ } ++ } else if (max_data_rate >= 256) { /* it is DDR 266 */ ++ if (ddrc_clk <= 350 && ddrc_clk > 280) { ++ /* DDR controller clk at 280~350 */ ++ printf("DDR: DDR controller freq is more than " ++ "max data rate of the module\n"); ++ return 0; ++ } else if (ddrc_clk <= 280 && ddrc_clk > 230) { ++ /* DDR controller clk at 230~280 */ ++ effective_data_rate = 266; /* 7.5ns */ ++ caslat = caslat; ++ } else if (ddrc_clk <= 230 && ddrc_clk > 90) { ++ /* DDR controller clk at 90~230 */ ++ effective_data_rate = 200; /* 10ns */ ++ if (spd.clk_cycle2 == 0xa0) ++ caslat = caslat - 1; ++ } ++ } else if (max_data_rate >= 190) { /* it is DDR 200 */ ++ if (ddrc_clk <= 350 && ddrc_clk > 230) { ++ /* DDR controller clk at 230~350 */ ++ printf("DDR: DDR controller freq is more than " ++ "max data rate of the module\n"); ++ return 0; ++ } else if (ddrc_clk <= 230 && ddrc_clk > 90) { ++ /* DDR controller clk at 90~230 */ ++ effective_data_rate = 200; /* 10ns */ ++ caslat = caslat; ++ } + } + ++ debug("DDR:Effective data rate is: %dMhz\n", effective_data_rate); ++ debug("DDR:The MSB 1 of CAS Latency is: %d\n", caslat); ++ ++ /* ++ * Errata DDR6 work around: input enable 2 cycles earlier. ++ * including MPC834x Rev1.0/1.1 and MPC8360 Rev1.1/1.2. ++ */ ++ if (caslat == 2) ++ ddr->debug_reg = 0x201c0000; /* CL=2 */ ++ else if (caslat == 3) ++ ddr->debug_reg = 0x202c0000; /* CL=2.5 */ ++ else if (caslat == 4) ++ ddr->debug_reg = 0x202c0000; /* CL=3.0 */ ++ ++ __asm__ __volatile__ ("sync"); ++ ++ debug("Errata DDR6 (debug_reg=0x%08x)\n", ddr->debug_reg); ++ + /* + * note: caslat must also be programmed into ddr->sdram_mode + * register. +@@ -229,16 +348,14 @@ long int spd_sdram() + * note: WRREC(Twr) and WRTORD(Twtr) are not in SPD, + * use conservative value here. + */ +- trfc = spd.trfc * 1000; /* up to ps */ +- trfc_clk = picos_to_clk(trfc); +- trfc_low = (trfc_clk - 8) & 0xf; ++ caslat_ctrl = (caslat + 1) & 0x07; /* see as above */ + + ddr->timing_cfg_1 = + (((picos_to_clk(spd.trp * 250) & 0x07) << 28 ) | + ((picos_to_clk(spd.tras * 1000) & 0x0f ) << 24 ) | + ((picos_to_clk(spd.trcd * 250) & 0x07) << 20 ) | +- ((caslat & 0x07) << 16 ) | +- (trfc_low << 12 ) | ++ ((caslat_ctrl & 0x07) << 16 ) | ++ (((picos_to_clk(spd.trfc * 1000) - 8) & 0x0f) << 12 ) | + ( 0x300 ) | + ((picos_to_clk(spd.trrd * 250) & 0x07) << 4) | 1); + +@@ -246,144 +363,143 @@ long int spd_sdram() + + debug("DDR:timing_cfg_1=0x%08x\n", ddr->timing_cfg_1); + debug("DDR:timing_cfg_2=0x%08x\n", ddr->timing_cfg_2); ++ /* Setup init value, but not enable */ ++ ddr->sdram_cfg = 0x42000000; + +- /* +- * Only DDR I is supported +- * DDR I and II have different mode-register-set definition +- */ +- switch(caslat) { +- case 2: +- tmp = 0x50; /* 1.5 */ +- break; +- case 3: +- tmp = 0x20; /* 2.0 */ +- break; +- case 4: +- tmp = 0x60; /* 2.5 */ +- break; +- case 5: +- tmp = 0x30; /* 3.0 */ +- break; +- default: +- puts("DDR:only CAS Latency 1.5, 2.0, 2.5, 3.0 is supported.\n"); +- return 0; ++ /* Check DIMM data bus width */ ++ if (spd.dataw_lsb == 0x20) { ++ burstlen = 0x03; /* 32 bit data bus, burst len is 8 */ ++ printf("\n DDR DIMM: data bus width is 32 bit"); ++ } else { ++ burstlen = 0x02; /* Others act as 64 bit bus, burst len is 4 */ ++ printf("\n DDR DIMM: data bus width is 64 bit"); ++ } ++ ++ /* Is this an ECC DDR chip? */ ++ if (spd.config == 0x02) ++ printf(" with ECC\n"); ++ else ++ printf(" without ECC\n"); ++ ++ /* Burst length is always 4 for 64 bit data bus, 8 for 32 bit data bus, ++ Burst type is sequential ++ */ ++ switch (caslat) { ++ case 1: ++ ddr->sdram_mode = 0x50 | burstlen; /* CL=1.5 */ ++ break; ++ case 2: ++ ddr->sdram_mode = 0x20 | burstlen; /* CL=2.0 */ ++ break; ++ case 3: ++ ddr->sdram_mode = 0x60 | burstlen; /* CL=2.5 */ ++ break; ++ case 4: ++ ddr->sdram_mode = 0x30 | burstlen; /* CL=3.0 */ ++ break; ++ default: ++ printf("DDR:only CL 1.5, 2.0, 2.5, 3.0 is supported\n"); ++ return 0; + } +-#if defined (CONFIG_DDR_32BIT) +- /* set burst length to 8 for 32-bit data path */ +- tmp |= 0x03; +-#else +- /* set burst length to 4 - default for 64-bit data path */ +- tmp |= 0x02; +-#endif +- ddr->sdram_mode = tmp; + debug("DDR:sdram_mode=0x%08x\n", ddr->sdram_mode); + +- switch(spd.refresh) { +- case 0x00: +- case 0x80: +- tmp = picos_to_clk(15625000); +- break; +- case 0x01: +- case 0x81: +- tmp = picos_to_clk(3900000); +- break; +- case 0x02: +- case 0x82: +- tmp = picos_to_clk(7800000); +- break; +- case 0x03: +- case 0x83: +- tmp = picos_to_clk(31300000); +- break; +- case 0x04: +- case 0x84: +- tmp = picos_to_clk(62500000); +- break; +- case 0x05: +- case 0x85: +- tmp = picos_to_clk(125000000); +- break; +- default: +- tmp = 0x512; +- break; ++ switch (spd.refresh) { ++ case 0x00: ++ case 0x80: ++ refresh_clk = picos_to_clk(15625000); ++ break; ++ case 0x01: ++ case 0x81: ++ refresh_clk = picos_to_clk(3900000); ++ break; ++ case 0x02: ++ case 0x82: ++ refresh_clk = picos_to_clk(7800000); ++ break; ++ case 0x03: ++ case 0x83: ++ refresh_clk = picos_to_clk(31300000); ++ break; ++ case 0x04: ++ case 0x84: ++ refresh_clk = picos_to_clk(62500000); ++ break; ++ case 0x05: ++ case 0x85: ++ refresh_clk = picos_to_clk(125000000); ++ break; ++ default: ++ refresh_clk = 0x512; ++ break; + } + + /* + * Set BSTOPRE to 0x100 for page mode + * If auto-charge is used, set BSTOPRE = 0 + */ +- ddr->sdram_interval = ((tmp & 0x3fff) << 16) | 0x100; ++ ddr->sdram_interval = ((refresh_clk & 0x3fff) << 16) | 0x100; + debug("DDR:sdram_interval=0x%08x\n", ddr->sdram_interval); + +- /* +- * Is this an ECC DDR chip? ++ /* SS_EN = 0, source synchronous disable ++ * CLK_ADJST = 0, MCK/MCK# is launched aligned with addr/cmd + */ +-#if defined(CONFIG_DDR_ECC) +- if (spd.config == 0x02) { +- /* disable error detection */ +- ddr->err_disable = ~ECC_ERROR_ENABLE; ++ ddr->sdram_clk_cntl = 0x00000000; ++ debug("DDR:sdram_clk_cntl=0x%08x\n", ddr->sdram_clk_cntl); + +- /* set single bit error threshold to maximum value, +- * reset counter to zero */ +- ddr->err_sbe = (255 << ECC_ERROR_MAN_SBET_SHIFT) | +- (0 << ECC_ERROR_MAN_SBEC_SHIFT); +- } +- debug("DDR:err_disable=0x%08x\n", ddr->err_disable); +- debug("DDR:err_sbe=0x%08x\n", ddr->err_sbe); +-#endif + asm("sync;isync"); + +- udelay(500); ++ udelay(600); + + /* +- * SS_EN=1, +- * CLK_ADJST = 2-MCK/MCK_B, is lauched 1/2 of one SDRAM +- * clock cycle after address/command +- */ +- /*ddr->sdram_clk_cntl = 0x82000000;*/ +- ddr->sdram_clk_cntl = (DDR_SDRAM_CLK_CNTL_SS_EN|DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05); +- +- /* +- * Figure out the settings for the sdram_cfg register. Build up +- * the entire register in 'tmp' before writing since the write into ++ * Figure out the settings for the sdram_cfg register. Build up ++ * the value in 'sdram_cfg' before writing since the write into + * the register will actually enable the memory controller, and all + * settings must be done before enabling. + * + * sdram_cfg[0] = 1 (ddr sdram logic enable) + * sdram_cfg[1] = 1 (self-refresh-enable) + * sdram_cfg[6:7] = 2 (SDRAM type = DDR SDRAM) ++ * sdram_cfg[12] = 0 (32_BE =0 , 64 bit bus mode) ++ * sdram_cfg[13] = 0 (8_BE =0, 4-beat bursts) + */ +- tmp = 0xc2000000; ++ sdram_cfg = 0xC2000000; + +-#if defined (CONFIG_DDR_32BIT) +- /* in 32-Bit mode burst len is 8 beats */ +- tmp |= (SDRAM_CFG_32_BE | SDRAM_CFG_8_BE); +-#endif +- /* +- * sdram_cfg[3] = RD_EN - registered DIMM enable +- * A value of 0x26 indicates micron registered DIMMS (micron.com) +- */ +- if (spd.mod_attr == 0x26) { +- tmp |= 0x10000000; +- } ++ /* sdram_cfg[3] = RD_EN - registered DIMM enable */ ++ if (spd.mod_attr & 0x02) ++ sdram_cfg |= 0x10000000; ++ ++ /* The DIMM is 32bit width */ ++ if (spd.dataw_lsb == 0x20) ++ sdram_cfg |= 0x000C0000; ++ ++ ddrc_ecc_enable = 0; + + #if defined(CONFIG_DDR_ECC) +- /* +- * If the user wanted ECC (enabled via sdram_cfg[2]) +- */ ++ /* Enable ECC with sdram_cfg[2] */ + if (spd.config == 0x02) { +- tmp |= SDRAM_CFG_ECC_EN; ++ sdram_cfg |= 0x20000000; ++ ddrc_ecc_enable = 1; ++ /* disable error detection */ ++ ddr->err_disable = ~ECC_ERROR_ENABLE; ++ /* set single bit error threshold to maximum value, ++ * reset counter to zero */ ++ ddr->err_sbe = (255 << ECC_ERROR_MAN_SBET_SHIFT) | ++ (0 << ECC_ERROR_MAN_SBEC_SHIFT); + } ++ ++ debug("DDR:err_disable=0x%08x\n", ddr->err_disable); ++ debug("DDR:err_sbe=0x%08x\n", ddr->err_sbe); + #endif ++ printf(" DDRC ECC mode: %s\n", ddrc_ecc_enable ? "ON":"OFF"); + + #if defined(CONFIG_DDR_2T_TIMING) + /* + * Enable 2T timing by setting sdram_cfg[16]. + */ +- tmp |= SDRAM_CFG_2T_EN; ++ sdram_cfg |= SDRAM_CFG_2T_EN; + #endif +- +- ddr->sdram_cfg = tmp; ++ /* Enable controller, and GO! */ ++ ddr->sdram_cfg = sdram_cfg; + asm("sync;isync"); + udelay(500); + +@@ -392,8 +508,7 @@ long int spd_sdram() + } + #endif /* CONFIG_SPD_EEPROM */ + +- +-#if defined(CONFIG_DDR_ECC) ++#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRC) + /* + * Use timebase counter, get_timer() is not availabe + * at this point of initialization yet. +@@ -429,74 +544,48 @@ static __inline__ unsigned long get_tbms + /* #define CONFIG_DDR_ECC_INIT_VIA_DMA */ + void ddr_enable_ecc(unsigned int dram_size) + { +- uint *p; +- volatile immap_t *immap = (immap_t *)CFG_IMMRBAR; +- volatile ddr8349_t *ddr = &immap->ddr; ++ volatile immap_t *immap = (immap_t *)CFG_IMMR; ++ volatile ddr83xx_t *ddr= &immap->ddr; + unsigned long t_start, t_end; ++ register u64 *p; ++ register uint size; ++ unsigned int pattern[2]; + #if defined(CONFIG_DDR_ECC_INIT_VIA_DMA) + uint i; + #endif +- +- debug("Initialize a Cachline in DRAM\n"); + icache_enable(); +- +-#if defined(CONFIG_DDR_ECC_INIT_VIA_DMA) +- /* Initialise DMA for direct Transfers */ +- dma_init(); +-#endif +- + t_start = get_tbms(); ++ pattern[0] = 0xdeadbeef; ++ pattern[1] = 0xdeadbeef; + + #if !defined(CONFIG_DDR_ECC_INIT_VIA_DMA) +- debug("DDR init: Cache flush method\n"); +- for (p = 0; p < (uint *)(dram_size); p++) { +- if (((unsigned int)p & 0x1f) == 0) { +- ppcDcbz((unsigned long) p); +- } +- +- /* write pattern to cache and flush */ +- *p = (unsigned int)0xdeadbeef; +- +- if (((unsigned int)p & 0x1c) == 0x1c) { +- ppcDcbf((unsigned long) p); +- } ++ debug("ddr init: CPU FP write method\n"); ++ size = dram_size; ++ for (p = 0; p < (u64*)(size); p++) { ++ ppcDWstore((u32*)p, pattern); + } ++ __asm__ __volatile__ ("sync"); + #else +- printf("DDR init: DMA method\n"); +- for (p = 0; p < (uint *)(8 * 1024); p++) { +- /* zero one data cache line */ +- if (((unsigned int)p & 0x1f) == 0) { +- ppcDcbz((unsigned long)p); +- } +- +- /* write pattern to it and flush */ +- *p = (unsigned int)0xdeadbeef; +- +- if (((unsigned int)p & 0x1c) == 0x1c) { +- ppcDcbf((unsigned long)p); +- } ++ debug("ddr init: DMA method\n"); ++ size = 0x2000; ++ for (p = 0; p < (u64*)(size); p++) { ++ ppcDWstore((u32*)p, pattern); + } ++ __asm__ __volatile__ ("sync"); + +- /* 8K */ +- dma_xfer((uint *)0x2000, 0x2000, (uint *)0); +- /* 16K */ +- dma_xfer((uint *)0x4000, 0x4000, (uint *)0); +- /* 32K */ +- dma_xfer((uint *)0x8000, 0x8000, (uint *)0); +- /* 64K */ +- dma_xfer((uint *)0x10000, 0x10000, (uint *)0); +- /* 128k */ +- dma_xfer((uint *)0x20000, 0x20000, (uint *)0); +- /* 256k */ +- dma_xfer((uint *)0x40000, 0x40000, (uint *)0); +- /* 512k */ +- dma_xfer((uint *)0x80000, 0x80000, (uint *)0); +- /* 1M */ +- dma_xfer((uint *)0x100000, 0x100000, (uint *)0); +- /* 2M */ +- dma_xfer((uint *)0x200000, 0x200000, (uint *)0); +- /* 4M */ +- dma_xfer((uint *)0x400000, 0x400000, (uint *)0); ++ /* Initialise DMA for direct transfer */ ++ dma_init(); ++ /* Start DMA to transfer */ ++ dma_xfer((uint *)0x2000, 0x2000, (uint *)0); /* 8K */ ++ dma_xfer((uint *)0x4000, 0x4000, (uint *)0); /* 16K */ ++ dma_xfer((uint *)0x8000, 0x8000, (uint *)0); /* 32K */ ++ dma_xfer((uint *)0x10000, 0x10000, (uint *)0); /* 64K */ ++ dma_xfer((uint *)0x20000, 0x20000, (uint *)0); /* 128K */ ++ dma_xfer((uint *)0x40000, 0x40000, (uint *)0); /* 256K */ ++ dma_xfer((uint *)0x80000, 0x80000, (uint *)0); /* 512K */ ++ dma_xfer((uint *)0x100000, 0x100000, (uint *)0); /* 1M */ ++ dma_xfer((uint *)0x200000, 0x200000, (uint *)0); /* 2M */ ++ dma_xfer((uint *)0x400000, 0x400000, (uint *)0); /* 4M */ + + for (i = 1; i < dram_size / 0x800000; i++) { + dma_xfer((uint *)(0x800000*i), 0x800000, (uint *)0); +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/speed.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/speed.c +--- u-boot-1.1.6/cpu/mpc83xx/speed.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/speed.c 2006-11-30 12:34:13.000000000 -0600 +@@ -2,7 +2,7 @@ + * (C) Copyright 2000-2002 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * +- * Copyright 2004 Freescale Semiconductor, Inc. ++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc. + * + * See file CREDITS for list of people who contributed to this + * project. +@@ -21,11 +21,6 @@ + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA +- * +- * Change log: +- * +- * 20050101: Eran Liberty (liberty@freescale.com) +- * Initial file creating (porting from 85XX & 8260) + */ + + #include <common.h> +@@ -53,38 +48,38 @@ typedef enum { + + typedef struct { + mult_t core_csb_ratio; +- mult_t vco_divider; ++ mult_t vco_divider; + } corecnf_t; + + corecnf_t corecnf_tab[] = { +- { _byp, _byp}, /* 0x00 */ +- { _byp, _byp}, /* 0x01 */ +- { _byp, _byp}, /* 0x02 */ +- { _byp, _byp}, /* 0x03 */ +- { _byp, _byp}, /* 0x04 */ +- { _byp, _byp}, /* 0x05 */ +- { _byp, _byp}, /* 0x06 */ +- { _byp, _byp}, /* 0x07 */ +- { _1x, _x2}, /* 0x08 */ +- { _1x, _x4}, /* 0x09 */ +- { _1x, _x8}, /* 0x0A */ +- { _1x, _x8}, /* 0x0B */ +- {_1_5x, _x2}, /* 0x0C */ +- {_1_5x, _x4}, /* 0x0D */ +- {_1_5x, _x8}, /* 0x0E */ +- {_1_5x, _x8}, /* 0x0F */ +- { _2x, _x2}, /* 0x10 */ +- { _2x, _x4}, /* 0x11 */ +- { _2x, _x8}, /* 0x12 */ +- { _2x, _x8}, /* 0x13 */ +- {_2_5x, _x2}, /* 0x14 */ +- {_2_5x, _x4}, /* 0x15 */ +- {_2_5x, _x8}, /* 0x16 */ +- {_2_5x, _x8}, /* 0x17 */ +- { _3x, _x2}, /* 0x18 */ +- { _3x, _x4}, /* 0x19 */ +- { _3x, _x8}, /* 0x1A */ +- { _3x, _x8}, /* 0x1B */ ++ {_byp, _byp}, /* 0x00 */ ++ {_byp, _byp}, /* 0x01 */ ++ {_byp, _byp}, /* 0x02 */ ++ {_byp, _byp}, /* 0x03 */ ++ {_byp, _byp}, /* 0x04 */ ++ {_byp, _byp}, /* 0x05 */ ++ {_byp, _byp}, /* 0x06 */ ++ {_byp, _byp}, /* 0x07 */ ++ {_1x, _x2}, /* 0x08 */ ++ {_1x, _x4}, /* 0x09 */ ++ {_1x, _x8}, /* 0x0A */ ++ {_1x, _x8}, /* 0x0B */ ++ {_1_5x, _x2}, /* 0x0C */ ++ {_1_5x, _x4}, /* 0x0D */ ++ {_1_5x, _x8}, /* 0x0E */ ++ {_1_5x, _x8}, /* 0x0F */ ++ {_2x, _x2}, /* 0x10 */ ++ {_2x, _x4}, /* 0x11 */ ++ {_2x, _x8}, /* 0x12 */ ++ {_2x, _x8}, /* 0x13 */ ++ {_2_5x, _x2}, /* 0x14 */ ++ {_2_5x, _x4}, /* 0x15 */ ++ {_2_5x, _x8}, /* 0x16 */ ++ {_2_5x, _x8}, /* 0x17 */ ++ {_3x, _x2}, /* 0x18 */ ++ {_3x, _x4}, /* 0x19 */ ++ {_3x, _x8}, /* 0x1A */ ++ {_3x, _x8}, /* 0x1B */ + }; + + /* ----------------------------------------------------------------- */ +@@ -92,91 +87,64 @@ corecnf_t corecnf_tab[] = { + /* + * + */ +-int get_clocks (void) ++int get_clocks(void) + { +- volatile immap_t *im = (immap_t *)CFG_IMMRBAR; ++ volatile immap_t *im = (immap_t *) CFG_IMMR; + u32 pci_sync_in; +- u8 spmf; +- u8 clkin_div; ++ u8 spmf; ++ u8 clkin_div; + u32 sccr; + u32 corecnf_tab_index; +- u8 corepll; ++ u8 corepll; + u32 lcrr; + + u32 csb_clk; ++#if defined(CONFIG_MPC8349) + u32 tsec1_clk; + u32 tsec2_clk; +- u32 core_clk; + u32 usbmph_clk; + u32 usbdr_clk; +- u32 i2c_clk; ++#endif ++ u32 core_clk; ++ u32 i2c1_clk; ++ u32 i2c2_clk; + u32 enc_clk; + u32 lbiu_clk; + u32 lclk_clk; + u32 ddr_clk; ++#if defined (CONFIG_MPC8360) ++ u32 qepmf; ++ u32 qepdf; ++ u32 ddr_sec_clk; ++ u32 qe_clk; ++ u32 brg_clk; ++#endif + +- if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32)im) ++ if ((im->sysconf.immrbar & IMMRBAR_BASE_ADDR) != (u32) im) + return -1; + +-#ifndef CFG_HRCW_HIGH +-# error "CFG_HRCW_HIGH must be defined in board config file" +-#endif /* CFG_HCWD_HIGH */ +- +-#if (CFG_HRCW_HIGH & HRCWH_PCI_HOST) +- +-# ifndef CONFIG_83XX_CLKIN +-# error "In PCI Host Mode, CONFIG_83XX_CLKIN must be defined in board config file" +-# endif /* CONFIG_83XX_CLKIN */ +-# ifdef CONFIG_83XX_PCICLK +-# warning "In PCI Host Mode, CONFIG_83XX_PCICLK in board config file is igonred" +-# endif /* CONFIG_83XX_PCICLK */ +- +- /* PCI Host Mode */ +- if (!(im->reset.rcwh & RCWH_PCIHOST)) { +- /* though RCWH_PCIHOST is defined in CFG_HRCW_HIGH +- * the im->reset.rcwhr PCI Host Mode is disabled +- * FIXME: findout if there is a way to issue some warning */ +- return -2; +- } +- if (im->clk.spmr & SPMR_CKID) { +- /* PCI Clock is half CONFIG_83XX_CLKIN */ +- pci_sync_in = CONFIG_83XX_CLKIN / 2; +- } +- else { +- pci_sync_in = CONFIG_83XX_CLKIN; +- } +- +-#else /* (CFG_HRCW_HIGH & HRCWH_PCI_HOST) */ ++ clkin_div = ((im->clk.spmr & SPMR_CKID) >> SPMR_CKID_SHIFT); + +-# ifdef CONFIG_83XX_CLKIN +-# warning "In PCI Agent Mode, CONFIG_83XX_CLKIN in board config file is igonred" +-# endif /* CONFIG_83XX_CLKIN */ +-# ifndef CONFIG_83XX_PCICLK +-# error "In PCI Agent Mode, CONFIG_83XX_PCICLK must be defined in board config file" +-# endif /* CONFIG_83XX_PCICLK */ +- +- /* PCI Agent Mode */ +- if (im->reset.rcwh & RCWH_PCIHOST) { +- /* though RCWH_PCIHOST is not defined in CFG_HRCW_HIGH +- * the im->reset.rcwhr PCI Host Mode is enabled */ +- return -3; ++ if (im->reset.rcwh & HRCWH_PCI_HOST) { ++#if defined(CONFIG_83XX_CLKIN) ++ pci_sync_in = CONFIG_83XX_CLKIN / (1 + clkin_div); ++#else ++ pci_sync_in = 0xDEADBEEF; ++#endif ++ } else { ++#if defined(CONFIG_83XX_PCICLK) ++ pci_sync_in = CONFIG_83XX_PCICLK; ++#else ++ pci_sync_in = 0xDEADBEEF; ++#endif + } +- pci_sync_in = CONFIG_83XX_PCICLK; + +-#endif /* (CFG_HRCW_HIGH | RCWH_PCIHOST) */ +- +- /* we have up to date pci_sync_in */ + spmf = ((im->reset.rcwl & RCWL_SPMF) >> RCWL_SPMF_SHIFT); +- clkin_div = ((im->clk.spmr & SPMR_CKID) >> SPMR_CKID_SHIFT); +- +- if ((im->reset.rcwl & RCWL_LBIUCM) || (im->reset.rcwl & RCWL_DDRCM)) { +- csb_clk = (pci_sync_in * spmf * (1 + clkin_div)) / 2; +- } +- else { +- csb_clk = pci_sync_in * spmf * (1 + clkin_div); +- } ++ csb_clk = pci_sync_in * (1 + clkin_div) * spmf; + + sccr = im->clk.sccr; ++ ++#if defined(CONFIG_MPC8349) + switch ((sccr & SCCR_TSEC1CM) >> SCCR_TSEC1CM_SHIFT) { + case 0: + tsec1_clk = 0; +@@ -212,25 +180,8 @@ int get_clocks (void) + /* unkown SCCR_TSEC2CM value */ + return -5; + } +- i2c_clk = tsec2_clk; + +- switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) { +- case 0: +- enc_clk = 0; +- break; +- case 1: +- enc_clk = csb_clk; +- break; +- case 2: +- enc_clk = csb_clk / 2; +- break; +- case 3: +- enc_clk = csb_clk / 3; +- break; +- default: +- /* unkown SCCR_ENCCM value */ +- return -6; +- } ++ i2c1_clk = tsec2_clk; + + switch ((sccr & SCCR_USBMPHCM) >> SCCR_USBMPHCM_SHIFT) { + case 0: +@@ -268,14 +219,42 @@ int get_clocks (void) + return -8; + } + +- if (usbmph_clk != 0 +- && usbdr_clk != 0 +- && usbmph_clk != usbdr_clk ) { +- /* if USB MPH clock is not disabled and USB DR clock is not disabled than USB MPH & USB DR must have the same rate */ ++ if (usbmph_clk != 0 && usbdr_clk != 0 && usbmph_clk != usbdr_clk) { ++ /* if USB MPH clock is not disabled and ++ * USB DR clock is not disabled then ++ * USB MPH & USB DR must have the same rate ++ */ + return -9; + } ++#endif ++#if defined (CONFIG_MPC8360) ++ i2c1_clk = csb_clk; ++#endif ++ i2c2_clk = csb_clk; /* i2c-2 clk is equal to csb clk */ + +- lbiu_clk = csb_clk * (1 + ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT)); ++ switch ((sccr & SCCR_ENCCM) >> SCCR_ENCCM_SHIFT) { ++ case 0: ++ enc_clk = 0; ++ break; ++ case 1: ++ enc_clk = csb_clk; ++ break; ++ case 2: ++ enc_clk = csb_clk / 2; ++ break; ++ case 3: ++ enc_clk = csb_clk / 3; ++ break; ++ default: ++ /* unkown SCCR_ENCCM value */ ++ return -6; ++ } ++#if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360) ++ lbiu_clk = csb_clk * ++ (1 + ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT)); ++#else ++#error Unknown MPC83xx chip ++#endif + lcrr = (im->lbus.lcrr & LCRR_CLKDIV) >> LCRR_CLKDIV_SHIFT; + switch (lcrr) { + case 2: +@@ -287,12 +266,20 @@ int get_clocks (void) + /* unknown lcrr */ + return -10; + } +- +- ddr_clk = csb_clk * (1 + ((im->reset.rcwl & RCWL_DDRCM) >> RCWL_DDRCM_SHIFT)); +- ++#if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360) ++ ddr_clk = csb_clk * ++ (1 + ((im->reset.rcwl & RCWL_DDRCM) >> RCWL_DDRCM_SHIFT)); + corepll = (im->reset.rcwl & RCWL_COREPLL) >> RCWL_COREPLL_SHIFT; ++#if defined (CONFIG_MPC8360) ++ ddr_sec_clk = csb_clk * (1 + ++ ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT)); ++#endif ++#else ++#error Unknown MPC83xx chip ++#endif ++ + corecnf_tab_index = ((corepll & 0x1F) << 2) | ((corepll & 0x60) >> 5); +- if (corecnf_tab_index > (sizeof(corecnf_tab)/sizeof(corecnf_t)) ) { ++ if (corecnf_tab_index > (sizeof(corecnf_tab) / sizeof(corecnf_t))) { + /* corecnf_tab_index is too high, possibly worng value */ + return -11; + } +@@ -309,7 +296,7 @@ int get_clocks (void) + core_clk = 2 * csb_clk; + break; + case _2_5x: +- core_clk = ( 5 * csb_clk) / 2; ++ core_clk = (5 * csb_clk) / 2; + break; + case _3x: + core_clk = 3 * csb_clk; +@@ -319,46 +306,69 @@ int get_clocks (void) + return -12; + } + +- gd->csb_clk = csb_clk ; +- gd->tsec1_clk = tsec1_clk ; +- gd->tsec2_clk = tsec2_clk ; +- gd->core_clk = core_clk ; ++#if defined (CONFIG_MPC8360) ++ qepmf = (im->reset.rcwl & RCWL_CEPMF) >> RCWL_CEPMF_SHIFT; ++ qepdf = (im->reset.rcwl & RCWL_CEPDF) >> RCWL_CEPDF_SHIFT; ++ qe_clk = (pci_sync_in * qepmf) / (1 + qepdf); ++ brg_clk = qe_clk / 2; ++#endif ++ ++ gd->csb_clk = csb_clk; ++#if defined(CONFIG_MPC8349) ++ gd->tsec1_clk = tsec1_clk; ++ gd->tsec2_clk = tsec2_clk; + gd->usbmph_clk = usbmph_clk; +- gd->usbdr_clk = usbdr_clk ; +- gd->i2c_clk = i2c_clk ; +- gd->enc_clk = enc_clk ; +- gd->lbiu_clk = lbiu_clk ; +- gd->lclk_clk = lclk_clk ; +- gd->ddr_clk = ddr_clk ; +- gd->pci_clk = pci_sync_in; +- ++ gd->usbdr_clk = usbdr_clk; ++#endif ++ gd->core_clk = core_clk; ++ gd->i2c1_clk = i2c1_clk; ++ gd->i2c2_clk = i2c2_clk; ++ gd->enc_clk = enc_clk; ++ gd->lbiu_clk = lbiu_clk; ++ gd->lclk_clk = lclk_clk; ++ gd->ddr_clk = ddr_clk; ++#if defined (CONFIG_MPC8360) ++ gd->ddr_sec_clk = ddr_sec_clk; ++ gd->qe_clk = qe_clk; ++ gd->brg_clk = brg_clk; ++#endif + gd->cpu_clk = gd->core_clk; +- gd->bus_clk = gd->lbiu_clk; ++ gd->bus_clk = gd->csb_clk; + return 0; ++ + } + + /******************************************** + * get_bus_freq + * return system bus freq in Hz + *********************************************/ +-ulong get_bus_freq (ulong dummy) ++ulong get_bus_freq(ulong dummy) + { + return gd->csb_clk; + } + +-int print_clock_conf (void) ++int print_clock_conf(void) + { + printf("Clock configuration:\n"); +- printf(" Coherent System Bus: %4d MHz\n",gd->csb_clk/1000000); +- printf(" Core: %4d MHz\n",gd->core_clk/1000000); +- debug(" Local Bus Controller:%4d MHz\n",gd->lbiu_clk/1000000); +- printf(" Local Bus: %4d MHz\n",gd->lclk_clk/1000000); +- debug(" DDR: %4d MHz\n",gd->ddr_clk/1000000); +- debug(" I2C: %4d MHz\n",gd->i2c_clk/1000000); +- debug(" TSEC1: %4d MHz\n",gd->tsec1_clk/1000000); +- debug(" TSEC2: %4d MHz\n",gd->tsec2_clk/1000000); +- debug(" USB MPH: %4d MHz\n",gd->usbmph_clk/1000000); +- debug(" USB DR: %4d MHz\n",gd->usbdr_clk/1000000); +- ++ printf(" Coherent System Bus: %4d MHz\n", gd->csb_clk / 1000000); ++ printf(" Core: %4d MHz\n", gd->core_clk / 1000000); ++#if defined (CONFIG_MPC8360) ++ printf(" QE: %4d MHz\n", gd->qe_clk / 1000000); ++#endif ++ printf(" Local Bus Controller:%4d MHz\n", gd->lbiu_clk / 1000000); ++ printf(" Local Bus: %4d MHz\n", gd->lclk_clk / 1000000); ++ printf(" DDR: %4d MHz\n", gd->ddr_clk / 1000000); ++#if defined (CONFIG_MPC8360) ++ printf(" DDR Secondary: %4d MHz\n", gd->ddr_sec_clk / 1000000); ++#endif ++ printf(" SEC: %4d MHz\n", gd->enc_clk / 1000000); ++ printf(" I2C1: %4d MHz\n", gd->i2c1_clk / 1000000); ++ printf(" I2C2: %4d MHz\n", gd->i2c2_clk / 1000000); ++#if defined(CONFIG_MPC8349) ++ printf(" TSEC1: %4d MHz\n", gd->tsec1_clk / 1000000); ++ printf(" TSEC2: %4d MHz\n", gd->tsec2_clk / 1000000); ++ printf(" USB MPH: %4d MHz\n", gd->usbmph_clk / 1000000); ++ printf(" USB DR: %4d MHz\n", gd->usbdr_clk / 1000000); ++#endif + return 0; + } +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/start.S u-boot-1.1.6-fsl-1/cpu/mpc83xx/start.S +--- u-boot-1.1.6/cpu/mpc83xx/start.S 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/start.S 2006-11-10 11:24:29.000000000 -0600 +@@ -2,7 +2,7 @@ + * Copyright (C) 1998 Dan Malek <dmalek@jlc.net> + * Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se> + * Copyright (C) 2000, 2001,2002 Wolfgang Denk <wd@denx.de> +- * Copyright 2004 Freescale Semiconductor, Inc. ++ * Copyright Freescale Semiconductor, Inc. 2004, 2006. All rights reserved. + * + * See file CREDITS for list of people who contributed to this + * project. +@@ -104,9 +104,9 @@ version_string: + #ifndef CONFIG_DEFAULT_IMMR + #error CONFIG_DEFAULT_IMMR must be defined + #endif /* CFG_DEFAULT_IMMR */ +-#ifndef CFG_IMMRBAR +-#define CFG_IMMRBAR CONFIG_DEFAULT_IMMR +-#endif /* CFG_IMMRBAR */ ++#ifndef CFG_IMMR ++#define CFG_IMMR CONFIG_DEFAULT_IMMR ++#endif /* CFG_IMMR */ + + /* + * After configuration, a system reset exception is executed using the +@@ -152,8 +152,8 @@ boot_cold: /* time t 3 */ + nop + boot_warm: /* time t 5 */ + mfmsr r5 /* save msr contents */ +- lis r3, CFG_IMMRBAR@h +- ori r3, r3, CFG_IMMRBAR@l ++ lis r3, CFG_IMMR@h ++ ori r3, r3, CFG_IMMR@l + stw r3, IMMRBAR(r4) + + /* Initialise the E300 processor core */ +@@ -226,7 +226,7 @@ in_flash: + GET_GOT /* initialize GOT access */ + + /* r3: IMMR */ +- lis r3, CFG_IMMRBAR@h ++ lis r3, CFG_IMMR@h + /* run low-level CPU init code (in Flash)*/ + bl cpu_init_f + +@@ -446,7 +446,7 @@ init_e300_core: /* time t 10 */ + mtspr SRR1, r3 /* Make SRR1 match MSR */ + + +- lis r3, CFG_IMMRBAR@h ++ lis r3, CFG_IMMR@h + #if defined(CONFIG_WATCHDOG) + /* Initialise the Wathcdog values and reset it (if req) */ + /*------------------------------------------------------*/ +@@ -870,6 +870,18 @@ ppcDcbz: + dcbz r0,r3 + blr + ++ .globl ppcDWstore ++ppcDWstore: ++ lfd 1, 0(r4) ++ stfd 1, 0(r3) ++ blr ++ ++ .globl ppcDWload ++ppcDWload: ++ lfd 1, 0(r3) ++ stfd 1, 0(r4) ++ blr ++ + /*-------------------------------------------------------------------*/ + + /* +@@ -1189,7 +1201,7 @@ map_flash_by_law1: + /* When booting from ROM (Flash or EPROM), clear the */ + /* Address Mask in OR0 so ROM appears everywhere */ + /*----------------------------------------------------*/ +- lis r3, (CFG_IMMRBAR)@h /* r3 <= CFG_IMMRBAR */ ++ lis r3, (CFG_IMMR)@h /* r3 <= CFG_IMMR */ + lwz r4, OR0@l(r3) + li r5, 0x7fff /* r5 <= 0x00007FFFF */ + and r4, r4, r5 +@@ -1214,8 +1226,15 @@ map_flash_by_law1: + lis r4, (CFG_FLASH_BASE)@h + ori r4, r4, (CFG_FLASH_BASE)@l + stw r4, LBLAWBAR1(r3) /* LBLAWBAR1 <= CFG_FLASH_BASE */ +- lis r4, (0x80000016)@h +- ori r4, r4, (0x80000016)@l ++ ++ /* Store 0x80000012 + log2(CFG_FLASH_SIZE) into LBLAWAR1 */ ++ lis r4, (0x80000012)@h ++ ori r4, r4, (0x80000012)@l ++ li r5, CFG_FLASH_SIZE ++1: srawi. r5, r5, 1 /* r5 = r5 >> 1 */ ++ addi r4, r4, 1 ++ bne 1b ++ + stw r4, LBLAWAR1(r3) /* LBLAWAR1 <= 8MB Flash Size */ + blr + +@@ -1234,17 +1253,23 @@ remap_flash_by_law0: + stw r5, BR0(r3) /* r5 <= (CFG_FLASH_BASE & 0xFFFF8000) | (BR0 & 0x00007FFF) */ + + lwz r4, OR0(r3) +- lis r5, 0xFF80 /* 8M */ ++ lis r5, ~((CFG_FLASH_SIZE << 4) - 1) + or r4, r4, r5 +- stw r4, OR0(r3) /* OR0 <= OR0 | 0xFF800000 */ ++ stw r4, OR0(r3) + + lis r4, (CFG_FLASH_BASE)@h + ori r4, r4, (CFG_FLASH_BASE)@l + stw r4, LBLAWBAR0(r3) /* LBLAWBAR0 <= CFG_FLASH_BASE */ + +- lis r4, (0x80000016)@h +- ori r4, r4, (0x80000016)@l +- stw r4, LBLAWAR0(r3) /* LBLAWAR0 <= 8MB Flash Size */ ++ /* Store 0x80000012 + log2(CFG_FLASH_SIZE) into LBLAWAR0 */ ++ lis r4, (0x80000012)@h ++ ori r4, r4, (0x80000012)@l ++ li r5, CFG_FLASH_SIZE ++1: srawi. r5, r5, 1 /* r5 = r5 >> 1 */ ++ addi r4, r4, 1 ++ bne 1b ++ stw r4, LBLAWAR0(r3) /* LBLAWAR0 <= Flash Size */ ++ + + xor r4, r4, r4 + stw r4, LBLAWBAR1(r3) +diff -Naupr u-boot-1.1.6/cpu/mpc83xx/traps.c u-boot-1.1.6-fsl-1/cpu/mpc83xx/traps.c +--- u-boot-1.1.6/cpu/mpc83xx/traps.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/mpc83xx/traps.c 2006-11-30 12:34:13.000000000 -0600 +@@ -1,5 +1,8 @@ + /* +- * linux/arch/ppc/kernel/traps.c ++ * (C) Copyright 2000 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as +@@ -15,19 +18,6 @@ + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA +- * +- * Change log: +- * +- * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) +- * +- * Modified by Cort Dougan (cort@cs.nmt.edu) +- * and Paul Mackerras (paulus@cs.anu.edu.au) +- * +- * (C) Copyright 2000 +- * Wolfgang Denk, DENX Software Engineering, wd@denx.de. +- * +- * 20050101: Eran Liberty (liberty@freescale.com) +- * Initial file creating (porting from 85XX & 8260) + */ + + /* +diff -Naupr u-boot-1.1.6/cpu/ppc4xx/405gp_pci.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/405gp_pci.c +--- u-boot-1.1.6/cpu/ppc4xx/405gp_pci.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/405gp_pci.c 2006-11-30 12:34:13.000000000 -0600 +@@ -475,7 +475,11 @@ void pci_440_init (struct pci_controller + pci_set_region(hose->regions + reg_num++, + CFG_PCI_TARGBASE, + CFG_PCI_MEMBASE, ++#ifdef CFG_PCI_MEMSIZE ++ CFG_PCI_MEMSIZE, ++#else + 0x10000000, ++#endif + PCI_REGION_MEM ); + + #if defined(CONFIG_PCI_SYS_MEM_BUS) && defined(CONFIG_PCI_SYS_MEM_PHYS) && \ +diff -Naupr u-boot-1.1.6/cpu/ppc4xx/4xx_enet.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/4xx_enet.c +--- u-boot-1.1.6/cpu/ppc4xx/4xx_enet.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/4xx_enet.c 2006-11-30 12:34:13.000000000 -0600 +@@ -264,10 +264,10 @@ int ppc_4xx_eth_setup_bridge(int devnum, + bis->bi_phymode[3] = BI_PHYMODE_ZMII; + break; + case 2: +- zmiifer = ZMII_FER_SMII << ZMII_FER_V(0); +- zmiifer = ZMII_FER_SMII << ZMII_FER_V(1); +- zmiifer = ZMII_FER_SMII << ZMII_FER_V(2); +- zmiifer = ZMII_FER_SMII << ZMII_FER_V(3); ++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(0); ++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(1); ++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(2); ++ zmiifer |= ZMII_FER_SMII << ZMII_FER_V(3); + bis->bi_phymode[0] = BI_PHYMODE_ZMII; + bis->bi_phymode[1] = BI_PHYMODE_ZMII; + bis->bi_phymode[2] = BI_PHYMODE_ZMII; +@@ -470,8 +470,7 @@ static int ppc_4xx_eth_init (struct eth_ + #else + if ((devnum == 0) || (devnum == 1)) { + out32 (ZMII_FER, (ZMII_FER_SMII | ZMII_FER_MDI) << ZMII_FER_V (devnum)); +- } +- else { /* ((devnum == 2) || (devnum == 3)) */ ++ } else { /* ((devnum == 2) || (devnum == 3)) */ + out32 (ZMII_FER, ZMII_FER_MDI << ZMII_FER_V (devnum)); + out32 (RGMII_FER, ((RGMII_FER_RGMII << RGMII_FER_V (2)) | + (RGMII_FER_RGMII << RGMII_FER_V (3)))); +@@ -561,22 +560,7 @@ static int ppc_4xx_eth_init (struct eth_ + * otherwise, just check the speeds & feeds + */ + if (hw_p->first_init == 0) { +-#if defined(CONFIG_88E1111_CLK_DELAY) +- /* +- * On some boards (e.g. ALPR) the Marvell 88E1111 PHY needs +- * the "RGMII transmit timing control" and "RGMII receive +- * timing control" bits set, so that Gbit communication works +- * without problems. +- * Also set the "Transmitter disable" to 1 to enable the +- * transmitter. +- * After setting these bits a soft-reset must occur for this +- * change to become active. +- */ +- miiphy_read (dev->name, reg, 0x14, ®_short); +- reg_short |= (1 << 7) | (1 << 1) | (1 << 0); +- miiphy_write (dev->name, reg, 0x14, reg_short); +-#endif +-#if defined(CONFIG_M88E1111_PHY) /* test-only: merge with CONFIG_88E1111_CLK_DELAY !!! */ ++#if defined(CONFIG_M88E1111_PHY) + miiphy_write (dev->name, reg, 0x14, 0x0ce3); + miiphy_write (dev->name, reg, 0x18, 0x4101); + miiphy_write (dev->name, reg, 0x09, 0x0e00); +@@ -808,7 +792,7 @@ static int ppc_4xx_eth_init (struct eth_ + hw_p->rx[i].ctrl |= MAL_RX_CTRL_EMPTY | MAL_RX_CTRL_INTR; + hw_p->rx_ready[i] = -1; + #if 0 +- printf ("RX_BUFF %d @ 0x%08lx\n", i, (ulong) rx[i].data_ptr); ++ printf ("RX_BUFF %d @ 0x%08lx\n", i, (ulong) hw_p->rx[i].data_ptr); + #endif + } + +diff -Naupr u-boot-1.1.6/cpu/ppc4xx/cpu.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu.c +--- u-boot-1.1.6/cpu/ppc4xx/cpu.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu.c 2006-12-06 10:33:49.000000000 -0600 +@@ -41,6 +41,10 @@ + DECLARE_GLOBAL_DATA_PTR; + #endif + ++#if defined(CONFIG_BOARD_RESET) ++void board_reset(void); ++#endif ++ + #if defined(CONFIG_440) + #define FREQ_EBC (sys_info.freqEPB) + #else +@@ -336,6 +340,10 @@ int checkcpu (void) + puts("SP Rev. B"); + break; + ++ case PVR_440SP_RC: ++ puts("SP Rev. C"); ++ break; ++ + case PVR_440SPe_RA: + puts("SPe Rev. A"); + break; +@@ -422,23 +430,19 @@ int ppc440spe_revB() { + + int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + { +-#if defined(CONFIG_YOSEMITE) || defined(CONFIG_YELLOWSTONE) +- /*give reset to BCSR*/ +- *(unsigned char*)(CFG_BCSR_BASE | 0x06) = 0x09; +- ++#if defined(CONFIG_BOARD_RESET) ++ board_reset(); ++#else ++#if defined(CFG_4xx_RESET_TYPE) ++ mtspr(dbcr0, CFG_4xx_RESET_TYPE << 28); + #else +- + /* + * Initiate system reset in debug control register DBCR + */ +- __asm__ __volatile__("lis 3, 0x3000" ::: "r3"); +-#if defined(CONFIG_440) +- __asm__ __volatile__("mtspr 0x134, 3"); +-#else +- __asm__ __volatile__("mtspr 0x3f2, 3"); +-#endif ++ mtspr(dbcr0, 0x30000000); ++#endif /* defined(CFG_4xx_RESET_TYPE) */ ++#endif /* defined(CONFIG_BOARD_RESET) */ + +-#endif/* defined(CONFIG_YOSEMITE) || defined(CONFIG_YELLOWSTONE)*/ + return 1; + } + +diff -Naupr u-boot-1.1.6/cpu/ppc4xx/cpu_init.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu_init.c +--- u-boot-1.1.6/cpu/ppc4xx/cpu_init.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/cpu_init.c 2006-11-30 12:34:13.000000000 -0600 +@@ -321,6 +321,10 @@ cpu_init_f (void) + #else + val |= 0xf0000000; /* generate system reset after 2.684 seconds */ + #endif ++#if defined(CFG_4xx_RESET_TYPE) ++ val &= ~0x30000000; /* clear WRC bits */ ++ val |= CFG_4xx_RESET_TYPE << 28; /* set board specific WRC type */ ++#endif + mtspr(tcr, val); + + val = mfspr(tsr); +diff -Naupr u-boot-1.1.6/cpu/ppc4xx/sdram.c u-boot-1.1.6-fsl-1/cpu/ppc4xx/sdram.c +--- u-boot-1.1.6/cpu/ppc4xx/sdram.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/sdram.c 2006-11-30 12:34:13.000000000 -0600 +@@ -351,6 +351,14 @@ long int initdram(int board_type) + int i; + int tr1_bank1; + ++#if defined(CONFIG_440GX) || defined(CONFIG_440EP) || defined(CONFIG_440GR) || defined(CONFIG_440SP) ++ /* ++ * Soft-reset SDRAM controller. ++ */ ++ mtsdr(sdr_srst, SDR0_SRST_DMC); ++ mtsdr(sdr_srst, 0x00000000); ++#endif ++ + for (i=0; i<N_MB0CF; i++) { + /* + * Disable memory controller. +diff -Naupr u-boot-1.1.6/cpu/ppc4xx/start.S u-boot-1.1.6-fsl-1/cpu/ppc4xx/start.S +--- u-boot-1.1.6/cpu/ppc4xx/start.S 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/cpu/ppc4xx/start.S 2006-11-30 12:34:13.000000000 -0600 +@@ -204,6 +204,18 @@ _start_440: + mfspr r1,mcsr + mtspr mcsr,r1 + #endif ++ ++ /*----------------------------------------------------------------*/ ++ /* CCR0 init */ ++ /*----------------------------------------------------------------*/ ++ /* Disable store gathering & broadcast, guarantee inst/data ++ * cache block touch, force load/store alignment ++ * (see errata 1.12: 440_33) ++ */ ++ lis r1,0x0030 /* store gathering & broadcast disable */ ++ ori r1,r1,0x6000 /* cache touch */ ++ mtspr ccr0,r1 ++ + /*----------------------------------------------------------------*/ + /* Initialize debug */ + /*----------------------------------------------------------------*/ +@@ -225,17 +237,6 @@ _start_440: + mtspr dbsr,r1 /* Clear all valid bits */ + skip_debug_init: + +- /*----------------------------------------------------------------*/ +- /* CCR0 init */ +- /*----------------------------------------------------------------*/ +- /* Disable store gathering & broadcast, guarantee inst/data +- * cache block touch, force load/store alignment +- * (see errata 1.12: 440_33) +- */ +- lis r1,0x0030 /* store gathering & broadcast disable */ +- ori r1,r1,0x6000 /* cache touch */ +- mtspr ccr0,r1 +- + #if defined (CONFIG_440SPE) + /*----------------------------------------------------------------+ + | Initialize Core Configuration Reg1. +diff -Naupr u-boot-1.1.6/CREDITS u-boot-1.1.6-fsl-1/CREDITS +--- u-boot-1.1.6/CREDITS 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/CREDITS 2006-11-10 11:24:28.000000000 -0600 +@@ -465,3 +465,8 @@ N: James MacAulay + E: james.macaulay@amirix.com + D: Suppport for Amirix AP1000 + W: www.amirix.com ++ ++N: Timur Tabi ++E: timur@freescale.com ++D: Support for MPC8349E-mITX ++W: www.freescale.com +diff -Naupr u-boot-1.1.6/doc/README.mpc8360emds u-boot-1.1.6-fsl-1/doc/README.mpc8360emds +--- u-boot-1.1.6/doc/README.mpc8360emds 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/doc/README.mpc8360emds 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,126 @@ ++Freescale MPC8360EMDS Board ++----------------------------------------- ++1. Board Switches and Jumpers ++1.0 There are four Dual-In-Line Packages(DIP) Switches on MPC8360EMDS board ++ For some reason, the HW designers describe the switch settings ++ in terms of 0 and 1, and then map that to physical switches where ++ the label "On" refers to logic 0 and "Off" is logic 1. ++ ++ Switch bits are numbered 1 through, like, 4 6 8 or 10, but the ++ bits may contribute to signals that are numbered based at 0, ++ and some of those signals may be high-bit-number-0 too. Heed ++ well the names and labels and do not get confused. ++ ++ "Off" == 1 ++ "On" == 0 ++ ++ SW18 is switch 18 as silk-screened onto the board. ++ SW4[8] is the bit labled 8 on Switch 4. ++ SW2[1:6] refers to bits labeled 1 through 6 in order on switch 2. ++ SW3[7:1] refers to bits labeled 7 through 1 in order on switch 3. ++ SW3[1:8]= 0000_0001 refers to bits labeled 1 through 6 is set as "On" ++ and bits labeled 8 is set as "Off". ++ ++1.1 For the MPC8360E PB PROTO Board ++ ++ First, make sure the board default setting is consistent with the ++ document shipped with your board. Then apply the following setting: ++ SW3[1-8]= 0000_0100 (HRCW setting value is performed on local bus) ++ SW4[1-8]= 0011_0000 (Flash boot on local bus) ++ SW9[1-8]= 0110_0110 (PCI Mode enabled. HRCW is read from FLASH) ++ SW10[1-8]= 0000_1000 (core PLL setting) ++ SW11[1-8]= 0000_0100 (SW11 is on the another side of the board) ++ JP6 1-2 ++ on board Oscillator: 66M ++ ++ ++2. Memory Map ++ ++2.1. The memory map should look pretty much like this: ++ ++ 0x0000_0000 0x7fff_ffff DDR 2G ++ 0x8000_0000 0x8fff_ffff PCI MEM prefetch 256M ++ 0x9000_0000 0x9fff_ffff PCI MEM non-prefetch 256M ++ 0xc000_0000 0xdfff_ffff Empty 512M ++ 0xe000_0000 0xe01f_ffff Int Mem Reg Space 2M ++ 0xe020_0000 0xe02f_ffff Empty 1M ++ 0xe030_0000 0xe03f_ffff PCI IO 1M ++ 0xe040_0000 0xefff_ffff Empty 252M ++ 0xf000_0000 0xf3ff_ffff Local Bus SDRAM 64M ++ 0xf400_0000 0xf7ff_ffff Empty 64M ++ 0xf800_0000 0xf800_7fff BCSR on CS1 32K ++ 0xf800_8000 0xf800_ffff PIB CS4 32K ++ 0xf801_0000 0xf801_7fff PIB CS5 32K ++ 0xfe00_0000 0xfeff_ffff FLASH on CS0 16M ++ ++ ++3. Definitions ++ ++3.1 Explanation of NEW definitions in: ++ ++ include/configs/MPC8360EMDS.h ++ ++ CONFIG_MPC83XX MPC83xx family for both MPC8349 and MPC8360 ++ CONFIG_MPC8360 MPC8360 specific ++ CONFIG_MPC8360EMDS MPC8360EMDS board specific ++ ++4. Compilation ++ ++ Assuming you're using BASH shell: ++ ++ export CROSS_COMPILE=your-cross-compile-prefix ++ cd u-boot ++ make distclean ++ make MPC8360EMDS_config ++ make ++ ++ MPC8360 support PCI in host and slave mode. ++ ++ To make u-boot support PCI host 66M : ++ 1) DIP SW support PCI mode as described in Section 1.1. ++ 2) Make MPC8360EMDS_HOST_66_config ++ ++ To make u-boot support PCI host 33M : ++ 1) DIP SW setting is similar as Section 1.1, except for SW3[4] is 1 ++ 2) Make MPC8360EMDS_HOST_33_config ++ ++ To make u-boot support PCI slave 66M : ++ 1) DIP SW setting is similar as Section 1.1, except for SW9[3] is 1 ++ 2) Make MPC8360EMDS_SLAVE_config ++ ++ ++5. Downloading and Flashing Images ++ ++5.0 Download over serial line using Kermit: ++ ++ loadb ++ [Drop to kermit: ++ ^\c ++ send <u-boot-bin-image> ++ c ++ ] ++ ++ ++ Or via tftp: ++ ++ tftp 10000 u-boot.bin ++ ++5.1 Reflash U-boot Image using U-boot ++ ++ tftp 20000 u-boot.bin ++ protect off fef00000 fef3ffff ++ erase fef00000 fef3ffff ++ ++ cp.b 20000 fef00000 xxxx ++ ++ or ++ ++ cp.b 20000 fef00000 3ffff ++ ++ ++You have to supply the correct byte count with 'xxxx' from the TFTP result log. ++Maybe 3ffff will work too, that corresponds to the erased sectors. ++ ++ ++6. Notes ++ 1) The console baudrate for MPC8360EMDS is 115200bps. +diff -Naupr u-boot-1.1.6/drivers/cfi_flash.c u-boot-1.1.6-fsl-1/drivers/cfi_flash.c +--- u-boot-1.1.6/drivers/cfi_flash.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/cfi_flash.c 2006-11-30 12:34:13.000000000 -0600 +@@ -4,11 +4,12 @@ + * + * Copyright (C) 2003 Arabella Software Ltd. + * Yuli Barcohen <yuli@arabellasw.com> +- * Modified to work with AMD flashes + * + * Copyright (C) 2004 + * Ed Okerson +- * Modified to work with little-endian systems. ++ * ++ * Copyright (C) 2006 ++ * Tolunay Orkun <listmember@orkun.us> + * + * See file CREDITS for list of people who contributed to this + * project. +@@ -28,17 +29,6 @@ + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * +- * History +- * 01/20/2004 - combined variants of original driver. +- * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay) +- * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud) +- * 01/27/2004 - Little endian support Ed Okerson +- * +- * Tested Architectures +- * Port Width Chip Width # of banks Flash Chip Board +- * 32 16 1 28F128J3 seranoa/eagle +- * 64 16 1 28F128J3 seranoa/falcon +- * + */ + + /* The DEBUG define must be before common to enable debugging */ +@@ -54,21 +44,16 @@ + * This file implements a Common Flash Interface (CFI) driver for U-Boot. + * The width of the port and the width of the chips are determined at initialization. + * These widths are used to calculate the address for access CFI data structures. +- * It has been tested on an Intel Strataflash implementation and AMD 29F016D. + * + * References + * JEDEC Standard JESD68 - Common Flash Interface (CFI) + * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes + * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets + * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet ++ * AMD CFI Specification, Release 2.0 December 1, 2001 ++ * AMD/Spansion Application Note: Migration from Single-byte to Three-byte ++ * Device IDs, Publication Number 25538 Revision A, November 8, 2001 + * +- * TODO +- * +- * Use Primary Extended Query table (PRI) and Alternate Algorithm Query +- * Table (ALT) to determine if protection is available +- * +- * Add support for other command sets Use the PRI and ALT to determine command set +- * Verify erase and program timeouts. + */ + + #ifndef CFG_FLASH_BANKS_LIST +@@ -114,6 +99,10 @@ + #define AMD_ADDR_START ((info->portwidth == FLASH_CFI_8BIT) ? 0xAAA : 0x555) + #define AMD_ADDR_ACK ((info->portwidth == FLASH_CFI_8BIT) ? 0x555 : 0x2AA) + ++#define FLASH_OFFSET_MANUFACTURER_ID 0x00 ++#define FLASH_OFFSET_DEVICE_ID 0x01 ++#define FLASH_OFFSET_DEVICE_ID2 0x0E ++#define FLASH_OFFSET_DEVICE_ID3 0x0F + #define FLASH_OFFSET_CFI 0x55 + #define FLASH_OFFSET_CFI_RESP 0x10 + #define FLASH_OFFSET_PRIMARY_VENDOR 0x13 +@@ -135,25 +124,20 @@ + #define FLASH_OFFSET_USER_PROTECTION 0x85 + #define FLASH_OFFSET_INTEL_PROTECTION 0x81 + +- +-#define FLASH_MAN_CFI 0x01000000 +- +-#define CFI_CMDSET_NONE 0 +-#define CFI_CMDSET_INTEL_EXTENDED 1 +-#define CFI_CMDSET_AMD_STANDARD 2 +-#define CFI_CMDSET_INTEL_STANDARD 3 +-#define CFI_CMDSET_AMD_EXTENDED 4 +-#define CFI_CMDSET_MITSU_STANDARD 256 +-#define CFI_CMDSET_MITSU_EXTENDED 257 +-#define CFI_CMDSET_SST 258 +- ++#define CFI_CMDSET_NONE 0 ++#define CFI_CMDSET_INTEL_EXTENDED 1 ++#define CFI_CMDSET_AMD_STANDARD 2 ++#define CFI_CMDSET_INTEL_STANDARD 3 ++#define CFI_CMDSET_AMD_EXTENDED 4 ++#define CFI_CMDSET_MITSU_STANDARD 256 ++#define CFI_CMDSET_MITSU_EXTENDED 257 ++#define CFI_CMDSET_SST 258 + + #ifdef CFG_FLASH_CFI_AMD_RESET /* needed for STM_ID_29W320DB on UC100 */ + # undef FLASH_CMD_RESET +-# define FLASH_CMD_RESET AMD_CMD_RESET /* use AMD-Reset instead */ ++# define FLASH_CMD_RESET AMD_CMD_RESET /* use AMD-Reset instead */ + #endif + +- + typedef union { + unsigned char c; + unsigned short w; +@@ -168,7 +152,7 @@ typedef union { + volatile unsigned long long *llp; + } cfiptr_t; + +-#define NUM_ERASE_REGIONS 4 ++#define NUM_ERASE_REGIONS 4 /* max. number of erase regions */ + + /* use CFG_MAX_FLASH_BANKS_DETECT if defined */ + #ifdef CFG_MAX_FLASH_BANKS_DETECT +@@ -200,6 +184,7 @@ static void flash_unlock_seq (flash_info + static int flash_isequal (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd); + static int flash_isset (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd); + static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd); ++static void flash_read_jedec_ids (flash_info_t * info); + static int flash_detect_cfi (flash_info_t * info); + static int flash_write_cfiword (flash_info_t * info, ulong dest, cfiword_t cword); + static int flash_full_status_check (flash_info_t * info, flash_sect_t sector, +@@ -307,7 +292,7 @@ ushort flash_read_ushort (flash_info_t * + } + + /*----------------------------------------------------------------------- +- * read a long word by picking the least significant byte of each maiximum ++ * read a long word by picking the least significant byte of each maximum + * port size word. Swap for ppc format. + */ + ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset) +@@ -529,14 +514,42 @@ void flash_print_info (flash_info_t * in + (info->portwidth << 3), (info->chipwidth << 3)); + printf (" Size: %ld MB in %d Sectors\n", + info->size >> 20, info->sector_count); +- printf (" Erase timeout %ld ms, write timeout %ld ms, buffer write timeout %ld ms, buffer size %d\n", ++ printf (" "); ++ switch (info->vendor) { ++ case CFI_CMDSET_INTEL_STANDARD: ++ printf ("Intel Standard"); ++ break; ++ case CFI_CMDSET_INTEL_EXTENDED: ++ printf ("Intel Extended"); ++ break; ++ case CFI_CMDSET_AMD_STANDARD: ++ printf ("AMD Standard"); ++ break; ++ case CFI_CMDSET_AMD_EXTENDED: ++ printf ("AMD Extended"); ++ break; ++ default: ++ printf ("Unknown (%d)", info->vendor); ++ break; ++ } ++ printf (" command set, Manufacturer ID: 0x%02X, Device ID: 0x%02X", ++ info->manufacturer_id, info->device_id); ++ if (info->device_id == 0x7E) { ++ printf("%04X", info->device_id2); ++ } ++ printf ("\n Erase timeout: %ld ms, write timeout: %ld ms\n", + info->erase_blk_tout, +- info->write_tout, ++ info->write_tout); ++ if (info->buffer_size > 1) { ++ printf (" Buffer write timeout: %ld ms, buffer size: %d bytes\n", + info->buffer_write_tout, + info->buffer_size); ++ } + +- puts (" Sector Start Addresses:"); ++ puts ("\n Sector Start Addresses:"); + for (i = 0; i < info->sector_count; ++i) { ++ if ((i % 5) == 0) ++ printf ("\n"); + #ifdef CFG_FLASH_EMPTY_INFO + int k; + int size; +@@ -560,18 +573,15 @@ void flash_print_info (flash_info_t * in + } + } + +- if ((i % 5) == 0) +- printf ("\n"); + /* print empty and read-only info */ +- printf (" %08lX%s%s", ++ printf (" %08lX %c %s ", + info->start[i], +- erased ? " E" : " ", +- info->protect[i] ? "RO " : " "); ++ erased ? 'E' : ' ', ++ info->protect[i] ? "RO" : " "); + #else /* ! CFG_FLASH_EMPTY_INFO */ +- if ((i % 5) == 0) +- printf ("\n "); +- printf (" %08lX%s", +- info->start[i], info->protect[i] ? " (RO)" : " "); ++ printf (" %08lX %s ", ++ info->start[i], ++ info->protect[i] ? "RO" : " "); + #endif + } + putc ('\n'); +@@ -1071,6 +1081,55 @@ static int flash_toggle (flash_info_t * + } + + /*----------------------------------------------------------------------- ++ * read jedec ids from device and set corresponding fields in info struct ++ * ++ * Note: assume cfi->vendor, cfi->portwidth and cfi->chipwidth are correct ++ * ++*/ ++static void flash_read_jedec_ids (flash_info_t * info) ++{ ++ info->manufacturer_id = 0; ++ info->device_id = 0; ++ info->device_id2 = 0; ++ ++ switch (info->vendor) { ++ case CFI_CMDSET_INTEL_STANDARD: ++ case CFI_CMDSET_INTEL_EXTENDED: ++ flash_write_cmd(info, 0, 0, FLASH_CMD_RESET); ++ flash_write_cmd(info, 0, 0, FLASH_CMD_READ_ID); ++ udelay(1000); /* some flash are slow to respond */ ++ info->manufacturer_id = flash_read_uchar (info, ++ FLASH_OFFSET_MANUFACTURER_ID); ++ info->device_id = flash_read_uchar (info, ++ FLASH_OFFSET_DEVICE_ID); ++ flash_write_cmd(info, 0, 0, FLASH_CMD_RESET); ++ break; ++ case CFI_CMDSET_AMD_STANDARD: ++ case CFI_CMDSET_AMD_EXTENDED: ++ flash_write_cmd(info, 0, 0, AMD_CMD_RESET); ++ flash_unlock_seq(info, 0); ++ flash_write_cmd(info, 0, AMD_ADDR_START, FLASH_CMD_READ_ID); ++ udelay(1000); /* some flash are slow to respond */ ++ info->manufacturer_id = flash_read_uchar (info, ++ FLASH_OFFSET_MANUFACTURER_ID); ++ info->device_id = flash_read_uchar (info, ++ FLASH_OFFSET_DEVICE_ID); ++ if (info->device_id == 0x7E) { ++ /* AMD 3-byte (expanded) device ids */ ++ info->device_id2 = flash_read_uchar (info, ++ FLASH_OFFSET_DEVICE_ID2); ++ info->device_id2 <<= 8; ++ info->device_id2 |= flash_read_uchar (info, ++ FLASH_OFFSET_DEVICE_ID3); ++ } ++ flash_write_cmd(info, 0, 0, AMD_CMD_RESET); ++ break; ++ default: ++ break; ++ } ++} ++ ++/*----------------------------------------------------------------------- + * detect if flash is compatible with the Common Flash Interface (CFI) + * http://www.jedec.org/download/search/jesd68.pdf + * +@@ -1120,15 +1179,31 @@ ulong flash_get_size (ulong base, int ba + uchar num_erase_regions; + int erase_region_size; + int erase_region_count; ++ int geometry_reversed = 0; ++ ++ info->ext_addr = 0; ++ info->cfi_version = 0; + #ifdef CFG_FLASH_PROTECTION +- int ext_addr; + info->legacy_unlock = 0; + #endif + + info->start[0] = base; + + if (flash_detect_cfi (info)) { +- info->vendor = flash_read_ushort (info, 0, FLASH_OFFSET_PRIMARY_VENDOR); ++ info->vendor = flash_read_ushort (info, 0, ++ FLASH_OFFSET_PRIMARY_VENDOR); ++ flash_read_jedec_ids (info); ++ flash_write_cmd (info, 0, FLASH_OFFSET_CFI, FLASH_CMD_CFI); ++ num_erase_regions = flash_read_uchar (info, ++ FLASH_OFFSET_NUM_ERASE_REGIONS); ++ info->ext_addr = flash_read_ushort (info, 0, ++ FLASH_OFFSET_EXT_QUERY_T_P_ADDR); ++ if (info->ext_addr) { ++ info->cfi_version = (ushort) flash_read_uchar (info, ++ info->ext_addr + 3) << 8; ++ info->cfi_version |= (ushort) flash_read_uchar (info, ++ info->ext_addr + 4); ++ } + #ifdef DEBUG + flash_printqry (info, 0); + #endif +@@ -1139,26 +1214,46 @@ ulong flash_get_size (ulong base, int ba + info->cmd_reset = FLASH_CMD_RESET; + #ifdef CFG_FLASH_PROTECTION + /* read legacy lock/unlock bit from intel flash */ +- ext_addr = flash_read_ushort (info, 0, +- FLASH_OFFSET_EXT_QUERY_T_P_ADDR); +- info->legacy_unlock = +- flash_read_uchar (info, ext_addr + 5) & 0x08; ++ if (info->ext_addr) { ++ info->legacy_unlock = flash_read_uchar (info, ++ info->ext_addr + 5) & 0x08; ++ } + #endif + break; + case CFI_CMDSET_AMD_STANDARD: + case CFI_CMDSET_AMD_EXTENDED: + info->cmd_reset = AMD_CMD_RESET; ++ /* check if flash geometry needs reversal */ ++ if (num_erase_regions <= 1) ++ break; ++ /* reverse geometry if top boot part */ ++ if (info->cfi_version < 0x3131) { ++ /* CFI < 1.1, try to guess from device id */ ++ if ((info->device_id & 0x80) != 0) { ++ geometry_reversed = 1; ++ } ++ break; ++ } ++ /* CFI >= 1.1, deduct from top/bottom flag */ ++ /* note: ext_addr is valid since cfi_version > 0 */ ++ if (flash_read_uchar(info, info->ext_addr + 0xf) == 3) { ++ geometry_reversed = 1; ++ } + break; + } + + debug ("manufacturer is %d\n", info->vendor); ++ debug ("manufacturer id is 0x%x\n", info->manufacturer_id); ++ debug ("device id is 0x%x\n", info->device_id); ++ debug ("device id2 is 0x%x\n", info->device_id2); ++ debug ("cfi version is 0x%04x\n", info->cfi_version); ++ + size_ratio = info->portwidth / info->chipwidth; + /* if the chip is x8/x16 reduce the ratio by half */ + if ((info->interface == FLASH_CFI_X8X16) + && (info->chipwidth == FLASH_CFI_BY8)) { + size_ratio >>= 1; + } +- num_erase_regions = flash_read_uchar (info, FLASH_OFFSET_NUM_ERASE_REGIONS); + debug ("size_ratio %d port %d bits chip %d bits\n", + size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH, + info->chipwidth << CFI_FLASH_SHIFT_WIDTH); +@@ -1171,7 +1266,12 @@ ulong flash_get_size (ulong base, int ba + num_erase_regions, NUM_ERASE_REGIONS); + break; + } +- tmp = flash_read_long (info, 0, ++ if (geometry_reversed) ++ tmp = flash_read_long (info, 0, ++ FLASH_OFFSET_ERASE_REGIONS + ++ (num_erase_regions - 1 - i) * 4); ++ else ++ tmp = flash_read_long (info, 0, + FLASH_OFFSET_ERASE_REGIONS + + i * 4); + erase_region_size = +diff -Naupr u-boot-1.1.6/drivers/fsl_i2c.c u-boot-1.1.6-fsl-1/drivers/fsl_i2c.c +--- u-boot-1.1.6/drivers/fsl_i2c.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/fsl_i2c.c 2006-11-30 12:34:13.000000000 -0600 +@@ -28,29 +28,52 @@ + #include <asm/fsl_i2c.h> /* HW definitions */ + + #define I2C_TIMEOUT (CFG_HZ / 4) +-#define I2C ((struct fsl_i2c *)(CFG_IMMR + CFG_I2C_OFFSET)) + ++#define I2C_READ_BIT 1 ++#define I2C_WRITE_BIT 0 ++ ++/* Initialize the bus pointer to whatever one the SPD EEPROM is on. ++ * Default is bus 0. This is necessary because the DDR initialization ++ * runs from ROM, and we can't switch buses because we can't modify ++ * the global variables. ++ */ ++#ifdef CFG_SPD_BUS_NUM ++static unsigned int i2c_bus_num __attribute__ ((section ("data"))) = CFG_SPD_BUS_NUM; ++#else ++static unsigned int i2c_bus_num __attribute__ ((section ("data"))) = 0; ++#endif ++ ++static volatile struct fsl_i2c *i2c_dev[2] = { ++ (struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET), ++#ifdef CFG_I2C2_OFFSET ++ (struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET) ++#endif ++}; + + void + i2c_init(int speed, int slaveadd) + { +- /* stop I2C controller */ +- writeb(0x0, &I2C->cr); +- +- /* set clock */ +- writeb(0x3f, &I2C->fdr); +- +- /* set default filter */ +- writeb(0x10, &I2C->dfsrr); ++ volatile struct fsl_i2c *dev; + +- /* write slave address */ +- writeb(slaveadd, &I2C->adr); ++ dev = (struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET); + +- /* clear status register */ +- writeb(0x0, &I2C->sr); +- +- /* start I2C controller */ +- writeb(I2C_CR_MEN, &I2C->cr); ++ writeb(0, &dev->cr); /* stop I2C controller */ ++ writeb(0x3F, &dev->fdr); /* set bus speed */ ++ writeb(0x3F, &dev->dfsrr); /* set default filter */ ++ writeb(slaveadd << 1, &dev->adr); /* write slave address */ ++ writeb(0x0, &dev->sr); /* clear status register */ ++ writeb(I2C_CR_MEN, &dev->cr); /* start I2C controller */ ++ ++#ifdef CFG_I2C2_OFFSET ++ dev = (struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET); ++ ++ writeb(0, &dev->cr); /* stop I2C controller */ ++ writeb(0x3F, &dev->fdr); /* set bus speed */ ++ writeb(0x3F, &dev->dfsrr); /* set default filter */ ++ writeb(slaveadd, &dev->adr); /* write slave address */ ++ writeb(0x0, &dev->sr); /* clear status register */ ++ writeb(I2C_CR_MEN, &dev->cr); /* start I2C controller */ ++#endif /* CFG_I2C2_OFFSET */ + } + + static __inline__ int +@@ -58,7 +81,7 @@ i2c_wait4bus(void) + { + ulong timeval = get_timer(0); + +- while (readb(&I2C->sr) & I2C_SR_MBB) { ++ while (readb(&i2c_dev[i2c_bus_num]->sr) & I2C_SR_MBB) { + if (get_timer(timeval) > I2C_TIMEOUT) { + return -1; + } +@@ -74,11 +97,11 @@ i2c_wait(int write) + ulong timeval = get_timer(0); + + do { +- csr = readb(&I2C->sr); ++ csr = readb(&i2c_dev[i2c_bus_num]->sr); + if (!(csr & I2C_SR_MIF)) + continue; + +- writeb(0x0, &I2C->sr); ++ writeb(0x0, &i2c_dev[i2c_bus_num]->sr); + + if (csr & I2C_SR_MAL) { + debug("i2c_wait: MAL\n"); +@@ -90,7 +113,7 @@ i2c_wait(int write) + return -1; + } + +- if (write == I2C_WRITE && (csr & I2C_SR_RXAK)) { ++ if (write == I2C_WRITE_BIT && (csr & I2C_SR_RXAK)) { + debug("i2c_wait: No RXACK\n"); + return -1; + } +@@ -107,11 +130,11 @@ i2c_write_addr (u8 dev, u8 dir, int rsta + { + writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX + | (rsta ? I2C_CR_RSTA : 0), +- &I2C->cr); ++ &i2c_dev[i2c_bus_num]->cr); + +- writeb((dev << 1) | dir, &I2C->dr); ++ writeb((dev << 1) | dir, &i2c_dev[i2c_bus_num]->dr); + +- if (i2c_wait(I2C_WRITE) < 0) ++ if (i2c_wait(I2C_WRITE_BIT) < 0) + return 0; + + return 1; +@@ -123,12 +146,12 @@ __i2c_write(u8 *data, int length) + int i; + + writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_MTX, +- &I2C->cr); ++ &i2c_dev[i2c_bus_num]->cr); + + for (i = 0; i < length; i++) { +- writeb(data[i], &I2C->dr); ++ writeb(data[i], &i2c_dev[i2c_bus_num]->dr); + +- if (i2c_wait(I2C_WRITE) < 0) ++ if (i2c_wait(I2C_WRITE_BIT) < 0) + break; + } + +@@ -141,25 +164,25 @@ __i2c_read(u8 *data, int length) + int i; + + writeb(I2C_CR_MEN | I2C_CR_MSTA | ((length == 1) ? I2C_CR_TXAK : 0), +- &I2C->cr); ++ &i2c_dev[i2c_bus_num]->cr); + + /* dummy read */ +- readb(&I2C->dr); ++ readb(&i2c_dev[i2c_bus_num]->dr); + + for (i = 0; i < length; i++) { +- if (i2c_wait(I2C_READ) < 0) ++ if (i2c_wait(I2C_READ_BIT) < 0) + break; + + /* Generate ack on last next to last byte */ + if (i == length - 2) + writeb(I2C_CR_MEN | I2C_CR_MSTA | I2C_CR_TXAK, +- &I2C->cr); ++ &i2c_dev[i2c_bus_num]->cr); + + /* Generate stop on last byte */ + if (i == length - 1) +- writeb(I2C_CR_MEN | I2C_CR_TXAK, &I2C->cr); ++ writeb(I2C_CR_MEN | I2C_CR_TXAK, &i2c_dev[i2c_bus_num]->cr); + +- data[i] = readb(&I2C->dr); ++ data[i] = readb(&i2c_dev[i2c_bus_num]->dr); + } + + return i; +@@ -172,13 +195,13 @@ i2c_read(u8 dev, uint addr, int alen, u8 + u8 *a = (u8*)&addr; + + if (i2c_wait4bus() >= 0 +- && i2c_write_addr(dev, I2C_WRITE, 0) != 0 ++ && i2c_write_addr(dev, I2C_WRITE_BIT, 0) != 0 + && __i2c_write(&a[4 - alen], alen) == alen +- && i2c_write_addr(dev, I2C_READ, 1) != 0) { ++ && i2c_write_addr(dev, I2C_READ_BIT, 1) != 0) { + i = __i2c_read(data, length); + } + +- writeb(I2C_CR_MEN, &I2C->cr); ++ writeb(I2C_CR_MEN, &i2c_dev[i2c_bus_num]->cr); + + if (i == length) + return 0; +@@ -193,12 +216,12 @@ i2c_write(u8 dev, uint addr, int alen, u + u8 *a = (u8*)&addr; + + if (i2c_wait4bus() >= 0 +- && i2c_write_addr(dev, I2C_WRITE, 0) != 0 ++ && i2c_write_addr(dev, I2C_WRITE_BIT, 0) != 0 + && __i2c_write(&a[4 - alen], alen) == alen) { + i = __i2c_write(data, length); + } + +- writeb(I2C_CR_MEN, &I2C->cr); ++ writeb(I2C_CR_MEN, &i2c_dev[i2c_bus_num]->cr); + + if (i == length) + return 0; +@@ -237,5 +260,34 @@ i2c_reg_write(uchar i2c_addr, uchar reg, + i2c_write(i2c_addr, reg, 1, &val, 1); + } + ++int i2c_set_bus_num(unsigned int bus) ++{ ++#ifdef CFG_I2C2_OFFSET ++ if (bus > 1) { ++#else ++ if (bus > 0) { ++#endif ++ return -1; ++ } ++ ++ i2c_bus_num = bus; ++ ++ return 0; ++} ++ ++int i2c_set_bus_speed(unsigned int speed) ++{ ++ return -1; ++} ++ ++unsigned int i2c_get_bus_num(void) ++{ ++ return i2c_bus_num; ++} ++ ++unsigned int i2c_get_bus_speed(void) ++{ ++ return 0; ++} + #endif /* CONFIG_HARD_I2C */ + #endif /* CONFIG_FSL_I2C */ +diff -Naupr u-boot-1.1.6/drivers/nand/nand_base.c u-boot-1.1.6-fsl-1/drivers/nand/nand_base.c +--- u-boot-1.1.6/drivers/nand/nand_base.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/nand/nand_base.c 2006-12-06 10:33:49.000000000 -0600 +@@ -838,9 +838,9 @@ static int nand_wait(struct mtd_info *mt + unsigned long timeo; + + if (state == FL_ERASING) +- timeo = CFG_HZ * 400; ++ timeo = (CFG_HZ * 400) / 1000; + else +- timeo = CFG_HZ * 20; ++ timeo = (CFG_HZ * 20) / 1000; + + if ((state == FL_ERASING) && (this->options & NAND_IS_AND)) + this->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1); +@@ -852,8 +852,8 @@ static int nand_wait(struct mtd_info *mt + while (1) { + if (get_timer(0) > timeo) { + printf("Timeout!"); +- return 0; +- } ++ return 0x01; ++ } + + if (this->dev_ready) { + if (this->dev_ready(mtd)) +@@ -1713,6 +1713,7 @@ static int nand_write_ecc (struct mtd_in + goto out; + } + *retlen = written; ++ bufstart = (u_char*) &buf[written]; + + ofs = autoplace ? mtd->oobavail : mtd->oobsize; + if (eccbuf) +@@ -2407,7 +2408,9 @@ int nand_scan (struct mtd_info *mtd, int + } + + if (!nand_flash_ids[i].name) { ++#ifndef CFG_NAND_QUIET_TEST + printk (KERN_WARNING "No NAND device found!!!\n"); ++#endif + this->select_chip(mtd, -1); + return 1; + } +diff -Naupr u-boot-1.1.6/drivers/qe/Makefile u-boot-1.1.6-fsl-1/drivers/qe/Makefile +--- u-boot-1.1.6/drivers/qe/Makefile 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/Makefile 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,43 @@ ++# ++# Copyright (C) 2006 Freescale Semiconductor, Inc. ++# ++# See file CREDITS for list of people who contributed to this ++# project. ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License as ++# published by the Free Software Foundation; either version 2 of ++# the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++# MA 02111-1307 USA ++# ++ ++include $(TOPDIR)/config.mk ++ ++LIB := $(obj)qe.a ++ ++COBJS := qe.o uccf.o uec.o uec_phy.o ++ ++SRCS := $(COBJS:.o=.c) ++OBJS := $(addprefix $(obj),$(COBJS)) ++ ++all: $(LIB) ++ ++$(LIB): $(obj).depend $(OBJS) ++ $(AR) $(ARFLAGS) $@ $(OBJS) ++ ++######################################################################### ++ ++include $(SRCTREE)/rules.mk ++ ++sinclude $(obj).depend ++ ++######################################################################### +diff -Naupr u-boot-1.1.6/drivers/qe/qe.c u-boot-1.1.6-fsl-1/drivers/qe/qe.c +--- u-boot-1.1.6/drivers/qe/qe.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/qe.c 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,254 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * based on source code of Shlomi Gridish ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include "common.h" ++#include "asm/errno.h" ++#include "asm/io.h" ++#include "asm/immap_qe.h" ++#include "qe.h" ++ ++#if defined(CONFIG_QE) ++qe_map_t *qe_immr = NULL; ++static qe_snum_t snums[QE_NUM_OF_SNUM]; ++ ++void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data) ++{ ++ u32 cecr; ++ ++ if (cmd == QE_RESET) { ++ out_be32(&qe_immr->cp.cecr,(u32) (cmd | QE_CR_FLG)); ++ } else { ++ out_be32(&qe_immr->cp.cecdr, cmd_data); ++ out_be32(&qe_immr->cp.cecr, (sbc | QE_CR_FLG | ++ ((u32) mcn<<QE_CR_PROTOCOL_SHIFT) | cmd)); ++ } ++ /* Wait for the QE_CR_FLG to clear */ ++ do { ++ cecr = in_be32(&qe_immr->cp.cecr); ++ } while (cecr & QE_CR_FLG); ++ ++ return; ++} ++ ++uint qe_muram_alloc(uint size, uint align) ++{ ++ DECLARE_GLOBAL_DATA_PTR; ++ ++ uint retloc; ++ uint align_mask, off; ++ uint savebase; ++ ++ align_mask = align - 1; ++ savebase = gd->mp_alloc_base; ++ ++ if ((off = (gd->mp_alloc_base & align_mask)) != 0) ++ gd->mp_alloc_base += (align - off); ++ ++ if ((off = size & align_mask) != 0) ++ size += (align - off); ++ ++ if ((gd->mp_alloc_base + size) >= gd->mp_alloc_top) { ++ gd->mp_alloc_base = savebase; ++ printf("%s: ran out of ram.\n", __FUNCTION__); ++ } ++ ++ retloc = gd->mp_alloc_base; ++ gd->mp_alloc_base += size; ++ ++ memset((void *)&qe_immr->muram[retloc], 0, size); ++ ++ __asm__ __volatile__("sync"); ++ ++ return retloc; ++} ++ ++void *qe_muram_addr(uint offset) ++{ ++ return (void *)&qe_immr->muram[offset]; ++} ++ ++static void qe_sdma_init(void) ++{ ++ volatile sdma_t *p; ++ uint sdma_buffer_base; ++ ++ p = (volatile sdma_t *)&qe_immr->sdma; ++ ++ /* All of DMA transaction in bus 1 */ ++ out_be32(&p->sdaqr, 0); ++ out_be32(&p->sdaqmr, 0); ++ ++ /* Allocate 2KB temporary buffer for sdma */ ++ sdma_buffer_base = qe_muram_alloc(2048, 64); ++ out_be32(&p->sdwbcr, sdma_buffer_base & QE_SDEBCR_BA_MASK); ++ ++ /* Clear sdma status */ ++ out_be32(&p->sdsr, 0x03000000); ++ ++ /* Enable global mode on bus 1, and 2KB buffer size */ ++ out_be32(&p->sdmr, QE_SDMR_GLB_1_MSK | (0x3 << QE_SDMR_CEN_SHIFT)); ++} ++ ++static u8 thread_snum[QE_NUM_OF_SNUM] = { ++ 0x04, 0x05, 0x0c, 0x0d, ++ 0x14, 0x15, 0x1c, 0x1d, ++ 0x24, 0x25, 0x2c, 0x2d, ++ 0x34, 0x35, 0x88, 0x89, ++ 0x98, 0x99, 0xa8, 0xa9, ++ 0xb8, 0xb9, 0xc8, 0xc9, ++ 0xd8, 0xd9, 0xe8, 0xe9 ++}; ++ ++static void qe_snums_init(void) ++{ ++ int i; ++ ++ for (i = 0; i < QE_NUM_OF_SNUM; i++) { ++ snums[i].state = QE_SNUM_STATE_FREE; ++ snums[i].num = thread_snum[i]; ++ } ++} ++ ++int qe_get_snum(void) ++{ ++ int snum = -EBUSY; ++ int i; ++ ++ for (i = 0; i < QE_NUM_OF_SNUM; i++) { ++ if (snums[i].state == QE_SNUM_STATE_FREE) { ++ snums[i].state = QE_SNUM_STATE_USED; ++ snum = snums[i].num; ++ break; ++ } ++ } ++ ++ return snum; ++} ++ ++void qe_put_snum(u8 snum) ++{ ++ int i; ++ ++ for (i = 0; i < QE_NUM_OF_SNUM; i++) { ++ if (snums[i].num == snum) { ++ snums[i].state = QE_SNUM_STATE_FREE; ++ break; ++ } ++ } ++} ++ ++void qe_init(uint qe_base) ++{ ++ DECLARE_GLOBAL_DATA_PTR; ++ ++ /* Init the QE IMMR base */ ++ qe_immr = (qe_map_t *)qe_base; ++ ++ gd->mp_alloc_base = QE_DATAONLY_BASE; ++ gd->mp_alloc_top = gd->mp_alloc_base + QE_DATAONLY_SIZE; ++ ++ qe_sdma_init(); ++ qe_snums_init(); ++} ++ ++void qe_reset(void) ++{ ++ qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID, ++ (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0); ++} ++ ++void qe_assign_page(uint snum, uint para_ram_base) ++{ ++ u32 cecr; ++ ++ out_be32(&qe_immr->cp.cecdr, para_ram_base); ++ out_be32(&qe_immr->cp.cecr, ((u32) snum<<QE_CR_ASSIGN_PAGE_SNUM_SHIFT) ++ | QE_CR_FLG | QE_ASSIGN_PAGE); ++ ++ /* Wait for the QE_CR_FLG to clear */ ++ do { ++ cecr = in_be32(&qe_immr->cp.cecr); ++ } while (cecr & QE_CR_FLG ); ++ ++ return; ++} ++ ++/* ++ * brg: 0~15 as BRG1~BRG16 ++ rate: baud rate ++ * BRG input clock comes from the BRGCLK (internal clock generated from ++ the QE clock, it is one-half of the QE clock), If need the clock source ++ from CLKn pin, we have te change the function. ++ */ ++ ++#define BRG_CLK (gd->brg_clk) ++ ++int qe_set_brg(uint brg, uint rate) ++{ ++ DECLARE_GLOBAL_DATA_PTR; ++ volatile uint *bp; ++ u32 divisor; ++ int div16 = 0; ++ ++ if (brg >= QE_NUM_OF_BRGS) ++ return -EINVAL; ++ bp = (uint *)&qe_immr->brg.brgc1; ++ bp += brg; ++ ++ divisor = (BRG_CLK / rate); ++ if (divisor > QE_BRGC_DIVISOR_MAX + 1) { ++ div16 = 1; ++ divisor /= 16; ++ } ++ ++ *bp = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE; ++ __asm__ __volatile__("sync"); ++ ++ if (div16) { ++ *bp |= QE_BRGC_DIV16; ++ __asm__ __volatile__("sync"); ++ } ++ ++ return 0; ++} ++ ++/* Set ethernet MII clock master ++*/ ++int qe_set_mii_clk_src(int ucc_num) ++{ ++ u32 cmxgcr; ++ ++ /* check if the UCC number is in range. */ ++ if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) { ++ printf("%s: ucc num not in ranges\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ cmxgcr = in_be32(&qe_immr->qmx.cmxgcr); ++ cmxgcr &= ~QE_CMXGCR_MII_ENET_MNG_MASK; ++ cmxgcr |= (ucc_num <<QE_CMXGCR_MII_ENET_MNG_SHIFT); ++ out_be32(&qe_immr->qmx.cmxgcr, cmxgcr); ++ ++ return 0; ++} ++ ++#endif /* CONFIG_QE */ +diff -Naupr u-boot-1.1.6/drivers/qe/qe.h u-boot-1.1.6-fsl-1/drivers/qe/qe.h +--- u-boot-1.1.6/drivers/qe/qe.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/qe.h 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,237 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * based on source code of Shlomi Gridish ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#ifndef __QE_H__ ++#define __QE_H__ ++ ++#include "common.h" ++ ++#define QE_NUM_OF_SNUM 28 ++#define QE_NUM_OF_BRGS 16 ++#define UCC_MAX_NUM 8 ++ ++#define QE_DATAONLY_BASE (uint)(128) ++#define QE_DATAONLY_SIZE ((uint)(0xc000) - QE_DATAONLY_BASE) ++ ++/* QE threads SNUM ++*/ ++typedef enum qe_snum_state { ++ QE_SNUM_STATE_USED, /* used */ ++ QE_SNUM_STATE_FREE /* free */ ++} qe_snum_state_e; ++ ++typedef struct qe_snum { ++ u8 num; /* snum */ ++ qe_snum_state_e state; /* state */ ++} qe_snum_t; ++ ++/* QE RISC allocation ++*/ ++typedef enum qe_risc_allocation { ++ QE_RISC_ALLOCATION_RISC1 = 1, /* RISC 1 */ ++ QE_RISC_ALLOCATION_RISC2 = 2, /* RISC 2 */ ++ QE_RISC_ALLOCATION_RISC1_AND_RISC2 = 3 /* RISC 1 or RISC 2 */ ++} qe_risc_allocation_e; ++ ++/* QE CECR commands for UCC fast. ++*/ ++#define QE_CR_FLG 0x00010000 ++#define QE_RESET 0x80000000 ++#define QE_INIT_TX_RX 0x00000000 ++#define QE_INIT_RX 0x00000001 ++#define QE_INIT_TX 0x00000002 ++#define QE_ENTER_HUNT_MODE 0x00000003 ++#define QE_STOP_TX 0x00000004 ++#define QE_GRACEFUL_STOP_TX 0x00000005 ++#define QE_RESTART_TX 0x00000006 ++#define QE_SWITCH_COMMAND 0x00000007 ++#define QE_SET_GROUP_ADDRESS 0x00000008 ++#define QE_INSERT_CELL 0x00000009 ++#define QE_ATM_TRANSMIT 0x0000000a ++#define QE_CELL_POOL_GET 0x0000000b ++#define QE_CELL_POOL_PUT 0x0000000c ++#define QE_IMA_HOST_CMD 0x0000000d ++#define QE_ATM_MULTI_THREAD_INIT 0x00000011 ++#define QE_ASSIGN_PAGE 0x00000012 ++#define QE_START_FLOW_CONTROL 0x00000014 ++#define QE_STOP_FLOW_CONTROL 0x00000015 ++#define QE_ASSIGN_PAGE_TO_DEVICE 0x00000016 ++#define QE_GRACEFUL_STOP_RX 0x0000001a ++#define QE_RESTART_RX 0x0000001b ++ ++/* QE CECR Sub Block Code - sub block code of QE command. ++*/ ++#define QE_CR_SUBBLOCK_INVALID 0x00000000 ++#define QE_CR_SUBBLOCK_USB 0x03200000 ++#define QE_CR_SUBBLOCK_UCCFAST1 0x02000000 ++#define QE_CR_SUBBLOCK_UCCFAST2 0x02200000 ++#define QE_CR_SUBBLOCK_UCCFAST3 0x02400000 ++#define QE_CR_SUBBLOCK_UCCFAST4 0x02600000 ++#define QE_CR_SUBBLOCK_UCCFAST5 0x02800000 ++#define QE_CR_SUBBLOCK_UCCFAST6 0x02a00000 ++#define QE_CR_SUBBLOCK_UCCFAST7 0x02c00000 ++#define QE_CR_SUBBLOCK_UCCFAST8 0x02e00000 ++#define QE_CR_SUBBLOCK_UCCSLOW1 0x00000000 ++#define QE_CR_SUBBLOCK_UCCSLOW2 0x00200000 ++#define QE_CR_SUBBLOCK_UCCSLOW3 0x00400000 ++#define QE_CR_SUBBLOCK_UCCSLOW4 0x00600000 ++#define QE_CR_SUBBLOCK_UCCSLOW5 0x00800000 ++#define QE_CR_SUBBLOCK_UCCSLOW6 0x00a00000 ++#define QE_CR_SUBBLOCK_UCCSLOW7 0x00c00000 ++#define QE_CR_SUBBLOCK_UCCSLOW8 0x00e00000 ++#define QE_CR_SUBBLOCK_MCC1 0x03800000 ++#define QE_CR_SUBBLOCK_MCC2 0x03a00000 ++#define QE_CR_SUBBLOCK_MCC3 0x03000000 ++#define QE_CR_SUBBLOCK_IDMA1 0x02800000 ++#define QE_CR_SUBBLOCK_IDMA2 0x02a00000 ++#define QE_CR_SUBBLOCK_IDMA3 0x02c00000 ++#define QE_CR_SUBBLOCK_IDMA4 0x02e00000 ++#define QE_CR_SUBBLOCK_HPAC 0x01e00000 ++#define QE_CR_SUBBLOCK_SPI1 0x01400000 ++#define QE_CR_SUBBLOCK_SPI2 0x01600000 ++#define QE_CR_SUBBLOCK_RAND 0x01c00000 ++#define QE_CR_SUBBLOCK_TIMER 0x01e00000 ++#define QE_CR_SUBBLOCK_GENERAL 0x03c00000 ++ ++/* QE CECR Protocol - For non-MCC, specifies mode for QE CECR command. ++*/ ++#define QE_CR_PROTOCOL_UNSPECIFIED 0x00 /* For all other protocols */ ++#define QE_CR_PROTOCOL_HDLC_TRANSPARENT 0x00 ++#define QE_CR_PROTOCOL_ATM_POS 0x0A ++#define QE_CR_PROTOCOL_ETHERNET 0x0C ++#define QE_CR_PROTOCOL_L2_SWITCH 0x0D ++#define QE_CR_PROTOCOL_SHIFT 6 ++ ++/* QE ASSIGN PAGE command ++*/ ++#define QE_CR_ASSIGN_PAGE_SNUM_SHIFT 17 ++ ++/* Communication Direction. ++*/ ++typedef enum comm_dir { ++ COMM_DIR_NONE = 0, ++ COMM_DIR_RX = 1, ++ COMM_DIR_TX = 2, ++ COMM_DIR_RX_AND_TX = 3 ++} comm_dir_e; ++ ++/* Clocks and BRG's ++*/ ++typedef enum qe_clock { ++ QE_CLK_NONE = 0, ++ QE_BRG1, /* Baud Rate Generator 1 */ ++ QE_BRG2, /* Baud Rate Generator 2 */ ++ QE_BRG3, /* Baud Rate Generator 3 */ ++ QE_BRG4, /* Baud Rate Generator 4 */ ++ QE_BRG5, /* Baud Rate Generator 5 */ ++ QE_BRG6, /* Baud Rate Generator 6 */ ++ QE_BRG7, /* Baud Rate Generator 7 */ ++ QE_BRG8, /* Baud Rate Generator 8 */ ++ QE_BRG9, /* Baud Rate Generator 9 */ ++ QE_BRG10, /* Baud Rate Generator 10 */ ++ QE_BRG11, /* Baud Rate Generator 11 */ ++ QE_BRG12, /* Baud Rate Generator 12 */ ++ QE_BRG13, /* Baud Rate Generator 13 */ ++ QE_BRG14, /* Baud Rate Generator 14 */ ++ QE_BRG15, /* Baud Rate Generator 15 */ ++ QE_BRG16, /* Baud Rate Generator 16 */ ++ QE_CLK1, /* Clock 1 */ ++ QE_CLK2, /* Clock 2 */ ++ QE_CLK3, /* Clock 3 */ ++ QE_CLK4, /* Clock 4 */ ++ QE_CLK5, /* Clock 5 */ ++ QE_CLK6, /* Clock 6 */ ++ QE_CLK7, /* Clock 7 */ ++ QE_CLK8, /* Clock 8 */ ++ QE_CLK9, /* Clock 9 */ ++ QE_CLK10, /* Clock 10 */ ++ QE_CLK11, /* Clock 11 */ ++ QE_CLK12, /* Clock 12 */ ++ QE_CLK13, /* Clock 13 */ ++ QE_CLK14, /* Clock 14 */ ++ QE_CLK15, /* Clock 15 */ ++ QE_CLK16, /* Clock 16 */ ++ QE_CLK17, /* Clock 17 */ ++ QE_CLK18, /* Clock 18 */ ++ QE_CLK19, /* Clock 19 */ ++ QE_CLK20, /* Clock 20 */ ++ QE_CLK21, /* Clock 21 */ ++ QE_CLK22, /* Clock 22 */ ++ QE_CLK23, /* Clock 23 */ ++ QE_CLK24, /* Clock 24 */ ++ QE_CLK_DUMMY ++} qe_clock_e; ++ ++/* QE CMXGCR register ++*/ ++#define QE_CMXGCR_MII_ENET_MNG_MASK 0x00007000 ++#define QE_CMXGCR_MII_ENET_MNG_SHIFT 12 ++ ++/* QE CMXUCR registers ++ */ ++#define QE_CMXUCR_TX_CLK_SRC_MASK 0x0000000F ++ ++/* QE BRG configuration register ++*/ ++#define QE_BRGC_ENABLE 0x00010000 ++#define QE_BRGC_DIVISOR_SHIFT 1 ++#define QE_BRGC_DIVISOR_MAX 0xFFF ++#define QE_BRGC_DIV16 1 ++ ++/* QE SDMA registers ++*/ ++#define QE_SDSR_BER1 0x02000000 ++#define QE_SDSR_BER2 0x01000000 ++ ++#define QE_SDMR_GLB_1_MSK 0x80000000 ++#define QE_SDMR_ADR_SEL 0x20000000 ++#define QE_SDMR_BER1_MSK 0x02000000 ++#define QE_SDMR_BER2_MSK 0x01000000 ++#define QE_SDMR_EB1_MSK 0x00800000 ++#define QE_SDMR_ER1_MSK 0x00080000 ++#define QE_SDMR_ER2_MSK 0x00040000 ++#define QE_SDMR_CEN_MASK 0x0000E000 ++#define QE_SDMR_SBER_1 0x00000200 ++#define QE_SDMR_SBER_2 0x00000200 ++#define QE_SDMR_EB1_PR_MASK 0x000000C0 ++#define QE_SDMR_ER1_PR 0x00000008 ++ ++#define QE_SDMR_CEN_SHIFT 13 ++#define QE_SDMR_EB1_PR_SHIFT 6 ++ ++#define QE_SDTM_MSNUM_SHIFT 24 ++ ++#define QE_SDEBCR_BA_MASK 0x01FFFFFF ++ ++void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign); ++void qe_issue_cmd(uint cmd, uint sbc, u8 mcn, u32 cmd_data); ++uint qe_muram_alloc(uint size, uint align); ++void *qe_muram_addr(uint offset); ++int qe_get_snum(void); ++void qe_put_snum(u8 snum); ++void qe_init(uint qe_base); ++void qe_reset(void); ++void qe_assign_page(uint snum, uint para_ram_base); ++int qe_set_brg(uint brg, uint rate); ++int qe_set_mii_clk_src(int ucc_num); ++ ++#endif /* __QE_H__ */ +diff -Naupr u-boot-1.1.6/drivers/qe/uccf.c u-boot-1.1.6-fsl-1/drivers/qe/uccf.c +--- u-boot-1.1.6/drivers/qe/uccf.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/uccf.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,404 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * based on source code of Shlomi Gridish ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include "common.h" ++#include "malloc.h" ++#include "asm/errno.h" ++#include "asm/io.h" ++#include "asm/immap_qe.h" ++#include "qe.h" ++#include "uccf.h" ++ ++#if defined(CONFIG_QE) ++void ucc_fast_transmit_on_demand(ucc_fast_private_t *uccf) ++{ ++ out_be16(&uccf->uf_regs->utodr, UCC_FAST_TOD); ++} ++ ++u32 ucc_fast_get_qe_cr_subblock(int ucc_num) ++{ ++ switch (ucc_num) { ++ case 0: return QE_CR_SUBBLOCK_UCCFAST1; ++ case 1: return QE_CR_SUBBLOCK_UCCFAST2; ++ case 2: return QE_CR_SUBBLOCK_UCCFAST3; ++ case 3: return QE_CR_SUBBLOCK_UCCFAST4; ++ case 4: return QE_CR_SUBBLOCK_UCCFAST5; ++ case 5: return QE_CR_SUBBLOCK_UCCFAST6; ++ case 6: return QE_CR_SUBBLOCK_UCCFAST7; ++ case 7: return QE_CR_SUBBLOCK_UCCFAST8; ++ default: return QE_CR_SUBBLOCK_INVALID; ++ } ++} ++ ++static void ucc_get_cmxucr_reg(int ucc_num, volatile u32 **p_cmxucr, ++ u8 *reg_num, u8 *shift) ++{ ++ switch (ucc_num) { ++ case 0: /* UCC1 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr1); ++ *reg_num = 1; ++ *shift = 16; ++ break; ++ case 2: /* UCC3 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr1); ++ *reg_num = 1; ++ *shift = 0; ++ break; ++ case 4: /* UCC5 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr2); ++ *reg_num = 2; ++ *shift = 16; ++ break; ++ case 6: /* UCC7 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr2); ++ *reg_num = 2; ++ *shift = 0; ++ break; ++ case 1: /* UCC2 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr3); ++ *reg_num = 3; ++ *shift = 16; ++ break; ++ case 3: /* UCC4 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr3); ++ *reg_num = 3; ++ *shift = 0; ++ break; ++ case 5: /* UCC6 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr4); ++ *reg_num = 4; ++ *shift = 16; ++ break; ++ case 7: /* UCC8 */ ++ *p_cmxucr = &(qe_immr->qmx.cmxucr4); ++ *reg_num = 4; ++ *shift = 0; ++ break; ++ default: ++ break; ++ } ++} ++ ++static int ucc_set_clk_src(int ucc_num, qe_clock_e clock, comm_dir_e mode) ++{ ++ volatile u32 *p_cmxucr = NULL; ++ u8 reg_num = 0; ++ u8 shift = 0; ++ u32 clockBits; ++ u32 clockMask; ++ int source = -1; ++ ++ /* check if the UCC number is in range. */ ++ if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) ++ return -EINVAL; ++ ++ if (! ((mode == COMM_DIR_RX) || (mode == COMM_DIR_TX))) { ++ printf("%s: bad comm mode type passed\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ ucc_get_cmxucr_reg(ucc_num, &p_cmxucr, ®_num, &shift); ++ ++ switch (reg_num) { ++ case 1: ++ switch (clock) { ++ case QE_BRG1: source = 1; break; ++ case QE_BRG2: source = 2; break; ++ case QE_BRG7: source = 3; break; ++ case QE_BRG8: source = 4; break; ++ case QE_CLK9: source = 5; break; ++ case QE_CLK10: source = 6; break; ++ case QE_CLK11: source = 7; break; ++ case QE_CLK12: source = 8; break; ++ case QE_CLK15: source = 9; break; ++ case QE_CLK16: source = 10; break; ++ default: source = -1; break; ++ } ++ break; ++ case 2: ++ switch (clock) { ++ case QE_BRG5: source = 1; break; ++ case QE_BRG6: source = 2; break; ++ case QE_BRG7: source = 3; break; ++ case QE_BRG8: source = 4; break; ++ case QE_CLK13: source = 5; break; ++ case QE_CLK14: source = 6; break; ++ case QE_CLK19: source = 7; break; ++ case QE_CLK20: source = 8; break; ++ case QE_CLK15: source = 9; break; ++ case QE_CLK16: source = 10; break; ++ default: source = -1; break; ++ } ++ break; ++ case 3: ++ switch (clock) { ++ case QE_BRG9: source = 1; break; ++ case QE_BRG10: source = 2; break; ++ case QE_BRG15: source = 3; break; ++ case QE_BRG16: source = 4; break; ++ case QE_CLK3: source = 5; break; ++ case QE_CLK4: source = 6; break; ++ case QE_CLK17: source = 7; break; ++ case QE_CLK18: source = 8; break; ++ case QE_CLK7: source = 9; break; ++ case QE_CLK8: source = 10; break; ++ case QE_CLK16: source = 11; break; ++ default: source = -1; break; ++ } ++ break; ++ case 4: ++ switch (clock) { ++ case QE_BRG13: source = 1; break; ++ case QE_BRG14: source = 2; break; ++ case QE_BRG15: source = 3; break; ++ case QE_BRG16: source = 4; break; ++ case QE_CLK5: source = 5; break; ++ case QE_CLK6: source = 6; break; ++ case QE_CLK21: source = 7; break; ++ case QE_CLK22: source = 8; break; ++ case QE_CLK7: source = 9; break; ++ case QE_CLK8: source = 10; break; ++ case QE_CLK16: source = 11; break; ++ default: source = -1; break; ++ } ++ break; ++ default: ++ source = -1; ++ break; ++ } ++ ++ if (source == -1) { ++ printf("%s: Bad combination of clock and UCC\n", __FUNCTION__); ++ return -ENOENT; ++ } ++ ++ clockBits = (u32) source; ++ clockMask = QE_CMXUCR_TX_CLK_SRC_MASK; ++ if (mode == COMM_DIR_RX) { ++ clockBits <<= 4; /* Rx field is 4 bits to left of Tx field */ ++ clockMask <<= 4; /* Rx field is 4 bits to left of Tx field */ ++ } ++ clockBits <<= shift; ++ clockMask <<= shift; ++ ++ out_be32(p_cmxucr, (in_be32(p_cmxucr) & ~clockMask) | clockBits); ++ ++ return 0; ++} ++ ++static uint ucc_get_reg_baseaddr(int ucc_num) ++{ ++ uint base = 0; ++ ++ /* check if the UCC number is in range */ ++ if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0)) { ++ printf("%s: the UCC num not in ranges\n", __FUNCTION__); ++ return 0; ++ } ++ ++ switch (ucc_num) { ++ case 0: base = 0x00002000; break; ++ case 1: base = 0x00003000; break; ++ case 2: base = 0x00002200; break; ++ case 3: base = 0x00003200; break; ++ case 4: base = 0x00002400; break; ++ case 5: base = 0x00003400; break; ++ case 6: base = 0x00002600; break; ++ case 7: base = 0x00003600; break; ++ default: break; ++ } ++ ++ base = (uint)qe_immr + base; ++ return base; ++} ++ ++void ucc_fast_enable(ucc_fast_private_t *uccf, comm_dir_e mode) ++{ ++ ucc_fast_t *uf_regs; ++ u32 gumr; ++ ++ uf_regs = uccf->uf_regs; ++ ++ /* Enable reception and/or transmission on this UCC. */ ++ gumr = in_be32(&uf_regs->gumr); ++ if (mode & COMM_DIR_TX) { ++ gumr |= UCC_FAST_GUMR_ENT; ++ uccf->enabled_tx = 1; ++ } ++ if (mode & COMM_DIR_RX) { ++ gumr |= UCC_FAST_GUMR_ENR; ++ uccf->enabled_rx = 1; ++ } ++ out_be32(&uf_regs->gumr, gumr); ++} ++ ++void ucc_fast_disable(ucc_fast_private_t *uccf, comm_dir_e mode) ++{ ++ ucc_fast_t *uf_regs; ++ u32 gumr; ++ ++ uf_regs = uccf->uf_regs; ++ ++ /* Disable reception and/or transmission on this UCC. */ ++ gumr = in_be32(&uf_regs->gumr); ++ if (mode & COMM_DIR_TX) { ++ gumr &= ~UCC_FAST_GUMR_ENT; ++ uccf->enabled_tx = 0; ++ } ++ if (mode & COMM_DIR_RX) { ++ gumr &= ~UCC_FAST_GUMR_ENR; ++ uccf->enabled_rx = 0; ++ } ++ out_be32(&uf_regs->gumr, gumr); ++} ++ ++int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t **uccf_ret) ++{ ++ ucc_fast_private_t *uccf; ++ ucc_fast_t *uf_regs; ++ ++ if (!uf_info) ++ return -EINVAL; ++ ++ if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) { ++ printf("%s: Illagal UCC number!\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ uccf = (ucc_fast_private_t *)malloc(sizeof(ucc_fast_private_t)); ++ if (!uccf) { ++ printf("%s: No memory for UCC fast data structure!\n", ++ __FUNCTION__); ++ return -ENOMEM; ++ } ++ memset(uccf, 0, sizeof(ucc_fast_private_t)); ++ ++ /* Save fast UCC structure */ ++ uccf->uf_info = uf_info; ++ uccf->uf_regs = (ucc_fast_t *)ucc_get_reg_baseaddr(uf_info->ucc_num); ++ ++ if (uccf->uf_regs == NULL) { ++ printf("%s: No memory map for UCC fast controller!\n", ++ __FUNCTION__); ++ return -ENOMEM; ++ } ++ ++ uccf->enabled_tx = 0; ++ uccf->enabled_rx = 0; ++ ++ uf_regs = uccf->uf_regs; ++ uccf->p_ucce = (u32 *) &(uf_regs->ucce); ++ uccf->p_uccm = (u32 *) &(uf_regs->uccm); ++ ++ /* Init GUEMR register, UCC both Rx and Tx is Fast protocol */ ++ out_8(&uf_regs->guemr, UCC_GUEMR_SET_RESERVED3 | UCC_GUEMR_MODE_FAST_RX ++ | UCC_GUEMR_MODE_FAST_TX); ++ ++ /* Set GUMR, disable UCC both Rx and Tx, Ethernet protocol */ ++ out_be32(&uf_regs->gumr, UCC_FAST_GUMR_ETH); ++ ++ /* Set the Giga ethernet VFIFO stuff */ ++ if (uf_info->eth_type == GIGA_ETH) { ++ /* Allocate memory for Tx Virtual Fifo */ ++ uccf->ucc_fast_tx_virtual_fifo_base_offset = ++ qe_muram_alloc(UCC_GETH_UTFS_GIGA_INIT, ++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT); ++ ++ /* Allocate memory for Rx Virtual Fifo */ ++ uccf->ucc_fast_rx_virtual_fifo_base_offset = ++ qe_muram_alloc(UCC_GETH_URFS_GIGA_INIT + ++ UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD, ++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT); ++ ++ /* utfb, urfb are offsets from MURAM base */ ++ out_be32(&uf_regs->utfb, ++ uccf->ucc_fast_tx_virtual_fifo_base_offset); ++ out_be32(&uf_regs->urfb, ++ uccf->ucc_fast_rx_virtual_fifo_base_offset); ++ ++ /* Set Virtual Fifo registers */ ++ out_be16(&uf_regs->urfs, UCC_GETH_URFS_GIGA_INIT); ++ out_be16(&uf_regs->urfet, UCC_GETH_URFET_GIGA_INIT); ++ out_be16(&uf_regs->urfset, UCC_GETH_URFSET_GIGA_INIT); ++ out_be16(&uf_regs->utfs, UCC_GETH_UTFS_GIGA_INIT); ++ out_be16(&uf_regs->utfet, UCC_GETH_UTFET_GIGA_INIT); ++ out_be16(&uf_regs->utftt, UCC_GETH_UTFTT_GIGA_INIT); ++ } ++ ++ /* Set the Fast ethernet VFIFO stuff */ ++ if (uf_info->eth_type == FAST_ETH) { ++ /* Allocate memory for Tx Virtual Fifo */ ++ uccf->ucc_fast_tx_virtual_fifo_base_offset = ++ qe_muram_alloc(UCC_GETH_UTFS_INIT, ++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT); ++ ++ /* Allocate memory for Rx Virtual Fifo */ ++ uccf->ucc_fast_rx_virtual_fifo_base_offset = ++ qe_muram_alloc(UCC_GETH_URFS_INIT + ++ UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD, ++ UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT); ++ ++ /* utfb, urfb are offsets from MURAM base */ ++ out_be32(&uf_regs->utfb, ++ uccf->ucc_fast_tx_virtual_fifo_base_offset); ++ out_be32(&uf_regs->urfb, ++ uccf->ucc_fast_rx_virtual_fifo_base_offset); ++ ++ /* Set Virtual Fifo registers */ ++ out_be16(&uf_regs->urfs, UCC_GETH_URFS_INIT); ++ out_be16(&uf_regs->urfet, UCC_GETH_URFET_INIT); ++ out_be16(&uf_regs->urfset, UCC_GETH_URFSET_INIT); ++ out_be16(&uf_regs->utfs, UCC_GETH_UTFS_INIT); ++ out_be16(&uf_regs->utfet, UCC_GETH_UTFET_INIT); ++ out_be16(&uf_regs->utftt, UCC_GETH_UTFTT_INIT); ++ } ++ ++ /* Rx clock routing */ ++ if (uf_info->rx_clock != QE_CLK_NONE) { ++ if (ucc_set_clk_src(uf_info->ucc_num, ++ uf_info->rx_clock, COMM_DIR_RX)) { ++ printf("%s: Illegal value for parameter 'RxClock'.\n", ++ __FUNCTION__); ++ return -EINVAL; ++ } ++ } ++ ++ /* Tx clock routing */ ++ if (uf_info->tx_clock != QE_CLK_NONE) { ++ if (ucc_set_clk_src(uf_info->ucc_num, ++ uf_info->tx_clock, COMM_DIR_TX)) { ++ printf("%s: Illegal value for parameter 'TxClock'.\n", ++ __FUNCTION__); ++ return -EINVAL; ++ } ++ } ++ ++ /* Clear interrupt mask register to disable all of interrupts */ ++ out_be32(&uf_regs->uccm, 0x0); ++ ++ /* Writing '1' to clear all of envents */ ++ out_be32(&uf_regs->ucce, 0xffffffff); ++ ++ *uccf_ret = uccf; ++ return 0; ++} ++#endif /* CONFIG_QE */ +diff -Naupr u-boot-1.1.6/drivers/qe/uccf.h u-boot-1.1.6-fsl-1/drivers/qe/uccf.h +--- u-boot-1.1.6/drivers/qe/uccf.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/uccf.h 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,130 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * based on source code of Shlomi Gridish ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#ifndef __UCCF_H__ ++#define __UCCF_H__ ++ ++#include "common.h" ++#include "qe.h" ++ ++/* Fast or Giga ethernet ++*/ ++typedef enum enet_type { ++ FAST_ETH, ++ GIGA_ETH, ++} enet_type_e; ++ ++/* General UCC Extended Mode Register ++*/ ++#define UCC_GUEMR_MODE_MASK_RX 0x02 ++#define UCC_GUEMR_MODE_MASK_TX 0x01 ++#define UCC_GUEMR_MODE_FAST_RX 0x02 ++#define UCC_GUEMR_MODE_FAST_TX 0x01 ++#define UCC_GUEMR_MODE_SLOW_RX 0x00 ++#define UCC_GUEMR_MODE_SLOW_TX 0x00 ++#define UCC_GUEMR_SET_RESERVED3 0x10 /* Bit 3 must be set 1 */ ++ ++/* General UCC FAST Mode Register ++*/ ++#define UCC_FAST_GUMR_TCI 0x20000000 ++#define UCC_FAST_GUMR_TRX 0x10000000 ++#define UCC_FAST_GUMR_TTX 0x08000000 ++#define UCC_FAST_GUMR_CDP 0x04000000 ++#define UCC_FAST_GUMR_CTSP 0x02000000 ++#define UCC_FAST_GUMR_CDS 0x01000000 ++#define UCC_FAST_GUMR_CTSS 0x00800000 ++#define UCC_FAST_GUMR_TXSY 0x00020000 ++#define UCC_FAST_GUMR_RSYN 0x00010000 ++#define UCC_FAST_GUMR_RTSM 0x00002000 ++#define UCC_FAST_GUMR_REVD 0x00000400 ++#define UCC_FAST_GUMR_ENR 0x00000020 ++#define UCC_FAST_GUMR_ENT 0x00000010 ++ ++/* GUMR [MODE] bit maps ++*/ ++#define UCC_FAST_GUMR_HDLC 0x00000000 ++#define UCC_FAST_GUMR_QMC 0x00000002 ++#define UCC_FAST_GUMR_UART 0x00000004 ++#define UCC_FAST_GUMR_BISYNC 0x00000008 ++#define UCC_FAST_GUMR_ATM 0x0000000a ++#define UCC_FAST_GUMR_ETH 0x0000000c ++ ++/* Transmit On Demand (UTORD) ++*/ ++#define UCC_SLOW_TOD 0x8000 ++#define UCC_FAST_TOD 0x8000 ++ ++/* Fast Ethernet (10/100 Mbps) ++*/ ++#define UCC_GETH_URFS_INIT 512 /* Rx virtual FIFO size */ ++#define UCC_GETH_URFET_INIT 256 /* 1/2 urfs */ ++#define UCC_GETH_URFSET_INIT 384 /* 3/4 urfs */ ++#define UCC_GETH_UTFS_INIT 512 /* Tx virtual FIFO size */ ++#define UCC_GETH_UTFET_INIT 256 /* 1/2 utfs */ ++#define UCC_GETH_UTFTT_INIT 128 ++ ++/* Gigabit Ethernet (1000 Mbps) ++*/ ++#define UCC_GETH_URFS_GIGA_INIT 4096/*2048*/ /* Rx virtual FIFO size */ ++#define UCC_GETH_URFET_GIGA_INIT 2048/*1024*/ /* 1/2 urfs */ ++#define UCC_GETH_URFSET_GIGA_INIT 3072/*1536*/ /* 3/4 urfs */ ++#define UCC_GETH_UTFS_GIGA_INIT 8192/*2048*/ /* Tx virtual FIFO size */ ++#define UCC_GETH_UTFET_GIGA_INIT 4096/*1024*/ /* 1/2 utfs */ ++#define UCC_GETH_UTFTT_GIGA_INIT 0x400/*0x40*/ /* */ ++ ++/* UCC fast alignment ++*/ ++#define UCC_FAST_RX_ALIGN 4 ++#define UCC_FAST_MRBLR_ALIGNMENT 4 ++#define UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT 8 ++ ++/* Sizes ++*/ ++#define UCC_FAST_RX_VIRTUAL_FIFO_SIZE_PAD 8 ++ ++/* UCC fast structure. ++*/ ++typedef struct ucc_fast_info { ++ int ucc_num; ++ qe_clock_e rx_clock; ++ qe_clock_e tx_clock; ++ enet_type_e eth_type; ++} ucc_fast_info_t; ++ ++typedef struct ucc_fast_private { ++ ucc_fast_info_t *uf_info; ++ ucc_fast_t *uf_regs; /* a pointer to memory map of UCC regs */ ++ u32 *p_ucce; /* a pointer to the event register */ ++ u32 *p_uccm; /* a pointer to the mask register */ ++ int enabled_tx; /* whether UCC is enabled for Tx (ENT) */ ++ int enabled_rx; /* whether UCC is enabled for Rx (ENR) */ ++ u32 ucc_fast_tx_virtual_fifo_base_offset; ++ u32 ucc_fast_rx_virtual_fifo_base_offset; ++} ucc_fast_private_t; ++ ++void ucc_fast_transmit_on_demand(ucc_fast_private_t *uccf); ++u32 ucc_fast_get_qe_cr_subblock(int ucc_num); ++void ucc_fast_enable(ucc_fast_private_t *uccf, comm_dir_e mode); ++void ucc_fast_disable(ucc_fast_private_t *uccf, comm_dir_e mode); ++int ucc_fast_init(ucc_fast_info_t *uf_info, ucc_fast_private_t **uccf_ret); ++ ++#endif /* __UCCF_H__ */ +diff -Naupr u-boot-1.1.6/drivers/qe/uec.c u-boot-1.1.6-fsl-1/drivers/qe/uec.c +--- u-boot-1.1.6/drivers/qe/uec.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/uec.c 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,1266 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#include "common.h" ++#include "net.h" ++#include "malloc.h" ++#include "asm/errno.h" ++#include "asm/io.h" ++#include "asm/immap_qe.h" ++#include "qe.h" ++#include "uccf.h" ++#include "uec.h" ++#include "uec_phy.h" ++ ++#if defined(CONFIG_QE) ++ ++#ifdef CONFIG_UEC_ETH1 ++static uec_info_t eth1_uec_info = { ++ .uf_info = { ++ .ucc_num = CFG_UEC1_UCC_NUM, ++ .rx_clock = CFG_UEC1_RX_CLK, ++ .tx_clock = CFG_UEC1_TX_CLK, ++ .eth_type = CFG_UEC1_ETH_TYPE, ++ }, ++ .num_threads_tx = UEC_NUM_OF_THREADS_4, ++ .num_threads_rx = UEC_NUM_OF_THREADS_4, ++ .riscTx = QE_RISC_ALLOCATION_RISC1_AND_RISC2, ++ .riscRx = QE_RISC_ALLOCATION_RISC1_AND_RISC2, ++ .tx_bd_ring_len = 16, ++ .rx_bd_ring_len = 16, ++ .phy_address = CFG_UEC1_PHY_ADDR, ++ .enet_interface = CFG_UEC1_INTERFACE_MODE, ++}; ++#endif ++#ifdef CONFIG_UEC_ETH2 ++static uec_info_t eth2_uec_info = { ++ .uf_info = { ++ .ucc_num = CFG_UEC2_UCC_NUM, ++ .rx_clock = CFG_UEC2_RX_CLK, ++ .tx_clock = CFG_UEC2_TX_CLK, ++ .eth_type = CFG_UEC2_ETH_TYPE, ++ }, ++ .num_threads_tx = UEC_NUM_OF_THREADS_4, ++ .num_threads_rx = UEC_NUM_OF_THREADS_4, ++ .riscTx = QE_RISC_ALLOCATION_RISC1_AND_RISC2, ++ .riscRx = QE_RISC_ALLOCATION_RISC1_AND_RISC2, ++ .tx_bd_ring_len = 16, ++ .rx_bd_ring_len = 16, ++ .phy_address = CFG_UEC2_PHY_ADDR, ++ .enet_interface = CFG_UEC2_INTERFACE_MODE, ++}; ++#endif ++ ++static int uec_mac_enable(uec_private_t *uec, comm_dir_e mode) ++{ ++ uec_t *uec_regs; ++ u32 maccfg1; ++ ++ if (!uec) { ++ printf("%s: uec not initial\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ uec_regs = uec->uec_regs; ++ ++ maccfg1 = in_be32(&uec_regs->maccfg1); ++ ++ if (mode & COMM_DIR_TX) { ++ maccfg1 |= MACCFG1_ENABLE_TX; ++ out_be32(&uec_regs->maccfg1, maccfg1); ++ uec->mac_tx_enabled = 1; ++ } ++ ++ if (mode & COMM_DIR_RX) { ++ maccfg1 |= MACCFG1_ENABLE_RX; ++ out_be32(&uec_regs->maccfg1, maccfg1); ++ uec->mac_rx_enabled = 1; ++ } ++ ++ return 0; ++} ++ ++static int uec_mac_disable(uec_private_t *uec, comm_dir_e mode) ++{ ++ uec_t *uec_regs; ++ u32 maccfg1; ++ ++ if (!uec) { ++ printf("%s: uec not initial\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ uec_regs = uec->uec_regs; ++ ++ maccfg1 = in_be32(&uec_regs->maccfg1); ++ ++ if (mode & COMM_DIR_TX) { ++ maccfg1 &= ~MACCFG1_ENABLE_TX; ++ out_be32(&uec_regs->maccfg1, maccfg1); ++ uec->mac_tx_enabled = 0; ++ } ++ ++ if (mode & COMM_DIR_RX) { ++ maccfg1 &= ~MACCFG1_ENABLE_RX; ++ out_be32(&uec_regs->maccfg1, maccfg1); ++ uec->mac_rx_enabled = 0; ++ } ++ ++ return 0; ++} ++ ++static int uec_graceful_stop_tx(uec_private_t *uec) ++{ ++ ucc_fast_t *uf_regs; ++ u32 cecr_subblock; ++ u32 ucce; ++ ++ if (!uec || !uec->uccf) { ++ printf("%s: No handle passed.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ uf_regs = uec->uccf->uf_regs; ++ ++ /* Clear the grace stop event */ ++ out_be32(&uf_regs->ucce, UCCE_GRA); ++ ++ /* Issue host command */ ++ cecr_subblock = ++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num); ++ qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock, ++ (u8)QE_CR_PROTOCOL_ETHERNET, 0); ++ ++ /* Wait for command to complete */ ++ do { ++ ucce = in_be32(&uf_regs->ucce); ++ } while (! (ucce & UCCE_GRA)); ++ ++ uec->grace_stopped_tx = 1; ++ ++ return 0; ++} ++ ++static int uec_graceful_stop_rx(uec_private_t *uec) ++{ ++ u32 cecr_subblock; ++ u8 ack; ++ ++ if (!uec) { ++ printf("%s: No handle passed.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ if (!uec->p_rx_glbl_pram) { ++ printf("%s: No init rx global parameter\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* Clear acknowledge bit */ ++ ack = uec->p_rx_glbl_pram->rxgstpack; ++ ack &= ~GRACEFUL_STOP_ACKNOWLEDGE_RX; ++ uec->p_rx_glbl_pram->rxgstpack = ack; ++ ++ /* Keep issuing cmd and checking ack bit until it is asserted */ ++ do { ++ /* Issue host command */ ++ cecr_subblock = ++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num); ++ qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock, ++ (u8)QE_CR_PROTOCOL_ETHERNET, 0); ++ ack = uec->p_rx_glbl_pram->rxgstpack; ++ } while (! (ack & GRACEFUL_STOP_ACKNOWLEDGE_RX )); ++ ++ uec->grace_stopped_rx = 1; ++ ++ return 0; ++} ++ ++static int uec_restart_tx(uec_private_t *uec) ++{ ++ u32 cecr_subblock; ++ ++ if (!uec || !uec->uec_info) { ++ printf("%s: No handle passed.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ cecr_subblock = ++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num); ++ qe_issue_cmd(QE_RESTART_TX, cecr_subblock, ++ (u8)QE_CR_PROTOCOL_ETHERNET, 0); ++ ++ uec->grace_stopped_tx = 0; ++ ++ return 0; ++} ++ ++static int uec_restart_rx(uec_private_t *uec) ++{ ++ u32 cecr_subblock; ++ ++ if (!uec || !uec->uec_info) { ++ printf("%s: No handle passed.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ cecr_subblock = ++ ucc_fast_get_qe_cr_subblock(uec->uec_info->uf_info.ucc_num); ++ qe_issue_cmd(QE_RESTART_RX, cecr_subblock, ++ (u8)QE_CR_PROTOCOL_ETHERNET, 0); ++ ++ uec->grace_stopped_rx = 0; ++ ++ return 0; ++} ++ ++static int uec_open(uec_private_t *uec, comm_dir_e mode) ++{ ++ ucc_fast_private_t *uccf; ++ ++ if (!uec || !uec->uccf) { ++ printf("%s: No handle passed.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ uccf = uec->uccf; ++ ++ /* check if the UCC number is in range. */ ++ if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) { ++ printf("%s: ucc_num out of range.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* Enable MAC */ ++ uec_mac_enable(uec, mode); ++ ++ /* Enable UCC fast */ ++ ucc_fast_enable(uccf, mode); ++ ++ /* RISC microcode start */ ++ if ((mode & COMM_DIR_TX) && uec->grace_stopped_tx) { ++ uec_restart_tx(uec); ++ } ++ if ((mode & COMM_DIR_RX) && uec->grace_stopped_rx) { ++ uec_restart_rx(uec); ++ } ++ ++ return 0; ++} ++ ++static int uec_stop(uec_private_t *uec, comm_dir_e mode) ++{ ++ ucc_fast_private_t *uccf; ++ ++ if (!uec || !uec->uccf) { ++ printf("%s: No handle passed.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ uccf = uec->uccf; ++ ++ /* check if the UCC number is in range. */ ++ if (uec->uec_info->uf_info.ucc_num >= UCC_MAX_NUM) { ++ printf("%s: ucc_num out of range.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ /* Stop any transmissions */ ++ if ((mode & COMM_DIR_TX) && !uec->grace_stopped_tx) { ++ uec_graceful_stop_tx(uec); ++ } ++ /* Stop any receptions */ ++ if ((mode & COMM_DIR_RX) && !uec->grace_stopped_rx) { ++ uec_graceful_stop_rx(uec); ++ } ++ ++ /* Disable the UCC fast */ ++ ucc_fast_disable(uec->uccf, mode); ++ ++ /* Disable the MAC */ ++ uec_mac_disable(uec, mode); ++ ++ return 0; ++} ++ ++static int uec_set_mac_duplex(uec_private_t *uec, int duplex) ++{ ++ uec_t *uec_regs; ++ u32 maccfg2; ++ ++ if (!uec) { ++ printf("%s: uec not initial\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ uec_regs = uec->uec_regs; ++ ++ if (duplex == DUPLEX_HALF) { ++ maccfg2 = in_be32(&uec_regs->maccfg2); ++ maccfg2 &= ~MACCFG2_FDX; ++ out_be32(&uec_regs->maccfg2, maccfg2); ++ } ++ ++ if (duplex == DUPLEX_FULL) { ++ maccfg2 = in_be32(&uec_regs->maccfg2); ++ maccfg2 |= MACCFG2_FDX; ++ out_be32(&uec_regs->maccfg2, maccfg2); ++ } ++ ++ return 0; ++} ++ ++static int uec_set_mac_if_mode(uec_private_t *uec, enet_interface_e if_mode) ++{ ++ enet_interface_e enet_if_mode; ++ uec_info_t *uec_info; ++ uec_t *uec_regs; ++ u32 upsmr; ++ u32 maccfg2; ++ ++ if (!uec) { ++ printf("%s: uec not initial\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ uec_info = uec->uec_info; ++ uec_regs = uec->uec_regs; ++ enet_if_mode = if_mode; ++ ++ maccfg2 = in_be32(&uec_regs->maccfg2); ++ maccfg2 &= ~MACCFG2_INTERFACE_MODE_MASK; ++ ++ upsmr = in_be32(&uec->uccf->uf_regs->upsmr); ++ upsmr &= ~(UPSMR_RPM | UPSMR_TBIM | UPSMR_R10M | UPSMR_RMM); ++ ++ switch (enet_if_mode) { ++ case ENET_100_MII: ++ case ENET_10_MII: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE; ++ break; ++ case ENET_1000_GMII: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE; ++ break; ++ case ENET_1000_TBI: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE; ++ upsmr |= UPSMR_TBIM; ++ break; ++ case ENET_1000_RTBI: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE; ++ upsmr |= (UPSMR_RPM | UPSMR_TBIM); ++ break; ++ case ENET_1000_RGMII: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_BYTE; ++ upsmr |= UPSMR_RPM; ++ break; ++ case ENET_100_RGMII: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE; ++ upsmr |= UPSMR_RPM; ++ break; ++ case ENET_10_RGMII: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE; ++ upsmr |= (UPSMR_RPM | UPSMR_R10M); ++ break; ++ case ENET_100_RMII: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE; ++ upsmr |= UPSMR_RMM; ++ break; ++ case ENET_10_RMII: ++ maccfg2 |= MACCFG2_INTERFACE_MODE_NIBBLE; ++ upsmr |= (UPSMR_R10M | UPSMR_RMM); ++ break; ++ default: ++ return -EINVAL; ++ break; ++ } ++ out_be32(&uec_regs->maccfg2, maccfg2); ++ out_be32(&uec->uccf->uf_regs->upsmr, upsmr); ++ ++ return 0; ++} ++ ++static int init_mii_management_configuration(uec_t *uec_regs) ++{ ++ uint timeout = 0x1000; ++ u32 miimcfg = 0; ++ ++ miimcfg = in_be32(&uec_regs->miimcfg); ++ miimcfg |= MIIMCFG_MNGMNT_CLC_DIV_INIT_VALUE; ++ out_be32(&uec_regs->miimcfg, miimcfg); ++ ++ /* Wait until the bus is free */ ++ while ((in_be32(&uec_regs->miimcfg) & MIIMIND_BUSY) && timeout--); ++ if (timeout <= 0) { ++ printf("%s: The MII Bus is stuck!", __FUNCTION__); ++ return -ETIMEDOUT; ++ } ++ ++ return 0; ++} ++ ++static int init_phy(struct eth_device *dev) ++{ ++ uec_private_t *uec; ++ uec_t *uec_regs; ++ struct uec_mii_info *mii_info; ++ struct phy_info *curphy; ++ int err; ++ ++ uec = (uec_private_t *)dev->priv; ++ uec_regs = uec->uec_regs; ++ ++ uec->oldlink = 0; ++ uec->oldspeed = 0; ++ uec->oldduplex = -1; ++ ++ mii_info = malloc(sizeof(*mii_info)); ++ if (!mii_info) { ++ printf("%s: Could not allocate mii_info", dev->name); ++ return -ENOMEM; ++ } ++ memset(mii_info, 0, sizeof(*mii_info)); ++ ++ mii_info->speed = SPEED_1000; ++ mii_info->duplex = DUPLEX_FULL; ++ mii_info->pause = 0; ++ mii_info->link = 1; ++ ++ mii_info->advertising = (ADVERTISED_10baseT_Half | ++ ADVERTISED_10baseT_Full | ++ ADVERTISED_100baseT_Half | ++ ADVERTISED_100baseT_Full | ++ ADVERTISED_1000baseT_Full); ++ mii_info->autoneg = 1; ++ mii_info->mii_id = uec->uec_info->phy_address; ++ mii_info->dev = dev; ++ ++ mii_info->mdio_read = &read_phy_reg; ++ mii_info->mdio_write = &write_phy_reg; ++ ++ uec->mii_info = mii_info; ++ ++ if (init_mii_management_configuration(uec_regs)) { ++ printf("%s: The MII Bus is stuck!", dev->name); ++ err = -1; ++ goto bus_fail; ++ } ++ ++ /* get info for this PHY */ ++ curphy = get_phy_info(uec->mii_info); ++ if (!curphy) { ++ printf("%s: No PHY found", dev->name); ++ err = -1; ++ goto no_phy; ++ } ++ ++ mii_info->phyinfo = curphy; ++ ++ /* Run the commands which initialize the PHY */ ++ if (curphy->init) { ++ err = curphy->init(uec->mii_info); ++ if (err) ++ goto phy_init_fail; ++ } ++ ++ return 0; ++ ++phy_init_fail: ++no_phy: ++bus_fail: ++ free(mii_info); ++ return err; ++} ++ ++static void adjust_link(struct eth_device *dev) ++{ ++ uec_private_t *uec = (uec_private_t *)dev->priv; ++ uec_t *uec_regs; ++ struct uec_mii_info *mii_info = uec->mii_info; ++ ++ extern void change_phy_interface_mode(struct eth_device *dev, ++ enet_interface_e mode); ++ uec_regs = uec->uec_regs; ++ ++ if (mii_info->link) { ++ /* Now we make sure that we can be in full duplex mode. ++ * If not, we operate in half-duplex mode. */ ++ if (mii_info->duplex != uec->oldduplex) { ++ if (!(mii_info->duplex)) { ++ uec_set_mac_duplex(uec, DUPLEX_HALF); ++ printf("%s: Half Duplex\n", dev->name); ++ } else { ++ uec_set_mac_duplex(uec, DUPLEX_FULL); ++ printf("%s: Full Duplex\n", dev->name); ++ } ++ uec->oldduplex = mii_info->duplex; ++ } ++ ++ if (mii_info->speed != uec->oldspeed) { ++ switch (mii_info->speed) { ++ case 1000: ++ break; ++ case 100: ++ printf ("switching to rgmii 100\n"); ++ /* change phy to rgmii 100 */ ++ change_phy_interface_mode(dev, ++ ENET_100_RGMII); ++ /* change the MAC interface mode */ ++ uec_set_mac_if_mode(uec,ENET_100_RGMII); ++ break; ++ case 10: ++ printf ("switching to rgmii 10\n"); ++ /* change phy to rgmii 10 */ ++ change_phy_interface_mode(dev, ++ ENET_10_RGMII); ++ /* change the MAC interface mode */ ++ uec_set_mac_if_mode(uec,ENET_10_RGMII); ++ break; ++ default: ++ printf("%s: Ack,Speed(%d)is illegal\n", ++ dev->name, mii_info->speed); ++ break; ++ } ++ ++ printf("%s: Speed %dBT\n", dev->name, mii_info->speed); ++ uec->oldspeed = mii_info->speed; ++ } ++ ++ if (!uec->oldlink) { ++ printf("%s: Link is up\n", dev->name); ++ uec->oldlink = 1; ++ } ++ ++ } else { /* if (mii_info->link) */ ++ if (uec->oldlink) { ++ printf("%s: Link is down\n", dev->name); ++ uec->oldlink = 0; ++ uec->oldspeed = 0; ++ uec->oldduplex = -1; ++ } ++ } ++} ++ ++static void phy_change(struct eth_device *dev) ++{ ++ uec_private_t *uec = (uec_private_t *)dev->priv; ++ uec_t *uec_regs; ++ int result = 0; ++ ++ uec_regs = uec->uec_regs; ++ ++ /* Delay 5s to give the PHY a chance to change the register state */ ++ udelay(5000000); ++ ++ /* Update the link, speed, duplex */ ++ result = uec->mii_info->phyinfo->read_status(uec->mii_info); ++ ++ /* Adjust the interface according to speed */ ++ if ((0 == result) || (uec->mii_info->link == 0)) { ++ adjust_link(dev); ++ } ++} ++ ++static int uec_set_mac_address(uec_private_t *uec, u8 *mac_addr) ++{ ++ uec_t *uec_regs; ++ u32 mac_addr1; ++ u32 mac_addr2; ++ ++ if (!uec) { ++ printf("%s: uec not initial\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ uec_regs = uec->uec_regs; ++ ++ /* if a station address of 0x12345678ABCD, perform a write to ++ MACSTNADDR1 of 0xCDAB7856, ++ MACSTNADDR2 of 0x34120000 */ ++ ++ mac_addr1 = (mac_addr[5] << 24) | (mac_addr[4] << 16) | \ ++ (mac_addr[3] << 8) | (mac_addr[2]); ++ out_be32(&uec_regs->macstnaddr1, mac_addr1); ++ ++ mac_addr2 = ((mac_addr[1] << 24) | (mac_addr[0] << 16)) & 0xffff0000; ++ out_be32(&uec_regs->macstnaddr2, mac_addr2); ++ ++ return 0; ++} ++ ++static int uec_convert_threads_num(uec_num_of_threads_e threads_num, ++ int *threads_num_ret) ++{ ++ int num_threads_numerica; ++ ++ switch (threads_num) { ++ case UEC_NUM_OF_THREADS_1: ++ num_threads_numerica = 1; ++ break; ++ case UEC_NUM_OF_THREADS_2: ++ num_threads_numerica = 2; ++ break; ++ case UEC_NUM_OF_THREADS_4: ++ num_threads_numerica = 4; ++ break; ++ case UEC_NUM_OF_THREADS_6: ++ num_threads_numerica = 6; ++ break; ++ case UEC_NUM_OF_THREADS_8: ++ num_threads_numerica = 8; ++ break; ++ default: ++ printf("%s: Bad number of threads value.", ++ __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ *threads_num_ret = num_threads_numerica; ++ ++ return 0; ++} ++ ++static void uec_init_tx_parameter(uec_private_t *uec, int num_threads_tx) ++{ ++ uec_info_t *uec_info; ++ u32 end_bd; ++ u8 bmrx = 0; ++ int i; ++ ++ uec_info = uec->uec_info; ++ ++ /* Alloc global Tx parameter RAM page */ ++ uec->tx_glbl_pram_offset = qe_muram_alloc( ++ sizeof(uec_tx_global_pram_t), ++ UEC_TX_GLOBAL_PRAM_ALIGNMENT); ++ uec->p_tx_glbl_pram = (uec_tx_global_pram_t *) ++ qe_muram_addr(uec->tx_glbl_pram_offset); ++ ++ /* Zero the global Tx prameter RAM */ ++ memset(uec->p_tx_glbl_pram, 0, sizeof(uec_tx_global_pram_t)); ++ ++ /* Init global Tx parameter RAM */ ++ ++ /* TEMODER, RMON statistics disable, one Tx queue */ ++ out_be16(&uec->p_tx_glbl_pram->temoder, TEMODER_INIT_VALUE); ++ ++ /* SQPTR */ ++ uec->send_q_mem_reg_offset = qe_muram_alloc( ++ sizeof(uec_send_queue_qd_t), ++ UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT); ++ uec->p_send_q_mem_reg = (uec_send_queue_mem_region_t *) ++ qe_muram_addr(uec->send_q_mem_reg_offset); ++ out_be32(&uec->p_tx_glbl_pram->sqptr, uec->send_q_mem_reg_offset); ++ ++ /* Setup the table with TxBDs ring */ ++ end_bd = (u32)uec->p_tx_bd_ring + (uec_info->tx_bd_ring_len - 1) ++ * SIZEOFBD; ++ out_be32(&uec->p_send_q_mem_reg->sqqd[0].bd_ring_base, ++ (u32)(uec->p_tx_bd_ring)); ++ out_be32(&uec->p_send_q_mem_reg->sqqd[0].last_bd_completed_address, ++ end_bd); ++ ++ /* Scheduler Base Pointer, we have only one Tx queue, no need it */ ++ out_be32(&uec->p_tx_glbl_pram->schedulerbasepointer, 0); ++ ++ /* TxRMON Base Pointer, TxRMON disable, we don't need it */ ++ out_be32(&uec->p_tx_glbl_pram->txrmonbaseptr, 0); ++ ++ /* TSTATE, global snooping, big endian, the CSB bus selected */ ++ bmrx = BMR_INIT_VALUE; ++ out_be32(&uec->p_tx_glbl_pram->tstate, ((u32)(bmrx) << BMR_SHIFT)); ++ ++ /* IPH_Offset */ ++ for (i = 0; i < MAX_IPH_OFFSET_ENTRY; i++) { ++ out_8(&uec->p_tx_glbl_pram->iphoffset[i], 0); ++ } ++ ++ /* VTAG table */ ++ for (i = 0; i < UEC_TX_VTAG_TABLE_ENTRY_MAX; i++) { ++ out_be32(&uec->p_tx_glbl_pram->vtagtable[i], 0); ++ } ++ ++ /* TQPTR */ ++ uec->thread_dat_tx_offset = qe_muram_alloc( ++ num_threads_tx * sizeof(uec_thread_data_tx_t) + ++ 32 *(num_threads_tx == 1), UEC_THREAD_DATA_ALIGNMENT); ++ ++ uec->p_thread_data_tx = (uec_thread_data_tx_t *) ++ qe_muram_addr(uec->thread_dat_tx_offset); ++ out_be32(&uec->p_tx_glbl_pram->tqptr, uec->thread_dat_tx_offset); ++} ++ ++static void uec_init_rx_parameter(uec_private_t *uec, int num_threads_rx) ++{ ++ u8 bmrx = 0; ++ int i; ++ uec_82xx_address_filtering_pram_t *p_af_pram; ++ ++ /* Allocate global Rx parameter RAM page */ ++ uec->rx_glbl_pram_offset = qe_muram_alloc( ++ sizeof(uec_rx_global_pram_t), UEC_RX_GLOBAL_PRAM_ALIGNMENT); ++ uec->p_rx_glbl_pram = (uec_rx_global_pram_t *) ++ qe_muram_addr(uec->rx_glbl_pram_offset); ++ ++ /* Zero Global Rx parameter RAM */ ++ memset(uec->p_rx_glbl_pram, 0, sizeof(uec_rx_global_pram_t)); ++ ++ /* Init global Rx parameter RAM */ ++ /* REMODER, Extended feature mode disable, VLAN disable, ++ LossLess flow control disable, Receive firmware statisic disable, ++ Extended address parsing mode disable, One Rx queues, ++ Dynamic maximum/minimum frame length disable, IP checksum check ++ disable, IP address alignment disable ++ */ ++ out_be32(&uec->p_rx_glbl_pram->remoder, REMODER_INIT_VALUE); ++ ++ /* RQPTR */ ++ uec->thread_dat_rx_offset = qe_muram_alloc( ++ num_threads_rx * sizeof(uec_thread_data_rx_t), ++ UEC_THREAD_DATA_ALIGNMENT); ++ uec->p_thread_data_rx = (uec_thread_data_rx_t *) ++ qe_muram_addr(uec->thread_dat_rx_offset); ++ out_be32(&uec->p_rx_glbl_pram->rqptr, uec->thread_dat_rx_offset); ++ ++ /* Type_or_Len */ ++ out_be16(&uec->p_rx_glbl_pram->typeorlen, 3072); ++ ++ /* RxRMON base pointer, we don't need it */ ++ out_be32(&uec->p_rx_glbl_pram->rxrmonbaseptr, 0); ++ ++ /* IntCoalescingPTR, we don't need it, no interrupt */ ++ out_be32(&uec->p_rx_glbl_pram->intcoalescingptr, 0); ++ ++ /* RSTATE, global snooping, big endian, the CSB bus selected */ ++ bmrx = BMR_INIT_VALUE; ++ out_8(&uec->p_rx_glbl_pram->rstate, bmrx); ++ ++ /* MRBLR */ ++ out_be16(&uec->p_rx_glbl_pram->mrblr, MAX_RXBUF_LEN); ++ ++ /* RBDQPTR */ ++ uec->rx_bd_qs_tbl_offset = qe_muram_alloc( ++ sizeof(uec_rx_bd_queues_entry_t) + \ ++ sizeof(uec_rx_prefetched_bds_t), ++ UEC_RX_BD_QUEUES_ALIGNMENT); ++ uec->p_rx_bd_qs_tbl = (uec_rx_bd_queues_entry_t *) ++ qe_muram_addr(uec->rx_bd_qs_tbl_offset); ++ ++ /* Zero it */ ++ memset(uec->p_rx_bd_qs_tbl, 0, sizeof(uec_rx_bd_queues_entry_t) + \ ++ sizeof(uec_rx_prefetched_bds_t)); ++ out_be32(&uec->p_rx_glbl_pram->rbdqptr, uec->rx_bd_qs_tbl_offset); ++ out_be32(&uec->p_rx_bd_qs_tbl->externalbdbaseptr, ++ (u32)uec->p_rx_bd_ring); ++ ++ /* MFLR */ ++ out_be16(&uec->p_rx_glbl_pram->mflr, MAX_FRAME_LEN); ++ /* MINFLR */ ++ out_be16(&uec->p_rx_glbl_pram->minflr, MIN_FRAME_LEN); ++ /* MAXD1 */ ++ out_be16(&uec->p_rx_glbl_pram->maxd1, MAX_DMA1_LEN); ++ /* MAXD2 */ ++ out_be16(&uec->p_rx_glbl_pram->maxd2, MAX_DMA2_LEN); ++ /* ECAM_PTR */ ++ out_be32(&uec->p_rx_glbl_pram->ecamptr, 0); ++ /* L2QT */ ++ out_be32(&uec->p_rx_glbl_pram->l2qt, 0); ++ /* L3QT */ ++ for (i = 0; i < 8; i++) { ++ out_be32(&uec->p_rx_glbl_pram->l3qt[i], 0); ++ } ++ ++ /* VLAN_TYPE */ ++ out_be16(&uec->p_rx_glbl_pram->vlantype, 0x8100); ++ /* TCI */ ++ out_be16(&uec->p_rx_glbl_pram->vlantci, 0); ++ ++ /* Clear PQ2 style address filtering hash table */ ++ p_af_pram = (uec_82xx_address_filtering_pram_t *) \ ++ uec->p_rx_glbl_pram->addressfiltering; ++ ++ p_af_pram->iaddr_h = 0; ++ p_af_pram->iaddr_l = 0; ++ p_af_pram->gaddr_h = 0; ++ p_af_pram->gaddr_l = 0; ++} ++ ++static int uec_issue_init_enet_rxtx_cmd(uec_private_t *uec, ++ int thread_tx, int thread_rx) ++{ ++ uec_init_cmd_pram_t *p_init_enet_param; ++ u32 init_enet_param_offset; ++ uec_info_t *uec_info; ++ int i; ++ int snum; ++ u32 init_enet_offset; ++ u32 entry_val; ++ u32 command; ++ u32 cecr_subblock; ++ ++ uec_info = uec->uec_info; ++ ++ /* Allocate init enet command parameter */ ++ uec->init_enet_param_offset = qe_muram_alloc( ++ sizeof(uec_init_cmd_pram_t), 4); ++ init_enet_param_offset = uec->init_enet_param_offset; ++ uec->p_init_enet_param = (uec_init_cmd_pram_t *) ++ qe_muram_addr(uec->init_enet_param_offset); ++ ++ /* Zero init enet command struct */ ++ memset((void *)uec->p_init_enet_param, 0, sizeof(uec_init_cmd_pram_t)); ++ ++ /* Init the command struct */ ++ p_init_enet_param = uec->p_init_enet_param; ++ p_init_enet_param->resinit0 = ENET_INIT_PARAM_MAGIC_RES_INIT0; ++ p_init_enet_param->resinit1 = ENET_INIT_PARAM_MAGIC_RES_INIT1; ++ p_init_enet_param->resinit2 = ENET_INIT_PARAM_MAGIC_RES_INIT2; ++ p_init_enet_param->resinit3 = ENET_INIT_PARAM_MAGIC_RES_INIT3; ++ p_init_enet_param->resinit4 = ENET_INIT_PARAM_MAGIC_RES_INIT4; ++ p_init_enet_param->largestexternallookupkeysize = 0; ++ ++ p_init_enet_param->rgftgfrxglobal |= ((u32)uec_info->num_threads_rx) ++ << ENET_INIT_PARAM_RGF_SHIFT; ++ p_init_enet_param->rgftgfrxglobal |= ((u32)uec_info->num_threads_tx) ++ << ENET_INIT_PARAM_TGF_SHIFT; ++ ++ /* Init Rx global parameter pointer */ ++ p_init_enet_param->rgftgfrxglobal |= uec->rx_glbl_pram_offset | ++ (u32)uec_info->riscRx; ++ ++ /* Init Rx threads */ ++ for (i = 0; i < (thread_rx + 1); i++) { ++ if ((snum = qe_get_snum()) < 0) { ++ printf("%s can not get snum\n", __FUNCTION__); ++ return -ENOMEM; ++ } ++ ++ if (i==0) { ++ init_enet_offset = 0; ++ } else { ++ init_enet_offset = qe_muram_alloc( ++ sizeof(uec_thread_rx_pram_t), ++ UEC_THREAD_RX_PRAM_ALIGNMENT); ++ } ++ ++ entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) | ++ init_enet_offset | (u32)uec_info->riscRx; ++ p_init_enet_param->rxthread[i] = entry_val; ++ } ++ ++ /* Init Tx global parameter pointer */ ++ p_init_enet_param->txglobal = uec->tx_glbl_pram_offset | ++ (u32)uec_info->riscTx; ++ ++ /* Init Tx threads */ ++ for (i = 0; i < thread_tx; i++) { ++ if ((snum = qe_get_snum()) < 0) { ++ printf("%s can not get snum\n", __FUNCTION__); ++ return -ENOMEM; ++ } ++ ++ init_enet_offset = qe_muram_alloc(sizeof(uec_thread_tx_pram_t), ++ UEC_THREAD_TX_PRAM_ALIGNMENT); ++ ++ entry_val = ((u32)snum << ENET_INIT_PARAM_SNUM_SHIFT) | ++ init_enet_offset | (u32)uec_info->riscTx; ++ p_init_enet_param->txthread[i] = entry_val; ++ } ++ ++ __asm__ __volatile__("sync"); ++ ++ /* Issue QE command */ ++ command = QE_INIT_TX_RX; ++ cecr_subblock = ucc_fast_get_qe_cr_subblock( ++ uec->uec_info->uf_info.ucc_num); ++ qe_issue_cmd(command, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET, ++ init_enet_param_offset); ++ ++ return 0; ++} ++ ++static int uec_startup(uec_private_t *uec) ++{ ++ uec_info_t *uec_info; ++ ucc_fast_info_t *uf_info; ++ ucc_fast_private_t *uccf; ++ ucc_fast_t *uf_regs; ++ uec_t *uec_regs; ++ int num_threads_tx; ++ int num_threads_rx; ++ u32 utbipar; ++ enet_interface_e enet_interface; ++ u32 length; ++ u32 align; ++ qe_bd_t *bd; ++ u8 *buf; ++ int i; ++ ++ if (!uec || !uec->uec_info) { ++ printf("%s: uec or uec_info not initial\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ uec_info = uec->uec_info; ++ uf_info = &(uec_info->uf_info); ++ ++ /* Check if Rx BD ring len is illegal */ ++ if ((uec_info->rx_bd_ring_len < UEC_RX_BD_RING_SIZE_MIN) || \ ++ (uec_info->rx_bd_ring_len % UEC_RX_BD_RING_SIZE_ALIGNMENT)) { ++ printf("%s: Rx BD ring len must be multiple of 4, and > 8.\n", ++ __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* Check if Tx BD ring len is illegal */ ++ if (uec_info->tx_bd_ring_len < UEC_TX_BD_RING_SIZE_MIN) { ++ printf("%s: Tx BD ring length must not be smaller than 2.\n", ++ __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* Check if MRBLR is illegal */ ++ if ((MAX_RXBUF_LEN == 0) || (MAX_RXBUF_LEN % UEC_MRBLR_ALIGNMENT)) { ++ printf("%s: max rx buffer length must be mutliple of 128.\n", ++ __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ /* Both Rx and Tx are stopped */ ++ uec->grace_stopped_rx = 1; ++ uec->grace_stopped_tx = 1; ++ ++ /* Init UCC fast */ ++ if (ucc_fast_init(uf_info, &uccf)) { ++ printf("%s: failed to init ucc fast\n", __FUNCTION__); ++ return -ENOMEM; ++ } ++ ++ /* Save uccf */ ++ uec->uccf = uccf; ++ ++ /* Convert the Tx threads number */ ++ if (uec_convert_threads_num(uec_info->num_threads_tx, ++ &num_threads_tx)) { ++ return -EINVAL; ++ } ++ ++ /* Convert the Rx threads number */ ++ if (uec_convert_threads_num(uec_info->num_threads_rx, ++ &num_threads_rx)) { ++ return -EINVAL; ++ } ++ ++ uf_regs = uccf->uf_regs; ++ ++ /* UEC register is following UCC fast registers */ ++ uec_regs = (uec_t *)(&uf_regs->ucc_eth); ++ ++ /* Save the UEC register pointer to UEC private struct */ ++ uec->uec_regs = uec_regs; ++ ++ /* Init UPSMR, enable hardware statistics (UCC) */ ++ out_be32(&uec->uccf->uf_regs->upsmr, UPSMR_INIT_VALUE); ++ ++ /* Init MACCFG1, flow control disable, disable Tx and Rx */ ++ out_be32(&uec_regs->maccfg1, MACCFG1_INIT_VALUE); ++ ++ /* Init MACCFG2, length check, MAC PAD and CRC enable */ ++ out_be32(&uec_regs->maccfg2, MACCFG2_INIT_VALUE); ++ ++ /* Setup MAC interface mode */ ++ uec_set_mac_if_mode(uec, uec_info->enet_interface); ++ ++ /* Setup MII master clock source */ ++ qe_set_mii_clk_src(uec_info->uf_info.ucc_num); ++ ++ /* Setup UTBIPAR */ ++ utbipar = in_be32(&uec_regs->utbipar); ++ utbipar &= ~UTBIPAR_PHY_ADDRESS_MASK; ++ enet_interface = uec->uec_info->enet_interface; ++ if (enet_interface == ENET_1000_TBI || ++ enet_interface == ENET_1000_RTBI) { ++ utbipar |= (uec_info->phy_address + uec_info->uf_info.ucc_num) ++ << UTBIPAR_PHY_ADDRESS_SHIFT; ++ } else { ++ utbipar |= (0x10 + uec_info->uf_info.ucc_num) ++ << UTBIPAR_PHY_ADDRESS_SHIFT; ++ } ++ ++ out_be32(&uec_regs->utbipar, utbipar); ++ ++ /* Allocate Tx BDs */ ++ length = ((uec_info->tx_bd_ring_len * SIZEOFBD) / ++ UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) * ++ UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT; ++ if ((uec_info->tx_bd_ring_len * SIZEOFBD) % ++ UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT) { ++ length += UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT; ++ } ++ ++ align = UEC_TX_BD_RING_ALIGNMENT; ++ uec->tx_bd_ring_offset = (u32)malloc((u32)(length + align)); ++ if (uec->tx_bd_ring_offset != 0) { ++ uec->p_tx_bd_ring = (u8 *)((uec->tx_bd_ring_offset + align) ++ & ~(align - 1)); ++ } ++ ++ /* Zero all of Tx BDs */ ++ memset((void *)(uec->tx_bd_ring_offset), 0, length + align); ++ ++ /* Allocate Rx BDs */ ++ length = uec_info->rx_bd_ring_len * SIZEOFBD; ++ align = UEC_RX_BD_RING_ALIGNMENT; ++ uec->rx_bd_ring_offset = (u32)(malloc((u32)(length + align))); ++ if (uec->rx_bd_ring_offset != 0) { ++ uec->p_rx_bd_ring = (u8 *)((uec->rx_bd_ring_offset + align) ++ & ~(align - 1)); ++ } ++ ++ /* Zero all of Rx BDs */ ++ memset((void *)(uec->rx_bd_ring_offset), 0, length + align); ++ ++ /* Allocate Rx buffer */ ++ length = uec_info->rx_bd_ring_len * MAX_RXBUF_LEN; ++ align = UEC_RX_DATA_BUF_ALIGNMENT; ++ uec->rx_buf_offset = (u32)malloc(length + align); ++ if (uec->rx_buf_offset != 0) { ++ uec->p_rx_buf = (u8 *)((uec->rx_buf_offset + align) ++ & ~(align - 1)); ++ } ++ ++ /* Zero all of the Rx buffer */ ++ memset((void *)(uec->rx_buf_offset), 0, length + align); ++ ++ /* Init TxBD ring */ ++ bd = (qe_bd_t *)uec->p_tx_bd_ring; ++ uec->txBd = bd; ++ ++ for (i = 0; i < uec_info->tx_bd_ring_len; i++) { ++ BD_DATA_CLEAR(bd); ++ BD_STATUS_SET(bd, 0); ++ BD_LENGTH_SET(bd, 0); ++ bd ++; ++ } ++ BD_STATUS_SET((--bd), TxBD_WRAP); ++ ++ /* Init RxBD ring */ ++ bd = (qe_bd_t *)uec->p_rx_bd_ring; ++ uec->rxBd = bd; ++ buf = uec->p_rx_buf; ++ for (i = 0; i < uec_info->rx_bd_ring_len; i++) { ++ BD_DATA_SET(bd, buf); ++ BD_LENGTH_SET(bd, 0); ++ BD_STATUS_SET(bd, RxBD_EMPTY); ++ buf += MAX_RXBUF_LEN; ++ bd ++; ++ } ++ BD_STATUS_SET((--bd), RxBD_WRAP | RxBD_EMPTY); ++ ++ /* Init global Tx parameter RAM */ ++ uec_init_tx_parameter(uec, num_threads_tx); ++ ++ /* Init global Rx parameter RAM */ ++ uec_init_rx_parameter(uec, num_threads_rx); ++ ++ /* Init ethernet Tx and Rx parameter command */ ++ if (uec_issue_init_enet_rxtx_cmd(uec, num_threads_tx, ++ num_threads_rx)) { ++ printf("%s issue init enet cmd failed\n", __FUNCTION__); ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ ++static int uec_init(struct eth_device* dev, bd_t *bd) ++{ ++ uec_private_t *uec; ++ int err; ++ ++ uec = (uec_private_t *)dev->priv; ++ ++ if (uec->the_first_run == 0) { ++ /* Set up the MAC address */ ++ if (dev->enetaddr[0] & 0x01) { ++ printf("%s: MacAddress is multcast address\n", ++ __FUNCTION__); ++ return -EINVAL; ++ } ++ uec_set_mac_address(uec, dev->enetaddr); ++ uec->the_first_run = 1; ++ } ++ ++ err = uec_open(uec, COMM_DIR_RX_AND_TX); ++ if (err) { ++ printf("%s: cannot enable UEC device\n", dev->name); ++ return err; ++ } ++ ++ return 0; ++} ++ ++static void uec_halt(struct eth_device* dev) ++{ ++ uec_private_t *uec = (uec_private_t *)dev->priv; ++ uec_stop(uec, COMM_DIR_RX_AND_TX); ++} ++ ++static int uec_send(struct eth_device* dev, volatile void *buf, int len) ++{ ++ uec_private_t *uec; ++ ucc_fast_private_t *uccf; ++ volatile qe_bd_t *bd; ++ volatile u16 status; ++ int i; ++ int result = 0; ++ ++ uec = (uec_private_t *)dev->priv; ++ uccf = uec->uccf; ++ bd = uec->txBd; ++ ++ /* Find an empty TxBD */ ++ for (i = 0; BD_STATUS(bd) & TxBD_READY; i++) { ++ if (i > 0x100000) { ++ printf("%s: tx buffer not ready\n", dev->name); ++ return result; ++ } ++ } ++ ++ /* Init TxBD */ ++ BD_DATA_SET(bd, buf); ++ BD_LENGTH_SET(bd, len); ++ status = BD_STATUS(bd); ++ status &= BD_WRAP; ++ status |= (TxBD_READY | TxBD_LAST); ++ BD_STATUS_SET(bd, status); ++ ++ /* Tell UCC to transmit the buffer */ ++ ucc_fast_transmit_on_demand(uccf); ++ ++ /* Wait for buffer to be transmitted */ ++ status = BD_STATUS(bd); ++ for (i = 0; status & TxBD_READY; i++) { ++ if (i > 0x100000) { ++ printf("%s: tx error\n", dev->name); ++ return result; ++ } ++ status = BD_STATUS(bd); ++ } ++ ++ /* Ok, the buffer be transimitted */ ++ BD_ADVANCE(bd, status, uec->p_tx_bd_ring); ++ uec->txBd = bd; ++ result = 1; ++ ++ return result; ++} ++ ++static int uec_recv(struct eth_device* dev) ++{ ++ uec_private_t *uec = dev->priv; ++ volatile qe_bd_t *bd; ++ volatile u16 status; ++ u16 len; ++ u8 *data; ++ ++ bd = uec->rxBd; ++ status = BD_STATUS(bd); ++ ++ while (!(status & RxBD_EMPTY)) { ++ if (!(status & RxBD_ERROR)) { ++ data = BD_DATA(bd); ++ len = BD_LENGTH(bd); ++ NetReceive(data, len); ++ } else { ++ printf("%s: Rx error\n", dev->name); ++ } ++ status &= BD_CLEAN; ++ BD_LENGTH_SET(bd, 0); ++ BD_STATUS_SET(bd, status | RxBD_EMPTY); ++ BD_ADVANCE(bd, status, uec->p_rx_bd_ring); ++ status = BD_STATUS(bd); ++ } ++ uec->rxBd = bd; ++ ++ return 1; ++} ++ ++int uec_initialize(int index) ++{ ++ struct eth_device *dev; ++ int i; ++ uec_private_t *uec; ++ uec_info_t *uec_info; ++ int err; ++ ++ dev = (struct eth_device *)malloc(sizeof(struct eth_device)); ++ if (!dev) ++ return 0; ++ memset(dev, 0, sizeof(struct eth_device)); ++ ++ /* Allocate the UEC private struct */ ++ uec = (uec_private_t *)malloc(sizeof(uec_private_t)); ++ if (!uec) { ++ return -ENOMEM; ++ } ++ memset(uec, 0, sizeof(uec_private_t)); ++ ++ /* Init UEC private struct, they come from board.h */ ++ if (index == 0) { ++#ifdef CONFIG_UEC_ETH1 ++ uec_info = ð1_uec_info; ++#endif ++ } else if (index == 1) { ++#ifdef CONFIG_UEC_ETH2 ++ uec_info = ð2_uec_info; ++#endif ++ } else { ++ printf("%s: index is illegal.\n", __FUNCTION__); ++ return -EINVAL; ++ } ++ ++ uec->uec_info = uec_info; ++ ++ sprintf(dev->name, "FSL UEC%d", index); ++ dev->iobase = 0; ++ dev->priv = (void *)uec; ++ dev->init = uec_init; ++ dev->halt = uec_halt; ++ dev->send = uec_send; ++ dev->recv = uec_recv; ++ ++ /* Clear the ethnet address */ ++ for (i = 0; i < 6; i++) ++ dev->enetaddr[i] = 0; ++ ++ eth_register(dev); ++ ++ err = uec_startup(uec); ++ if (err) { ++ printf("%s: Cannot configure net device, aborting.",dev->name); ++ return err; ++ } ++ ++ err = init_phy(dev); ++ if (err) { ++ printf("%s: Cannot initialize PHY, aborting.\n", dev->name); ++ return err; ++ } ++ ++ phy_change(dev); ++ ++ return 1; ++} ++#endif /* CONFIG_QE */ +diff -Naupr u-boot-1.1.6/drivers/qe/uec.h u-boot-1.1.6-fsl-1/drivers/qe/uec.h +--- u-boot-1.1.6/drivers/qe/uec.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/uec.h 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,716 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * based on source code of Shlomi Gridish ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#ifndef __UEC_H__ ++#define __UEC_H__ ++ ++#define MAX_TX_THREADS 8 ++#define MAX_RX_THREADS 8 ++#define MAX_TX_QUEUES 8 ++#define MAX_RX_QUEUES 8 ++#define MAX_PREFETCHED_BDS 4 ++#define MAX_IPH_OFFSET_ENTRY 8 ++#define MAX_ENET_INIT_PARAM_ENTRIES_RX 9 ++#define MAX_ENET_INIT_PARAM_ENTRIES_TX 8 ++ ++/* UEC UPSMR (Protocol Specific Mode Register) ++ */ ++#define UPSMR_ECM 0x04000000 /* Enable CAM Miss */ ++#define UPSMR_HSE 0x02000000 /* Hardware Statistics Enable */ ++#define UPSMR_PRO 0x00400000 /* Promiscuous */ ++#define UPSMR_CAP 0x00200000 /* CAM polarity */ ++#define UPSMR_RSH 0x00100000 /* Receive Short Frames */ ++#define UPSMR_RPM 0x00080000 /* Reduced Pin Mode interfaces */ ++#define UPSMR_R10M 0x00040000 /* RGMII/RMII 10 Mode */ ++#define UPSMR_RLPB 0x00020000 /* RMII Loopback Mode */ ++#define UPSMR_TBIM 0x00010000 /* Ten-bit Interface Mode */ ++#define UPSMR_RMM 0x00001000 /* RMII/RGMII Mode */ ++#define UPSMR_CAM 0x00000400 /* CAM Address Matching */ ++#define UPSMR_BRO 0x00000200 /* Broadcast Address */ ++#define UPSMR_RES1 0x00002000 /* Reserved feild - must be 1 */ ++ ++#define UPSMR_INIT_VALUE (UPSMR_HSE | UPSMR_RES1) ++ ++/* UEC MACCFG1 (MAC Configuration 1 Register) ++ */ ++#define MACCFG1_FLOW_RX 0x00000020 /* Flow Control Rx */ ++#define MACCFG1_FLOW_TX 0x00000010 /* Flow Control Tx */ ++#define MACCFG1_ENABLE_SYNCHED_RX 0x00000008 /* Enable Rx Sync */ ++#define MACCFG1_ENABLE_RX 0x00000004 /* Enable Rx */ ++#define MACCFG1_ENABLE_SYNCHED_TX 0x00000002 /* Enable Tx Sync */ ++#define MACCFG1_ENABLE_TX 0x00000001 /* Enable Tx */ ++ ++#define MACCFG1_INIT_VALUE (0) ++ ++/* UEC MACCFG2 (MAC Configuration 2 Register) ++ */ ++#define MACCFG2_PREL 0x00007000 ++#define MACCFG2_PREL_SHIFT (31 - 19) ++#define MACCFG2_PREL_MASK 0x0000f000 ++#define MACCFG2_SRP 0x00000080 ++#define MACCFG2_STP 0x00000040 ++#define MACCFG2_RESERVED_1 0x00000020 /* must be set */ ++#define MACCFG2_LC 0x00000010 /* Length Check */ ++#define MACCFG2_MPE 0x00000008 ++#define MACCFG2_FDX 0x00000001 /* Full Duplex */ ++#define MACCFG2_FDX_MASK 0x00000001 ++#define MACCFG2_PAD_CRC 0x00000004 ++#define MACCFG2_CRC_EN 0x00000002 ++#define MACCFG2_PAD_AND_CRC_MODE_NONE 0x00000000 ++#define MACCFG2_PAD_AND_CRC_MODE_CRC_ONLY 0x00000002 ++#define MACCFG2_PAD_AND_CRC_MODE_PAD_AND_CRC 0x00000004 ++#define MACCFG2_INTERFACE_MODE_NIBBLE 0x00000100 ++#define MACCFG2_INTERFACE_MODE_BYTE 0x00000200 ++#define MACCFG2_INTERFACE_MODE_MASK 0x00000300 ++ ++#define MACCFG2_INIT_VALUE (MACCFG2_PREL | MACCFG2_RESERVED_1 | \ ++ MACCFG2_LC | MACCFG2_PAD_CRC | MACCFG2_FDX) ++ ++/* UEC Event Register ++*/ ++#define UCCE_MPD 0x80000000 ++#define UCCE_SCAR 0x40000000 ++#define UCCE_GRA 0x20000000 ++#define UCCE_CBPR 0x10000000 ++#define UCCE_BSY 0x08000000 ++#define UCCE_RXC 0x04000000 ++#define UCCE_TXC 0x02000000 ++#define UCCE_TXE 0x01000000 ++#define UCCE_TXB7 0x00800000 ++#define UCCE_TXB6 0x00400000 ++#define UCCE_TXB5 0x00200000 ++#define UCCE_TXB4 0x00100000 ++#define UCCE_TXB3 0x00080000 ++#define UCCE_TXB2 0x00040000 ++#define UCCE_TXB1 0x00020000 ++#define UCCE_TXB0 0x00010000 ++#define UCCE_RXB7 0x00008000 ++#define UCCE_RXB6 0x00004000 ++#define UCCE_RXB5 0x00002000 ++#define UCCE_RXB4 0x00001000 ++#define UCCE_RXB3 0x00000800 ++#define UCCE_RXB2 0x00000400 ++#define UCCE_RXB1 0x00000200 ++#define UCCE_RXB0 0x00000100 ++#define UCCE_RXF7 0x00000080 ++#define UCCE_RXF6 0x00000040 ++#define UCCE_RXF5 0x00000020 ++#define UCCE_RXF4 0x00000010 ++#define UCCE_RXF3 0x00000008 ++#define UCCE_RXF2 0x00000004 ++#define UCCE_RXF1 0x00000002 ++#define UCCE_RXF0 0x00000001 ++ ++#define UCCE_TXB (UCCE_TXB7 | UCCE_TXB6 | UCCE_TXB5 | UCCE_TXB4 | \ ++ UCCE_TXB3 | UCCE_TXB2 | UCCE_TXB1 | UCCE_TXB0) ++#define UCCE_RXB (UCCE_RXB7 | UCCE_RXB6 | UCCE_RXB5 | UCCE_RXB4 | \ ++ UCCE_RXB3 | UCCE_RXB2 | UCCE_RXB1 | UCCE_RXB0) ++#define UCCE_RXF (UCCE_RXF7 | UCCE_RXF6 | UCCE_RXF5 | UCCE_RXF4 | \ ++ UCCE_RXF3 | UCCE_RXF2 | UCCE_RXF1 | UCCE_RXF0) ++#define UCCE_OTHER (UCCE_SCAR | UCCE_GRA | UCCE_CBPR | UCCE_BSY | \ ++ UCCE_RXC | UCCE_TXC | UCCE_TXE) ++ ++/* UEC TEMODR Register ++*/ ++#define TEMODER_SCHEDULER_ENABLE 0x2000 ++#define TEMODER_IP_CHECKSUM_GENERATE 0x0400 ++#define TEMODER_PERFORMANCE_OPTIMIZATION_MODE1 0x0200 ++#define TEMODER_RMON_STATISTICS 0x0100 ++#define TEMODER_NUM_OF_QUEUES_SHIFT (15-15) ++ ++#define TEMODER_INIT_VALUE 0xc000 ++ ++/* UEC REMODR Register ++*/ ++#define REMODER_RX_RMON_STATISTICS_ENABLE 0x00001000 ++#define REMODER_RX_EXTENDED_FEATURES 0x80000000 ++#define REMODER_VLAN_OPERATION_TAGGED_SHIFT (31-9 ) ++#define REMODER_VLAN_OPERATION_NON_TAGGED_SHIFT (31-10) ++#define REMODER_RX_QOS_MODE_SHIFT (31-15) ++#define REMODER_RMON_STATISTICS 0x00001000 ++#define REMODER_RX_EXTENDED_FILTERING 0x00000800 ++#define REMODER_NUM_OF_QUEUES_SHIFT (31-23) ++#define REMODER_DYNAMIC_MAX_FRAME_LENGTH 0x00000008 ++#define REMODER_DYNAMIC_MIN_FRAME_LENGTH 0x00000004 ++#define REMODER_IP_CHECKSUM_CHECK 0x00000002 ++#define REMODER_IP_ADDRESS_ALIGNMENT 0x00000001 ++ ++#define REMODER_INIT_VALUE 0 ++ ++/* BMRx - Bus Mode Register */ ++#define BMR_GLB 0x20 ++#define BMR_BO_BE 0x10 ++#define BMR_DTB_SECONDARY_BUS 0x02 ++#define BMR_BDB_SECONDARY_BUS 0x01 ++ ++#define BMR_SHIFT 24 ++#define BMR_INIT_VALUE (BMR_GLB | BMR_BO_BE) ++ ++/* UEC UCCS (Ethernet Status Register) ++ */ ++#define UCCS_BPR 0x02 ++#define UCCS_PAU 0x02 ++#define UCCS_MPD 0x01 ++ ++/* UEC MIIMCFG (MII Management Configuration Register) ++ */ ++#define MIIMCFG_RESET_MANAGEMENT 0x80000000 ++#define MIIMCFG_NO_PREAMBLE 0x00000010 ++#define MIIMCFG_CLOCK_DIVIDE_SHIFT (31 - 31) ++#define MIIMCFG_CLOCK_DIVIDE_MASK 0x0000000f ++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_4 0x00000001 ++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_6 0x00000002 ++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_8 0x00000003 ++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_10 0x00000004 ++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_14 0x00000005 ++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_20 0x00000006 ++#define MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_28 0x00000007 ++ ++#define MIIMCFG_MNGMNT_CLC_DIV_INIT_VALUE \ ++ MIIMCFG_MANAGEMENT_CLOCK_DIVIDE_BY_10 ++ ++/* UEC MIIMCOM (MII Management Command Register) ++ */ ++#define MIIMCOM_SCAN_CYCLE 0x00000002 /* Scan cycle */ ++#define MIIMCOM_READ_CYCLE 0x00000001 /* Read cycle */ ++ ++/* UEC MIIMADD (MII Management Address Register) ++ */ ++#define MIIMADD_PHY_ADDRESS_SHIFT (31 - 23) ++#define MIIMADD_PHY_REGISTER_SHIFT (31 - 31) ++ ++/* UEC MIIMCON (MII Management Control Register) ++ */ ++#define MIIMCON_PHY_CONTROL_SHIFT (31 - 31) ++#define MIIMCON_PHY_STATUS_SHIFT (31 - 31) ++ ++/* UEC MIIMIND (MII Management Indicator Register) ++ */ ++#define MIIMIND_NOT_VALID 0x00000004 ++#define MIIMIND_SCAN 0x00000002 ++#define MIIMIND_BUSY 0x00000001 ++ ++/* UEC UTBIPAR (Ten Bit Interface Physical Address Register) ++ */ ++#define UTBIPAR_PHY_ADDRESS_SHIFT (31 - 31) ++#define UTBIPAR_PHY_ADDRESS_MASK 0x0000001f ++ ++/* UEC UESCR (Ethernet Statistics Control Register) ++ */ ++#define UESCR_AUTOZ 0x8000 ++#define UESCR_CLRCNT 0x4000 ++#define UESCR_MAXCOV_SHIFT (15 - 7) ++#define UESCR_SCOV_SHIFT (15 - 15) ++ ++/****** Tx data struct collection ******/ ++/* Tx thread data, each Tx thread has one this struct. ++*/ ++typedef struct uec_thread_data_tx { ++ u8 res0[136]; ++} __attribute__ ((packed)) uec_thread_data_tx_t; ++ ++/* Tx thread parameter, each Tx thread has one this struct. ++*/ ++typedef struct uec_thread_tx_pram { ++ u8 res0[64]; ++} __attribute__ ((packed)) uec_thread_tx_pram_t; ++ ++/* Send queue queue-descriptor, each Tx queue has one this QD ++*/ ++typedef struct uec_send_queue_qd { ++ u32 bd_ring_base; /* pointer to BD ring base address */ ++ u8 res0[0x8]; ++ u32 last_bd_completed_address; /* last entry in BD ring */ ++ u8 res1[0x30]; ++} __attribute__ ((packed)) uec_send_queue_qd_t; ++ ++/* Send queue memory region */ ++typedef struct uec_send_queue_mem_region { ++ uec_send_queue_qd_t sqqd[MAX_TX_QUEUES]; ++} __attribute__ ((packed)) uec_send_queue_mem_region_t; ++ ++/* Scheduler struct ++*/ ++typedef struct uec_scheduler { ++ u16 cpucount0; /* CPU packet counter */ ++ u16 cpucount1; /* CPU packet counter */ ++ u16 cecount0; /* QE packet counter */ ++ u16 cecount1; /* QE packet counter */ ++ u16 cpucount2; /* CPU packet counter */ ++ u16 cpucount3; /* CPU packet counter */ ++ u16 cecount2; /* QE packet counter */ ++ u16 cecount3; /* QE packet counter */ ++ u16 cpucount4; /* CPU packet counter */ ++ u16 cpucount5; /* CPU packet counter */ ++ u16 cecount4; /* QE packet counter */ ++ u16 cecount5; /* QE packet counter */ ++ u16 cpucount6; /* CPU packet counter */ ++ u16 cpucount7; /* CPU packet counter */ ++ u16 cecount6; /* QE packet counter */ ++ u16 cecount7; /* QE packet counter */ ++ u32 weightstatus[MAX_TX_QUEUES]; /* accumulated weight factor */ ++ u32 rtsrshadow; /* temporary variable handled by QE */ ++ u32 time; /* temporary variable handled by QE */ ++ u32 ttl; /* temporary variable handled by QE */ ++ u32 mblinterval; /* max burst length interval */ ++ u16 nortsrbytetime; /* normalized value of byte time in tsr units */ ++ u8 fracsiz; ++ u8 res0[1]; ++ u8 strictpriorityq; /* Strict Priority Mask register */ ++ u8 txasap; /* Transmit ASAP register */ ++ u8 extrabw; /* Extra BandWidth register */ ++ u8 oldwfqmask; /* temporary variable handled by QE */ ++ u8 weightfactor[MAX_TX_QUEUES]; /**< weight factor for queues */ ++ u32 minw; /* temporary variable handled by QE */ ++ u8 res1[0x70-0x64]; ++} __attribute__ ((packed)) uec_scheduler_t; ++ ++/* Tx firmware counters ++*/ ++typedef struct uec_tx_firmware_statistics_pram { ++ u32 sicoltx; /* single collision */ ++ u32 mulcoltx; /* multiple collision */ ++ u32 latecoltxfr; /* late collision */ ++ u32 frabortduecol; /* frames aborted due to tx collision */ ++ u32 frlostinmactxer; /* frames lost due to internal MAC error tx */ ++ u32 carriersenseertx; /* carrier sense error */ ++ u32 frtxok; /* frames transmitted OK */ ++ u32 txfrexcessivedefer; ++ u32 txpkts256; /* total packets(including bad) 256~511 B */ ++ u32 txpkts512; /* total packets(including bad) 512~1023B */ ++ u32 txpkts1024; /* total packets(including bad) 1024~1518B */ ++ u32 txpktsjumbo; /* total packets(including bad) >1024 */ ++} __attribute__ ((packed)) uec_tx_firmware_statistics_pram_t; ++ ++/* Tx global parameter table ++*/ ++typedef struct uec_tx_global_pram { ++ u16 temoder; ++ u8 res0[0x38-0x02]; ++ u32 sqptr; ++ u32 schedulerbasepointer; ++ u32 txrmonbaseptr; ++ u32 tstate; ++ u8 iphoffset[MAX_IPH_OFFSET_ENTRY]; ++ u32 vtagtable[0x8]; ++ u32 tqptr; ++ u8 res2[0x80-0x74]; ++} __attribute__ ((packed)) uec_tx_global_pram_t; ++ ++ ++/****** Rx data struct collection ******/ ++/* Rx thread data, each Rx thread has one this struct. ++*/ ++typedef struct uec_thread_data_rx { ++ u8 res0[40]; ++} __attribute__ ((packed)) uec_thread_data_rx_t; ++ ++/* Rx thread parameter, each Rx thread has one this struct. ++*/ ++typedef struct uec_thread_rx_pram { ++ u8 res0[128]; ++} __attribute__ ((packed)) uec_thread_rx_pram_t; ++ ++/* Rx firmware counters ++*/ ++typedef struct uec_rx_firmware_statistics_pram { ++ u32 frrxfcser; /* frames with crc error */ ++ u32 fraligner; /* frames with alignment error */ ++ u32 inrangelenrxer; /* in range length error */ ++ u32 outrangelenrxer; /* out of range length error */ ++ u32 frtoolong; /* frame too long */ ++ u32 runt; /* runt */ ++ u32 verylongevent; /* very long event */ ++ u32 symbolerror; /* symbol error */ ++ u32 dropbsy; /* drop because of BD not ready */ ++ u8 res0[0x8]; ++ u32 mismatchdrop; /* drop because of MAC filtering */ ++ u32 underpkts; /* total frames less than 64 octets */ ++ u32 pkts256; /* total frames(including bad)256~511 B */ ++ u32 pkts512; /* total frames(including bad)512~1023 B */ ++ u32 pkts1024; /* total frames(including bad)1024~1518 B */ ++ u32 pktsjumbo; /* total frames(including bad) >1024 B */ ++ u32 frlossinmacer; ++ u32 pausefr; /* pause frames */ ++ u8 res1[0x4]; ++ u32 removevlan; ++ u32 replacevlan; ++ u32 insertvlan; ++} __attribute__ ((packed)) uec_rx_firmware_statistics_pram_t; ++ ++/* Rx interrupt coalescing entry, each Rx queue has one this entry. ++*/ ++typedef struct uec_rx_interrupt_coalescing_entry { ++ u32 maxvalue; ++ u32 counter; ++} __attribute__ ((packed)) uec_rx_interrupt_coalescing_entry_t; ++ ++typedef struct uec_rx_interrupt_coalescing_table { ++ uec_rx_interrupt_coalescing_entry_t entry[MAX_RX_QUEUES]; ++} __attribute__ ((packed)) uec_rx_interrupt_coalescing_table_t; ++ ++/* RxBD queue entry, each Rx queue has one this entry. ++*/ ++typedef struct uec_rx_bd_queues_entry { ++ u32 bdbaseptr; /* BD base pointer */ ++ u32 bdptr; /* BD pointer */ ++ u32 externalbdbaseptr; /* external BD base pointer */ ++ u32 externalbdptr; /* external BD pointer */ ++} __attribute__ ((packed)) uec_rx_bd_queues_entry_t; ++ ++/* Rx global paramter table ++*/ ++typedef struct uec_rx_global_pram { ++ u32 remoder; /* ethernet mode reg. */ ++ u32 rqptr; /* base pointer to the Rx Queues */ ++ u32 res0[0x1]; ++ u8 res1[0x20-0xC]; ++ u16 typeorlen; ++ u8 res2[0x1]; ++ u8 rxgstpack; /* ack on GRACEFUL STOP RX command */ ++ u32 rxrmonbaseptr; /* Rx RMON statistics base */ ++ u8 res3[0x30-0x28]; ++ u32 intcoalescingptr; /* Interrupt coalescing table pointer */ ++ u8 res4[0x36-0x34]; ++ u8 rstate; ++ u8 res5[0x46-0x37]; ++ u16 mrblr; /* max receive buffer length reg. */ ++ u32 rbdqptr; /* RxBD parameter table description */ ++ u16 mflr; /* max frame length reg. */ ++ u16 minflr; /* min frame length reg. */ ++ u16 maxd1; /* max dma1 length reg. */ ++ u16 maxd2; /* max dma2 length reg. */ ++ u32 ecamptr; /* external CAM address */ ++ u32 l2qt; /* VLAN priority mapping table. */ ++ u32 l3qt[0x8]; /* IP priority mapping table. */ ++ u16 vlantype; /* vlan type */ ++ u16 vlantci; /* default vlan tci */ ++ u8 addressfiltering[64];/* address filtering data structure */ ++ u32 exfGlobalParam; /* extended filtering global parameters */ ++ u8 res6[0x100-0xC4]; /* Initialize to zero */ ++} __attribute__ ((packed)) uec_rx_global_pram_t; ++ ++#define GRACEFUL_STOP_ACKNOWLEDGE_RX 0x01 ++ ++ ++/****** UEC common ******/ ++/* UCC statistics - hardware counters ++*/ ++typedef struct uec_hardware_statistics { ++ u32 tx64; ++ u32 tx127; ++ u32 tx255; ++ u32 rx64; ++ u32 rx127; ++ u32 rx255; ++ u32 txok; ++ u16 txcf; ++ u32 tmca; ++ u32 tbca; ++ u32 rxfok; ++ u32 rxbok; ++ u32 rbyt; ++ u32 rmca; ++ u32 rbca; ++} __attribute__ ((packed)) uec_hardware_statistics_t; ++ ++/* InitEnet command parameter ++*/ ++typedef struct uec_init_cmd_pram { ++ u8 resinit0; ++ u8 resinit1; ++ u8 resinit2; ++ u8 resinit3; ++ u16 resinit4; ++ u8 res1[0x1]; ++ u8 largestexternallookupkeysize; ++ u32 rgftgfrxglobal; ++ u32 rxthread[MAX_ENET_INIT_PARAM_ENTRIES_RX]; /* rx threads */ ++ u8 res2[0x38 - 0x30]; ++ u32 txglobal; /* tx global */ ++ u32 txthread[MAX_ENET_INIT_PARAM_ENTRIES_TX]; /* tx threads */ ++ u8 res3[0x1]; ++} __attribute__ ((packed)) uec_init_cmd_pram_t; ++ ++#define ENET_INIT_PARAM_RGF_SHIFT (32 - 4) ++#define ENET_INIT_PARAM_TGF_SHIFT (32 - 8) ++ ++#define ENET_INIT_PARAM_RISC_MASK 0x0000003f ++#define ENET_INIT_PARAM_PTR_MASK 0x00ffffc0 ++#define ENET_INIT_PARAM_SNUM_MASK 0xff000000 ++#define ENET_INIT_PARAM_SNUM_SHIFT 24 ++ ++#define ENET_INIT_PARAM_MAGIC_RES_INIT0 0x06 ++#define ENET_INIT_PARAM_MAGIC_RES_INIT1 0x30 ++#define ENET_INIT_PARAM_MAGIC_RES_INIT2 0xff ++#define ENET_INIT_PARAM_MAGIC_RES_INIT3 0x00 ++#define ENET_INIT_PARAM_MAGIC_RES_INIT4 0x0400 ++ ++/* structure representing 82xx Address Filtering Enet Address in PRAM ++*/ ++typedef struct uec_82xx_enet_address { ++ u8 res1[0x2]; ++ u16 h; /* address (MSB) */ ++ u16 m; /* address */ ++ u16 l; /* address (LSB) */ ++} __attribute__ ((packed)) uec_82xx_enet_address_t; ++ ++/* structure representing 82xx Address Filtering PRAM ++*/ ++typedef struct uec_82xx_address_filtering_pram { ++ u32 iaddr_h; /* individual address filter, high */ ++ u32 iaddr_l; /* individual address filter, low */ ++ u32 gaddr_h; /* group address filter, high */ ++ u32 gaddr_l; /* group address filter, low */ ++ uec_82xx_enet_address_t taddr; ++ uec_82xx_enet_address_t paddr[4]; ++ u8 res0[0x40-0x38]; ++} __attribute__ ((packed)) uec_82xx_address_filtering_pram_t; ++ ++/* Buffer Descriptor ++*/ ++typedef struct buffer_descriptor { ++ u16 status; ++ u16 len; ++ u32 data; ++} __attribute__ ((packed)) qe_bd_t, *p_bd_t; ++ ++#define SIZEOFBD sizeof(qe_bd_t) ++ ++/* Common BD flags ++*/ ++#define BD_WRAP 0x2000 ++#define BD_INT 0x1000 ++#define BD_LAST 0x0800 ++#define BD_CLEAN 0x3000 ++ ++/* TxBD status flags ++*/ ++#define TxBD_READY 0x8000 ++#define TxBD_PADCRC 0x4000 ++#define TxBD_WRAP BD_WRAP ++#define TxBD_INT BD_INT ++#define TxBD_LAST BD_LAST ++#define TxBD_TXCRC 0x0400 ++#define TxBD_DEF 0x0200 ++#define TxBD_PP 0x0100 ++#define TxBD_LC 0x0080 ++#define TxBD_RL 0x0040 ++#define TxBD_RC 0x003C ++#define TxBD_UNDERRUN 0x0002 ++#define TxBD_TRUNC 0x0001 ++ ++#define TxBD_ERROR (TxBD_UNDERRUN | TxBD_TRUNC) ++ ++/* RxBD status flags ++*/ ++#define RxBD_EMPTY 0x8000 ++#define RxBD_OWNER 0x4000 ++#define RxBD_WRAP BD_WRAP ++#define RxBD_INT BD_INT ++#define RxBD_LAST BD_LAST ++#define RxBD_FIRST 0x0400 ++#define RxBD_CMR 0x0200 ++#define RxBD_MISS 0x0100 ++#define RxBD_BCAST 0x0080 ++#define RxBD_MCAST 0x0040 ++#define RxBD_LG 0x0020 ++#define RxBD_NO 0x0010 ++#define RxBD_SHORT 0x0008 ++#define RxBD_CRCERR 0x0004 ++#define RxBD_OVERRUN 0x0002 ++#define RxBD_IPCH 0x0001 ++ ++#define RxBD_ERROR (RxBD_LG | RxBD_NO | RxBD_SHORT | \ ++ RxBD_CRCERR | RxBD_OVERRUN) ++ ++/* BD access macros ++*/ ++#define BD_STATUS(_bd) (((p_bd_t)(_bd))->status) ++#define BD_STATUS_SET(_bd, _val) (((p_bd_t)(_bd))->status = _val) ++#define BD_LENGTH(_bd) (((p_bd_t)(_bd))->len) ++#define BD_LENGTH_SET(_bd, _val) (((p_bd_t)(_bd))->len = _val) ++#define BD_DATA_CLEAR(_bd) (((p_bd_t)(_bd))->data = 0) ++#define BD_IS_DATA(_bd) (((p_bd_t)(_bd))->data) ++#define BD_DATA(_bd) ((u8 *)(((p_bd_t)(_bd))->data)) ++#define BD_DATA_SET(_bd, _data) (((p_bd_t)(_bd))->data = (u32)(_data)) ++#define BD_ADVANCE(_bd,_status,_base) \ ++ (((_status) & BD_WRAP) ? (_bd) = ((p_bd_t)(_base)) : ++(_bd)) ++ ++/* Rx Prefetched BDs ++*/ ++typedef struct uec_rx_prefetched_bds { ++ qe_bd_t bd[MAX_PREFETCHED_BDS]; /* prefetched bd */ ++} __attribute__ ((packed)) uec_rx_prefetched_bds_t; ++ ++/* Alignments ++ */ ++#define UEC_RX_GLOBAL_PRAM_ALIGNMENT 64 ++#define UEC_TX_GLOBAL_PRAM_ALIGNMENT 64 ++#define UEC_THREAD_RX_PRAM_ALIGNMENT 128 ++#define UEC_THREAD_TX_PRAM_ALIGNMENT 64 ++#define UEC_THREAD_DATA_ALIGNMENT 256 ++#define UEC_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT 32 ++#define UEC_SCHEDULER_ALIGNMENT 4 ++#define UEC_TX_STATISTICS_ALIGNMENT 4 ++#define UEC_RX_STATISTICS_ALIGNMENT 4 ++#define UEC_RX_INTERRUPT_COALESCING_ALIGNMENT 4 ++#define UEC_RX_BD_QUEUES_ALIGNMENT 8 ++#define UEC_RX_PREFETCHED_BDS_ALIGNMENT 128 ++#define UEC_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT 4 ++#define UEC_RX_BD_RING_ALIGNMENT 32 ++#define UEC_TX_BD_RING_ALIGNMENT 32 ++#define UEC_MRBLR_ALIGNMENT 128 ++#define UEC_RX_BD_RING_SIZE_ALIGNMENT 4 ++#define UEC_TX_BD_RING_SIZE_MEMORY_ALIGNMENT 32 ++#define UEC_RX_DATA_BUF_ALIGNMENT 64 ++ ++#define UEC_VLAN_PRIORITY_MAX 8 ++#define UEC_IP_PRIORITY_MAX 64 ++#define UEC_TX_VTAG_TABLE_ENTRY_MAX 8 ++#define UEC_RX_BD_RING_SIZE_MIN 8 ++#define UEC_TX_BD_RING_SIZE_MIN 2 ++ ++/* Ethernet speed ++*/ ++typedef enum enet_speed { ++ ENET_SPEED_10BT, /* 10 Base T */ ++ ENET_SPEED_100BT, /* 100 Base T */ ++ ENET_SPEED_1000BT /* 1000 Base T */ ++} enet_speed_e; ++ ++/* Ethernet Address Type. ++*/ ++typedef enum enet_addr_type { ++ ENET_ADDR_TYPE_INDIVIDUAL, ++ ENET_ADDR_TYPE_GROUP, ++ ENET_ADDR_TYPE_BROADCAST ++} enet_addr_type_e; ++ ++/* TBI / MII Set Register ++*/ ++typedef enum enet_tbi_mii_reg { ++ ENET_TBI_MII_CR = 0x00, ++ ENET_TBI_MII_SR = 0x01, ++ ENET_TBI_MII_ANA = 0x04, ++ ENET_TBI_MII_ANLPBPA = 0x05, ++ ENET_TBI_MII_ANEX = 0x06, ++ ENET_TBI_MII_ANNPT = 0x07, ++ ENET_TBI_MII_ANLPANP = 0x08, ++ ENET_TBI_MII_EXST = 0x0F, ++ ENET_TBI_MII_JD = 0x10, ++ ENET_TBI_MII_TBICON = 0x11 ++} enet_tbi_mii_reg_e; ++ ++/* UEC number of threads ++*/ ++typedef enum uec_num_of_threads { ++ UEC_NUM_OF_THREADS_1 = 0x1, /* 1 */ ++ UEC_NUM_OF_THREADS_2 = 0x2, /* 2 */ ++ UEC_NUM_OF_THREADS_4 = 0x0, /* 4 */ ++ UEC_NUM_OF_THREADS_6 = 0x3, /* 6 */ ++ UEC_NUM_OF_THREADS_8 = 0x4 /* 8 */ ++} uec_num_of_threads_e; ++ ++/* UEC ethernet interface type ++*/ ++typedef enum enet_interface { ++ ENET_10_MII, ++ ENET_10_RMII, ++ ENET_10_RGMII, ++ ENET_100_MII, ++ ENET_100_RMII, ++ ENET_100_RGMII, ++ ENET_1000_GMII, ++ ENET_1000_RGMII, ++ ENET_1000_TBI, ++ ENET_1000_RTBI ++} enet_interface_e; ++ ++/* UEC initialization info struct ++*/ ++typedef struct uec_info { ++ ucc_fast_info_t uf_info; ++ uec_num_of_threads_e num_threads_tx; ++ uec_num_of_threads_e num_threads_rx; ++ qe_risc_allocation_e riscTx; ++ qe_risc_allocation_e riscRx; ++ u16 rx_bd_ring_len; ++ u16 tx_bd_ring_len; ++ u8 phy_address; ++ enet_interface_e enet_interface; ++} uec_info_t; ++ ++/* UEC driver initialized info ++*/ ++#define MAX_RXBUF_LEN 1536 ++#define MAX_FRAME_LEN 1518 ++#define MIN_FRAME_LEN 64 ++#define MAX_DMA1_LEN 1520 ++#define MAX_DMA2_LEN 1520 ++ ++/* UEC driver private struct ++*/ ++typedef struct uec_private { ++ uec_info_t *uec_info; ++ ucc_fast_private_t *uccf; ++ struct eth_device *dev; ++ uec_t *uec_regs; ++ /* enet init command parameter */ ++ uec_init_cmd_pram_t *p_init_enet_param; ++ u32 init_enet_param_offset; ++ /* Rx and Tx paramter */ ++ uec_rx_global_pram_t *p_rx_glbl_pram; ++ u32 rx_glbl_pram_offset; ++ uec_tx_global_pram_t *p_tx_glbl_pram; ++ u32 tx_glbl_pram_offset; ++ uec_send_queue_mem_region_t *p_send_q_mem_reg; ++ u32 send_q_mem_reg_offset; ++ uec_thread_data_tx_t *p_thread_data_tx; ++ u32 thread_dat_tx_offset; ++ uec_thread_data_rx_t *p_thread_data_rx; ++ u32 thread_dat_rx_offset; ++ uec_rx_bd_queues_entry_t *p_rx_bd_qs_tbl; ++ u32 rx_bd_qs_tbl_offset; ++ /* BDs specific */ ++ u8 *p_tx_bd_ring; ++ u32 tx_bd_ring_offset; ++ u8 *p_rx_bd_ring; ++ u32 rx_bd_ring_offset; ++ u8 *p_rx_buf; ++ u32 rx_buf_offset; ++ volatile qe_bd_t *txBd; ++ volatile qe_bd_t *rxBd; ++ /* Status */ ++ int mac_tx_enabled; ++ int mac_rx_enabled; ++ int grace_stopped_tx; ++ int grace_stopped_rx; ++ int the_first_run; ++ /* PHY specific */ ++ struct uec_mii_info *mii_info; ++ int oldspeed; ++ int oldduplex; ++ int oldlink; ++} uec_private_t; ++ ++#endif /* __UEC_H__ */ +diff -Naupr u-boot-1.1.6/drivers/qe/uec_phy.c u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.c +--- u-boot-1.1.6/drivers/qe/uec_phy.c 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.c 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,607 @@ ++/* ++ * Copyright (C) 2005 Freescale Semiconductor, Inc. ++ * ++ * Author: Shlomi Gridish ++ * ++ * Description: UCC GETH Driver -- PHY handling ++ * Driver for UEC on QE ++ * Based on 8260_io/fcc_enet.c ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ */ ++ ++#include "common.h" ++#include "net.h" ++#include "malloc.h" ++#include "asm/errno.h" ++#include "asm/immap_qe.h" ++#include "asm/io.h" ++#include "qe.h" ++#include "uccf.h" ++#include "uec.h" ++#include "uec_phy.h" ++#include "miiphy.h" ++ ++#if defined(CONFIG_QE) ++ ++#define UEC_VERBOSE_DEBUG ++#define ugphy_printk(format, arg...) \ ++ printf(format "\n", ## arg) ++ ++#define ugphy_dbg(format, arg...) \ ++ ugphy_printk(format , ## arg) ++#define ugphy_err(format, arg...) \ ++ ugphy_printk(format , ## arg) ++#define ugphy_info(format, arg...) \ ++ ugphy_printk(format , ## arg) ++#define ugphy_warn(format, arg...) \ ++ ugphy_printk(format , ## arg) ++ ++#ifdef UEC_VERBOSE_DEBUG ++#define ugphy_vdbg ugphy_dbg ++#else ++#define ugphy_vdbg(ugeth, fmt, args...) do { } while (0) ++#endif /* UEC_VERBOSE_DEBUG */ ++ ++static void config_genmii_advert (struct uec_mii_info *mii_info); ++static void genmii_setup_forced (struct uec_mii_info *mii_info); ++static void genmii_restart_aneg (struct uec_mii_info *mii_info); ++static int gbit_config_aneg (struct uec_mii_info *mii_info); ++static int genmii_config_aneg (struct uec_mii_info *mii_info); ++static int genmii_update_link (struct uec_mii_info *mii_info); ++static int genmii_read_status (struct uec_mii_info *mii_info); ++u16 phy_read (struct uec_mii_info *mii_info, u16 regnum); ++void phy_write (struct uec_mii_info *mii_info, u16 regnum, u16 val); ++ ++/* Write value to the PHY for this device to the register at regnum, */ ++/* waiting until the write is done before it returns. All PHY */ ++/* configuration has to be done through the TSEC1 MIIM regs */ ++void write_phy_reg (struct eth_device *dev, int mii_id, int regnum, int value) ++{ ++ uec_private_t *ugeth = (uec_private_t *) dev->priv; ++ uec_t *ug_regs; ++ enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum; ++ u32 tmp_reg; ++ ++ ug_regs = ugeth->uec_regs; ++ ++ /* Stop the MII management read cycle */ ++ out_be32 (&ug_regs->miimcom, 0); ++ /* Setting up the MII Mangement Address Register */ ++ tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg; ++ out_be32 (&ug_regs->miimadd, tmp_reg); ++ ++ /* Setting up the MII Mangement Control Register with the value */ ++ out_be32 (&ug_regs->miimcon, (u32) value); ++ ++ /* Wait till MII management write is complete */ ++ while ((in_be32 (&ug_regs->miimind)) & MIIMIND_BUSY); ++ ++ udelay (100000); ++} ++ ++/* Reads from register regnum in the PHY for device dev, */ ++/* returning the value. Clears miimcom first. All PHY */ ++/* configuration has to be done through the TSEC1 MIIM regs */ ++int read_phy_reg (struct eth_device *dev, int mii_id, int regnum) ++{ ++ uec_private_t *ugeth = (uec_private_t *) dev->priv; ++ uec_t *ug_regs; ++ enet_tbi_mii_reg_e mii_reg = (enet_tbi_mii_reg_e) regnum; ++ u32 tmp_reg; ++ u16 value; ++ ++ ug_regs = ugeth->uec_regs; ++ ++ /* Setting up the MII Mangement Address Register */ ++ tmp_reg = ((u32) mii_id << MIIMADD_PHY_ADDRESS_SHIFT) | mii_reg; ++ out_be32 (&ug_regs->miimadd, tmp_reg); ++ ++ /* Perform an MII management read cycle */ ++ out_be32 (&ug_regs->miimcom, 0); ++ out_be32 (&ug_regs->miimcom, MIIMCOM_READ_CYCLE); ++ ++ /* Wait till MII management write is complete */ ++ while ((in_be32 (&ug_regs->miimind)) & ++ (MIIMIND_NOT_VALID | MIIMIND_BUSY)); ++ ++ udelay (100000); ++ ++ /* Read MII management status */ ++ value = (u16) in_be32 (&ug_regs->miimstat); ++ if (value == 0xffff) ++ ugphy_warn ++ ("read wrong value : mii_id %d,mii_reg %d, base %08x", ++ mii_id, mii_reg, (u32) & (ug_regs->miimcfg)); ++ ++ return (value); ++} ++ ++void mii_clear_phy_interrupt (struct uec_mii_info *mii_info) ++{ ++ if (mii_info->phyinfo->ack_interrupt) ++ mii_info->phyinfo->ack_interrupt (mii_info); ++} ++ ++void mii_configure_phy_interrupt (struct uec_mii_info *mii_info, ++ u32 interrupts) ++{ ++ mii_info->interrupts = interrupts; ++ if (mii_info->phyinfo->config_intr) ++ mii_info->phyinfo->config_intr (mii_info); ++} ++ ++/* Writes MII_ADVERTISE with the appropriate values, after ++ * sanitizing advertise to make sure only supported features ++ * are advertised ++ */ ++static void config_genmii_advert (struct uec_mii_info *mii_info) ++{ ++ u32 advertise; ++ u16 adv; ++ ++ /* Only allow advertising what this PHY supports */ ++ mii_info->advertising &= mii_info->phyinfo->features; ++ advertise = mii_info->advertising; ++ ++ /* Setup standard advertisement */ ++ adv = phy_read (mii_info, PHY_ANAR); ++ adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4); ++ if (advertise & ADVERTISED_10baseT_Half) ++ adv |= ADVERTISE_10HALF; ++ if (advertise & ADVERTISED_10baseT_Full) ++ adv |= ADVERTISE_10FULL; ++ if (advertise & ADVERTISED_100baseT_Half) ++ adv |= ADVERTISE_100HALF; ++ if (advertise & ADVERTISED_100baseT_Full) ++ adv |= ADVERTISE_100FULL; ++ phy_write (mii_info, PHY_ANAR, adv); ++} ++ ++static void genmii_setup_forced (struct uec_mii_info *mii_info) ++{ ++ u16 ctrl; ++ u32 features = mii_info->phyinfo->features; ++ ++ ctrl = phy_read (mii_info, PHY_BMCR); ++ ++ ctrl &= ~(PHY_BMCR_DPLX | PHY_BMCR_100_MBPS | ++ PHY_BMCR_1000_MBPS | PHY_BMCR_AUTON); ++ ctrl |= PHY_BMCR_RESET; ++ ++ switch (mii_info->speed) { ++ case SPEED_1000: ++ if (features & (SUPPORTED_1000baseT_Half ++ | SUPPORTED_1000baseT_Full)) { ++ ctrl |= PHY_BMCR_1000_MBPS; ++ break; ++ } ++ mii_info->speed = SPEED_100; ++ case SPEED_100: ++ if (features & (SUPPORTED_100baseT_Half ++ | SUPPORTED_100baseT_Full)) { ++ ctrl |= PHY_BMCR_100_MBPS; ++ break; ++ } ++ mii_info->speed = SPEED_10; ++ case SPEED_10: ++ if (features & (SUPPORTED_10baseT_Half ++ | SUPPORTED_10baseT_Full)) ++ break; ++ default: /* Unsupported speed! */ ++ ugphy_err ("%s: Bad speed!", mii_info->dev->name); ++ break; ++ } ++ ++ phy_write (mii_info, PHY_BMCR, ctrl); ++} ++ ++/* Enable and Restart Autonegotiation */ ++static void genmii_restart_aneg (struct uec_mii_info *mii_info) ++{ ++ u16 ctl; ++ ++ ctl = phy_read (mii_info, PHY_BMCR); ++ ctl |= (PHY_BMCR_AUTON | PHY_BMCR_RST_NEG); ++ phy_write (mii_info, PHY_BMCR, ctl); ++} ++ ++static int gbit_config_aneg (struct uec_mii_info *mii_info) ++{ ++ u16 adv; ++ u32 advertise; ++ ++ if (mii_info->autoneg) { ++ /* Configure the ADVERTISE register */ ++ config_genmii_advert (mii_info); ++ advertise = mii_info->advertising; ++ ++ adv = phy_read (mii_info, MII_1000BASETCONTROL); ++ adv &= ~(MII_1000BASETCONTROL_FULLDUPLEXCAP | ++ MII_1000BASETCONTROL_HALFDUPLEXCAP); ++ if (advertise & SUPPORTED_1000baseT_Half) ++ adv |= MII_1000BASETCONTROL_HALFDUPLEXCAP; ++ if (advertise & SUPPORTED_1000baseT_Full) ++ adv |= MII_1000BASETCONTROL_FULLDUPLEXCAP; ++ phy_write (mii_info, MII_1000BASETCONTROL, adv); ++ ++ /* Start/Restart aneg */ ++ genmii_restart_aneg (mii_info); ++ } else ++ genmii_setup_forced (mii_info); ++ ++ return 0; ++} ++ ++static int marvell_config_aneg (struct uec_mii_info *mii_info) ++{ ++ /* The Marvell PHY has an errata which requires ++ * that certain registers get written in order ++ * to restart autonegotiation */ ++ phy_write (mii_info, PHY_BMCR, PHY_BMCR_RESET); ++ ++ phy_write (mii_info, 0x1d, 0x1f); ++ phy_write (mii_info, 0x1e, 0x200c); ++ phy_write (mii_info, 0x1d, 0x5); ++ phy_write (mii_info, 0x1e, 0); ++ phy_write (mii_info, 0x1e, 0x100); ++ ++ gbit_config_aneg (mii_info); ++ ++ return 0; ++} ++ ++static int genmii_config_aneg (struct uec_mii_info *mii_info) ++{ ++ if (mii_info->autoneg) { ++ config_genmii_advert (mii_info); ++ genmii_restart_aneg (mii_info); ++ } else ++ genmii_setup_forced (mii_info); ++ ++ return 0; ++} ++ ++static int genmii_update_link (struct uec_mii_info *mii_info) ++{ ++ u16 status; ++ ++ /* Do a fake read */ ++ phy_read (mii_info, PHY_BMSR); ++ ++ /* Read link and autonegotiation status */ ++ status = phy_read (mii_info, PHY_BMSR); ++ if ((status & PHY_BMSR_LS) == 0) ++ mii_info->link = 0; ++ else ++ mii_info->link = 1; ++ ++ /* If we are autonegotiating, and not done, ++ * return an error */ ++ if (mii_info->autoneg && !(status & PHY_BMSR_AUTN_COMP)) ++ return -EAGAIN; ++ ++ return 0; ++} ++ ++static int genmii_read_status (struct uec_mii_info *mii_info) ++{ ++ u16 status; ++ int err; ++ ++ /* Update the link, but return if there ++ * was an error */ ++ err = genmii_update_link (mii_info); ++ if (err) ++ return err; ++ ++ if (mii_info->autoneg) { ++ status = phy_read (mii_info, PHY_ANLPAR); ++ ++ if (status & (PHY_ANLPAR_10FD | PHY_ANLPAR_TXFD)) ++ mii_info->duplex = DUPLEX_FULL; ++ else ++ mii_info->duplex = DUPLEX_HALF; ++ if (status & (PHY_ANLPAR_TXFD | PHY_ANLPAR_TX)) ++ mii_info->speed = SPEED_100; ++ else ++ mii_info->speed = SPEED_10; ++ mii_info->pause = 0; ++ } ++ /* On non-aneg, we assume what we put in BMCR is the speed, ++ * though magic-aneg shouldn't prevent this case from occurring ++ */ ++ ++ return 0; ++} ++ ++static int marvell_read_status (struct uec_mii_info *mii_info) ++{ ++ u16 status; ++ int err; ++ ++ /* Update the link, but return if there ++ * was an error */ ++ err = genmii_update_link (mii_info); ++ if (err) ++ return err; ++ ++ /* If the link is up, read the speed and duplex */ ++ /* If we aren't autonegotiating, assume speeds ++ * are as set */ ++ if (mii_info->autoneg && mii_info->link) { ++ int speed; ++ ++ status = phy_read (mii_info, MII_M1011_PHY_SPEC_STATUS); ++ ++ /* Get the duplexity */ ++ if (status & MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX) ++ mii_info->duplex = DUPLEX_FULL; ++ else ++ mii_info->duplex = DUPLEX_HALF; ++ ++ /* Get the speed */ ++ speed = status & MII_M1011_PHY_SPEC_STATUS_SPD_MASK; ++ switch (speed) { ++ case MII_M1011_PHY_SPEC_STATUS_1000: ++ mii_info->speed = SPEED_1000; ++ break; ++ case MII_M1011_PHY_SPEC_STATUS_100: ++ mii_info->speed = SPEED_100; ++ break; ++ default: ++ mii_info->speed = SPEED_10; ++ break; ++ } ++ mii_info->pause = 0; ++ } ++ ++ return 0; ++} ++ ++static int marvell_ack_interrupt (struct uec_mii_info *mii_info) ++{ ++ /* Clear the interrupts by reading the reg */ ++ phy_read (mii_info, MII_M1011_IEVENT); ++ ++ return 0; ++} ++ ++static int marvell_config_intr (struct uec_mii_info *mii_info) ++{ ++ if (mii_info->interrupts == MII_INTERRUPT_ENABLED) ++ phy_write (mii_info, MII_M1011_IMASK, MII_M1011_IMASK_INIT); ++ else ++ phy_write (mii_info, MII_M1011_IMASK, MII_M1011_IMASK_CLEAR); ++ ++ return 0; ++} ++ ++static int dm9161_init (struct uec_mii_info *mii_info) ++{ ++ /* Reset the PHY */ ++ phy_write (mii_info, PHY_BMCR, phy_read (mii_info, PHY_BMCR) | ++ PHY_BMCR_RESET); ++ /* PHY and MAC connect */ ++ phy_write (mii_info, PHY_BMCR, phy_read (mii_info, PHY_BMCR) & ++ ~PHY_BMCR_ISO); ++#ifdef CONFIG_RMII_MODE ++ phy_write (mii_info, MII_DM9161_SCR, MII_DM9161_SCR_RMII_INIT); ++#else ++ phy_write (mii_info, MII_DM9161_SCR, MII_DM9161_SCR_INIT); ++#endif ++ config_genmii_advert (mii_info); ++ /* Start/restart aneg */ ++ genmii_config_aneg (mii_info); ++ /* Delay to wait the aneg compeleted */ ++ udelay (3000000); ++ ++ return 0; ++} ++ ++static int dm9161_config_aneg (struct uec_mii_info *mii_info) ++{ ++ return 0; ++} ++ ++static int dm9161_read_status (struct uec_mii_info *mii_info) ++{ ++ u16 status; ++ int err; ++ ++ /* Update the link, but return if there was an error */ ++ err = genmii_update_link (mii_info); ++ if (err) ++ return err; ++ /* If the link is up, read the speed and duplex ++ If we aren't autonegotiating assume speeds are as set */ ++ if (mii_info->autoneg && mii_info->link) { ++ status = phy_read (mii_info, MII_DM9161_SCSR); ++ if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_100H)) ++ mii_info->speed = SPEED_100; ++ else ++ mii_info->speed = SPEED_10; ++ ++ if (status & (MII_DM9161_SCSR_100F | MII_DM9161_SCSR_10F)) ++ mii_info->duplex = DUPLEX_FULL; ++ else ++ mii_info->duplex = DUPLEX_HALF; ++ } ++ ++ return 0; ++} ++ ++static int dm9161_ack_interrupt (struct uec_mii_info *mii_info) ++{ ++ /* Clear the interrupt by reading the reg */ ++ phy_read (mii_info, MII_DM9161_INTR); ++ ++ return 0; ++} ++ ++static int dm9161_config_intr (struct uec_mii_info *mii_info) ++{ ++ if (mii_info->interrupts == MII_INTERRUPT_ENABLED) ++ phy_write (mii_info, MII_DM9161_INTR, MII_DM9161_INTR_INIT); ++ else ++ phy_write (mii_info, MII_DM9161_INTR, MII_DM9161_INTR_STOP); ++ ++ return 0; ++} ++ ++static void dm9161_close (struct uec_mii_info *mii_info) ++{ ++} ++ ++static struct phy_info phy_info_dm9161 = { ++ .phy_id = 0x0181b880, ++ .phy_id_mask = 0x0ffffff0, ++ .name = "Davicom DM9161E", ++ .init = dm9161_init, ++ .config_aneg = dm9161_config_aneg, ++ .read_status = dm9161_read_status, ++ .close = dm9161_close, ++}; ++ ++static struct phy_info phy_info_dm9161a = { ++ .phy_id = 0x0181b8a0, ++ .phy_id_mask = 0x0ffffff0, ++ .name = "Davicom DM9161A", ++ .features = MII_BASIC_FEATURES, ++ .init = dm9161_init, ++ .config_aneg = dm9161_config_aneg, ++ .read_status = dm9161_read_status, ++ .ack_interrupt = dm9161_ack_interrupt, ++ .config_intr = dm9161_config_intr, ++ .close = dm9161_close, ++}; ++ ++static struct phy_info phy_info_marvell = { ++ .phy_id = 0x01410c00, ++ .phy_id_mask = 0xffffff00, ++ .name = "Marvell 88E11x1", ++ .features = MII_GBIT_FEATURES, ++ .config_aneg = &marvell_config_aneg, ++ .read_status = &marvell_read_status, ++ .ack_interrupt = &marvell_ack_interrupt, ++ .config_intr = &marvell_config_intr, ++}; ++ ++static struct phy_info phy_info_genmii = { ++ .phy_id = 0x00000000, ++ .phy_id_mask = 0x00000000, ++ .name = "Generic MII", ++ .features = MII_BASIC_FEATURES, ++ .config_aneg = genmii_config_aneg, ++ .read_status = genmii_read_status, ++}; ++ ++static struct phy_info *phy_info[] = { ++ &phy_info_dm9161, ++ &phy_info_dm9161a, ++ &phy_info_marvell, ++ &phy_info_genmii, ++ NULL ++}; ++ ++u16 phy_read (struct uec_mii_info *mii_info, u16 regnum) ++{ ++ return mii_info->mdio_read (mii_info->dev, mii_info->mii_id, regnum); ++} ++ ++void phy_write (struct uec_mii_info *mii_info, u16 regnum, u16 val) ++{ ++ mii_info->mdio_write (mii_info->dev, mii_info->mii_id, regnum, val); ++} ++ ++/* Use the PHY ID registers to determine what type of PHY is attached ++ * to device dev. return a struct phy_info structure describing that PHY ++ */ ++struct phy_info *get_phy_info (struct uec_mii_info *mii_info) ++{ ++ u16 phy_reg; ++ u32 phy_ID; ++ int i; ++ struct phy_info *theInfo = NULL; ++ ++ /* Grab the bits from PHYIR1, and put them in the upper half */ ++ phy_reg = phy_read (mii_info, PHY_PHYIDR1); ++ phy_ID = (phy_reg & 0xffff) << 16; ++ ++ /* Grab the bits from PHYIR2, and put them in the lower half */ ++ phy_reg = phy_read (mii_info, PHY_PHYIDR2); ++ phy_ID |= (phy_reg & 0xffff); ++ ++ /* loop through all the known PHY types, and find one that */ ++ /* matches the ID we read from the PHY. */ ++ for (i = 0; phy_info[i]; i++) ++ if (phy_info[i]->phy_id == ++ (phy_ID & phy_info[i]->phy_id_mask)) { ++ theInfo = phy_info[i]; ++ break; ++ } ++ ++ /* This shouldn't happen, as we have generic PHY support */ ++ if (theInfo == NULL) { ++ ugphy_info ("UEC: PHY id %x is not supported!", phy_ID); ++ return NULL; ++ } else { ++ ugphy_info ("UEC: PHY is %s (%x)", theInfo->name, phy_ID); ++ } ++ ++ return theInfo; ++} ++ ++void marvell_phy_interface_mode (struct eth_device *dev, ++ enet_interface_e mode) ++{ ++ uec_private_t *uec = (uec_private_t *) dev->priv; ++ struct uec_mii_info *mii_info; ++ ++ if (!uec->mii_info) { ++ printf ("%s: the PHY not intialized\n", __FUNCTION__); ++ return; ++ } ++ mii_info = uec->mii_info; ++ ++ if (mode == ENET_100_RGMII) { ++ phy_write (mii_info, 0x00, 0x9140); ++ phy_write (mii_info, 0x1d, 0x001f); ++ phy_write (mii_info, 0x1e, 0x200c); ++ phy_write (mii_info, 0x1d, 0x0005); ++ phy_write (mii_info, 0x1e, 0x0000); ++ phy_write (mii_info, 0x1e, 0x0100); ++ phy_write (mii_info, 0x09, 0x0e00); ++ phy_write (mii_info, 0x04, 0x01e1); ++ phy_write (mii_info, 0x00, 0x9140); ++ phy_write (mii_info, 0x00, 0x1000); ++ udelay (100000); ++ phy_write (mii_info, 0x00, 0x2900); ++ phy_write (mii_info, 0x14, 0x0cd2); ++ phy_write (mii_info, 0x00, 0xa100); ++ phy_write (mii_info, 0x09, 0x0000); ++ phy_write (mii_info, 0x1b, 0x800b); ++ phy_write (mii_info, 0x04, 0x05e1); ++ phy_write (mii_info, 0x00, 0xa100); ++ phy_write (mii_info, 0x00, 0x2100); ++ udelay (1000000); ++ } else if (mode == ENET_10_RGMII) { ++ phy_write (mii_info, 0x14, 0x8e40); ++ phy_write (mii_info, 0x1b, 0x800b); ++ phy_write (mii_info, 0x14, 0x0c82); ++ phy_write (mii_info, 0x00, 0x8100); ++ udelay (1000000); ++ } ++} ++ ++void change_phy_interface_mode (struct eth_device *dev, enet_interface_e mode) ++{ ++#ifdef CONFIG_PHY_MODE_NEED_CHANGE ++ marvell_phy_interface_mode (dev, mode); ++#endif ++} ++#endif /* CONFIG_QE */ +diff -Naupr u-boot-1.1.6/drivers/qe/uec_phy.h u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.h +--- u-boot-1.1.6/drivers/qe/uec_phy.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/qe/uec_phy.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,259 @@ ++/* ++ * Copyright (C) 2005 Freescale Semiconductor, Inc. ++ * ++ * Author: Shlomi Gridish <gridish@freescale.com> ++ * ++ * Description: UCC ethernet driver -- PHY handling ++ * Driver for UEC on QE ++ * Based on 8260_io/fcc_enet.c ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ */ ++#ifndef __UEC_PHY_H__ ++#define __UEC_PHY_H__ ++ ++#define MII_end ((u32)-2) ++#define MII_read ((u32)-1) ++ ++#define MIIMIND_BUSY 0x00000001 ++#define MIIMIND_NOTVALID 0x00000004 ++ ++#define UGETH_AN_TIMEOUT 2000 ++ ++/* 1000BT control (Marvell & BCM54xx at least) */ ++#define MII_1000BASETCONTROL 0x09 ++#define MII_1000BASETCONTROL_FULLDUPLEXCAP 0x0200 ++#define MII_1000BASETCONTROL_HALFDUPLEXCAP 0x0100 ++ ++/* Cicada Extended Control Register 1 */ ++#define MII_CIS8201_EXT_CON1 0x17 ++#define MII_CIS8201_EXTCON1_INIT 0x0000 ++ ++/* Cicada Interrupt Mask Register */ ++#define MII_CIS8201_IMASK 0x19 ++#define MII_CIS8201_IMASK_IEN 0x8000 ++#define MII_CIS8201_IMASK_SPEED 0x4000 ++#define MII_CIS8201_IMASK_LINK 0x2000 ++#define MII_CIS8201_IMASK_DUPLEX 0x1000 ++#define MII_CIS8201_IMASK_MASK 0xf000 ++ ++/* Cicada Interrupt Status Register */ ++#define MII_CIS8201_ISTAT 0x1a ++#define MII_CIS8201_ISTAT_STATUS 0x8000 ++#define MII_CIS8201_ISTAT_SPEED 0x4000 ++#define MII_CIS8201_ISTAT_LINK 0x2000 ++#define MII_CIS8201_ISTAT_DUPLEX 0x1000 ++ ++/* Cicada Auxiliary Control/Status Register */ ++#define MII_CIS8201_AUX_CONSTAT 0x1c ++#define MII_CIS8201_AUXCONSTAT_INIT 0x0004 ++#define MII_CIS8201_AUXCONSTAT_DUPLEX 0x0020 ++#define MII_CIS8201_AUXCONSTAT_SPEED 0x0018 ++#define MII_CIS8201_AUXCONSTAT_GBIT 0x0010 ++#define MII_CIS8201_AUXCONSTAT_100 0x0008 ++ ++/* 88E1011 PHY Status Register */ ++#define MII_M1011_PHY_SPEC_STATUS 0x11 ++#define MII_M1011_PHY_SPEC_STATUS_1000 0x8000 ++#define MII_M1011_PHY_SPEC_STATUS_100 0x4000 ++#define MII_M1011_PHY_SPEC_STATUS_SPD_MASK 0xc000 ++#define MII_M1011_PHY_SPEC_STATUS_FULLDUPLEX 0x2000 ++#define MII_M1011_PHY_SPEC_STATUS_RESOLVED 0x0800 ++#define MII_M1011_PHY_SPEC_STATUS_LINK 0x0400 ++ ++#define MII_M1011_IEVENT 0x13 ++#define MII_M1011_IEVENT_CLEAR 0x0000 ++ ++#define MII_M1011_IMASK 0x12 ++#define MII_M1011_IMASK_INIT 0x6400 ++#define MII_M1011_IMASK_CLEAR 0x0000 ++ ++#define MII_DM9161_SCR 0x10 ++#define MII_DM9161_SCR_INIT 0x0610 ++#define MII_DM9161_SCR_RMII_INIT 0x0710 ++ ++/* DM9161 Specified Configuration and Status Register */ ++#define MII_DM9161_SCSR 0x11 ++#define MII_DM9161_SCSR_100F 0x8000 ++#define MII_DM9161_SCSR_100H 0x4000 ++#define MII_DM9161_SCSR_10F 0x2000 ++#define MII_DM9161_SCSR_10H 0x1000 ++ ++/* DM9161 Interrupt Register */ ++#define MII_DM9161_INTR 0x15 ++#define MII_DM9161_INTR_PEND 0x8000 ++#define MII_DM9161_INTR_DPLX_MASK 0x0800 ++#define MII_DM9161_INTR_SPD_MASK 0x0400 ++#define MII_DM9161_INTR_LINK_MASK 0x0200 ++#define MII_DM9161_INTR_MASK 0x0100 ++#define MII_DM9161_INTR_DPLX_CHANGE 0x0010 ++#define MII_DM9161_INTR_SPD_CHANGE 0x0008 ++#define MII_DM9161_INTR_LINK_CHANGE 0x0004 ++#define MII_DM9161_INTR_INIT 0x0000 ++#define MII_DM9161_INTR_STOP \ ++(MII_DM9161_INTR_DPLX_MASK | MII_DM9161_INTR_SPD_MASK \ ++ | MII_DM9161_INTR_LINK_MASK | MII_DM9161_INTR_MASK) ++ ++/* DM9161 10BT Configuration/Status */ ++#define MII_DM9161_10BTCSR 0x12 ++#define MII_DM9161_10BTCSR_INIT 0x7800 ++ ++#define MII_BASIC_FEATURES (SUPPORTED_10baseT_Half | \ ++ SUPPORTED_10baseT_Full | \ ++ SUPPORTED_100baseT_Half | \ ++ SUPPORTED_100baseT_Full | \ ++ SUPPORTED_Autoneg | \ ++ SUPPORTED_TP | \ ++ SUPPORTED_MII) ++ ++#define MII_GBIT_FEATURES (MII_BASIC_FEATURES | \ ++ SUPPORTED_1000baseT_Half | \ ++ SUPPORTED_1000baseT_Full) ++ ++#define MII_READ_COMMAND 0x00000001 ++ ++#define MII_INTERRUPT_DISABLED 0x0 ++#define MII_INTERRUPT_ENABLED 0x1 ++ ++#define SPEED_10 10 ++#define SPEED_100 100 ++#define SPEED_1000 1000 ++ ++/* Duplex, half or full. */ ++#define DUPLEX_HALF 0x00 ++#define DUPLEX_FULL 0x01 ++ ++/* Indicates what features are supported by the interface. */ ++#define SUPPORTED_10baseT_Half (1 << 0) ++#define SUPPORTED_10baseT_Full (1 << 1) ++#define SUPPORTED_100baseT_Half (1 << 2) ++#define SUPPORTED_100baseT_Full (1 << 3) ++#define SUPPORTED_1000baseT_Half (1 << 4) ++#define SUPPORTED_1000baseT_Full (1 << 5) ++#define SUPPORTED_Autoneg (1 << 6) ++#define SUPPORTED_TP (1 << 7) ++#define SUPPORTED_AUI (1 << 8) ++#define SUPPORTED_MII (1 << 9) ++#define SUPPORTED_FIBRE (1 << 10) ++#define SUPPORTED_BNC (1 << 11) ++#define SUPPORTED_10000baseT_Full (1 << 12) ++ ++#define ADVERTISED_10baseT_Half (1 << 0) ++#define ADVERTISED_10baseT_Full (1 << 1) ++#define ADVERTISED_100baseT_Half (1 << 2) ++#define ADVERTISED_100baseT_Full (1 << 3) ++#define ADVERTISED_1000baseT_Half (1 << 4) ++#define ADVERTISED_1000baseT_Full (1 << 5) ++#define ADVERTISED_Autoneg (1 << 6) ++#define ADVERTISED_TP (1 << 7) ++#define ADVERTISED_AUI (1 << 8) ++#define ADVERTISED_MII (1 << 9) ++#define ADVERTISED_FIBRE (1 << 10) ++#define ADVERTISED_BNC (1 << 11) ++#define ADVERTISED_10000baseT_Full (1 << 12) ++ ++/* Advertisement control register. */ ++#define ADVERTISE_SLCT 0x001f /* Selector bits */ ++#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ ++#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ ++#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ ++#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ ++#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ ++#define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */ ++#define ADVERTISE_RESV 0x1c00 /* Unused... */ ++#define ADVERTISE_RFAULT 0x2000 /* Say we can detect faults */ ++#define ADVERTISE_LPACK 0x4000 /* Ack link partners response */ ++#define ADVERTISE_NPAGE 0x8000 /* Next page bit */ ++ ++#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | \ ++ ADVERTISE_CSMA) ++#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ ++ ADVERTISE_100HALF | ADVERTISE_100FULL) ++ ++/* Taken from mii_if_info and sungem_phy.h */ ++struct uec_mii_info { ++ /* Information about the PHY type */ ++ /* And management functions */ ++ struct phy_info *phyinfo; ++ ++ struct eth_device *dev; ++ ++ /* forced speed & duplex (no autoneg) ++ * partner speed & duplex & pause (autoneg) ++ */ ++ int speed; ++ int duplex; ++ int pause; ++ ++ /* The most recently read link state */ ++ int link; ++ ++ /* Enabled Interrupts */ ++ u32 interrupts; ++ ++ u32 advertising; ++ int autoneg; ++ int mii_id; ++ ++ /* private data pointer */ ++ /* For use by PHYs to maintain extra state */ ++ void *priv; ++ ++ /* Provided by ethernet driver */ ++ int (*mdio_read) (struct eth_device * dev, int mii_id, int reg); ++ void (*mdio_write) (struct eth_device * dev, int mii_id, int reg, ++ int val); ++}; ++ ++/* struct phy_info: a structure which defines attributes for a PHY ++ * ++ * id will contain a number which represents the PHY. During ++ * startup, the driver will poll the PHY to find out what its ++ * UID--as defined by registers 2 and 3--is. The 32-bit result ++ * gotten from the PHY will be ANDed with phy_id_mask to ++ * discard any bits which may change based on revision numbers ++ * unimportant to functionality ++ * ++ * There are 6 commands which take a ugeth_mii_info structure. ++ * Each PHY must declare config_aneg, and read_status. ++ */ ++struct phy_info { ++ u32 phy_id; ++ char *name; ++ unsigned int phy_id_mask; ++ u32 features; ++ ++ /* Called to initialize the PHY */ ++ int (*init) (struct uec_mii_info * mii_info); ++ ++ /* Called to suspend the PHY for power */ ++ int (*suspend) (struct uec_mii_info * mii_info); ++ ++ /* Reconfigures autonegotiation (or disables it) */ ++ int (*config_aneg) (struct uec_mii_info * mii_info); ++ ++ /* Determines the negotiated speed and duplex */ ++ int (*read_status) (struct uec_mii_info * mii_info); ++ ++ /* Clears any pending interrupts */ ++ int (*ack_interrupt) (struct uec_mii_info * mii_info); ++ ++ /* Enables or disables interrupts */ ++ int (*config_intr) (struct uec_mii_info * mii_info); ++ ++ /* Clears up any memory if needed */ ++ void (*close) (struct uec_mii_info * mii_info); ++}; ++ ++struct phy_info *get_phy_info (struct uec_mii_info *mii_info); ++void write_phy_reg (struct eth_device *dev, int mii_id, int regnum, ++ int value); ++int read_phy_reg (struct eth_device *dev, int mii_id, int regnum); ++void mii_clear_phy_interrupt (struct uec_mii_info *mii_info); ++void mii_configure_phy_interrupt (struct uec_mii_info *mii_info, ++ u32 interrupts); ++#endif /* __UEC_PHY_H__ */ +diff -Naupr u-boot-1.1.6/drivers/tsec.c u-boot-1.1.6-fsl-1/drivers/tsec.c +--- u-boot-1.1.6/drivers/tsec.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/tsec.c 2006-11-10 11:24:29.000000000 -0600 +@@ -610,11 +610,10 @@ static void adjust_link(struct eth_devic + regs->maccfg2 = ((regs->maccfg2 & ~(MACCFG2_IF)) + | MACCFG2_MII); + +- /* If We're in reduced mode, we need +- * to say whether we're 10 or 100 MB. ++ /* Set R100 bit in all modes although ++ * it is only used in RGMII mode + */ +- if ((priv->speed == 100) +- && (priv->flags & TSEC_REDUCED)) ++ if (priv->speed == 100) + regs->ecntrl |= ECNTRL_R100; + else + regs->ecntrl &= ~(ECNTRL_R100); +@@ -816,6 +815,7 @@ struct phy_info phy_info_M88E1111S = { + {0x1d, 0x5, NULL}, + {0x1e, 0x0, NULL}, + {0x1e, 0x100, NULL}, ++ {0x14, 0x0cd2, NULL}, /* Delay RGMII TX and RX */ + {MIIM_GBIT_CONTROL, MIIM_GBIT_CONTROL_INIT, NULL}, + {MIIM_ANAR, MIIM_ANAR_INIT, NULL}, + {MIIM_CONTROL, MIIM_CONTROL_RESET, NULL}, +@@ -1110,10 +1110,8 @@ struct phy_info phy_info_dp83865 = { + }; + + struct phy_info *phy_info[] = { +-#if 0 +- &phy_info_cis8201, +-#endif + &phy_info_cis8204, ++ &phy_info_cis8201, + &phy_info_M88E1011S, + &phy_info_M88E1111S, + &phy_info_M88E1145, +diff -Naupr u-boot-1.1.6/drivers/tsec.h u-boot-1.1.6-fsl-1/drivers/tsec.h +--- u-boot-1.1.6/drivers/tsec.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/drivers/tsec.h 2006-11-10 11:24:29.000000000 -0600 +@@ -30,7 +30,7 @@ + #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) + #define TSEC_BASE_ADDR (CFG_IMMR + CFG_TSEC1_OFFSET) + #elif defined(CONFIG_MPC83XX) +- #define TSEC_BASE_ADDR (CFG_IMMRBAR + CFG_TSEC1_OFFSET) ++ #define TSEC_BASE_ADDR (CFG_IMMR + CFG_TSEC1_OFFSET) + #endif + + +diff -Naupr u-boot-1.1.6/include/74xx_7xx.h u-boot-1.1.6-fsl-1/include/74xx_7xx.h +--- u-boot-1.1.6/include/74xx_7xx.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/74xx_7xx.h 2006-12-06 10:33:49.000000000 -0600 +@@ -111,6 +111,7 @@ typedef enum __cpu_t { + CPU_750CX, CPU_750FX, CPU_750GX, + CPU_7400, + CPU_7410, ++ CPU_7448, + CPU_7450, CPU_7455, CPU_7457, + CPU_UNKNOWN} cpu_t; + +diff -Naupr u-boot-1.1.6/include/ACEX1K.h u-boot-1.1.6-fsl-1/include/ACEX1K.h +--- u-boot-1.1.6/include/ACEX1K.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/ACEX1K.h 2006-11-30 12:34:13.000000000 -0600 +@@ -35,6 +35,11 @@ extern int ACEX1K_dump( Altera_desc *des + extern int ACEX1K_info( Altera_desc *desc ); + extern int ACEX1K_reloc( Altera_desc *desc, ulong reloc_off ); + ++extern int CYC2_load( Altera_desc *desc, void *image, size_t size ); ++extern int CYC2_dump( Altera_desc *desc, void *buf, size_t bsize ); ++extern int CYC2_info( Altera_desc *desc ); ++extern int CYC2_reloc( Altera_desc *desc, ulong reloc_off ); ++ + /* Slave Serial Implementation function table */ + typedef struct { + Altera_pre_fn pre; +@@ -48,6 +53,18 @@ typedef struct { + int relocated; + } Altera_ACEX1K_Passive_Serial_fns; + ++/* Slave Serial Implementation function table */ ++typedef struct { ++ Altera_pre_fn pre; ++ Altera_config_fn config; ++ Altera_status_fn status; ++ Altera_done_fn done; ++ Altera_write_fn write; ++ Altera_abort_fn abort; ++ Altera_post_fn post; ++ int relocated; ++} Altera_CYC2_Passive_Serial_fns; ++ + /* Device Image Sizes + *********************************************************************/ + /* ACEX1K */ +@@ -60,6 +77,8 @@ typedef struct { + #endif + #define Altera_EP1K100_SIZE (166965*8) + ++#define Altera_EP2C35_SIZE 883905 ++ + /* Descriptor Macros + *********************************************************************/ + /* ACEX1K devices */ +diff -Naupr u-boot-1.1.6/include/altera.h u-boot-1.1.6-fsl-1/include/altera.h +--- u-boot-1.1.6/include/altera.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/altera.h 2006-11-30 12:34:13.000000000 -0600 +@@ -34,8 +34,10 @@ + /* Altera Model definitions + *********************************************************************/ + #define CFG_ACEX1K CFG_FPGA_DEV( 0x1 ) ++#define CFG_CYCLON2 CFG_FPGA_DEV( 0x2 ) + + #define CFG_ALTERA_ACEX1K (CFG_FPGA_ALTERA | CFG_ACEX1K) ++#define CFG_ALTERA_CYCLON2 (CFG_FPGA_ALTERA | CFG_CYCLON2) + /* Add new models here */ + + /* Altera Interface definitions +@@ -56,6 +58,7 @@ typedef enum { /* typedef Altera_ifac + typedef enum { /* typedef Altera_Family */ + min_altera_type, /* insert all new types after this */ + Altera_ACEX1K, /* ACEX1K Family */ ++ Altera_CYC2, /* CYCLONII Family */ + /* Add new models here */ + max_altera_type /* insert all new types before this */ + } Altera_Family; /* end, typedef Altera_Family */ +@@ -84,6 +87,7 @@ typedef int (*Altera_status_fn)( int coo + typedef int (*Altera_done_fn)( int cookie ); + typedef int (*Altera_clk_fn)( int assert_clk, int flush, int cookie ); + typedef int (*Altera_data_fn)( int assert_data, int flush, int cookie ); ++typedef int (*Altera_write_fn)(void *buf, size_t len, int flush, int cookie); + typedef int (*Altera_abort_fn)( int cookie ); + typedef int (*Altera_post_fn)( int cookie ); + +diff -Naupr u-boot-1.1.6/include/asm-ppc/e300.h u-boot-1.1.6-fsl-1/include/asm-ppc/e300.h +--- u-boot-1.1.6/include/asm-ppc/e300.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/asm-ppc/e300.h 2006-11-10 11:24:29.000000000 -0600 +@@ -12,6 +12,8 @@ + #define PVR_83xx 0x80830000 + #define PVR_8349_REV10 (PVR_83xx | 0x0010) + #define PVR_8349_REV11 (PVR_83xx | 0x0011) ++#define PVR_8360_REV10 (PVR_83xx | 0x0020) ++#define PVR_8360_REV11 (PVR_83xx | 0x0020) + + /* + * Hardware Implementation-Dependent Register 0 (HID0) +diff -Naupr u-boot-1.1.6/include/asm-ppc/fsl_i2c.h u-boot-1.1.6-fsl-1/include/asm-ppc/fsl_i2c.h +--- u-boot-1.1.6/include/asm-ppc/fsl_i2c.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/asm-ppc/fsl_i2c.h 2006-11-30 12:34:13.000000000 -0600 +@@ -83,8 +83,4 @@ typedef struct fsl_i2c { + u8 res6[0xE8]; + } fsl_i2c_t; + +- +-#define I2C_READ 1 +-#define I2C_WRITE 0 +- + #endif /* _ASM_I2C_H_ */ +diff -Naupr u-boot-1.1.6/include/asm-ppc/global_data.h u-boot-1.1.6-fsl-1/include/asm-ppc/global_data.h +--- u-boot-1.1.6/include/asm-ppc/global_data.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/asm-ppc/global_data.h 2006-11-10 11:24:29.000000000 -0600 +@@ -52,17 +52,29 @@ typedef struct global_data { + #if defined(CONFIG_MPC83XX) + /* There are other clocks in the MPC83XX */ + u32 csb_clk; ++#if defined (CONFIG_MPC8349) + u32 tsec1_clk; + u32 tsec2_clk; +- u32 core_clk; + u32 usbmph_clk; + u32 usbdr_clk; +- u32 i2c_clk; ++#endif /* CONFIG_MPC8349 */ ++ u32 core_clk; ++ u32 i2c1_clk; ++ u32 i2c2_clk; + u32 enc_clk; + u32 lbiu_clk; + u32 lclk_clk; + u32 ddr_clk; + u32 pci_clk; ++#if defined(CONFIG_QE) ++ u32 qe_clk; ++ u32 brg_clk; ++ uint mp_alloc_base; ++ uint mp_alloc_top; ++#endif /* CONFIG_QE */ ++#if defined (CONFIG_MPC8360) ++ u32 ddr_sec_clk; ++#endif /* CONFIG_MPC8360 */ + #endif + #if defined(CONFIG_MPC5xxx) + unsigned long ipb_clk; +diff -Naupr u-boot-1.1.6/include/asm-ppc/i2c.h u-boot-1.1.6-fsl-1/include/asm-ppc/i2c.h +--- u-boot-1.1.6/include/asm-ppc/i2c.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/asm-ppc/i2c.h 1969-12-31 18:00:00.000000000 -0600 +@@ -1,103 +0,0 @@ +-/* +- * Freescale I2C Controller +- * +- * This software may be used and distributed according to the +- * terms of the GNU Public License, Version 2, incorporated +- * herein by reference. +- * +- * Copyright 2004 Freescale Semiconductor. +- * (C) Copyright 2003, Motorola, Inc. +- * author: Eran Liberty (liberty@freescale.com) +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License as +- * published by the Free Software Foundation; either version 2 of +- * the License, or (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, +- * MA 02111-1307 USA +- */ +- +-#ifndef _ASM_I2C_H_ +-#define _ASM_I2C_H_ +- +-#include <asm/types.h> +- +-typedef struct i2c +-{ +- u8 adr; /**< I2C slave address */ +-#define I2C_ADR 0xFE +-#define I2C_ADR_SHIFT 1 +-#define I2C_ADR_RES ~(I2C_ADR) +- u8 res0[3]; +- u8 fdr; /**< I2C frequency divider register */ +-#define IC2_FDR 0x3F +-#define IC2_FDR_SHIFT 0 +-#define IC2_FDR_RES ~(IC2_FDR) +- u8 res1[3]; +- u8 cr; /**< I2C control redister */ +-#define I2C_CR_MEN 0x80 +-#define I2C_CR_MIEN 0x40 +-#define I2C_CR_MSTA 0x20 +-#define I2C_CR_MTX 0x10 +-#define I2C_CR_TXAK 0x08 +-#define I2C_CR_RSTA 0x04 +-#define I2C_CR_BCST 0x01 +- u8 res2[3]; +- u8 sr; /**< I2C status register */ +-#define I2C_SR_MCF 0x80 +-#define I2C_SR_MAAS 0x40 +-#define I2C_SR_MBB 0x20 +-#define I2C_SR_MAL 0x10 +-#define I2C_SR_BCSTM 0x08 +-#define I2C_SR_SRW 0x04 +-#define I2C_SR_MIF 0x02 +-#define I2C_SR_RXAK 0x01 +- u8 res3[3]; +- u8 dr; /**< I2C data register */ +-#define I2C_DR 0xFF +-#define I2C_DR_SHIFT 0 +-#define I2C_DR_RES ~(I2C_DR) +- u8 res4[3]; +- u8 dfsrr; /**< I2C digital filter sampling rate register */ +-#define I2C_DFSRR 0x3F +-#define I2C_DFSRR_SHIFT 0 +-#define I2C_DFSRR_RES ~(I2C_DR) +- u8 res5[3]; +- u8 res6[0xE8]; +-} i2c_t; +- +-#ifndef CFG_HZ +-#error CFG_HZ is not defined in /include/configs/${BOARD}.h +-#endif +-#define I2C_TIMEOUT (CFG_HZ/4) +- +-#ifndef CFG_IMMRBAR +-#error CFG_IMMRBAR is not defined in /include/configs/${BOARD}.h +-#endif +- +-#ifndef CFG_I2C_OFFSET +-#error CFG_I2C_OFFSET is not defined in /include/configs/${BOARD}.h +-#endif +- +-#if defined(CONFIG_MPC8349EMDS) || defined(CONFIG_TQM834X) +-/* +- * MPC8349 have two i2c bus +- */ +-extern i2c_t * mpc8349_i2c; +-#define I2C mpc8349_i2c +-#else +-#define I2C ((i2c_t*)(CFG_IMMRBAR + CFG_I2C_OFFSET)) +-#endif +- +-#define I2C_READ 1 +-#define I2C_WRITE 0 +- +-#endif /* _ASM_I2C_H_ */ +diff -Naupr u-boot-1.1.6/include/asm-ppc/immap_83xx.h u-boot-1.1.6-fsl-1/include/asm-ppc/immap_83xx.h +--- u-boot-1.1.6/include/asm-ppc/immap_83xx.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/asm-ppc/immap_83xx.h 2006-12-06 10:33:49.000000000 -0600 +@@ -1,75 +1,116 @@ + /* +- * MPC8349 Internal Memory Map +- * Copyright (c) 2004 Freescale Semiconductor. +- * Eran Liberty (liberty@freescale.com) ++ * (C) Copyright 2004-2006 Freescale Semiconductor, Inc. ++ * ++ * MPC83xx Internal Memory Map ++ * ++ * History : ++ * 20060601: Daveliu (daveliu@freescale.com) ++ * TanyaJiang (tanya.jiang@freescale.com) ++ * Unified variable names for mpc83xx ++ * 2005 : Mandy Lavi (mandy.lavi@freescale.com) ++ * support for mpc8360e ++ * 2004 : Eran Liberty (liberty@freescale.com) ++ * Initialized for mpc8349 ++ * based on: ++ * MPC8260 Internal Memory Map ++ * Copyright (c) 1999 Dan Malek (dmalek@jlc.net) ++ * MPC85xx Internal Memory Map ++ * Copyright(c) 2002,2003 Motorola Inc. ++ * Xianghua Xiao (x.xiao@motorola.com) ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA + * +- * based on: +- * - MPC8260 Internal Memory Map +- * Copyright (c) 1999 Dan Malek (dmalek@jlc.net) +- * - MPC85xx Internal Memory Map +- * Copyright(c) 2002,2003 Motorola Inc. +- * Xianghua Xiao (x.xiao@motorola.com) + */ +-#ifndef __IMMAP_8349__ +-#define __IMMAP_8349__ ++#ifndef __IMMAP_83xx__ ++#define __IMMAP_83xx__ + ++#include <config.h> + #include <asm/types.h> +-#include <asm/i2c.h> ++#include <asm/fsl_i2c.h> + + /* + * Local Access Window. + */ +-typedef struct law8349 { +- u32 bar; /* LBIU local access window base address register */ ++typedef struct law83xx { ++ u32 bar; /* LBIU local access window base address register */ + /* Identifies the 20 most-significant address bits of the base of local + * access window n. The specified base address should be aligned to the + * window size, as defined by LBLAWARn[SIZE]. + */ +-#define LAWBAR_BAR 0xFFFFF000 ++#define LAWBAR_BAR 0xFFFFF000 + #define LAWBAR_RES ~(LAWBAR_BAR) +- u32 ar; /* LBIU local access window attribute register */ +-} law8349_t; ++ u32 ar; /* LBIU local access window attribute register */ ++} law83xx_t; + + /* + * System configuration registers. + */ +-typedef struct sysconf8349 { +- u32 immrbar; /* Internal memory map base address register */ ++typedef struct sysconf83xx { ++ u32 immrbar; /* Internal memory map base address register */ + u8 res0[0x04]; +- u32 altcbar; /* Alternate configuration base address register */ ++ u32 altcbar; /* Alternate configuration base address register */ + /* Identifies the12 most significant address bits of an alternate base + * address used for boot sequencer configuration accesses. + */ + #define ALTCBAR_BASE_ADDR 0xFFF00000 +-#define ALTCBAR_RES ~(ALTCBAR_BASE_ADDR) /* Reserved. Write has no effect, read returns 0. */ ++#define ALTCBAR_RES ~(ALTCBAR_BASE_ADDR) /* Reserved. Write has no effect, read returns 0. */ + u8 res1[0x14]; +- law8349_t lblaw[4]; /* LBIU local access window */ ++ law83xx_t lblaw[4]; /* LBIU local access window */ + u8 res2[0x20]; +- law8349_t pcilaw[2]; /* PCI local access window */ ++ law83xx_t pcilaw[2]; /* PCI local access window */ + u8 res3[0x30]; +- law8349_t ddrlaw[2]; /* DDR local access window */ ++ law83xx_t ddrlaw[2]; /* DDR local access window */ + u8 res4[0x50]; +- u32 sgprl; /* System General Purpose Register Low */ +- u32 sgprh; /* System General Purpose Register High */ +- u32 spridr; /* System Part and Revision ID Register */ +-#define SPRIDR_PARTID 0xFFFF0000 /* Part Identification. */ +-#define SPRIDR_REVID 0x0000FFFF /* Revision Identification. */ ++ u32 sgprl; /* System General Purpose Register Low */ ++ u32 sgprh; /* System General Purpose Register High */ ++ u32 spridr; /* System Part and Revision ID Register */ ++#define SPRIDR_PARTID 0xFFFF0000 /* Part Identification. */ ++#define SPRIDR_REVID 0x0000FFFF /* Revision Identification. */ + u8 res5[0x04]; +- u32 spcr; /* System Priority Configuration Register */ +-#define SPCR_PCIHPE 0x10000000 /* PCI Highest Priority Enable. */ +-#define SPCR_PCIPR 0x03000000 /* PCI bridge system bus request priority. */ +-#define SPCR_TBEN 0x00400000 /* E300 PowerPC core time base unit enable. */ +-#define SPCR_COREPR 0x00300000 /* E300 PowerPC Core system bus request priority. */ +-#define SPCR_TSEC1DP 0x00003000 /* TSEC1 data priority. */ +-#define SPCR_TSEC1BDP 0x00000C00 /* TSEC1 buffer descriptor priority. */ +-#define SPCR_TSEC1EP 0x00000300 /* TSEC1 emergency priority. */ +-#define SPCR_TSEC2DP 0x00000030 /* TSEC2 data priority. */ +-#define SPCR_TSEC2BDP 0x0000000C /* TSEC2 buffer descriptor priority. */ +-#define SPCR_TSEC2EP 0x00000003 /* TSEC2 emergency priority. */ ++ u32 spcr; /* System Priority Configuration Register */ ++#define SPCR_PCIHPE 0x10000000 /* PCI Highest Priority Enable. */ ++#define SPCR_PCIHPE_SHIFT (31-3) ++#define SPCR_PCIPR 0x03000000 /* PCI bridge system bus request priority. */ ++#define SPCR_PCIPR_SHIFT (31-7) ++#define SPCR_OPT 0x00800000 /* Optimize */ ++#define SPCR_TBEN 0x00400000 /* E300 PowerPC core time base unit enable. */ ++#define SPCR_TBEN_SHIFT (31-9) ++#define SPCR_COREPR 0x00300000 /* E300 PowerPC Core system bus request priority. */ ++#define SPCR_COREPR_SHIFT (31-11) ++#if defined (CONFIG_MPC8349) ++#define SPCR_TSEC1DP 0x00003000 /* TSEC1 data priority. */ ++#define SPCR_TSEC1DP_SHIFT (31-19) ++#define SPCR_TSEC1BDP 0x00000C00 /* TSEC1 buffer descriptor priority. */ ++#define SPCR_TSEC1BDP_SHIFT (31-21) ++#define SPCR_TSEC1EP 0x00000300 /* TSEC1 emergency priority. */ ++#define SPCR_TSEC1EP_SHIFT (31-23) ++#define SPCR_TSEC2DP 0x00000030 /* TSEC2 data priority. */ ++#define SPCR_TSEC2DP_SHIFT (31-27) ++#define SPCR_TSEC2BDP 0x0000000C /* TSEC2 buffer descriptor priority. */ ++#define SPCR_TSEC2BDP_SHIFT (31-29) ++#define SPCR_TSEC2EP 0x00000003 /* TSEC2 emergency priority. */ ++#define SPCR_TSEC2EP_SHIFT (31-31) + #define SPCR_RES ~(SPCR_PCIHPE | SPCR_PCIPR | SPCR_TBEN | SPCR_COREPR \ + | SPCR_TSEC1DP | SPCR_TSEC1BDP | SPCR_TSEC1EP \ + | SPCR_TSEC2DP | SPCR_TSEC2BDP | SPCR_TSEC2EP) +- u32 sicrl; /* System General Purpose Register Low */ ++#elif defined (CONFIG_MPC8360) ++#define SPCR_RES ~(SPCR_PCIHPE|SPCR_PCIPR|SPCR_OPT|SPCR_TBEN|SPCR_COREPR) ++#endif ++ u32 sicrl; /* System General Purpose Register Low */ ++#if defined (CONFIG_MPC8349) + #define SICRL_LDP_A 0x80000000 + #define SICRL_USB1 0x40000000 + #define SICRL_USB0 0x20000000 +@@ -91,8 +132,18 @@ typedef struct sysconf8349 { + | SICRL_GPIO1_D | SICRL_GPIO1_E | SICRL_GPIO1_F \ + | SICRL_GPIO1_G | SICRL_GPIO1_H | SICRL_GPIO1_I \ + | SICRL_GPIO1_J | SICRL_GPIO1_K | SICRL_GPIO1_L ) +- u32 sicrh; /* System General Purpose Register High */ ++#elif defined (CONFIG_MPC8360) ++#define SICRL_LDP_A 0xC0000000 ++#define SICRL_LCLK_1 0x10000000 ++#define SICRL_LCLK_2 0x08000000 ++#define SICRL_SRCID_A 0x03000000 ++#define SICRL_IRQ_CKSTP_A 0x00C00000 ++#define SICRL_RES ~(SICRL_LDP_A | SICRL_LCLK_1 | SICRL_LCLK_2 | \ ++ SICRL_SRCID_A | SICRL_IRQ_CKSTP_A) ++#endif ++ u32 sicrh; /* System General Purpose Register High */ + #define SICRH_DDR 0x80000000 ++#if defined (CONFIG_MPC8349) + #define SICRH_TSEC1_A 0x10000000 + #define SICRH_TSEC1_B 0x08000000 + #define SICRH_TSEC1_C 0x04000000 +@@ -117,7 +168,7 @@ typedef struct sysconf8349 { + #define SICRH_GPIO2_H 0x00000060 + #define SICRH_TSOBI1 0x00000002 + #define SICRH_TSOBI2 0x00000001 +-#define SICRh_RES ~( SICRH_DDR | SICRH_TSEC1_A | SICRH_TSEC1_B \ ++#define SICRH_RES ~( SICRH_DDR | SICRH_TSEC1_A | SICRH_TSEC1_B \ + | SICRH_TSEC1_C | SICRH_TSEC1_D | SICRH_TSEC1_E \ + | SICRH_TSEC1_F | SICRH_TSEC2_A | SICRH_TSEC2_B \ + | SICRH_TSEC2_C | SICRH_TSEC2_D | SICRH_TSEC2_E \ +@@ -126,207 +177,256 @@ typedef struct sysconf8349 { + | SICRH_GPIO2_D | SICRH_GPIO2_E | SICRH_GPIO2_F \ + | SICRH_GPIO2_G | SICRH_GPIO2_H | SICRH_TSOBI1 \ + | SICRH_TSOBI2) ++#elif defined (CONFIG_MPC8360) ++#define SICRH_SECONDARY_DDR 0x40000000 ++#define SICRH_SDDROE 0x02000000 /* SDDRIOE bit from reset configuration word high. */ ++#define SICRH_UC1EOBI 0x00000004 /* UCC1 Ethernet Output Buffer Impedance. */ ++#define SICRH_UC2E1OBI 0x00000002 /* UCC2 Ethernet pin option 1 Output Buffer Impedance. */ ++#define SICRH_UC2E2OBI 0x00000001 /* UCC2 Ethernet pin option 2 Output Buffer Impedance. */ ++#define SICRH_RES ~(SICRH_DDR | SICRH_SECONDARY_DDR | SICRH_SDDROE | \ ++ SICRH_UC2E1OBI | SICRH_UC2E2OBI | SICRH_UC2E2OBI) ++#endif + u8 res6[0xE4]; +-} sysconf8349_t; ++} sysconf83xx_t; + + /* + * Watch Dog Timer (WDT) Registers + */ +-typedef struct wdt8349 { ++typedef struct wdt83xx { + u8 res0[4]; +- u32 swcrr; /* System watchdog control register */ +- u32 swcnr; /* System watchdog count register */ ++ u32 swcrr; /* System watchdog control register */ ++ u32 swcnr; /* System watchdog count register */ + #define SWCNR_SWCN 0x0000FFFF Software Watchdog Count Field. + #define SWCNR_RES ~(SWCNR_SWCN) + u8 res1[2]; +- u16 swsrr; /* System watchdog service register */ ++ u16 swsrr; /* System watchdog service register */ ++#define SWSRR_WS 0x0000FFFF /* Software Watchdog Service Field. */ + u8 res2[0xF0]; +-} wdt8349_t; ++} wdt83xx_t; + + /* + * RTC/PIT Module Registers + */ +-typedef struct rtclk8349 { +- u32 cnr; /* control register */ +-#define CNR_CLEN 0x00000080 /* Clock Enable Control Bit */ +-#define CNR_CLIN 0x00000040 /* Input Clock Control Bit */ +-#define CNR_AIM 0x00000002 /* Alarm Interrupt Mask Bit */ +-#define CNR_SIM 0x00000001 /* Second Interrupt Mask Bit */ +-#define CNR_RES ~(CNR_CLEN | CNR_CLIN | CNR_AIM | CNR_SIM) +- u32 ldr; /* load register */ +- u32 psr; /* prescale register */ +- u32 ctr; /* register */ +- u32 evr; /* event register */ +-#define RTEVR_SIF 0x00000001 /* Second Interrupt Flag Bit */ +-#define RTEVR_AIF 0x00000002 /* Alarm Interrupt Flag Bit */ +-#define RTEVR_RES ~(EVR_SIF | EVR_AIF) +- u32 alr; /* alarm register */ ++typedef struct rtclk83xx { ++ u32 cnr; /* control register */ ++#define CNR_CLEN 0x00000080 /* Clock Enable Control Bit */ ++#define CNR_CLIN 0x00000040 /* Input Clock Control Bit */ ++#define CNR_AIM 0x00000002 /* Alarm Interrupt Mask Bit */ ++#define CNR_SIM 0x00000001 /* Second Interrupt Mask Bit */ ++#define CNR_RES ~(CNR_CLEN | CNR_CLIN | CNR_AIM | CNR_SIM) ++ u32 ldr; /* load register */ ++#define LDR_CLDV 0xFFFFFFFF /* Contains the 32-bit value to be ++ * loaded in a 32-bit RTC counter.*/ ++ u32 psr; /* prescale register */ ++#define PSR_PRSC 0xFFFFFFFF /* RTC Prescaler bits. */ ++ u32 ctr; /* Counter value field register */ ++#define CRT_CNTV 0xFFFFFFFF /* RTC Counter value field. */ ++ u32 evr; /* event register */ ++#define RTEVR_SIF 0x00000001 /* Second Interrupt Flag Bit */ ++#define RTEVR_AIF 0x00000002 /* Alarm Interrupt Flag Bit */ ++#define RTEVR_RES ~(RTEVR_SIF | RTEVR_AIF) ++#define PTEVR_PIF 0x00000001 /* Periodic interrupt flag bit. */ ++#define PTEVR_RES ~(PTEVR_PIF) ++ u32 alr; /* alarm register */ + u8 res0[0xE8]; +-} rtclk8349_t; ++} rtclk83xx_t; + + /* + * Global timper module + */ + +-typedef struct gtm8349 { +- u8 cfr1; /* Timer1/2 Configuration */ +-#define CFR1_PCAS 0x80 /* Pair Cascade mode */ +-#define CFR1_BCM 0x40 /* Backward compatible mode */ +-#define CFR1_STP2 0x20 /* Stop timer */ +-#define CFR1_RST2 0x10 /* Reset timer */ +-#define CFR1_GM2 0x08 /* Gate mode for pin 2 */ +-#define CFR1_GM1 0x04 /* Gate mode for pin 1 */ +-#define CFR1_STP1 0x02 /* Stop timer */ +-#define CFR1_RST1 0x01 /* Reset timer */ +- u8 res0[3]; +- u8 cfr2; /* Timer3/4 Configuration */ +-#define CFR2_PCAS 0x80 /* Pair Cascade mode */ +-#define CFR2_SCAS 0x40 /* Super Cascade mode */ +-#define CFR2_STP4 0x20 /* Stop timer */ +-#define CFR2_RST4 0x10 /* Reset timer */ +-#define CFR2_GM4 0x08 /* Gate mode for pin 4 */ +-#define CFR2_GM3 0x04 /* Gate mode for pin 3 */ +-#define CFR2_STP3 0x02 /* Stop timer */ +-#define CFR2_RST3 0x01 /* Reset timer */ +- u8 res1[10]; +- u16 mdr1; /* Timer1 Mode Register */ +-#define MDR_SPS 0xff00 /* Secondary Prescaler value */ +-#define MDR_CE 0x00c0 /* Capture edge and enable interrupt */ +-#define MDR_OM 0x0020 /* Output mode */ +-#define MDR_ORI 0x0010 /* Output reference interrupt enable */ +-#define MDR_FRR 0x0008 /* Free run/restart */ +-#define MDR_ICLK 0x0006 /* Input clock source for the timer */ +-#define MDR_GE 0x0001 /* Gate enable */ +- u16 mdr2; /* Timer2 Mode Register */ +- u16 rfr1; /* Timer1 Reference Register */ +- u16 rfr2; /* Timer2 Reference Register */ +- u16 cpr1; /* Timer1 Capture Register */ +- u16 cpr2; /* Timer2 Capture Register */ +- u16 cnr1; /* Timer1 Counter Register */ +- u16 cnr2; /* Timer2 Counter Register */ +- u16 mdr3; /* Timer3 Mode Register */ +- u16 mdr4; /* Timer4 Mode Register */ +- u16 rfr3; /* Timer3 Reference Register */ +- u16 rfr4; /* Timer4 Reference Register */ +- u16 cpr3; /* Timer3 Capture Register */ +- u16 cpr4; /* Timer4 Capture Register */ +- u16 cnr3; /* Timer3 Counter Register */ +- u16 cnr4; /* Timer4 Counter Register */ +- u16 evr1; /* Timer1 Event Register */ +- u16 evr2; /* Timer2 Event Register */ +- u16 evr3; /* Timer3 Event Register */ +- u16 evr4; /* Timer4 Event Register */ +-#define GTEVR_REF 0x0002 /* Output reference event */ +-#define GTEVR_CAP 0x0001 /* Counter Capture event */ ++typedef struct gtm83xx { ++ u8 cfr1; /* Timer1/2 Configuration */ ++#define CFR1_PCAS 0x80 /* Pair Cascade mode */ ++#define CFR1_BCM 0x40 /* Backward compatible mode */ ++#define CFR1_STP2 0x20 /* Stop timer */ ++#define CFR1_RST2 0x10 /* Reset timer */ ++#define CFR1_GM2 0x08 /* Gate mode for pin 2 */ ++#define CFR1_GM1 0x04 /* Gate mode for pin 1 */ ++#define CFR1_STP1 0x02 /* Stop timer */ ++#define CFR1_RST1 0x01 /* Reset timer */ ++#define CFR1_RES ~(CFR1_PCAS | CFR1_STP2 | CFR1_RST2 | CFR1_GM2 |\ ++ CFR1_GM1 | CFR1_STP1 | CFR1_RST1) ++ u8 res0[3]; ++ u8 cfr2; /* Timer3/4 Configuration */ ++#define CFR2_PCAS 0x80 /* Pair Cascade mode */ ++#define CFR2_SCAS 0x40 /* Super Cascade mode */ ++#define CFR2_STP4 0x20 /* Stop timer */ ++#define CFR2_RST4 0x10 /* Reset timer */ ++#define CFR2_GM4 0x08 /* Gate mode for pin 4 */ ++#define CFR2_GM3 0x04 /* Gate mode for pin 3 */ ++#define CFR2_STP3 0x02 /* Stop timer */ ++#define CFR2_RST3 0x01 /* Reset timer */ ++ u8 res1[10]; ++ u16 mdr1; /* Timer1 Mode Register */ ++#define MDR_SPS 0xff00 /* Secondary Prescaler value */ ++#define MDR_CE 0x00c0 /* Capture edge and enable interrupt */ ++#define MDR_OM 0x0020 /* Output mode */ ++#define MDR_ORI 0x0010 /* Output reference interrupt enable */ ++#define MDR_FRR 0x0008 /* Free run/restart */ ++#define MDR_ICLK 0x0006 /* Input clock source for the timer */ ++#define MDR_GE 0x0001 /* Gate enable */ ++ u16 mdr2; /* Timer2 Mode Register */ ++ u16 rfr1; /* Timer1 Reference Register */ ++ u16 rfr2; /* Timer2 Reference Register */ ++ u16 cpr1; /* Timer1 Capture Register */ ++ u16 cpr2; /* Timer2 Capture Register */ ++ u16 cnr1; /* Timer1 Counter Register */ ++ u16 cnr2; /* Timer2 Counter Register */ ++ u16 mdr3; /* Timer3 Mode Register */ ++ u16 mdr4; /* Timer4 Mode Register */ ++ u16 rfr3; /* Timer3 Reference Register */ ++ u16 rfr4; /* Timer4 Reference Register */ ++ u16 cpr3; /* Timer3 Capture Register */ ++ u16 cpr4; /* Timer4 Capture Register */ ++ u16 cnr3; /* Timer3 Counter Register */ ++ u16 cnr4; /* Timer4 Counter Register */ ++ u16 evr1; /* Timer1 Event Register */ ++ u16 evr2; /* Timer2 Event Register */ ++ u16 evr3; /* Timer3 Event Register */ ++ u16 evr4; /* Timer4 Event Register */ ++#define GTEVR_REF 0x0002 /* Output reference event */ ++#define GTEVR_CAP 0x0001 /* Counter Capture event */ + #define GTEVR_RES ~(EVR_CAP|EVR_REF) +- u16 psr1; /* Timer1 Prescaler Register */ +- u16 psr2; /* Timer2 Prescaler Register */ +- u16 psr3; /* Timer3 Prescaler Register */ +- u16 psr4; /* Timer4 Prescaler Register */ +- u8 res[0xC0]; +-} gtm8349_t; ++ u16 psr1; /* Timer1 Prescaler Register */ ++ u16 psr2; /* Timer2 Prescaler Register */ ++ u16 psr3; /* Timer3 Prescaler Register */ ++ u16 psr4; /* Timer4 Prescaler Register */ ++#define GTPSR_PPS 0x00FF /* Primary Prescaler Bits. */ ++#define GTPSR_RES ~(GTPSR_PPS) ++ u8 res[0xC0]; ++} gtm83xx_t; + + /* + * Integrated Programmable Interrupt Controller + */ +-typedef struct ipic8349 { +- u32 sicfr; /* System Global Interrupt Configuration Register (SICFR) */ +-#define SICFR_HPI 0x7f000000 /* Highest Priority Interrupt */ +-#define SICFR_MPSB 0x00400000 /* Mixed interrupts Priority Scheme for group B */ +-#define SICFR_MPSA 0x00200000 /* Mixed interrupts Priority Scheme for group A */ +-#define SICFR_IPSD 0x00080000 /* Internal interrupts Priority Scheme for group D */ +-#define SICFR_IPSA 0x00010000 /* Internal interrupts Priority Scheme for group A */ +-#define SICFR_HPIT 0x00000300 /* HPI priority position IPIC output interrupt Type */ ++typedef struct ipic83xx { ++ u32 sicfr; /* System Global Interrupt Configuration Register (SICFR) */ ++#define SICFR_HPI 0x7f000000 /* Highest Priority Interrupt */ ++#define SICFR_MPSB 0x00400000 /* Mixed interrupts Priority Scheme for group B */ ++#define SICFR_MPSA 0x00200000 /* Mixed interrupts Priority Scheme for group A */ ++#define SICFR_IPSD 0x00080000 /* Internal interrupts Priority Scheme for group D */ ++#define SICFR_IPSA 0x00010000 /* Internal interrupts Priority Scheme for group A */ ++#define SICFR_HPIT 0x00000300 /* HPI priority position IPIC output interrupt Type */ + #define SICFR_RES ~(SICFR_HPI|SICFR_MPSB|SICFR_MPSA|SICFR_IPSD|SICFR_IPSA|SICFR_HPIT) +- u32 sivcr; /* System Global Interrupt Vector Register (SIVCR) */ +-#define SICVR_IVECX 0xfc000000 /* Interrupt vector (for CE compatibility purpose only not used in 8349 IPIC implementation) */ +-#define SICVR_IVEC 0x0000007f /* Interrupt vector */ ++ u32 sivcr; /* System Global Interrupt Vector Register (SIVCR) */ ++#define SICVR_IVECX 0xfc000000 /* Interrupt vector (for CE compatibility purpose only not used in 8349 IPIC implementation) */ ++#define SICVR_IVEC 0x0000007f /* Interrupt vector */ + #define SICVR_RES ~(SICVR_IVECX|SICVR_IVEC) +- u32 sipnr_h; /* System Internal Interrupt Pending Register - High (SIPNR_H) */ +-#define SIIH_TSEC1TX 0x80000000 /* TSEC1 Tx interrupt */ +-#define SIIH_TSEC1RX 0x40000000 /* TSEC1 Rx interrupt */ ++ u32 sipnr_h; /* System Internal Interrupt Pending Register - High (SIPNR_H) */ ++#if defined (CONFIG_MPC8349) ++#define SIIH_TSEC1TX 0x80000000 /* TSEC1 Tx interrupt */ ++#define SIIH_TSEC1RX 0x40000000 /* TSEC1 Rx interrupt */ + #define SIIH_TSEC1ER 0x20000000 /* TSEC1 Eror interrupt */ +-#define SIIH_TSEC2TX 0x10000000 /* TSEC2 Tx interrupt */ +-#define SIIH_TSEC2RX 0x08000000 /* TSEC2 Rx interrupt */ ++#define SIIH_TSEC2TX 0x10000000 /* TSEC2 Tx interrupt */ ++#define SIIH_TSEC2RX 0x08000000 /* TSEC2 Rx interrupt */ + #define SIIH_TSEC2ER 0x04000000 /* TSEC2 Eror interrupt */ + #define SIIH_USB2DR 0x02000000 /* USB2 DR interrupt */ +-#define SIIH_USB2MPH 0x01000000 /* USB2 MPH interrupt */ ++#define SIIH_USB2MPH 0x01000000 /* USB2 MPH interrupt */ ++#endif ++#if defined (CONFIG_MPC8360) ++#define SIIH_H_QE_H 0x80000000 /* QE high interrupt */ ++#define SIIH_H_QE_L 0x40000000 /* QE low interrupt */ ++#endif + #define SIIH_UART1 0x00000080 /* UART1 interrupt */ + #define SIIH_UART2 0x00000040 /* UART2 interrupt */ + #define SIIH_SEC 0x00000020 /* SEC interrupt */ + #define SIIH_I2C1 0x00000004 /* I2C1 interrupt */ +-#define SIIH_I2C2 0x00000002 /* I2C1 interrupt */ ++#define SIIH_I2C2 0x00000002 /* I2C2 interrupt */ ++#if defined (CONFIG_MPC8349) + #define SIIH_SPI 0x00000001 /* SPI interrupt */ + #define SIIH_RES ~(SIIH_TSEC1TX | SIIH_TSEC1RX | SIIH_TSEC1ER \ + | SIIH_TSEC2TX | SIIH_TSEC2RX | SIIH_TSEC2ER \ + | SIIH_USB2DR | SIIH_USB2MPH | SIIH_UART1 \ + | SIIH_UART2 | SIIH_SEC | SIIH_I2C1 \ + | SIIH_I2C2 | SIIH_SPI) +- u32 sipnr_l; /* System Internal Interrupt Pending Register - Low (SIPNR_L) */ +-#define SIIL_RTCS 0x80000000 /* RTC SECOND interrupt */ +-#define SIIL_PIT 0x40000000 /* PIT interrupt */ +-#define SIIL_PCI1 0x20000000 /* PCI1 interrupt */ +-#define SIIL_PCI2 0x10000000 /* PCI2 interrupt */ +-#define SIIL_RTCA 0x08000000 /* RTC ALARM interrupt */ +-#define SIIL_MU 0x04000000 /* Message Unit interrupt */ +-#define SIIL_SBA 0x02000000 /* System Bus Arbiter interrupt */ +-#define SIIL_DMA 0x01000000 /* DMA interrupt */ +-#define SIIL_GTM4 0x00800000 /* GTM4 interrupt */ +-#define SIIL_GTM8 0x00400000 /* GTM8 interrupt */ +-#define SIIL_GPIO1 0x00200000 /* GPIO1 interrupt */ +-#define SIIL_GPIO2 0x00100000 /* GPIO2 interrupt */ +-#define SIIL_DDR 0x00080000 /* DDR interrupt */ +-#define SIIL_LBC 0x00040000 /* LBC interrupt */ +-#define SIIL_GTM2 0x00020000 /* GTM2 interrupt */ +-#define SIIL_GTM6 0x00010000 /* GTM6 interrupt */ +-#define SIIL_PMC 0x00008000 /* PMC interrupt */ +-#define SIIL_GTM3 0x00000800 /* GTM3 interrupt */ +-#define SIIL_GTM7 0x00000400 /* GTM7 interrupt */ +-#define SIIL_GTM1 0x00000020 /* GTM1 interrupt */ +-#define SIIL_GTM5 0x00000010 /* GTM5 interrupt */ +-#define SIIL_DPTC 0x00000001 /* DPTC interrupt (!!! Invisible for user !!!) */ ++#endif ++#if defined (CONFIG_MPC8360) ++#define SIIH_RES ~(SIIH_H_QE_H | SIIH_H_QE_L | SIIH_H_UART1 | \ ++ SIIH_H_UART2| SIIH_H_SEC | SIIH_H_I2C1 |SIIH_H_I2C2) ++#endif ++ u32 sipnr_l; /* System Internal Interrupt Pending Register - Low (SIPNR_L) */ ++#define SIIL_RTCS 0x80000000 /* RTC SECOND interrupt */ ++#define SIIL_PIT 0x40000000 /* PIT interrupt */ ++#define SIIL_PCI1 0x20000000 /* PCI1 interrupt */ ++#if defined (CONFIG_MPC8349) ++#define SIIL_PCI2 0x10000000 /* PCI2 interrupt */ ++#endif ++#define SIIL_RTCA 0x08000000 /* RTC ALARM interrupt */ ++#define SIIL_MU 0x04000000 /* Message Unit interrupt */ ++#define SIIL_SBA 0x02000000 /* System Bus Arbiter interrupt */ ++#define SIIL_DMA 0x01000000 /* DMA interrupt */ ++#define SIIL_GTM4 0x00800000 /* GTM4 interrupt */ ++#define SIIL_GTM8 0x00400000 /* GTM8 interrupt */ ++#if defined (CONFIG_MPC8349) ++#define SIIL_GPIO1 0x00200000 /* GPIO1 interrupt */ ++#define SIIL_GPIO2 0x00100000 /* GPIO2 interrupt */ ++#endif ++#if defined (CONFIG_MPC8360) ++#define SIIL_QEP 0x00200000 /* QE ports interrupt */ ++#define SIIL_SDDR 0x00100000 /* SDDR interrupt */ ++#endif ++#define SIIL_DDR 0x00080000 /* DDR interrupt */ ++#define SIIL_LBC 0x00040000 /* LBC interrupt */ ++#define SIIL_GTM2 0x00020000 /* GTM2 interrupt */ ++#define SIIL_GTM6 0x00010000 /* GTM6 interrupt */ ++#define SIIL_PMC 0x00008000 /* PMC interrupt */ ++#define SIIL_GTM3 0x00000800 /* GTM3 interrupt */ ++#define SIIL_GTM7 0x00000400 /* GTM7 interrupt */ ++#define SIIL_GTM1 0x00000020 /* GTM1 interrupt */ ++#define SIIL_GTM5 0x00000010 /* GTM5 interrupt */ ++#define SIIL_DPTC 0x00000001 /* DPTC interrupt (!!! Invisible for user !!!) */ ++#if defined (CONFIG_MPC8349) + #define SIIL_RES ~(SIIL_RTCS | SIIL_PIT | SIIL_PCI1 | SIIL_PCI2 \ + | SIIL_RTCA | SIIL_MU | SIIL_SBA | SIIL_DMA \ + | SIIL_GTM4 | SIIL_GTM8 | SIIL_GPIO1 | SIIL_GPIO2 \ + | SIIL_DDR | SIIL_LBC | SIIL_GTM2 | SIIL_GTM6 \ + | SIIL_PMC |SIIL_GTM3 | SIIL_GTM7 | SIIL_GTM1 \ + | SIIL_GTM5 |SIIL_DPTC ) +- u32 siprr_a; /* System Internal Interrupt Group A Priority Register (PRR) */ +- u8 res0[8]; +- u32 siprr_d; /* System Internal Interrupt Group D Priority Register (PRR) */ +- u32 simsr_h; /* System Internal Interrupt Mask Register - High (SIIH) */ +- u32 simsr_l; /* System Internal Interrupt Mask Register - Low (SIIL) */ +- u8 res1[4]; +- u32 sepnr; /* System External Interrupt Pending Register (SEI) */ +- u32 smprr_a; /* System Mixed Interrupt Group A Priority Register (PRR) */ +- u32 smprr_b; /* System Mixed Interrupt Group B Priority Register (PRR) */ +-#define PRR_0 0xe0000000 /* Priority Register, Position 0 programming */ +-#define PRR_1 0x1c000000 /* Priority Register, Position 1 programming */ +-#define PRR_2 0x03800000 /* Priority Register, Position 2 programming */ +-#define PRR_3 0x00700000 /* Priority Register, Position 3 programming */ +-#define PRR_4 0x0000e000 /* Priority Register, Position 4 programming */ +-#define PRR_5 0x00001c00 /* Priority Register, Position 5 programming */ +-#define PRR_6 0x00000380 /* Priority Register, Position 6 programming */ +-#define PRR_7 0x00000070 /* Priority Register, Position 7 programming */ ++#endif ++#if defined (CONFIG_MPC8360) ++#define SIIL_RES ~(SIIL_RTCS |SIIL_PIT |SIIL_PCI1 |SIIL_RTCALR \ ++ |SIIL_MU |SIIL_SBA |SIIL_DMA |SIIL_GTM4 |SIIL_GTM8 \ ++ |SIIL_QEP | SIIL_SDDR| SIIL_DDR |SIIL_LBC |SIIL_GTM2 \ ++ |SIIL_GTM6 |SIIL_PMC |SIIL_GTM3 |SIIL_GTM7 |SIIL_GTM1 \ ++ |SIIL_GTM5 ) ++#endif ++ u32 siprr_a; /* System Internal Interrupt Group A Priority Register (PRR) */ ++ u8 res0[8]; ++ u32 siprr_d; /* System Internal Interrupt Group D Priority Register (PRR) */ ++ u32 simsr_h; /* System Internal Interrupt Mask Register - High (SIIH) */ ++ u32 simsr_l; /* System Internal Interrupt Mask Register - Low (SIIL) */ ++ u8 res1[4]; ++ u32 sepnr; /* System External Interrupt Pending Register (SEI) */ ++ u32 smprr_a; /* System Mixed Interrupt Group A Priority Register (PRR) */ ++ u32 smprr_b; /* System Mixed Interrupt Group B Priority Register (PRR) */ ++#define PRR_0 0xe0000000 /* Priority Register, Position 0 programming */ ++#define PRR_1 0x1c000000 /* Priority Register, Position 1 programming */ ++#define PRR_2 0x03800000 /* Priority Register, Position 2 programming */ ++#define PRR_3 0x00700000 /* Priority Register, Position 3 programming */ ++#define PRR_4 0x0000e000 /* Priority Register, Position 4 programming */ ++#define PRR_5 0x00001c00 /* Priority Register, Position 5 programming */ ++#define PRR_6 0x00000380 /* Priority Register, Position 6 programming */ ++#define PRR_7 0x00000070 /* Priority Register, Position 7 programming */ + #define PRR_RES ~(PRR_0|PRR_1|PRR_2|PRR_3|PRR_4|PRR_5|PRR_6|PRR_7) +- u32 semsr; /* System External Interrupt Mask Register (SEI) */ +-#define SEI_IRQ0 0x80000000 /* IRQ0 external interrupt */ +-#define SEI_IRQ1 0x40000000 /* IRQ1 external interrupt */ +-#define SEI_IRQ2 0x20000000 /* IRQ2 external interrupt */ +-#define SEI_IRQ3 0x10000000 /* IRQ3 external interrupt */ +-#define SEI_IRQ4 0x08000000 /* IRQ4 external interrupt */ +-#define SEI_IRQ5 0x04000000 /* IRQ5 external interrupt */ +-#define SEI_IRQ6 0x02000000 /* IRQ6 external interrupt */ +-#define SEI_IRQ7 0x01000000 /* IRQ7 external interrupt */ +-#define SEI_SIRQ0 0x00008000 /* SIRQ0 external interrupt */ ++ u32 semsr; /* System External Interrupt Mask Register (SEI) */ ++#define SEI_IRQ0 0x80000000 /* IRQ0 external interrupt */ ++#define SEI_IRQ1 0x40000000 /* IRQ1 external interrupt */ ++#define SEI_IRQ2 0x20000000 /* IRQ2 external interrupt */ ++#define SEI_IRQ3 0x10000000 /* IRQ3 external interrupt */ ++#define SEI_IRQ4 0x08000000 /* IRQ4 external interrupt */ ++#define SEI_IRQ5 0x04000000 /* IRQ5 external interrupt */ ++#define SEI_IRQ6 0x02000000 /* IRQ6 external interrupt */ ++#define SEI_IRQ7 0x01000000 /* IRQ7 external interrupt */ ++#define SEI_SIRQ0 0x00008000 /* SIRQ0 external interrupt */ + #define SEI_RES ~( SEI_IRQ0 | SEI_IRQ1 | SEI_IRQ2 | SEI_IRQ3 \ + | SEI_IRQ4 | SEI_IRQ5 | SEI_IRQ6 | SEI_IRQ7 \ + | SEI_SIRQ0) +- u32 secnr; /* System External Interrupt Control Register (SECNR) */ +-#define SECNR_MIXB0T 0xc0000000 /* MIXB0 priority position IPIC output interrupt type */ +-#define SECNR_MIXB1T 0x30000000 /* MIXB1 priority position IPIC output interrupt type */ +-#define SECNR_MIXA0T 0x00c00000 /* MIXA0 priority position IPIC output interrupt type */ +-#define SECNR_SYSA1T 0x00300000 /* MIXA1 priority position IPIC output interrupt type */ ++ u32 secnr; /* System External Interrupt Control Register (SECNR) */ ++#define SECNR_MIXB0T 0xc0000000 /* MIXB0 priority position IPIC output interrupt type */ ++#define SECNR_MIXB1T 0x30000000 /* MIXB1 priority position IPIC output interrupt type */ ++#define SECNR_MIXA0T 0x00c00000 /* MIXA0 priority position IPIC output interrupt type */ ++#define SECNR_SYSA1T 0x00300000 /* MIXA1 priority position IPIC output interrupt type */ + #define SECNR_EDI0 0x00008000 /* IRQ0 external interrupt edge/level detect */ + #define SECNR_EDI1 0x00004000 /* IRQ1 external interrupt edge/level detect */ + #define SECNR_EDI2 0x00002000 /* IRQ2 external interrupt edge/level detect */ +@@ -339,176 +439,238 @@ typedef struct ipic8349 { + | SECNR_SYSA1T | SECNR_EDI0 | SECNR_EDI1 \ + | SECNR_EDI2 | SECNR_EDI3 | SECNR_EDI4 \ + | SECNR_EDI5 | SECNR_EDI6 | SECNR_EDI7) +- u32 sersr; /* System Error Status Register (SERR) */ +- u32 sermr; /* System Error Mask Register (SERR) */ +-#define SERR_IRQ0 0x80000000 /* IRQ0 MCP request */ +-#define SERR_WDT 0x40000000 /* WDT MCP request */ +-#define SERR_SBA 0x20000000 /* SBA MCP request */ +-#define SERR_DDR 0x10000000 /* DDR MCP request */ +-#define SERR_LBC 0x08000000 /* LBC MCP request */ +-#define SERR_PCI1 0x04000000 /* PCI1 MCP request */ +-#define SERR_PCI2 0x02000000 /* PCI2 MCP request */ +-#define SERR_MU 0x01000000 /* MU MCP request */ +-#define SERR_RNC 0x00010000 /* MU MCP request (!!! Non-visible for users !!!) */ ++ u32 sersr; /* System Error Status Register (SERR) */ ++ u32 sermr; /* System Error Mask Register (SERR) */ ++#define SERR_IRQ0 0x80000000 /* IRQ0 MCP request */ ++#define SERR_WDT 0x40000000 /* WDT MCP request */ ++#define SERR_SBA 0x20000000 /* SBA MCP request */ ++#if defined (CONFIG_MPC8349) ++#define SERR_DDR 0x10000000 /* DDR MCP request */ ++#define SERR_LBC 0x08000000 /* LBC MCP request */ ++#define SERR_PCI1 0x04000000 /* PCI1 MCP request */ ++#define SERR_PCI2 0x02000000 /* PCI2 MCP request */ ++#endif ++#if defined (CONFIG_MPC8360) ++#define SERR_CIEE 0x10000000 /* CIEE MCP request */ ++#define SERR_CMEE 0x08000000 /* CMEEMCP request */ ++#define SERR_PCI 0x04000000 /* PCI MCP request */ ++#endif ++#define SERR_MU 0x01000000 /* MU MCP request */ ++#define SERR_RNC 0x00010000 /* MU MCP request (!!! Non-visible for users !!!) */ ++#if defined (CONFIG_MPC8349) + #define SERR_RES ~( SERR_IRQ0 | SERR_WDT | SERR_SBA | SERR_DDR \ + |SERR_LBC | SERR_PCI1 | SERR_PCI2 | SERR_MU \ + |SERR_RNC ) +- u32 sercr; /* System Error Control Register (SERCR) */ +-#define SERCR_MCPR 0x00000001 /* MCP Route */ ++#elif defined (CONFIG_MPC8360) ++#define SERR_RES ~( SERR_IRQ0|SERR_WDT |SERR_SBA |SERR_CIEE\ ++ |SERR_CMEE|SERR_PCI|SERR_MU) ++#endif ++ u32 sercr; /* System Error Control Register (SERCR) */ ++#define SERCR_MCPR 0x00000001 /* MCP Route */ + #define SERCR_RES ~(SERCR_MCPR) +- u8 res2[4]; +- u32 sifcr_h; /* System Internal Interrupt Force Register - High (SIIH) */ +- u32 sifcr_l; /* System Internal Interrupt Force Register - Low (SIIL) */ +- u32 sefcr; /* System External Interrupt Force Register (SEI) */ +- u32 serfr; /* System Error Force Register (SERR) */ +- u8 res3[0xA0]; +-} ipic8349_t; ++ u8 res2[4]; ++ u32 sifcr_h; /* System Internal Interrupt Force Register - High (SIIH) */ ++ u32 sifcr_l; /* System Internal Interrupt Force Register - Low (SIIL) */ ++ u32 sefcr; /* System External Interrupt Force Register (SEI) */ ++ u32 serfr; /* System Error Force Register (SERR) */ ++ u32 scvcr; /* System Critical Interrupt Vector Register */ ++#define SCVCR_CVECX 0xFC000000 /* Backward (MPC8260) compatible ++ critical interrupt vector. */ ++#define SCVCR_CVEC 0x0000007F /* Critical interrupt vector */ ++#define SCVCR_RES ~(SCVCR_CVECX|SCVCR_CVEC) ++ u32 smvcr; /* System Management Interrupt Vector Register */ ++#define SMVCR_CVECX 0xFC000000 /* Backward (MPC8260) compatible ++ critical interrupt vector. */ ++#define SMVCR_CVEC 0x0000007F /* Critical interrupt vector */ ++#define SMVCR_RES ~(SMVCR_CVECX|SMVCR_CVEC) ++ u8 res3[0x98]; ++} ipic83xx_t; + + /* + * System Arbiter Registers + */ +-typedef struct arbiter8349 { +- u32 acr; /* Arbiter Configuration Register */ +-#define ACR_COREDIS 0x10000000 /* Core disable. */ +-#define ACR_PIPE_DEP 0x00070000 /* Pipeline depth (number of outstanding transactions). */ +-#define ACR_PCI_RPTCNT 0x00007000 /* PCI repeat count. */ +-#define ACR_RPTCNT 0x00000700 /* Repeat count. */ +-#define ACR_APARK 0x00000030 /* Address parking. */ +-#define ACR_PARKM 0x0000000F /* Parking master. */ ++typedef struct arbiter83xx { ++ u32 acr; /* Arbiter Configuration Register */ ++#define ACR_COREDIS 0x10000000 /* Core disable. */ ++#define ACR_COREDIS_SHIFT (31-7) ++#define ACR_PIPE_DEP 0x00070000 /* Pipeline depth (number of outstanding transactions). */ ++#define ACR_PIPE_DEP_SHIFT (31-15) ++#define ACR_PCI_RPTCNT 0x00007000 /* PCI repeat count. */ ++#define ACR_PCI_RPTCNT_SHIFT (31-19) ++#define ACR_RPTCNT 0x00000700 /* Repeat count. */ ++#define ACR_RPTCNT_SHIFT (31-23) ++#define ACR_APARK 0x00000030 /* Address parking. */ ++#define ACR_APARK_SHIFT (31-27) ++#define ACR_PARKM 0x0000000F /* Parking master. */ ++#define ACR_PARKM_SHIFT (31-31) + #define ACR_RES ~(ACR_COREDIS|ACR_PIPE_DEP|ACR_PCI_RPTCNT|ACR_RPTCNT|ACR_APARK|ACR_PARKM) +- u32 atr; /* Arbiter Timers Register */ +-#define ATR_DTO 0x00FF0000 /* Data time out. */ +-#define ATR_ATO 0x000000FF /* Address time out. */ ++ u32 atr; /* Arbiter Timers Register */ ++#define ATR_DTO 0x00FF0000 /* Data time out. */ ++#define ATR_ATO 0x000000FF /* Address time out. */ + #define ATR_RES ~(ATR_DTO|ATR_ATO) + u8 res[4]; +- u32 aer; /* Arbiter Event Register (AE)*/ +- u32 aidr; /* Arbiter Interrupt Definition Register (AE) */ +- u32 amr; /* Arbiter Mask Register (AE) */ +- u32 aeatr; /* Arbiter Event Attributes Register */ +-#define AEATR_EVENT 0x07000000 /* Event type. */ +-#define AEATR_MSTR_ID 0x001F0000 /* Master Id. */ +-#define AEATR_TBST 0x00000800 /* Transfer burst. */ +-#define AEATR_TSIZE 0x00000700 /* Transfer Size. */ +-#define AEATR_TTYPE 0x0000001F /* Transfer Type. */ ++ u32 aer; /* Arbiter Event Register (AE) */ ++ u32 aidr; /* Arbiter Interrupt Definition Register (AE) */ ++ u32 amr; /* Arbiter Mask Register (AE) */ ++ u32 aeatr; /* Arbiter Event Attributes Register */ ++#define AEATR_EVENT 0x07000000 /* Event type. */ ++#define AEATR_MSTR_ID 0x001F0000 /* Master Id. */ ++#define AEATR_TBST 0x00000800 /* Transfer burst. */ ++#define AEATR_TSIZE 0x00000700 /* Transfer Size. */ ++#define AEATR_TTYPE 0x0000001F /* Transfer Type. */ + #define AEATR_RES ~(AEATR_EVENT|AEATR_MSTR_ID|AEATR_TBST|AEATR_TSIZE|AEATR_TTYPE) +- u32 aeadr; /* Arbiter Event Address Register */ +- u32 aerr; /* Arbiter Event Response Register (AE)*/ +-#define AE_ETEA 0x00000020 /* Transfer error. */ +-#define AE_RES_ 0x00000010 /* Reserved transfer type. */ +-#define AE_ECW 0x00000008 /* External control word transfer type. */ +-#define AE_AO 0x00000004 /* Address Only transfer type. */ +-#define AE_DTO 0x00000002 /* Data time out. */ +-#define AE_ATO 0x00000001 /* Address time out. */ ++ u32 aeadr; /* Arbiter Event Address Register */ ++ u32 aerr; /* Arbiter Event Response Register (AE) */ ++#define AE_ETEA 0x00000020 /* Transfer error. */ ++#define AE_RES_ 0x00000010 /* Reserved transfer type. */ ++#define AE_ECW 0x00000008 /* External control word transfer type. */ ++#define AE_AO 0x00000004 /* Address Only transfer type. */ ++#define AE_DTO 0x00000002 /* Data time out. */ ++#define AE_ATO 0x00000001 /* Address time out. */ + #define AE_RSRV ~(AE_ETEA|AE_RES_|AE_ECW|AE_AO|AE_DTO|AE_ATO) + u8 res1[0xDC]; +-} arbiter8349_t; ++} arbiter83xx_t; + + /* + * Reset Module + */ +-typedef struct reset8349 { +- u32 rcwl; /* RCWL Register */ ++typedef struct reset83xx { ++ u32 rcwl; /* RCWL Register */ + #define RCWL_LBIUCM 0x80000000 /* LBIUCM */ + #define RCWL_LBIUCM_SHIFT 31 + #define RCWL_DDRCM 0x40000000 /* DDRCM */ + #define RCWL_DDRCM_SHIFT 30 ++#if defined (CONFIG_MPC8349) + #define RCWL_SVCOD 0x30000000 /* SVCOD */ +-#define RCWL_SPMF 0x0f000000 /* SPMF */ +-#define RCWL_SPMF_SHIFT 24 ++#endif ++#define RCWL_SPMF 0x0f000000 /* SPMF */ ++#define RCWL_SPMF_SHIFT 24 + #define RCWL_COREPLL 0x007F0000 /* COREPLL */ + #define RCWL_COREPLL_SHIFT 16 + #define RCWL_CEVCOD 0x000000C0 /* CEVCOD */ + #define RCWL_CEPDF 0x00000020 /* CEPDF */ ++#define RCWL_CEPDF_SHIFT 5 + #define RCWL_CEPMF 0x0000001F /* CEPMF */ +-#define RCWL_RES ~(RCWL_BIUCM|RCWL_DDRCM|RCWL_SVCOD|RCWL_SPMF|RCWL_COREPLL|RCWL_CEVCOD|RCWL_CEPDF|RCWL_CEPMF) +- u32 rcwh; /* RCHL Register */ ++#define RCWL_CEPMF_SHIFT 0 ++#if defined (CONFIG_MPC8349) ++#define RCWL_RES ~(RCWL_LBIUCM|RCWL_DDRCM|RCWL_SVCOD|RCWL_SPMF|RCWL_COREPLL|RCWL_CEVCOD|RCWL_CEPDF|RCWL_CEPMF) ++#elif defined (CONFIG_MPC8360) ++#define RCWL_RES ~(RCWL_LBIUCM|RCWL_DDRCM|RCWL_SPMF|RCWL_COREPLL|RCWL_CEPDF|RCWL_CEPMF) ++#endif ++ u32 rcwh; /* RCHL Register */ + #define RCWH_PCIHOST 0x80000000 /* PCIHOST */ + #define RCWH_PCIHOST_SHIFT 31 ++#if defined (CONFIG_MPC8349) + #define RCWH_PCI64 0x40000000 /* PCI64 */ + #define RCWH_PCI1ARB 0x20000000 /* PCI1ARB */ + #define RCWH_PCI2ARB 0x10000000 /* PCI2ARB */ ++#elif defined (CONFIG_MPC8360) ++#define RCWH_PCIARB 0x20000000 /* PCI internal arbiter mode. */ ++#define RCWH_PCICKDRV 0x10000000 /* PCI clock output drive. */ ++#endif + #define RCWH_COREDIS 0x08000000 /* COREDIS */ +-#define RCWH_BMS 0x04000000 /* BMS */ ++#define RCWH_BMS 0x04000000 /* BMS */ + #define RCWH_BOOTSEQ 0x03000000 /* BOOTSEQ */ +-#define RCWH_SWEN 0x00800000 /* SWEN */ ++#define RCWH_SWEN 0x00800000 /* SWEN */ + #define RCWH_ROMLOC 0x00700000 /* ROMLOC */ ++#if defined (CONFIG_MPC8349) + #define RCWH_TSEC1M 0x0000c000 /* TSEC1M */ + #define RCWH_TSEC2M 0x00003000 /* TSEC2M */ +-#define RCWH_TPR 0x00000100 /* TPR */ +-#define RCWH_TLE 0x00000008 /* TLE */ +-#define RCWH_LALE 0x00000004 /* LALE */ ++#define RCWH_TPR 0x00000100 /* TPR */ ++#elif defined (CONFIG_MPC8360) ++#define RCWH_SDDRIOE 0x00000010 /* Secondary DDR IO Enable. */ ++#endif ++#define RCWH_TLE 0x00000008 /* TLE */ ++#define RCWH_LALE 0x00000004 /* LALE */ ++#if defined (CONFIG_MPC8349) + #define RCWH_RES ~(RCWH_PCIHOST | RCWH_PCI64 | RCWH_PCI1ARB \ + | RCWH_PCI2ARB | RCWH_COREDIS | RCWH_BMS \ + | RCWH_BOOTSEQ | RCWH_SWEN | RCWH_ROMLOC \ + | RCWH_TSEC1M | RCWH_TSEC2M | RCWH_TPR \ + | RCWH_TLE | RCWH_LALE) +- u8 res0[8]; +- u32 rsr; /* Reset status Register */ +-#define RSR_RSTSRC 0xE0000000 /* Reset source */ ++#elif defined (CONFIG_MPC8360) ++#define RCWH_RES ~(RCWH_PCIHOST|RCWH_PCIARB|RCWH_PCICKDRV \ ++ |RCWH_COREDIS|RCWH_BMS|RCWH_BOOTSEQ|RCWH_SWEN \ ++ |RCWH_SDDRIOE |RCWH_TLE) ++#endif ++ u8 res0[8]; ++ u32 rsr; /* Reset status Register */ ++#define RSR_RSTSRC 0xE0000000 /* Reset source */ + #define RSR_RSTSRC_SHIFT 29 +-#define RSR_BSF 0x00010000 /* Boot seq. fail */ +-#define RSR_BSF_SHIFT 16 +-#define RSR_SWSR 0x00002000 /* software soft reset */ +-#define RSR_SWSR_SHIFT 13 +-#define RSR_SWHR 0x00001000 /* software hard reset */ +-#define RSR_SWHR_SHIFT 12 +-#define RSR_JHRS 0x00000200 /* jtag hreset */ +-#define RSR_JHRS_SHIFT 9 +-#define RSR_JSRS 0x00000100 /* jtag sreset status */ +-#define RSR_JSRS_SHIFT 8 +-#define RSR_CSHR 0x00000010 /* checkstop reset status */ +-#define RSR_CSHR_SHIFT 4 +-#define RSR_SWRS 0x00000008 /* software watchdog reset status */ +-#define RSR_SWRS_SHIFT 3 +-#define RSR_BMRS 0x00000004 /* bus monitop reset status */ +-#define RSR_BMRS_SHIFT 2 +-#define RSR_SRS 0x00000002 /* soft reset status */ +-#define RSR_SRS_SHIFT 1 +-#define RSR_HRS 0x00000001 /* hard reset status */ +-#define RSR_HRS_SHIFT 0 ++#define RSR_BSF 0x00010000 /* Boot seq. fail */ ++#define RSR_BSF_SHIFT 16 ++#define RSR_SWSR 0x00002000 /* software soft reset */ ++#define RSR_SWSR_SHIFT 13 ++#define RSR_SWHR 0x00001000 /* software hard reset */ ++#define RSR_SWHR_SHIFT 12 ++#define RSR_JHRS 0x00000200 /* jtag hreset */ ++#define RSR_JHRS_SHIFT 9 ++#define RSR_JSRS 0x00000100 /* jtag sreset status */ ++#define RSR_JSRS_SHIFT 8 ++#define RSR_CSHR 0x00000010 /* checkstop reset status */ ++#define RSR_CSHR_SHIFT 4 ++#define RSR_SWRS 0x00000008 /* software watchdog reset status */ ++#define RSR_SWRS_SHIFT 3 ++#define RSR_BMRS 0x00000004 /* bus monitop reset status */ ++#define RSR_BMRS_SHIFT 2 ++#define RSR_SRS 0x00000002 /* soft reset status */ ++#define RSR_SRS_SHIFT 1 ++#define RSR_HRS 0x00000001 /* hard reset status */ ++#define RSR_HRS_SHIFT 0 + #define RSR_RES ~(RSR_RSTSRC | RSR_BSF | RSR_SWSR | RSR_SWHR | RSR_JHRS | RSR_JSRS | RSR_CSHR | RSR_SWRS | RSR_BMRS | RSR_SRS | RSR_HRS) +- u32 rmr; /* Reset mode Register */ +-#define RMR_CSRE 0x00000001 /* checkstop reset enable */ +-#define RMR_CSRE_SHIFT 0 ++ u32 rmr; /* Reset mode Register */ ++#define RMR_CSRE 0x00000001 /* checkstop reset enable */ ++#define RMR_CSRE_SHIFT 0 + #define RMR_RES ~(RMR_CSRE) +- u32 rpr; /* Reset protection Register */ +- u32 rcr; /* Reset Control Register */ +-#define RCR_SWHR 0x00000002 /* software hard reset */ +-#define RCR_SWSR 0x00000001 /* software soft reset */ ++ u32 rpr; /* Reset protection Register */ ++ u32 rcr; /* Reset Control Register */ ++#define RCR_SWHR 0x00000002 /* software hard reset */ ++#define RCR_SWSR 0x00000001 /* software soft reset */ + #define RCR_RES ~(RCR_SWHR | RCR_SWSR) +- u32 rcer; /* Reset Control Enable Register */ +-#define RCER_CRE 0x00000001 /* software hard reset */ ++ u32 rcer; /* Reset Control Enable Register */ ++#define RCER_CRE 0x00000001 /* software hard reset */ + #define RCER_RES ~(RCER_CRE) +- u8 res1[0xDC]; +-} reset8349_t; ++ u8 res1[0xDC]; ++} reset83xx_t; + +-typedef struct clk8349 { +- u32 spmr; /* system PLL mode Register */ ++typedef struct clk83xx { ++ u32 spmr; /* system PLL mode Register */ + #define SPMR_LBIUCM 0x80000000 /* LBIUCM */ + #define SPMR_DDRCM 0x40000000 /* DDRCM */ ++#if defined (CONFIG_MPC8349) + #define SPMR_SVCOD 0x30000000 /* SVCOD */ +-#define SPMR_SPMF 0x0F000000 /* SPMF */ +-#define SPMR_CKID 0x00800000 /* CKID */ ++#endif ++#define SPMR_SPMF 0x0F000000 /* SPMF */ ++#define SPMR_CKID 0x00800000 /* CKID */ + #define SPMR_CKID_SHIFT 23 + #define SPMR_COREPLL 0x007F0000 /* COREPLL */ + #define SPMR_CEVCOD 0x000000C0 /* CEVCOD */ + #define SPMR_CEPDF 0x00000020 /* CEPDF */ + #define SPMR_CEPMF 0x0000001F /* CEPMF */ ++#if defined (CONFIG_MPC8349) + #define SPMR_RES ~(SPMR_LBIUCM | SPMR_DDRCM | SPMR_SVCOD \ + | SPMR_SPMF | SPMR_CKID | SPMR_COREPLL \ + | SPMR_CEVCOD | SPMR_CEPDF | SPMR_CEPMF) +- u32 occr; /* output clock control Register */ ++#elif defined (CONFIG_MPC8360) ++#define SPMR_RES ~(SPMR_LBIUCM | SPMR_DDRCM | SPMR_SPMF \ ++ | SPMR_CKID | SPMR_COREPLL | SPMR_CEVCOD \ ++ | SPMR_CEPDF | SPMR_CEPMF) ++#endif ++ u32 occr; /* output clock control Register */ + #define OCCR_PCICOE0 0x80000000 /* PCICOE0 */ + #define OCCR_PCICOE1 0x40000000 /* PCICOE1 */ + #define OCCR_PCICOE2 0x20000000 /* PCICOE2 */ ++#if defined (CONFIG_MPC8349) + #define OCCR_PCICOE3 0x10000000 /* PCICOE3 */ + #define OCCR_PCICOE4 0x08000000 /* PCICOE4 */ + #define OCCR_PCICOE5 0x04000000 /* PCICOE5 */ + #define OCCR_PCICOE6 0x02000000 /* PCICOE6 */ + #define OCCR_PCICOE7 0x01000000 /* PCICOE7 */ ++#endif + #define OCCR_PCICD0 0x00800000 /* PCICD0 */ + #define OCCR_PCICD1 0x00400000 /* PCICD1 */ + #define OCCR_PCICD2 0x00200000 /* PCICD2 */ ++#if defined (CONFIG_MPC8349) + #define OCCR_PCICD3 0x00100000 /* PCICD3 */ + #define OCCR_PCICD4 0x00080000 /* PCICD4 */ + #define OCCR_PCICD5 0x00040000 /* PCICD5 */ +@@ -522,72 +684,253 @@ typedef struct clk8349 { + | OCCR_PCICD1 | OCCR_PCICD2 | OCCR_PCICD3 \ + | OCCR_PCICD4 | OCCR_PCICD5 | OCCR_PCICD6 \ + | OCCR_PCICD7 | OCCR_PCI1CR | OCCR_PCI2CR ) +- u32 sccr; /* system clock control Register */ +-#define SCCR_TSEC1CM 0xc0000000 /* TSEC1CM */ ++#endif ++#if defined (CONFIG_MPC8360) ++#define OCCR_PCICR 0x00000002 /* PCI clock rate */ ++#define OCCR_RES ~(OCCR_PCICOE0|OCCR_PCICOE1|OCCR_PCICOE2 \ ++ |OCCR_PCICD0|OCCR_PCICD1|OCCR_PCICD2|OCCR_PCICR ) ++#endif ++ u32 sccr; /* system clock control Register */ ++#if defined (CONFIG_MPC8349) ++#define SCCR_TSEC1CM 0xc0000000 /* TSEC1CM */ + #define SCCR_TSEC1CM_SHIFT 30 +-#define SCCR_TSEC2CM 0x30000000 /* TSEC2CM */ ++#define SCCR_TSEC2CM 0x30000000 /* TSEC2CM */ + #define SCCR_TSEC2CM_SHIFT 28 +-#define SCCR_ENCCM 0x03000000 /* ENCCM */ ++#endif ++#define SCCR_ENCCM 0x03000000 /* ENCCM */ + #define SCCR_ENCCM_SHIFT 24 +-#define SCCR_USBMPHCM 0x00c00000 /* USBMPHCM */ ++#if defined (CONFIG_MPC8349) ++#define SCCR_USBMPHCM 0x00c00000 /* USBMPHCM */ + #define SCCR_USBMPHCM_SHIFT 22 +-#define SCCR_USBDRCM 0x00300000 /* USBDRCM */ ++#define SCCR_USBDRCM 0x00300000 /* USBDRCM */ + #define SCCR_USBDRCM_SHIFT 20 +-#define SCCR_PCICM 0x00010000 /* PCICM */ ++#endif ++#define SCCR_PCICM 0x00010000 /* PCICM */ ++#if defined (CONFIG_MPC8349) + #define SCCR_RES ~( SCCR_TSEC1CM | SCCR_TSEC2CM | SCCR_ENCCM \ + | SCCR_USBMPHCM | SCCR_USBDRCM | SCCR_PCICM) +- u8 res0[0xF4]; +-} clk8349_t; ++#endif ++#if defined (CONFIG_MPC8360) ++#define SCCR_RES ~(SCCR_ENCCM | SCCR_PCICM) ++#endif ++ u8 res0[0xF4]; ++} clk83xx_t; + + /* + * Power Management Control Module + */ +-typedef struct pmc8349 { +- u32 pmccr; /* PMC Configuration Register */ +-#define PMCCR_SLPEN 0x00000001 /* System Low Power Enable */ +-#define PMCCR_DLPEN 0x00000002 /* DDR SDRAM Low Power Enable */ +-#define PMCCR_RES ~(PMCCR_SLPEN | PMCCR_DLPEN) +- u32 pmcer; /* PMC Event Register */ +-#define PMCER_PMCI 0x00000001 /* PMC Interrupt */ ++typedef struct pmc83xx { ++ u32 pmccr; /* PMC Configuration Register */ ++#define PMCCR_SLPEN 0x00000001 /* System Low Power Enable */ ++#define PMCCR_DLPEN 0x00000002 /* DDR SDRAM Low Power Enable */ ++#if defined (CONFIG_MPC8360) ++#define PMCCR_SDLPEN 0x00000004 /* Secondary DDR SDRAM Low Power Enable */ ++#define PMCCR_RES ~(PMCCR_SLPEN | PMCCR_DLPEN | PMCCR_SDLPEN) ++#elif defined (CONFIG_MPC8349) ++#define PMCCR_RES ~(PMCCR_SLPEN | PMCCR_DLPEN) ++#endif ++ u32 pmcer; /* PMC Event Register */ ++#define PMCER_PMCI 0x00000001 /* PMC Interrupt */ + #define PMCER_RES ~(PMCER_PMCI) +- u32 pmcmr; /* PMC Mask Register */ +-#define PMCMR_PMCIE 0x0001 /* PMC Interrupt Enable */ ++ u32 pmcmr; /* PMC Mask Register */ ++#define PMCMR_PMCIE 0x0001 /* PMC Interrupt Enable */ + #define PMCMR_RES ~(PMCMR_PMCIE) + u8 res0[0xF4]; +-} pmc8349_t; +- ++} pmc83xx_t; + ++#if defined (CONFIG_MPC8349) + /* + * general purpose I/O module + */ +-typedef struct gpio8349 { +- u32 dir; /* direction register */ +- u32 odr; /* open drain register */ +- u32 dat; /* data register */ +- u32 ier; /* interrupt event register */ +- u32 imr; /* interrupt mask register */ +- u32 icr; /* external interrupt control register */ ++typedef struct gpio83xx { ++ u32 dir; /* direction register */ ++ u32 odr; /* open drain register */ ++ u32 dat; /* data register */ ++ u32 ier; /* interrupt event register */ ++ u32 imr; /* interrupt mask register */ ++ u32 icr; /* external interrupt control register */ + u8 res0[0xE8]; +-} gpio8349_t; ++} gpio83xx_t; ++#endif ++ ++#if defined (CONFIG_MPC8360) ++/* ++ * QE Ports Interrupts Registers ++ */ ++typedef struct qepi83xx { ++ u8 res0[0xC]; ++ u32 qepier; /* QE Ports Interrupt Event Register */ ++#define QEPIER_PA15 0x80000000 ++#define QEPIER_PA16 0x40000000 ++#define QEPIER_PA29 0x20000000 ++#define QEPIER_PA30 0x10000000 ++#define QEPIER_PB3 0x08000000 ++#define QEPIER_PB5 0x04000000 ++#define QEPIER_PB12 0x02000000 ++#define QEPIER_PB13 0x01000000 ++#define QEPIER_PB26 0x00800000 ++#define QEPIER_PB27 0x00400000 ++#define QEPIER_PC27 0x00200000 ++#define QEPIER_PC28 0x00100000 ++#define QEPIER_PC29 0x00080000 ++#define QEPIER_PD12 0x00040000 ++#define QEPIER_PD13 0x00020000 ++#define QEPIER_PD16 0x00010000 ++#define QEPIER_PD17 0x00008000 ++#define QEPIER_PD26 0x00004000 ++#define QEPIER_PD27 0x00002000 ++#define QEPIER_PE12 0x00001000 ++#define QEPIER_PE13 0x00000800 ++#define QEPIER_PE24 0x00000400 ++#define QEPIER_PE25 0x00000200 ++#define QEPIER_PE26 0x00000100 ++#define QEPIER_PE27 0x00000080 ++#define QEPIER_PE31 0x00000040 ++#define QEPIER_PF20 0x00000020 ++#define QEPIER_PG31 0x00000010 ++#define QEPIER_RES ~(QEPIER_PA15|QEPIER_PA16|QEPIER_PA29|QEPIER_PA30|QEPIER_PB3 \ ++ |QEPIER_PB5|QEPIER_PB12|QEPIER_PB13|QEPIER_PB26|QEPIER_PB27 \ ++ |QEPIER_PC27|QEPIER_PC28|QEPIER_PC29|QEPIER_PD12|QEPIER_PD13 \ ++ |QEPIER_PD16|QEPIER_PD17|QEPIER_PD26|QEPIER_PD27|QEPIER_PE12 \ ++ |QEPIER_PE13|QEPIER_PE24|QEPIER_PE25|QEPIER_PE26|QEPIER_PE27 \ ++ |QEPIER_PE31|QEPIER_PF20|QEPIER_PG31) ++ u32 qepimr; /* QE Ports Interrupt Mask Register */ ++#define QEPIMR_PA15 0x80000000 ++#define QEPIMR_PA16 0x40000000 ++#define QEPIMR_PA29 0x20000000 ++#define QEPIMR_PA30 0x10000000 ++#define QEPIMR_PB3 0x08000000 ++#define QEPIMR_PB5 0x04000000 ++#define QEPIMR_PB12 0x02000000 ++#define QEPIMR_PB13 0x01000000 ++#define QEPIMR_PB26 0x00800000 ++#define QEPIMR_PB27 0x00400000 ++#define QEPIMR_PC27 0x00200000 ++#define QEPIMR_PC28 0x00100000 ++#define QEPIMR_PC29 0x00080000 ++#define QEPIMR_PD12 0x00040000 ++#define QEPIMR_PD13 0x00020000 ++#define QEPIMR_PD16 0x00010000 ++#define QEPIMR_PD17 0x00008000 ++#define QEPIMR_PD26 0x00004000 ++#define QEPIMR_PD27 0x00002000 ++#define QEPIMR_PE12 0x00001000 ++#define QEPIMR_PE13 0x00000800 ++#define QEPIMR_PE24 0x00000400 ++#define QEPIMR_PE25 0x00000200 ++#define QEPIMR_PE26 0x00000100 ++#define QEPIMR_PE27 0x00000080 ++#define QEPIMR_PE31 0x00000040 ++#define QEPIMR_PF20 0x00000020 ++#define QEPIMR_PG31 0x00000010 ++#define QEPIMR_RES ~(QEPIMR_PA15|QEPIMR_PA16|QEPIMR_PA29|QEPIMR_PA30|QEPIMR_PB3 \ ++ |QEPIMR_PB5|QEPIMR_PB12|QEPIMR_PB13|QEPIMR_PB26|QEPIMR_PB27 \ ++ |QEPIMR_PC27|QEPIMR_PC28|QEPIMR_PC29|QEPIMR_PD12|QEPIMR_PD13 \ ++ |QEPIMR_PD16|QEPIMR_PD17|QEPIMR_PD26|QEPIMR_PD27|QEPIMR_PE12 \ ++ |QEPIMR_PE13|QEPIMR_PE24|QEPIMR_PE25|QEPIMR_PE26|QEPIMR_PE27 \ ++ |QEPIMR_PE31|QEPIMR_PF20|QEPIMR_PG31) ++ u32 qepicr; /* QE Ports Interrupt Control Register */ ++#define QEPICR_PA15 0x80000000 ++#define QEPICR_PA16 0x40000000 ++#define QEPICR_PA29 0x20000000 ++#define QEPICR_PA30 0x10000000 ++#define QEPICR_PB3 0x08000000 ++#define QEPICR_PB5 0x04000000 ++#define QEPICR_PB12 0x02000000 ++#define QEPICR_PB13 0x01000000 ++#define QEPICR_PB26 0x00800000 ++#define QEPICR_PB27 0x00400000 ++#define QEPICR_PC27 0x00200000 ++#define QEPICR_PC28 0x00100000 ++#define QEPICR_PC29 0x00080000 ++#define QEPICR_PD12 0x00040000 ++#define QEPICR_PD13 0x00020000 ++#define QEPICR_PD16 0x00010000 ++#define QEPICR_PD17 0x00008000 ++#define QEPICR_PD26 0x00004000 ++#define QEPICR_PD27 0x00002000 ++#define QEPICR_PE12 0x00001000 ++#define QEPICR_PE13 0x00000800 ++#define QEPICR_PE24 0x00000400 ++#define QEPICR_PE25 0x00000200 ++#define QEPICR_PE26 0x00000100 ++#define QEPICR_PE27 0x00000080 ++#define QEPICR_PE31 0x00000040 ++#define QEPICR_PF20 0x00000020 ++#define QEPICR_PG31 0x00000010 ++#define QEPICR_RES ~(QEPICR_PA15|QEPICR_PA16|QEPICR_PA29|QEPICR_PA30|QEPICR_PB3 \ ++ |QEPICR_PB5|QEPICR_PB12|QEPICR_PB13|QEPICR_PB26|QEPICR_PB27 \ ++ |QEPICR_PC27|QEPICR_PC28|QEPICR_PC29|QEPICR_PD12|QEPICR_PD13 \ ++ |QEPICR_PD16|QEPICR_PD17|QEPICR_PD26|QEPICR_PD27|QEPICR_PE12 \ ++ |QEPICR_PE13|QEPICR_PE24|QEPICR_PE25|QEPICR_PE26|QEPICR_PE27 \ ++ |QEPICR_PE31|QEPICR_PF20|QEPICR_PG31) ++ u8 res1[0xE8]; ++} qepi83xx_t; ++ ++/* ++ * general purpose I/O module ++ */ ++typedef struct gpio_n { ++ u32 podr; /* Open Drain Register */ ++ u32 pdat; /* Data Register */ ++ u32 dir1; /* direction register 1 */ ++ u32 dir2; /* direction register 2 */ ++ u32 ppar1; /* Pin Assignment Register 1 */ ++ u32 ppar2; /* Pin Assignment Register 2 */ ++} gpio_n_t; ++ ++typedef struct gpio83xx { ++ gpio_n_t ioport[0x7]; ++ u8 res0[0x358]; ++} gpio83xx_t; ++ ++/* ++ * QE Secondary Bus Access Windows ++ */ ++ ++typedef struct qesba83xx { ++ u32 lbmcsar; /* Local bus memory controller start address */ ++#define LBMCSAR_SA 0x000FFFFF /* 20 most-significant bits of the start address */ ++#define LBMCSAR_RES ~(LBMCSAR_SA) ++ u32 sdmcsar; /* Secondary DDR memory controller start address */ ++#define SDMCSAR_SA 0x000FFFFF /* 20 most-significant bits of the start address */ ++#define SDMCSAR_RES ~(SDMCSAR_SA) ++ u8 res0[0x38]; ++ u32 lbmcear; /* Local bus memory controller end address */ ++#define LBMCEAR_EA 0x000FFFFF /* 20 most-significant bits of the end address */ ++#define LBMCEAR_RES ~(LBMCEAR_EA) ++ u32 sdmcear; /* Secondary DDR memory controller end address */ ++#define SDMCEAR_EA 0x000FFFFF /* 20 most-significant bits of the end address */ ++#define SDMCEAR_RES ~(SDMCEAR_EA) ++ u8 res1[0x38]; ++ u32 lbmcar; /* Local bus memory controller attributes */ ++#define LBMCAR_WEN 0x00000001 /* Forward transactions to the QE local bus */ ++#define LBMCAR_RES ~(LBMCAR_WEN) ++ u32 sdmcar; /* Secondary DDR memory controller attributes */ ++#define SDMCAR_WEN 0x00000001 /* Forward transactions to the second DDR bus */ ++#define SDMCAR_RES ~(SDMCAR_WEN) ++ u8 res2[0x778]; ++} qesba83xx_t; ++#endif + + /* + * DDR Memory Controller Memory Map + */ +-typedef struct ddr_cs_bnds{ ++typedef struct ddr_cs_bnds { + u32 csbnds; + #define CSBNDS_SA 0x00FF0000 +-#define CSBNDS_SA_SHIFT 8 ++#define CSBNDS_SA_SHIFT 8 + #define CSBNDS_EA 0x000000FF +-#define CSBNDS_EA_SHIFT 24 +- u8 res0[4]; ++#define CSBNDS_EA_SHIFT 24 ++ u8 res0[4]; + } ddr_cs_bnds_t; + +-typedef struct ddr8349{ +- ddr_cs_bnds_t csbnds[4]; /**< Chip Select x Memory Bounds */ ++typedef struct ddr83xx { ++ ddr_cs_bnds_t csbnds[4]; /**< Chip Select x Memory Bounds */ + u8 res0[0x60]; +- u32 cs_config[4]; /**< Chip Select x Configuration */ +-#define CSCONFIG_EN 0x80000000 +-#define CSCONFIG_AP 0x00800000 ++ u32 cs_config[4]; /**< Chip Select x Configuration */ ++#define CSCONFIG_EN 0x80000000 ++#define CSCONFIG_AP 0x00800000 + #define CSCONFIG_ROW_BIT 0x00000700 + #define CSCONFIG_ROW_BIT_12 0x00000000 + #define CSCONFIG_ROW_BIT_13 0x00000100 +@@ -598,7 +941,7 @@ typedef struct ddr8349{ + #define CSCONFIG_COL_BIT_10 0x00000002 + #define CSCONFIG_COL_BIT_11 0x00000003 + u8 res1[0x78]; +- u32 timing_cfg_1; /**< SDRAM Timing Configuration 1 */ ++ u32 timing_cfg_1; /**< SDRAM Timing Configuration 1 */ + #define TIMING_CFG1_PRETOACT 0x70000000 + #define TIMING_CFG1_PRETOACT_SHIFT 28 + #define TIMING_CFG1_ACTTOPRE 0x0F000000 +@@ -610,70 +953,70 @@ typedef struct ddr8349{ + #define TIMING_CFG1_REFREC 0x0000F000 + #define TIMING_CFG1_REFREC_SHIFT 12 + #define TIMING_CFG1_WRREC 0x00000700 +-#define TIMING_CFG1_WRREC_SHIFT 8 ++#define TIMING_CFG1_WRREC_SHIFT 8 + #define TIMING_CFG1_ACTTOACT 0x00000070 + #define TIMING_CFG1_ACTTOACT_SHIFT 4 + #define TIMING_CFG1_WRTORD 0x00000007 + #define TIMING_CFG1_WRTORD_SHIFT 0 +-#define TIMING_CFG1_CASLAT_20 0x00030000 /* CAS latency = 2.0 */ +-#define TIMING_CFG1_CASLAT_25 0x00040000 /* CAS latency = 2.5 */ ++#define TIMING_CFG1_CASLAT_20 0x00030000 /* CAS latency = 2.0 */ ++#define TIMING_CFG1_CASLAT_25 0x00040000 /* CAS latency = 2.5 */ + +- u32 timing_cfg_2; /**< SDRAM Timing Configuration 2 */ +-#define TIMING_CFG2_CPO 0x0F000000 +-#define TIMING_CFG2_CPO_SHIFT 24 +-#define TIMING_CFG2_ACSM 0x00080000 ++ u32 timing_cfg_2; /**< SDRAM Timing Configuration 2 */ ++#define TIMING_CFG2_CPO 0x0F000000 ++#define TIMING_CFG2_CPO_SHIFT 24 ++#define TIMING_CFG2_ACSM 0x00080000 + #define TIMING_CFG2_WR_DATA_DELAY 0x00001C00 +-#define TIMING_CFG2_WR_DATA_DELAY_SHIFT 10 +-#define TIMING_CFG2_CPO_DEF 0x00000000 /* default (= CASLAT + 1) */ ++#define TIMING_CFG2_WR_DATA_DELAY_SHIFT 10 ++#define TIMING_CFG2_CPO_DEF 0x00000000 /* default (= CASLAT + 1) */ + +- u32 sdram_cfg; /**< SDRAM Control Configuration */ ++ u32 sdram_cfg; /**< SDRAM Control Configuration */ + #define SDRAM_CFG_MEM_EN 0x80000000 +-#define SDRAM_CFG_SREN 0x40000000 ++#define SDRAM_CFG_SREN 0x40000000 + #define SDRAM_CFG_ECC_EN 0x20000000 +-#define SDRAM_CFG_RD_EN 0x10000000 ++#define SDRAM_CFG_RD_EN 0x10000000 + #define SDRAM_CFG_SDRAM_TYPE 0x03000000 + #define SDRAM_CFG_SDRAM_TYPE_SHIFT 24 + #define SDRAM_CFG_DYN_PWR 0x00200000 +-#define SDRAM_CFG_32_BE 0x00080000 +-#define SDRAM_CFG_8_BE 0x00040000 +-#define SDRAM_CFG_NCAP 0x00020000 +-#define SDRAM_CFG_2T_EN 0x00008000 ++#define SDRAM_CFG_32_BE 0x00080000 ++#define SDRAM_CFG_8_BE 0x00040000 ++#define SDRAM_CFG_NCAP 0x00020000 ++#define SDRAM_CFG_2T_EN 0x00008000 + #define SDRAM_CFG_SDRAM_TYPE_DDR 0x02000000 + + u8 res2[4]; +- u32 sdram_mode; /**< SDRAM Mode Configuration */ ++ u32 sdram_mode; /**< SDRAM Mode Configuration */ + #define SDRAM_MODE_ESD 0xFFFF0000 + #define SDRAM_MODE_ESD_SHIFT 16 + #define SDRAM_MODE_SD 0x0000FFFF +-#define SDRAM_MODE_SD_SHIFT 0 +-#define DDR_MODE_EXT_MODEREG 0x4000 /* select extended mode reg */ +-#define DDR_MODE_EXT_OPMODE 0x3FF8 /* operating mode, mask */ +-#define DDR_MODE_EXT_OP_NORMAL 0x0000 /* normal operation */ +-#define DDR_MODE_QFC 0x0004 /* QFC / compatibility, mask */ +-#define DDR_MODE_QFC_COMP 0x0000 /* compatible to older SDRAMs */ +-#define DDR_MODE_WEAK 0x0002 /* weak drivers */ +-#define DDR_MODE_DLL_DIS 0x0001 /* disable DLL */ +-#define DDR_MODE_CASLAT 0x0070 /* CAS latency, mask */ +-#define DDR_MODE_CASLAT_15 0x0010 /* CAS latency 1.5 */ +-#define DDR_MODE_CASLAT_20 0x0020 /* CAS latency 2 */ +-#define DDR_MODE_CASLAT_25 0x0060 /* CAS latency 2.5 */ +-#define DDR_MODE_CASLAT_30 0x0030 /* CAS latency 3 */ +-#define DDR_MODE_BTYPE_SEQ 0x0000 /* sequential burst */ +-#define DDR_MODE_BTYPE_ILVD 0x0008 /* interleaved burst */ +-#define DDR_MODE_BLEN_2 0x0001 /* burst length 2 */ +-#define DDR_MODE_BLEN_4 0x0002 /* burst length 4 */ +-#define DDR_REFINT_166MHZ_7US 1302 /* exact value for 7.8125 µs */ +-#define DDR_BSTOPRE 256 /* use 256 cycles as a starting point */ +-#define DDR_MODE_MODEREG 0x0000 /* select mode register */ ++#define SDRAM_MODE_SD_SHIFT 0 ++#define DDR_MODE_EXT_MODEREG 0x4000 /* select extended mode reg */ ++#define DDR_MODE_EXT_OPMODE 0x3FF8 /* operating mode, mask */ ++#define DDR_MODE_EXT_OP_NORMAL 0x0000 /* normal operation */ ++#define DDR_MODE_QFC 0x0004 /* QFC / compatibility, mask */ ++#define DDR_MODE_QFC_COMP 0x0000 /* compatible to older SDRAMs */ ++#define DDR_MODE_WEAK 0x0002 /* weak drivers */ ++#define DDR_MODE_DLL_DIS 0x0001 /* disable DLL */ ++#define DDR_MODE_CASLAT 0x0070 /* CAS latency, mask */ ++#define DDR_MODE_CASLAT_15 0x0010 /* CAS latency 1.5 */ ++#define DDR_MODE_CASLAT_20 0x0020 /* CAS latency 2 */ ++#define DDR_MODE_CASLAT_25 0x0060 /* CAS latency 2.5 */ ++#define DDR_MODE_CASLAT_30 0x0030 /* CAS latency 3 */ ++#define DDR_MODE_BTYPE_SEQ 0x0000 /* sequential burst */ ++#define DDR_MODE_BTYPE_ILVD 0x0008 /* interleaved burst */ ++#define DDR_MODE_BLEN_2 0x0001 /* burst length 2 */ ++#define DDR_MODE_BLEN_4 0x0002 /* burst length 4 */ ++#define DDR_REFINT_166MHZ_7US 1302 /* exact value for 7.8125 µs */ ++#define DDR_BSTOPRE 256 /* use 256 cycles as a starting point */ ++#define DDR_MODE_MODEREG 0x0000 /* select mode register */ + + u8 res3[8]; +- u32 sdram_interval; /**< SDRAM Interval Configuration */ ++ u32 sdram_interval; /**< SDRAM Interval Configuration */ + #define SDRAM_INTERVAL_REFINT 0x3FFF0000 + #define SDRAM_INTERVAL_REFINT_SHIFT 16 + #define SDRAM_INTERVAL_BSTOPRE 0x00003FFF +-#define SDRAM_INTERVAL_BSTOPRE_SHIFT 0 +- u8 res9[8]; +- u32 sdram_clk_cntl; ++#define SDRAM_INTERVAL_BSTOPRE_SHIFT 0 ++ u8 res9[8]; ++ u32 sdram_clk_cntl; + #define DDR_SDRAM_CLK_CNTL_SS_EN 0x80000000 + #define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_025 0x01000000 + #define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05 0x02000000 +@@ -683,37 +1026,37 @@ typedef struct ddr8349{ + u8 res4[0xCCC]; + u32 data_err_inject_hi; /**< Memory Data Path Error Injection Mask High */ + u32 data_err_inject_lo; /**< Memory Data Path Error Injection Mask Low */ +- u32 ecc_err_inject; /**< Memory Data Path Error Injection Mask ECC */ ++ u32 ecc_err_inject; /**< Memory Data Path Error Injection Mask ECC */ + #define ECC_ERR_INJECT_EMB (0x80000000>>22) /* ECC Mirror Byte */ + #define ECC_ERR_INJECT_EIEN (0x80000000>>23) /* Error Injection Enable */ + #define ECC_ERR_INJECT_EEIM (0xff000000>>24) /* ECC Erroe Injection Enable */ + #define ECC_ERR_INJECT_EEIM_SHIFT 0 + u8 res5[0x14]; +- u32 capture_data_hi; /**< Memory Data Path Read Capture High */ +- u32 capture_data_lo; /**< Memory Data Path Read Capture Low */ +- u32 capture_ecc; /**< Memory Data Path Read Capture ECC */ ++ u32 capture_data_hi; /**< Memory Data Path Read Capture High */ ++ u32 capture_data_lo; /**< Memory Data Path Read Capture Low */ ++ u32 capture_ecc; /**< Memory Data Path Read Capture ECC */ + #define CAPTURE_ECC_ECE (0xff000000>>24) + #define CAPTURE_ECC_ECE_SHIFT 0 + u8 res6[0x14]; +- u32 err_detect; /**< Memory Error Detect */ +-#define ECC_ERROR_DETECT_MME (0x80000000>>0) /* Multiple Memory Errors */ ++ u32 err_detect; /**< Memory Error Detect */ ++#define ECC_ERROR_DETECT_MME (0x80000000>>0) /* Multiple Memory Errors */ + #define ECC_ERROR_DETECT_MBE (0x80000000>>28) /* Multiple-Bit Error */ + #define ECC_ERROR_DETECT_SBE (0x80000000>>29) /* Single-Bit ECC Error Pickup */ + #define ECC_ERROR_DETECT_MSE (0x80000000>>31) /* Memory Select Error */ +- u32 err_disable; /**< Memory Error Disable */ ++ u32 err_disable; /**< Memory Error Disable */ + #define ECC_ERROR_DISABLE_MBED (0x80000000>>28) /* Multiple-Bit ECC Error Disable */ + #define ECC_ERROR_DISABLE_SBED (0x80000000>>29) /* Sinle-Bit ECC Error disable */ + #define ECC_ERROR_DISABLE_MSED (0x80000000>>31) /* Memory Select Error Disable */ + #define ECC_ERROR_ENABLE ~(ECC_ERROR_DISABLE_MSED|ECC_ERROR_DISABLE_SBED|ECC_ERROR_DISABLE_MBED) +- u32 err_int_en; /**< Memory Error Interrupt Enable */ ++ u32 err_int_en; /**< Memory Error Interrupt Enable */ + #define ECC_ERR_INT_EN_MBEE (0x80000000>>28) /* Multiple-Bit ECC Error Interrupt Enable */ + #define ECC_ERR_INT_EN_SBEE (0x80000000>>29) /* Single-Bit ECC Error Interrupt Enable */ + #define ECC_ERR_INT_EN_MSEE (0x80000000>>31) /* Memory Select Error Interrupt Enable */ + #define ECC_ERR_INT_DISABLE ~(ECC_ERR_INT_EN_MBEE|ECC_ERR_INT_EN_SBEE|ECC_ERR_INT_EN_MSEE) + u32 capture_attributes; /**< Memory Error Attributes Capture */ +-#define ECC_CAPT_ATTR_BNUM (0xe0000000>>1) /* Data Beat Num */ ++#define ECC_CAPT_ATTR_BNUM (0xe0000000>>1) /* Data Beat Num */ + #define ECC_CAPT_ATTR_BNUM_SHIFT 28 +-#define ECC_CAPT_ATTR_TSIZ (0xc0000000>>6) /* Transaction Size */ ++#define ECC_CAPT_ATTR_TSIZ (0xc0000000>>6) /* Transaction Size */ + #define ECC_CAPT_ATTR_TSIZ_FOUR_DW 0 + #define ECC_CAPT_ATTR_TSIZ_ONE_DW 1 + #define ECC_CAPT_ATTR_TSIZ_TWO_DW 2 +@@ -738,209 +1081,207 @@ typedef struct ddr8349{ + #define ECC_CAPT_ATTR_TTYP_R_M_W 0x3 + #define ECC_CAPT_ATTR_TTYP_SHIFT 12 + #define ECC_CAPT_ATTR_VLD (0x80000000>>31) /* Valid */ +- u32 capture_address; /**< Memory Error Address Capture */ ++ u32 capture_address; /**< Memory Error Address Capture */ + u32 capture_ext_address;/**< Memory Error Extended Address Capture */ +- u32 err_sbe; /**< Memory Single-Bit ECC Error Management */ +-#define ECC_ERROR_MAN_SBET (0xff000000>>8) /* Single-Bit Error Threshold 0..255*/ ++ u32 err_sbe; /**< Memory Single-Bit ECC Error Management */ ++#define ECC_ERROR_MAN_SBET (0xff000000>>8) /* Single-Bit Error Threshold 0..255 */ + #define ECC_ERROR_MAN_SBET_SHIFT 16 +-#define ECC_ERROR_MAN_SBEC (0xff000000>>24) /* Single Bit Error Counter 0..255*/ ++#define ECC_ERROR_MAN_SBEC (0xff000000>>24) /* Single Bit Error Counter 0..255 */ + #define ECC_ERROR_MAN_SBEC_SHIFT 0 + u8 res7[0xA4]; + u32 debug_reg; + u8 res8[0xFC]; +-} ddr8349_t; ++} ddr83xx_t; + + /* + * I2C1 Controller + */ + +- + /* + * DUART + */ +-typedef struct duart8349{ ++typedef struct duart83xx { + u8 urbr_ulcr_udlb; /**< combined register for URBR, UTHR and UDLB */ +- u8 uier_udmb; /**< combined register for UIER and UDMB */ ++ u8 uier_udmb; /**< combined register for UIER and UDMB */ + u8 uiir_ufcr_uafr; /**< combined register for UIIR, UFCR and UAFR */ +- u8 ulcr; /**< line control register */ +- u8 umcr; /**< MODEM control register */ +- u8 ulsr; /**< line status register */ +- u8 umsr; /**< MODEM status register */ +- u8 uscr; /**< scratch register */ ++ u8 ulcr; /**< line control register */ ++ u8 umcr; /**< MODEM control register */ ++ u8 ulsr; /**< line status register */ ++ u8 umsr; /**< MODEM status register */ ++ u8 uscr; /**< scratch register */ + u8 res0[8]; +- u8 udsr; /**< DMA status register */ ++ u8 udsr; /**< DMA status register */ + u8 res1[3]; + u8 res2[0xEC]; +-} duart8349_t; ++} duart83xx_t; + + /* + * Local Bus Controller Registers + */ +-typedef struct lbus_bank{ +- u32 br; /**< Base Register */ +- u32 or; /**< Base Register */ ++typedef struct lbus_bank { ++ u32 br; /**< Base Register */ ++ u32 or; /**< Base Register */ + } lbus_bank_t; + +-typedef struct lbus8349 { ++typedef struct lbus83xx { + lbus_bank_t bank[8]; + u8 res0[0x28]; +- u32 mar; /**< UPM Address Register */ ++ u32 mar; /**< UPM Address Register */ + u8 res1[0x4]; +- u32 mamr; /**< UPMA Mode Register */ +- u32 mbmr; /**< UPMB Mode Register */ +- u32 mcmr; /**< UPMC Mode Register */ ++ u32 mamr; /**< UPMA Mode Register */ ++ u32 mbmr; /**< UPMB Mode Register */ ++ u32 mcmr; /**< UPMC Mode Register */ + u8 res2[0x8]; +- u32 mrtpr; /**< Memory Refresh Timer Prescaler Register */ +- u32 mdr; /**< UPM Data Register */ ++ u32 mrtpr; /**< Memory Refresh Timer Prescaler Register */ ++ u32 mdr; /**< UPM Data Register */ + u8 res3[0x8]; +- u32 lsdmr; /**< SDRAM Mode Register */ ++ u32 lsdmr; /**< SDRAM Mode Register */ + u8 res4[0x8]; +- u32 lurt; /**< UPM Refresh Timer */ +- u32 lsrt; /**< SDRAM Refresh Timer */ ++ u32 lurt; /**< UPM Refresh Timer */ ++ u32 lsrt; /**< SDRAM Refresh Timer */ + u8 res5[0x8]; +- u32 ltesr; /**< Transfer Error Status Register */ +- u32 ltedr; /**< Transfer Error Disable Register */ +- u32 lteir; /**< Transfer Error Interrupt Register */ +- u32 lteatr; /**< Transfer Error Attributes Register */ +- u32 ltear; /**< Transfer Error Address Register */ ++ u32 ltesr; /**< Transfer Error Status Register */ ++ u32 ltedr; /**< Transfer Error Disable Register */ ++ u32 lteir; /**< Transfer Error Interrupt Register */ ++ u32 lteatr; /**< Transfer Error Attributes Register */ ++ u32 ltear; /**< Transfer Error Address Register */ + u8 res6[0xC]; +- u32 lbcr; /**< Configuration Register */ ++ u32 lbcr; /**< Configuration Register */ + #define LBCR_LDIS 0x80000000 +-#define LBCR_LDIS_SHIFT 31 ++#define LBCR_LDIS_SHIFT 31 + #define LBCR_BCTLC 0x00C00000 + #define LBCR_BCTLC_SHIFT 22 + #define LBCR_LPBSE 0x00020000 + #define LBCR_LPBSE_SHIFT 17 + #define LBCR_EPAR 0x00010000 +-#define LBCR_EPAR_SHIFT 16 ++#define LBCR_EPAR_SHIFT 16 + #define LBCR_BMT 0x0000FF00 +-#define LBCR_BMT_SHIFT 8 +- u32 lcrr; /**< Clock Ratio Register */ ++#define LBCR_BMT_SHIFT 8 ++ u32 lcrr; /**< Clock Ratio Register */ + #define LCRR_DBYP 0x80000000 +-#define LCRR_DBYP_SHIFT 31 ++#define LCRR_DBYP_SHIFT 31 + #define LCRR_BUFCMDC 0x30000000 + #define LCRR_BUFCMDC_SHIFT 28 + #define LCRR_ECL 0x03000000 +-#define LCRR_ECL_SHIFT 24 ++#define LCRR_ECL_SHIFT 24 + #define LCRR_EADC 0x00030000 +-#define LCRR_EADC_SHIFT 16 ++#define LCRR_EADC_SHIFT 16 + #define LCRR_CLKDIV 0x0000000F + #define LCRR_CLKDIV_SHIFT 0 + +- + u8 res7[0x28]; + u8 res8[0xF00]; +-} lbus8349_t; ++} lbus83xx_t; + ++#if defined (CONFIG_MPC8349) + /* + * Serial Peripheral Interface + */ +-typedef struct spi8349 +-{ ++typedef struct spi83xx { + u32 mode; /**< mode register */ + u32 event; /**< event register */ + u32 mask; /**< mask register */ + u32 com; /**< command register */ + u8 res0[0x10]; +- u32 tx; /**< transmit register */ +- u32 rx; /**< receive register */ ++ u32 tx; /**< transmit register */ ++ u32 rx; /**< receive register */ + u8 res1[0xD8]; +-} spi8349_t; +- ++} spi83xx_t; ++#endif + + /* + * DMA/Messaging Unit + */ +-typedef struct dma8349 { +- u32 res0[0xC]; /* 0x0-0x29 reseverd */ +- u32 omisr; /* 0x30 Outbound message interrupt status register */ +- u32 omimr; /* 0x34 Outbound message interrupt mask register */ +- u32 res1[0x6]; /* 0x38-0x49 reserved */ +- +- u32 imr0; /* 0x50 Inbound message register 0 */ +- u32 imr1; /* 0x54 Inbound message register 1 */ +- u32 omr0; /* 0x58 Outbound message register 0 */ +- u32 omr1; /* 0x5C Outbound message register 1 */ +- +- u32 odr; /* 0x60 Outbound doorbell register */ +- u32 res2; /* 0x64-0x67 reserved */ +- u32 idr; /* 0x68 Inbound doorbell register */ +- u32 res3[0x5]; /* 0x6C-0x79 reserved */ +- +- u32 imisr; /* 0x80 Inbound message interrupt status register */ +- u32 imimr; /* 0x84 Inbound message interrupt mask register */ +- u32 res4[0x1E]; /* 0x88-0x99 reserved */ +- +- u32 dmamr0; /* 0x100 DMA 0 mode register */ +- u32 dmasr0; /* 0x104 DMA 0 status register */ +- u32 dmacdar0; /* 0x108 DMA 0 current descriptor address register */ +- u32 res5; /* 0x10C reserved */ +- u32 dmasar0; /* 0x110 DMA 0 source address register */ +- u32 res6; /* 0x114 reserved */ +- u32 dmadar0; /* 0x118 DMA 0 destination address register */ +- u32 res7; /* 0x11C reserved */ +- u32 dmabcr0; /* 0x120 DMA 0 byte count register */ +- u32 dmandar0; /* 0x124 DMA 0 next descriptor address register */ +- u32 res8[0x16]; /* 0x128-0x179 reserved */ +- +- u32 dmamr1; /* 0x180 DMA 1 mode register */ +- u32 dmasr1; /* 0x184 DMA 1 status register */ +- u32 dmacdar1; /* 0x188 DMA 1 current descriptor address register */ +- u32 res9; /* 0x18C reserved */ +- u32 dmasar1; /* 0x190 DMA 1 source address register */ +- u32 res10; /* 0x194 reserved */ +- u32 dmadar1; /* 0x198 DMA 1 destination address register */ +- u32 res11; /* 0x19C reserved */ +- u32 dmabcr1; /* 0x1A0 DMA 1 byte count register */ +- u32 dmandar1; /* 0x1A4 DMA 1 next descriptor address register */ +- u32 res12[0x16];/* 0x1A8-0x199 reserved */ +- +- u32 dmamr2; /* 0x200 DMA 2 mode register */ +- u32 dmasr2; /* 0x204 DMA 2 status register */ +- u32 dmacdar2; /* 0x208 DMA 2 current descriptor address register */ +- u32 res13; /* 0x20C reserved */ +- u32 dmasar2; /* 0x210 DMA 2 source address register */ +- u32 res14; /* 0x214 reserved */ +- u32 dmadar2; /* 0x218 DMA 2 destination address register */ +- u32 res15; /* 0x21C reserved */ +- u32 dmabcr2; /* 0x220 DMA 2 byte count register */ +- u32 dmandar2; /* 0x224 DMA 2 next descriptor address register */ +- u32 res16[0x16];/* 0x228-0x279 reserved */ +- +- u32 dmamr3; /* 0x280 DMA 3 mode register */ +- u32 dmasr3; /* 0x284 DMA 3 status register */ +- u32 dmacdar3; /* 0x288 DMA 3 current descriptor address register */ +- u32 res17; /* 0x28C reserved */ +- u32 dmasar3; /* 0x290 DMA 3 source address register */ +- u32 res18; /* 0x294 reserved */ +- u32 dmadar3; /* 0x298 DMA 3 destination address register */ +- u32 res19; /* 0x29C reserved */ +- u32 dmabcr3; /* 0x2A0 DMA 3 byte count register */ +- u32 dmandar3; /* 0x2A4 DMA 3 next descriptor address register */ +- +- u32 dmagsr; /* 0x2A8 DMA general status register */ +- u32 res20[0x15];/* 0x2AC-0x2FF reserved */ +-} dma8349_t; ++typedef struct dma83xx { ++ u32 res0[0xC]; /* 0x0-0x29 reseverd */ ++ u32 omisr; /* 0x30 Outbound message interrupt status register */ ++ u32 omimr; /* 0x34 Outbound message interrupt mask register */ ++ u32 res1[0x6]; /* 0x38-0x49 reserved */ ++ ++ u32 imr0; /* 0x50 Inbound message register 0 */ ++ u32 imr1; /* 0x54 Inbound message register 1 */ ++ u32 omr0; /* 0x58 Outbound message register 0 */ ++ u32 omr1; /* 0x5C Outbound message register 1 */ ++ ++ u32 odr; /* 0x60 Outbound doorbell register */ ++ u32 res2; /* 0x64-0x67 reserved */ ++ u32 idr; /* 0x68 Inbound doorbell register */ ++ u32 res3[0x5]; /* 0x6C-0x79 reserved */ ++ ++ u32 imisr; /* 0x80 Inbound message interrupt status register */ ++ u32 imimr; /* 0x84 Inbound message interrupt mask register */ ++ u32 res4[0x1E]; /* 0x88-0x99 reserved */ ++ ++ u32 dmamr0; /* 0x100 DMA 0 mode register */ ++ u32 dmasr0; /* 0x104 DMA 0 status register */ ++ u32 dmacdar0; /* 0x108 DMA 0 current descriptor address register */ ++ u32 res5; /* 0x10C reserved */ ++ u32 dmasar0; /* 0x110 DMA 0 source address register */ ++ u32 res6; /* 0x114 reserved */ ++ u32 dmadar0; /* 0x118 DMA 0 destination address register */ ++ u32 res7; /* 0x11C reserved */ ++ u32 dmabcr0; /* 0x120 DMA 0 byte count register */ ++ u32 dmandar0; /* 0x124 DMA 0 next descriptor address register */ ++ u32 res8[0x16]; /* 0x128-0x179 reserved */ ++ ++ u32 dmamr1; /* 0x180 DMA 1 mode register */ ++ u32 dmasr1; /* 0x184 DMA 1 status register */ ++ u32 dmacdar1; /* 0x188 DMA 1 current descriptor address register */ ++ u32 res9; /* 0x18C reserved */ ++ u32 dmasar1; /* 0x190 DMA 1 source address register */ ++ u32 res10; /* 0x194 reserved */ ++ u32 dmadar1; /* 0x198 DMA 1 destination address register */ ++ u32 res11; /* 0x19C reserved */ ++ u32 dmabcr1; /* 0x1A0 DMA 1 byte count register */ ++ u32 dmandar1; /* 0x1A4 DMA 1 next descriptor address register */ ++ u32 res12[0x16]; /* 0x1A8-0x199 reserved */ ++ ++ u32 dmamr2; /* 0x200 DMA 2 mode register */ ++ u32 dmasr2; /* 0x204 DMA 2 status register */ ++ u32 dmacdar2; /* 0x208 DMA 2 current descriptor address register */ ++ u32 res13; /* 0x20C reserved */ ++ u32 dmasar2; /* 0x210 DMA 2 source address register */ ++ u32 res14; /* 0x214 reserved */ ++ u32 dmadar2; /* 0x218 DMA 2 destination address register */ ++ u32 res15; /* 0x21C reserved */ ++ u32 dmabcr2; /* 0x220 DMA 2 byte count register */ ++ u32 dmandar2; /* 0x224 DMA 2 next descriptor address register */ ++ u32 res16[0x16]; /* 0x228-0x279 reserved */ ++ ++ u32 dmamr3; /* 0x280 DMA 3 mode register */ ++ u32 dmasr3; /* 0x284 DMA 3 status register */ ++ u32 dmacdar3; /* 0x288 DMA 3 current descriptor address register */ ++ u32 res17; /* 0x28C reserved */ ++ u32 dmasar3; /* 0x290 DMA 3 source address register */ ++ u32 res18; /* 0x294 reserved */ ++ u32 dmadar3; /* 0x298 DMA 3 destination address register */ ++ u32 res19; /* 0x29C reserved */ ++ u32 dmabcr3; /* 0x2A0 DMA 3 byte count register */ ++ u32 dmandar3; /* 0x2A4 DMA 3 next descriptor address register */ ++ ++ u32 dmagsr; /* 0x2A8 DMA general status register */ ++ u32 res20[0x15]; /* 0x2AC-0x2FF reserved */ ++} dma83xx_t; + + /* DMAMRn bits */ +-#define DMA_CHANNEL_START (0x00000001) /* Bit - DMAMRn CS */ +-#define DMA_CHANNEL_TRANSFER_MODE_DIRECT (0x00000004) /* Bit - DMAMRn CTM */ +-#define DMA_CHANNEL_SOURCE_ADRESSS_HOLD_EN (0x00001000) /* Bit - DMAMRn SAHE */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_1B (0x00000000) /* 2Bit- DMAMRn SAHTS 1byte */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_2B (0x00004000) /* 2Bit- DMAMRn SAHTS 2bytes */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_4B (0x00008000) /* 2Bit- DMAMRn SAHTS 4bytes */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_8B (0x0000c000) /* 2Bit- DMAMRn SAHTS 8bytes */ +-#define DMA_CHANNEL_SNOOP (0x00010000) /* Bit - DMAMRn DMSEN */ ++#define DMA_CHANNEL_START (0x00000001) /* Bit - DMAMRn CS */ ++#define DMA_CHANNEL_TRANSFER_MODE_DIRECT (0x00000004) /* Bit - DMAMRn CTM */ ++#define DMA_CHANNEL_SOURCE_ADRESSS_HOLD_EN (0x00001000) /* Bit - DMAMRn SAHE */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_1B (0x00000000) /* 2Bit- DMAMRn SAHTS 1byte */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_2B (0x00004000) /* 2Bit- DMAMRn SAHTS 2bytes */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_4B (0x00008000) /* 2Bit- DMAMRn SAHTS 4bytes */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_8B (0x0000c000) /* 2Bit- DMAMRn SAHTS 8bytes */ ++#define DMA_CHANNEL_SNOOP (0x00010000) /* Bit - DMAMRn DMSEN */ + + /* DMASRn bits */ +-#define DMA_CHANNEL_BUSY (0x00000004) /* Bit - DMASRn CB */ +-#define DMA_CHANNEL_TRANSFER_ERROR (0x00000080) /* Bit - DMASRn TE */ ++#define DMA_CHANNEL_BUSY (0x00000004) /* Bit - DMASRn CB */ ++#define DMA_CHANNEL_TRANSFER_ERROR (0x00000080) /* Bit - DMASRn TE */ + + /* + * PCI Software Configuration Registers + */ +-typedef struct pciconf8349 { +- u32 config_address; ++typedef struct pciconf83xx { ++ u32 config_address; + #define PCI_CONFIG_ADDRESS_EN 0x80000000 + #define PCI_CONFIG_ADDRESS_BN_SHIFT 16 + #define PCI_CONFIG_ADDRESS_BN_MASK 0x00ff0000 +@@ -952,235 +1293,788 @@ typedef struct pciconf8349 { + #define PCI_CONFIG_ADDRESS_RN_MASK 0x000000fc + u32 config_data; + u32 int_ack; +- u8 res[116]; +-} pciconf8349_t; ++ u8 res[116]; ++} pciconf83xx_t; + + /* + * PCI Outbound Translation Register + */ + typedef struct pci_outbound_window { +- u32 potar; +- u8 res0[4]; +- u32 pobar; +- u8 res1[4]; +- u32 pocmr; +- u8 res2[4]; +-} pot8349_t; ++ u32 potar; ++ u8 res0[4]; ++ u32 pobar; ++ u8 res1[4]; ++ u32 pocmr; ++ u8 res2[4]; ++} pot83xx_t; ++ + /* + * Sequencer + */ +-typedef struct ios8349 { +- pot8349_t pot[6]; ++typedef struct ios83xx { ++ pot83xx_t pot[6]; + #define POTAR_TA_MASK 0x000fffff +-#define POBAR_BA_MASK 0x000fffff +-#define POCMR_EN 0x80000000 +-#define POCMR_IO 0x40000000 /* 0--memory space 1--I/O space */ +-#define POCMR_SE 0x20000000 /* streaming enable */ +-#define POCMR_DST 0x10000000 /* 0--PCI1 1--PCI2*/ +-#define POCMR_CM_MASK 0x000fffff +-#define POCMR_CM_4G 0x00000000 +-#define POCMR_CM_2G 0x00080000 +-#define POCMR_CM_1G 0x000C0000 +-#define POCMR_CM_512M 0x000E0000 +-#define POCMR_CM_256M 0x000F0000 +-#define POCMR_CM_128M 0x000F8000 +-#define POCMR_CM_64M 0x000FC000 +-#define POCMR_CM_32M 0x000FE000 +-#define POCMR_CM_16M 0x000FF000 +-#define POCMR_CM_8M 0x000FF800 +-#define POCMR_CM_4M 0x000FFC00 +-#define POCMR_CM_2M 0x000FFE00 +-#define POCMR_CM_1M 0x000FFF00 +-#define POCMR_CM_512K 0x000FFF80 +-#define POCMR_CM_256K 0x000FFFC0 +-#define POCMR_CM_128K 0x000FFFE0 +-#define POCMR_CM_64K 0x000FFFF0 +-#define POCMR_CM_32K 0x000FFFF8 +-#define POCMR_CM_16K 0x000FFFFC +-#define POCMR_CM_8K 0x000FFFFE +-#define POCMR_CM_4K 0x000FFFFF +- u8 res0[0x60]; +- u32 pmcr; +- u8 res1[4]; +- u32 dtcr; +- u8 res2[4]; +-} ios8349_t; ++#define POBAR_BA_MASK 0x000fffff ++#define POCMR_EN 0x80000000 ++#define POCMR_IO 0x40000000 /* 0--memory space 1--I/O space */ ++#define POCMR_SE 0x20000000 /* streaming enable */ ++#define POCMR_DST 0x10000000 /* 0--PCI1 1--PCI2 */ ++#define POCMR_CM_MASK 0x000fffff ++#define POCMR_CM_4G 0x00000000 ++#define POCMR_CM_2G 0x00080000 ++#define POCMR_CM_1G 0x000C0000 ++#define POCMR_CM_512M 0x000E0000 ++#define POCMR_CM_256M 0x000F0000 ++#define POCMR_CM_128M 0x000F8000 ++#define POCMR_CM_64M 0x000FC000 ++#define POCMR_CM_32M 0x000FE000 ++#define POCMR_CM_16M 0x000FF000 ++#define POCMR_CM_8M 0x000FF800 ++#define POCMR_CM_4M 0x000FFC00 ++#define POCMR_CM_2M 0x000FFE00 ++#define POCMR_CM_1M 0x000FFF00 ++#define POCMR_CM_512K 0x000FFF80 ++#define POCMR_CM_256K 0x000FFFC0 ++#define POCMR_CM_128K 0x000FFFE0 ++#define POCMR_CM_64K 0x000FFFF0 ++#define POCMR_CM_32K 0x000FFFF8 ++#define POCMR_CM_16K 0x000FFFFC ++#define POCMR_CM_8K 0x000FFFFE ++#define POCMR_CM_4K 0x000FFFFF ++ u8 res0[0x60]; ++ u32 pmcr; ++ u8 res1[4]; ++ u32 dtcr; ++ u8 res2[4]; ++} ios83xx_t; + + /* + * PCI Controller Control and Status Registers + */ +-typedef struct pcictrl8349 { +- u32 esr; ++typedef struct pcictrl83xx { ++ u32 esr; + #define ESR_MERR 0x80000000 + #define ESR_APAR 0x00000400 +-#define ESR_PCISERR 0x00000200 +-#define ESR_MPERR 0x00000100 +-#define ESR_TPERR 0x00000080 +-#define ESR_NORSP 0x00000040 +-#define ESR_TABT 0x00000020 +- u32 ecdr; ++#define ESR_PCISERR 0x00000200 ++#define ESR_MPERR 0x00000100 ++#define ESR_TPERR 0x00000080 ++#define ESR_NORSP 0x00000040 ++#define ESR_TABT 0x00000020 ++ u32 ecdr; + #define ECDR_APAR 0x00000400 +-#define ECDR_PCISERR 0x00000200 +-#define ECDR_MPERR 0x00000100 +-#define ECDR_TPERR 0x00000080 +-#define ECDR_NORSP 0x00000040 +-#define ECDR_TABT 0x00000020 ++#define ECDR_PCISERR 0x00000200 ++#define ECDR_MPERR 0x00000100 ++#define ECDR_TPERR 0x00000080 ++#define ECDR_NORSP 0x00000040 ++#define ECDR_TABT 0x00000020 + u32 eer; + #define EER_APAR 0x00000400 +-#define EER_PCISERR 0x00000200 +-#define EER_MPERR 0x00000100 +-#define EER_TPERR 0x00000080 +-#define EER_NORSP 0x00000040 +-#define EER_TABT 0x00000020 +- u32 eatcr; +-#define EATCR_ERRTYPR_MASK 0x70000000 +-#define EATCR_ERRTYPR_APR 0x00000000 /* address parity error */ +-#define EATCR_ERRTYPR_WDPR 0x10000000 /* write data parity error */ +-#define EATCR_ERRTYPR_RDPR 0x20000000 /* read data parity error */ +-#define EATCR_ERRTYPR_MA 0x30000000 /* master abort */ +-#define EATCR_ERRTYPR_TA 0x40000000 /* target abort */ +-#define EATCR_ERRTYPR_SE 0x50000000 /* system error indication received */ +-#define EATCR_ERRTYPR_PEA 0x60000000 /* parity error indication received on a read */ +-#define EATCR_ERRTYPR_PEW 0x70000000 /* parity error indication received on a write */ ++#define EER_PCISERR 0x00000200 ++#define EER_MPERR 0x00000100 ++#define EER_TPERR 0x00000080 ++#define EER_NORSP 0x00000040 ++#define EER_TABT 0x00000020 ++ u32 eatcr; ++#define EATCR_ERRTYPR_MASK 0x70000000 ++#define EATCR_ERRTYPR_APR 0x00000000 /* address parity error */ ++#define EATCR_ERRTYPR_WDPR 0x10000000 /* write data parity error */ ++#define EATCR_ERRTYPR_RDPR 0x20000000 /* read data parity error */ ++#define EATCR_ERRTYPR_MA 0x30000000 /* master abort */ ++#define EATCR_ERRTYPR_TA 0x40000000 /* target abort */ ++#define EATCR_ERRTYPR_SE 0x50000000 /* system error indication received */ ++#define EATCR_ERRTYPR_PEA 0x60000000 /* parity error indication received on a read */ ++#define EATCR_ERRTYPR_PEW 0x70000000 /* parity error indication received on a write */ + #define EATCR_BN_MASK 0x0f000000 /* beat number */ +-#define EATCR_BN_1st 0x00000000 +-#define EATCR_BN_2ed 0x01000000 +-#define EATCR_BN_3rd 0x02000000 +-#define EATCR_BN_4th 0x03000000 +-#define EATCR_BN_5th 0x0400000 +-#define EATCR_BN_6th 0x05000000 +-#define EATCR_BN_7th 0x06000000 +-#define EATCR_BN_8th 0x07000000 +-#define EATCR_BN_9th 0x08000000 ++#define EATCR_BN_1st 0x00000000 ++#define EATCR_BN_2ed 0x01000000 ++#define EATCR_BN_3rd 0x02000000 ++#define EATCR_BN_4th 0x03000000 ++#define EATCR_BN_5th 0x0400000 ++#define EATCR_BN_6th 0x05000000 ++#define EATCR_BN_7th 0x06000000 ++#define EATCR_BN_8th 0x07000000 ++#define EATCR_BN_9th 0x08000000 + #define EATCR_TS_MASK 0x00300000 /* transaction size */ +-#define EATCR_TS_4 0x00000000 +-#define EATCR_TS_1 0x00100000 +-#define EATCR_TS_2 0x00200000 +-#define EATCR_TS_3 0x00300000 +-#define EATCR_ES_MASK 0x000f0000 /* error source */ +-#define EATCR_ES_EM 0x00000000 /* external master */ +-#define EATCR_ES_DMA 0x00050000 +-#define EATCR_CMD_MASK 0x0000f000 +-#define EATCR_HBE_MASK 0x00000f00 /* PCI high byte enable*/ +-#define EATCR_BE_MASK 0x000000f0 /* PCI byte enable */ +-#define EATCR_HPB 0x00000004 /* high parity bit */ +-#define EATCR_PB 0x00000002 /* parity bit*/ +-#define EATCR_VI 0x00000001 /* error information valid */ +- u32 eacr; +- u32 eeacr; +- u32 edlcr; +- u32 edhcr; +- u32 gcr; +- u32 ecr; +- u32 gsr; +- u8 res0[12]; +- u32 pitar2; +- u8 res1[4]; +- u32 pibar2; +- u32 piebar2; +- u32 piwar2; +- u8 res2[4]; +- u32 pitar1; +- u8 res3[4]; +- u32 pibar1; +- u32 piebar1; +- u32 piwar1; +- u8 res4[4]; +- u32 pitar0; +- u8 res5[4]; +- u32 pibar0; +- u8 res6[4]; +- u32 piwar0; +- u8 res7[132]; ++#define EATCR_TS_4 0x00000000 ++#define EATCR_TS_1 0x00100000 ++#define EATCR_TS_2 0x00200000 ++#define EATCR_TS_3 0x00300000 ++#define EATCR_ES_MASK 0x000f0000 /* error source */ ++#define EATCR_ES_EM 0x00000000 /* external master */ ++#define EATCR_ES_DMA 0x00050000 ++#define EATCR_CMD_MASK 0x0000f000 ++#if defined (CONFIG_MPC8349) ++#define EATCR_HBE_MASK 0x00000f00 /* PCI high byte enable */ ++#endif ++#define EATCR_BE_MASK 0x000000f0 /* PCI byte enable */ ++#if defined (CONFIG_MPC8349) ++#define EATCR_HPB 0x00000004 /* high parity bit */ ++#endif ++#define EATCR_PB 0x00000002 /* parity bit */ ++#define EATCR_VI 0x00000001 /* error information valid */ ++ u32 eacr; ++ u32 eeacr; ++#if defined (CONFIG_MPC8349) ++ u32 edlcr; ++ u32 edhcr; ++#elif defined (CONFIG_MPC8360) ++ u32 edcr; /* was edlcr */ ++ u8 res_edcr[0x4]; ++#endif ++ u32 gcr; ++ u32 ecr; ++ u32 gsr; ++ u8 res0[12]; ++ u32 pitar2; ++ u8 res1[4]; ++ u32 pibar2; ++ u32 piebar2; ++ u32 piwar2; ++ u8 res2[4]; ++ u32 pitar1; ++ u8 res3[4]; ++ u32 pibar1; ++ u32 piebar1; ++ u32 piwar1; ++ u8 res4[4]; ++ u32 pitar0; ++ u8 res5[4]; ++ u32 pibar0; ++ u8 res6[4]; ++ u32 piwar0; ++ u8 res7[132]; + #define PITAR_TA_MASK 0x000fffff + #define PIBAR_MASK 0xffffffff + #define PIEBAR_EBA_MASK 0x000fffff + #define PIWAR_EN 0x80000000 + #define PIWAR_PF 0x20000000 +-#define PIWAR_RTT_MASK 0x000f0000 +-#define PIWAR_RTT_NO_SNOOP 0x00040000 ++#define PIWAR_RTT_MASK 0x000f0000 ++#define PIWAR_RTT_NO_SNOOP 0x00040000 + #define PIWAR_RTT_SNOOP 0x00050000 +-#define PIWAR_WTT_MASK 0x0000f000 +-#define PIWAR_WTT_NO_SNOOP 0x00004000 ++#define PIWAR_WTT_MASK 0x0000f000 ++#define PIWAR_WTT_NO_SNOOP 0x00004000 + #define PIWAR_WTT_SNOOP 0x00005000 +-#define PIWAR_IWS_MASK 0x0000003F +-#define PIWAR_IWS_4K 0x0000000B +-#define PIWAR_IWS_8K 0x0000000C +-#define PIWAR_IWS_16K 0x0000000D +-#define PIWAR_IWS_32K 0x0000000E +-#define PIWAR_IWS_64K 0x0000000F +-#define PIWAR_IWS_128K 0x00000010 +-#define PIWAR_IWS_256K 0x00000011 +-#define PIWAR_IWS_512K 0x00000012 +-#define PIWAR_IWS_1M 0x00000013 +-#define PIWAR_IWS_2M 0x00000014 +-#define PIWAR_IWS_4M 0x00000015 +-#define PIWAR_IWS_8M 0x00000016 +-#define PIWAR_IWS_16M 0x00000017 +-#define PIWAR_IWS_32M 0x00000018 +-#define PIWAR_IWS_64M 0x00000019 +-#define PIWAR_IWS_128M 0x0000001A +-#define PIWAR_IWS_256M 0x0000001B +-#define PIWAR_IWS_512M 0x0000001C +-#define PIWAR_IWS_1G 0x0000001D +-#define PIWAR_IWS_2G 0x0000001E +-} pcictrl8349_t; ++#define PIWAR_IWS_MASK 0x0000003F ++#define PIWAR_IWS_4K 0x0000000B ++#define PIWAR_IWS_8K 0x0000000C ++#define PIWAR_IWS_16K 0x0000000D ++#define PIWAR_IWS_32K 0x0000000E ++#define PIWAR_IWS_64K 0x0000000F ++#define PIWAR_IWS_128K 0x00000010 ++#define PIWAR_IWS_256K 0x00000011 ++#define PIWAR_IWS_512K 0x00000012 ++#define PIWAR_IWS_1M 0x00000013 ++#define PIWAR_IWS_2M 0x00000014 ++#define PIWAR_IWS_4M 0x00000015 ++#define PIWAR_IWS_8M 0x00000016 ++#define PIWAR_IWS_16M 0x00000017 ++#define PIWAR_IWS_32M 0x00000018 ++#define PIWAR_IWS_64M 0x00000019 ++#define PIWAR_IWS_128M 0x0000001A ++#define PIWAR_IWS_256M 0x0000001B ++#define PIWAR_IWS_512M 0x0000001C ++#define PIWAR_IWS_1G 0x0000001D ++#define PIWAR_IWS_2G 0x0000001E ++} pcictrl83xx_t; + ++#if defined (CONFIG_MPC8349) + /* + * USB + */ +-typedef struct usb8349 { ++typedef struct usb83xx { + u8 fixme[0x2000]; +-} usb8349_t; ++} usb83xx_t; + + /* + * TSEC + */ +-typedef struct tsec8349 { ++typedef struct tsec83xx { + u8 fixme[0x1000]; +-} tsec8349_t; ++} tsec83xx_t; ++#endif + + /* + * Security + */ +-typedef struct security8349 { ++typedef struct security83xx { + u8 fixme[0x10000]; +-} security8349_t; ++} security83xx_t; ++ ++#if defined (CONFIG_MPC8360) ++/* ++ * iram ++ */ ++typedef struct iram83xx { ++ u32 iadd; /* I-RAM address register */ ++ u32 idata; /* I-RAM data register */ ++ u8 res0[0x78]; ++} iram83xx_t; ++ ++/* ++ * Interrupt Controller ++ */ ++typedef struct irq83xx { ++ u32 cicr; /* QE system interrupt configuration */ ++ u32 civec; /* QE system interrupt vector register */ ++ u32 cripnr; /* QE RISC interrupt pending register */ ++ u32 cipnr; /* QE system interrupt pending register */ ++ u32 cipxcc; /* QE interrupt priority register */ ++ u32 cipycc; /* QE interrupt priority register */ ++ u32 cipwcc; /* QE interrupt priority register */ ++ u32 cipzcc; /* QE interrupt priority register */ ++ u32 cimr; /* QE system interrupt mask register */ ++ u32 crimr; /* QE RISC interrupt mask register */ ++ u32 cicnr; /* QE system interrupt control register */ ++ u8 res0[0x4]; ++ u32 ciprta; /* QE system interrupt priority register for RISC tasks A */ ++ u32 ciprtb; /* QE system interrupt priority register for RISC tasks B */ ++ u8 res1[0x4]; ++ u32 cricr; /* QE system RISC interrupt control */ ++ u8 res2[0x20]; ++ u32 chivec; /* QE high system interrupt vector */ ++ u8 res3[0x1C]; ++} irq83xx_t; ++ ++/* ++ * Communications Processor ++ */ ++typedef struct cp83xx { ++ u32 cecr; /* QE command register */ ++ u32 ceccr; /* QE controller configuration register */ ++ u32 cecdr; /* QE command data register */ ++ u8 res0[0xA]; ++ u16 ceter; /* QE timer event register */ ++ u8 res1[0x2]; ++ u16 cetmr; /* QE timers mask register */ ++ u32 cetscr; /* QE time-stamp timer control register */ ++ u32 cetsr1; /* QE time-stamp register 1 */ ++ u32 cetsr2; /* QE time-stamp register 2 */ ++ u8 res2[0x8]; ++ u32 cevter; /* QE virtual tasks event register */ ++ u32 cevtmr; /* QE virtual tasks mask register */ ++ u16 cercr; /* QE RAM control register */ ++ u8 res3[0x2]; ++ u8 res4[0x24]; ++ u16 ceexe1; /* QE external request 1 event register */ ++ u8 res5[0x2]; ++ u16 ceexm1; /* QE external request 1 mask register */ ++ u8 res6[0x2]; ++ u16 ceexe2; /* QE external request 2 event register */ ++ u8 res7[0x2]; ++ u16 ceexm2; /* QE external request 2 mask register */ ++ u8 res8[0x2]; ++ u16 ceexe3; /* QE external request 3 event register */ ++ u8 res9[0x2]; ++ u16 ceexm3; /* QE external request 3 mask register */ ++ u8 res10[0x2]; ++ u16 ceexe4; /* QE external request 4 event register */ ++ u8 res11[0x2]; ++ u16 ceexm4; /* QE external request 4 mask register */ ++ u8 res12[0x2]; ++ u8 res13[0x280]; ++} cp83xx_t; ++ ++/* ++ * QE Multiplexer ++ */ ++ ++typedef struct qmx83xx { ++ u32 cmxgcr; /* CMX general clock route register */ ++ u32 cmxsi1cr_l; /* CMX SI1 clock route low register */ ++ u32 cmxsi1cr_h; /* CMX SI1 clock route high register */ ++ u32 cmxsi1syr; /* CMX SI1 SYNC route register */ ++ u32 cmxucr1; /* CMX UCC1, UCC3 clock route register */ ++ u32 cmxucr2; /* CMX UCC5, UCC7 clock route register */ ++ u32 cmxucr3; /* CMX UCC2, UCC4 clock route register */ ++ u32 cmxucr4; /* CMX UCC6, UCC8 clock route register */ ++ u32 cmxupcr; /* CMX UPC clock route register */ ++ u8 res0[0x1C]; ++} qmx83xx_t; ++ ++/* ++* QE Timers ++*/ ++ ++typedef struct qet83xx { ++ u8 gtcfr1; /* Timer 1 and Timer 2 global configuration register */ ++ u8 res0[0x3]; ++ u8 gtcfr2; /* Timer 3 and timer 4 global configuration register */ ++ u8 res1[0xB]; ++ u16 gtmdr1; /* Timer 1 mode register */ ++ u16 gtmdr2; /* Timer 2 mode register */ ++ u16 gtrfr1; /* Timer 1 reference register */ ++ u16 gtrfr2; /* Timer 2 reference register */ ++ u16 gtcpr1; /* Timer 1 capture register */ ++ u16 gtcpr2; /* Timer 2 capture register */ ++ u16 gtcnr1; /* Timer 1 counter */ ++ u16 gtcnr2; /* Timer 2 counter */ ++ u16 gtmdr3; /* Timer 3 mode register */ ++ u16 gtmdr4; /* Timer 4 mode register */ ++ u16 gtrfr3; /* Timer 3 reference register */ ++ u16 gtrfr4; /* Timer 4 reference register */ ++ u16 gtcpr3; /* Timer 3 capture register */ ++ u16 gtcpr4; /* Timer 4 capture register */ ++ u16 gtcnr3; /* Timer 3 counter */ ++ u16 gtcnr4; /* Timer 4 counter */ ++ u16 gtevr1; /* Timer 1 event register */ ++ u16 gtevr2; /* Timer 2 event register */ ++ u16 gtevr3; /* Timer 3 event register */ ++ u16 gtevr4; /* Timer 4 event register */ ++ u16 gtps; /* Timer 1 prescale register */ ++ u8 res2[0x46]; ++} qet83xx_t; ++ ++/* ++* spi ++*/ ++ ++typedef struct spi83xx { ++ u8 res0[0x20]; ++ u32 spmode; /* SPI mode register */ ++ u8 res1[0x2]; ++ u8 spie; /* SPI event register */ ++ u8 res2[0x1]; ++ u8 res3[0x2]; ++ u8 spim; /* SPI mask register */ ++ u8 res4[0x1]; ++ u8 res5[0x1]; ++ u8 spcom; /* SPI command register */ ++ u8 res6[0x2]; ++ u32 spitd; /* SPI transmit data register (cpu mode) */ ++ u32 spird; /* SPI receive data register (cpu mode) */ ++ u8 res7[0x8]; ++} spi83xx_t; ++ ++/* ++* mcc ++*/ ++ ++typedef struct mcc83xx { ++ u32 mcce; /* MCC event register */ ++ u32 mccm; /* MCC mask register */ ++ u32 mccf; /* MCC configuration register */ ++ u32 merl; /* MCC emergency request level register */ ++ u8 res0[0xF0]; ++} mcc83xx_t; ++ ++/* ++* brg ++*/ ++ ++typedef struct brg83xx { ++ u32 brgc1; /* BRG1 configuration register */ ++ u32 brgc2; /* BRG2 configuration register */ ++ u32 brgc3; /* BRG3 configuration register */ ++ u32 brgc4; /* BRG4 configuration register */ ++ u32 brgc5; /* BRG5 configuration register */ ++ u32 brgc6; /* BRG6 configuration register */ ++ u32 brgc7; /* BRG7 configuration register */ ++ u32 brgc8; /* BRG8 configuration register */ ++ u32 brgc9; /* BRG9 configuration register */ ++ u32 brgc10; /* BRG10 configuration register */ ++ u32 brgc11; /* BRG11 configuration register */ ++ u32 brgc12; /* BRG12 configuration register */ ++ u32 brgc13; /* BRG13 configuration register */ ++ u32 brgc14; /* BRG14 configuration register */ ++ u32 brgc15; /* BRG15 configuration register */ ++ u32 brgc16; /* BRG16 configuration register */ ++ u8 res0[0x40]; ++} brg83xx_t; ++ ++/* ++* USB ++*/ ++ ++typedef struct usb83xx { ++ u8 usmod; /* USB mode register */ ++ u8 usadd; /* USB address register */ ++ u8 uscom; /* USB command register */ ++ u8 res0[0x1]; ++ u16 usep0; /* USB endpoint register 0 */ ++ u16 usep1; /* USB endpoint register 1 */ ++ u16 usep2; /* USB endpoint register 2 */ ++ u16 usep3; /* USB endpoint register 3 */ ++ u8 res1[0x4]; ++ u16 usber; /* USB event register */ ++ u8 res2[0x2]; ++ u16 usbmr; /* USB mask register */ ++ u8 res3[0x1]; ++ u8 usbs; /* USB status register */ ++ u32 ussft; /* USB start of frame timer */ ++ u8 res4[0x24]; ++} usb83xx_t; ++ ++/* ++* SI ++*/ ++ ++typedef struct si1_83xx { ++ u16 siamr1; /* SI1 TDMA mode register */ ++ u16 sibmr1; /* SI1 TDMB mode register */ ++ u16 sicmr1; /* SI1 TDMC mode register */ ++ u16 sidmr1; /* SI1 TDMD mode register */ ++ u8 siglmr1_h; /* SI1 global mode register high */ ++ u8 res0[0x1]; ++ u8 sicmdr1_h; /* SI1 command register high */ ++ u8 res2[0x1]; ++ u8 sistr1_h; /* SI1 status register high */ ++ u8 res3[0x1]; ++ u16 sirsr1_h; /* SI1 RAM shadow address register high */ ++ u8 sitarc1; /* SI1 RAM counter Tx TDMA */ ++ u8 sitbrc1; /* SI1 RAM counter Tx TDMB */ ++ u8 sitcrc1; /* SI1 RAM counter Tx TDMC */ ++ u8 sitdrc1; /* SI1 RAM counter Tx TDMD */ ++ u8 sirarc1; /* SI1 RAM counter Rx TDMA */ ++ u8 sirbrc1; /* SI1 RAM counter Rx TDMB */ ++ u8 sircrc1; /* SI1 RAM counter Rx TDMC */ ++ u8 sirdrc1; /* SI1 RAM counter Rx TDMD */ ++ u8 res4[0x8]; ++ u16 siemr1; /* SI1 TDME mode register 16 bits */ ++ u16 sifmr1; /* SI1 TDMF mode register 16 bits */ ++ u16 sigmr1; /* SI1 TDMG mode register 16 bits */ ++ u16 sihmr1; /* SI1 TDMH mode register 16 bits */ ++ u8 siglmg1_l; /* SI1 global mode register low 8 bits */ ++ u8 res5[0x1]; ++ u8 sicmdr1_l; /* SI1 command register low 8 bits */ ++ u8 res6[0x1]; ++ u8 sistr1_l; /* SI1 status register low 8 bits */ ++ u8 res7[0x1]; ++ u16 sirsr1_l; /* SI1 RAM shadow address register low 16 bits */ ++ u8 siterc1; /* SI1 RAM counter Tx TDME 8 bits */ ++ u8 sitfrc1; /* SI1 RAM counter Tx TDMF 8 bits */ ++ u8 sitgrc1; /* SI1 RAM counter Tx TDMG 8 bits */ ++ u8 sithrc1; /* SI1 RAM counter Tx TDMH 8 bits */ ++ u8 sirerc1; /* SI1 RAM counter Rx TDME 8 bits */ ++ u8 sirfrc1; /* SI1 RAM counter Rx TDMF 8 bits */ ++ u8 sirgrc1; /* SI1 RAM counter Rx TDMG 8 bits */ ++ u8 sirhrc1; /* SI1 RAM counter Rx TDMH 8 bits */ ++ u8 res8[0x8]; ++ u32 siml1; /* SI1 multiframe limit register */ ++ u8 siedm1; /* SI1 extended diagnostic mode register */ ++ u8 res9[0xBB]; ++} si1_83xx_t; ++ ++/* ++* SI Routing Tables ++*/ ++ ++typedef struct sir83xx { ++ u8 tx[0x400]; ++ u8 rx[0x400]; ++ u8 res0[0x800]; ++} sir83xx_t; ++ ++/* ++* ucc ++*/ ++ ++typedef struct uslow { ++ u32 gumr_l; /* UCCx general mode register (low) */ ++ u32 gumr_h; /* UCCx general mode register (high) */ ++ u16 upsmr; /* UCCx protocol-specific mode register */ ++ u8 res0[0x2]; ++ u16 utodr; /* UCCx transmit on demand register */ ++ u16 udsr; /* UCCx data synchronization register */ ++ u16 ucce; /* UCCx event register */ ++ u8 res1[0x2]; ++ u16 uccm; /* UCCx mask register */ ++ u8 res2[0x1]; ++ u8 uccs; /* UCCx status register */ ++ u8 res3[0x1E8]; ++} uslow_t; ++ ++typedef struct ufast { ++ u32 gumr; /* UCCx general mode register */ ++ u32 upsmr; /* UCCx protocol-specific mode register */ ++ u16 utodr; /* UCCx transmit on demand register */ ++ u8 res0[0x2]; ++ u16 udsr; /* UCCx data synchronization register */ ++ u8 res1[0x2]; ++ u32 ucce; /* UCCx event register */ ++ u32 uccm; /* UCCx mask register. */ ++ u8 uccs; /* UCCx status register */ ++ u8 res2[0x7]; ++ u32 urfb; /* UCC receive FIFO base */ ++ u16 urfs; /* UCC receive FIFO size */ ++ u8 res3[0x2]; ++ u16 urfet; /* UCC receive FIFO emergency threshold */ ++ u16 urfset; /* UCC receive FIFO special emergency threshold */ ++ u32 utfb; /* UCC transmit FIFO base */ ++ u16 utfs; /* UCC transmit FIFO size */ ++ u8 res4[0x2]; ++ u16 utfet; /* UCC transmit FIFO emergency threshold */ ++ u8 res5[0x2]; ++ u16 utftt; /* UCC transmit FIFO transmit threshold */ ++ u8 res6[0x2]; ++ u16 utpt; /* UCC transmit polling timer */ ++ u32 urtry; /* UCC retry counter register */ ++ u8 res7[0x4C]; ++ u8 guemr; /* UCC general extended mode register */ ++ u8 res8[0x3]; ++ u8 res9[0x6C]; ++ u32 maccfg1; /* Mac configuration register #1 */ ++ u32 maccfg2; /* Mac configuration register #2 */ ++ u16 ipgifg; /* Interframe gap register */ ++ u8 res10[0x2]; ++ u32 hafdup; /* Half-duplex register */ ++ u8 res11[0xC]; ++ u32 emtr; /* Ethernet MAC test register */ ++ u32 miimcfg; /* MII mgmt configuration register */ ++ u32 miimcom; /* MII mgmt command register */ ++ u32 miimadd; /* MII mgmt address register */ ++ u32 miimcon; /* MII mgmt control register */ ++ u32 miistat; /* MII mgmt status register */ ++ u32 miimnd; /* MII mgmt indication register */ ++ u32 ifctl; /* Interface control register */ ++ u32 ifstat; /* Interface status register */ ++ u32 macstnaddr1; /* Station address part 1 register */ ++ u32 macstnaddr2; /* Station address part 2 register */ ++ u8 res12[0x8]; ++ u32 uempr; /* UCC Ethernet MAC parameter register */ ++ u32 utbipa; /* UCC TBI address */ ++ u16 uescr; /* UCC Ethernet statistics control register */ ++ u8 res13[0x26]; ++ u32 tx64; /* Transmit and receive 64-byte frame counter */ ++ u32 tx127; /* Transmit and receive 65- to 127-byte frame counter */ ++ u32 tx255; /* Transmit and receive 128- to 255-byte frame counter */ ++ u32 rx64; /* Receive and receive 64-byte frame counter */ ++ u32 rx127; /* Receive and receive 65- to 127-byte frame counter */ ++ u32 rx255; /* Receive and receive 128- to 255-byte frame counter */ ++ u32 txok; /* Transmit good bytes counter */ ++ u32 txcf; /* Transmit control frame counter */ ++ u32 tmca; /* Transmit multicast control frame counter */ ++ u32 tbca; /* Transmit broadcast packet counter */ ++ u32 rxfok; /* Receive frame OK counter */ ++ u32 rbyt; /* Receive good and bad bytes counter */ ++ u32 rxbok; /* Receive bytes OK counter */ ++ u32 rmca; /* Receive multicast packet counter */ ++ u32 rbca; /* Receive broadcast packet counter */ ++ u32 scar; /* Statistics carry register */ ++ u32 scam; /* Statistics carry mask register */ ++ u8 res14[0x3C]; ++} ufast_t; ++ ++typedef struct ucc83xx { ++ union { ++ uslow_t slow; ++ ufast_t fast; ++ }; ++} ucc83xx_t; ++ ++/* ++* MultiPHY UTOPIA POS Controllers ++*/ ++ ++typedef struct upc83xx { ++ u32 upgcr; /* UTOPIA/POS general configuration register */ ++#define UPGCR_PROTOCOL 0x80000000 /* protocol ul2 or pl2 */ ++#define UPGCR_TMS 0x40000000 /* Transmit master/slave mode */ ++#define UPGCR_RMS 0x20000000 /* Receive master/slave mode */ ++#define UPGCR_ADDR 0x10000000 /* Master MPHY Addr multiplexing: */ ++#define UPGCR_DIAG 0x01000000 /* Diagnostic mode */ ++ u32 uplpa; /* UTOPIA/POS last PHY address */ ++ u32 uphec; /* ATM HEC register */ ++ u32 upuc; /* UTOPIA/POS UCC configuration */ ++ u32 updc1; /* UTOPIA/POS device 1 configuration */ ++ u32 updc2; /* UTOPIA/POS device 2 configuration */ ++ u32 updc3; /* UTOPIA/POS device 3 configuration */ ++ u32 updc4; /* UTOPIA/POS device 4 configuration */ ++ u32 upstpa; /* UTOPIA/POS STPA threshold */ ++ u8 res0[0xC]; ++ u32 updrs1_h; /* UTOPIA/POS device 1 rate select */ ++ u32 updrs1_l; /* UTOPIA/POS device 1 rate select */ ++ u32 updrs2_h; /* UTOPIA/POS device 2 rate select */ ++ u32 updrs2_l; /* UTOPIA/POS device 2 rate select */ ++ u32 updrs3_h; /* UTOPIA/POS device 3 rate select */ ++ u32 updrs3_l; /* UTOPIA/POS device 3 rate select */ ++ u32 updrs4_h; /* UTOPIA/POS device 4 rate select */ ++ u32 updrs4_l; /* UTOPIA/POS device 4 rate select */ ++ u32 updrp1; /* UTOPIA/POS device 1 receive priority low */ ++ u32 updrp2; /* UTOPIA/POS device 2 receive priority low */ ++ u32 updrp3; /* UTOPIA/POS device 3 receive priority low */ ++ u32 updrp4; /* UTOPIA/POS device 4 receive priority low */ ++ u32 upde1; /* UTOPIA/POS device 1 event */ ++ u32 upde2; /* UTOPIA/POS device 2 event */ ++ u32 upde3; /* UTOPIA/POS device 3 event */ ++ u32 upde4; /* UTOPIA/POS device 4 event */ ++ u16 uprp1; ++ u16 uprp2; ++ u16 uprp3; ++ u16 uprp4; ++ u8 res1[0x8]; ++ u16 uptirr1_0; /* Device 1 transmit internal rate 0 */ ++ u16 uptirr1_1; /* Device 1 transmit internal rate 1 */ ++ u16 uptirr1_2; /* Device 1 transmit internal rate 2 */ ++ u16 uptirr1_3; /* Device 1 transmit internal rate 3 */ ++ u16 uptirr2_0; /* Device 2 transmit internal rate 0 */ ++ u16 uptirr2_1; /* Device 2 transmit internal rate 1 */ ++ u16 uptirr2_2; /* Device 2 transmit internal rate 2 */ ++ u16 uptirr2_3; /* Device 2 transmit internal rate 3 */ ++ u16 uptirr3_0; /* Device 3 transmit internal rate 0 */ ++ u16 uptirr3_1; /* Device 3 transmit internal rate 1 */ ++ u16 uptirr3_2; /* Device 3 transmit internal rate 2 */ ++ u16 uptirr3_3; /* Device 3 transmit internal rate 3 */ ++ u16 uptirr4_0; /* Device 4 transmit internal rate 0 */ ++ u16 uptirr4_1; /* Device 4 transmit internal rate 1 */ ++ u16 uptirr4_2; /* Device 4 transmit internal rate 2 */ ++ u16 uptirr4_3; /* Device 4 transmit internal rate 3 */ ++ u32 uper1; /* Device 1 port enable register */ ++ u32 uper2; /* Device 2 port enable register */ ++ u32 uper3; /* Device 3 port enable register */ ++ u32 uper4; /* Device 4 port enable register */ ++ u8 res2[0x150]; ++} upc83xx_t; ++ ++/* ++* SDMA ++*/ ++ ++typedef struct sdma83xx { ++ u32 sdsr; /* Serial DMA status register */ ++ u32 sdmr; /* Serial DMA mode register */ ++ u32 sdtr1; /* SDMA system bus threshold register */ ++ u32 sdtr2; /* SDMA secondary bus threshold register */ ++ u32 sdhy1; /* SDMA system bus hysteresis register */ ++ u32 sdhy2; /* SDMA secondary bus hysteresis register */ ++ u32 sdta1; /* SDMA system bus address register */ ++ u32 sdta2; /* SDMA secondary bus address register */ ++ u32 sdtm1; /* SDMA system bus MSNUM register */ ++ u32 sdtm2; /* SDMA secondary bus MSNUM register */ ++ u8 res0[0x10]; ++ u32 sdaqr; /* SDMA address bus qualify register */ ++ u32 sdaqmr; /* SDMA address bus qualify mask register */ ++ u8 res1[0x4]; ++ u32 sdwbcr; /* SDMA CAM entries base register */ ++ u8 res2[0x38]; ++} sdma83xx_t; ++ ++/* ++* Debug Space ++*/ ++ ++typedef struct dbg83xx { ++ u32 bpdcr; /* Breakpoint debug command register */ ++ u32 bpdsr; /* Breakpoint debug status register */ ++ u32 bpdmr; /* Breakpoint debug mask register */ ++ u32 bprmrr0; /* Breakpoint request mode risc register 0 */ ++ u32 bprmrr1; /* Breakpoint request mode risc register 1 */ ++ u8 res0[0x8]; ++ u32 bprmtr0; /* Breakpoint request mode trb register 0 */ ++ u32 bprmtr1; /* Breakpoint request mode trb register 1 */ ++ u8 res1[0x8]; ++ u32 bprmir; /* Breakpoint request mode immediate register */ ++ u32 bprmsr; /* Breakpoint request mode serial register */ ++ u32 bpemr; /* Breakpoint exit mode register */ ++ u8 res2[0x48]; ++} dbg83xx_t; ++ ++/* ++* RISC Special Registers (Trap and Breakpoint) ++*/ ++ ++typedef struct rsp83xx { ++ u8 fixme[0x100]; ++} rsp83xx_t; ++#endif + + typedef struct immap { +- sysconf8349_t sysconf; /* System configuration */ +- wdt8349_t wdt; /* Watch Dog Timer (WDT) Registers */ +- rtclk8349_t rtc; /* Real Time Clock Module Registers */ +- rtclk8349_t pit; /* Periodic Interval Timer */ +- gtm8349_t gtm[2]; /* Global Timers Module */ +- ipic8349_t ipic; /* Integrated Programmable Interrupt Controller */ +- arbiter8349_t arbiter; /* System Arbiter Registers */ +- reset8349_t reset; /* Reset Module */ +- clk8349_t clk; /* System Clock Module */ +- pmc8349_t pmc; /* Power Management Control Module */ +- gpio8349_t pgio[2]; /* general purpose I/O module */ ++ sysconf83xx_t sysconf; /* System configuration */ ++ wdt83xx_t wdt; /* Watch Dog Timer (WDT) Registers */ ++ rtclk83xx_t rtc; /* Real Time Clock Module Registers */ ++ rtclk83xx_t pit; /* Periodic Interval Timer */ ++ gtm83xx_t gtm[2]; /* Global Timers Module */ ++ ipic83xx_t ipic; /* Integrated Programmable Interrupt Controller */ ++ arbiter83xx_t arbiter; /* System Arbiter Registers */ ++ reset83xx_t reset; /* Reset Module */ ++ clk83xx_t clk; /* System Clock Module */ ++ pmc83xx_t pmc; /* Power Management Control Module */ ++#if defined (CONFIG_MPC8349) ++ gpio83xx_t pgio[2]; /* general purpose I/O module */ ++#elif defined (CONFIG_MPC8360) ++ qepi83xx_t qepi; /* QE Ports Interrupts Registers */ ++#endif + u8 res0[0x200]; ++#if defined (CONFIG_MPC8360) ++ u8 DLL_LBDDR[0x100]; ++#endif + u8 DDL_DDR[0x100]; + u8 DDL_LBIU[0x100]; ++#if defined (CONFIG_MPC8349) + u8 res1[0xE00]; +- ddr8349_t ddr; /* DDR Memory Controller Memory */ +- i2c_t i2c[2]; /* I2C1 Controller */ ++#elif defined (CONFIG_MPC8360) ++ u8 res1[0x200]; ++ gpio83xx_t gpio; /* General purpose I/O module */ ++ qesba83xx_t qesba; /* QE Secondary Bus Access Windows */ ++#endif ++ ddr83xx_t ddr; /* DDR Memory Controller Memory */ ++ fsl_i2c_t i2c[2]; /* I2C Controllers */ + u8 res2[0x1300]; +- duart8349_t duart[2];/* DUART */ ++ duart83xx_t duart[2]; /* DUART */ ++#if defined (CONFIG_MPC8349) + u8 res3[0x900]; +- lbus8349_t lbus; /* Local Bus Controller Registers */ ++ lbus83xx_t lbus; /* Local Bus Controller Registers */ + u8 res4[0x1000]; +- spi8349_t spi; /* Serial Peripheral Interface */ ++ spi83xx_t spi; /* Serial Peripheral Interface */ + u8 res5[0xF00]; +- dma8349_t dma; /* DMA */ +- pciconf8349_t pci_conf[2]; /* PCI Software Configuration Registers */ +- ios8349_t ios; /* Sequencer */ +- pcictrl8349_t pci_ctrl[2]; /* PCI Controller Control and Status Registers */ ++#elif defined (CONFIG_MPC8360) ++ u8 res3[0x900]; ++ lbus83xx_t lbus; /* Local Bus Controller */ ++ u8 res4[0x2000]; ++#endif ++ dma83xx_t dma; /* DMA */ ++#if defined (CONFIG_MPC8349) ++ pciconf83xx_t pci_conf[2]; /* PCI Software Configuration Registers */ ++ ios83xx_t ios; /* Sequencer */ ++ pcictrl83xx_t pci_ctrl[2]; /* PCI Controller Control and Status Registers */ + u8 res6[0x19900]; +- usb8349_t usb; +- tsec8349_t tsec[2]; ++ usb83xx_t usb; ++ tsec83xx_t tsec[2]; + u8 res7[0xA000]; +- security8349_t security; ++ security83xx_t security; ++#elif defined (CONFIG_MPC8360) ++ pciconf83xx_t pci_conf[1]; /* PCI Software Configuration Registers */ ++ u8 res_5[128]; ++ ios83xx_t ios; /* Sequencer (IOS) */ ++ pcictrl83xx_t pci_ctrl[1]; /* PCI Controller Control and Status Registers */ ++ u8 res6[0x4A00]; ++ ddr83xx_t ddr_secondary; /* Secondary DDR Memory Controller Memory Map */ ++ u8 res7[0x22000]; ++ security83xx_t security; ++ u8 res8[0xC0000]; ++ iram83xx_t iram; /* IRAM */ ++ irq83xx_t irq; /* Interrupt Controller */ ++ cp83xx_t cp; /* Communications Processor */ ++ qmx83xx_t qmx; /* QE Multiplexer */ ++ qet83xx_t qet; /* QE Timers */ ++ spi83xx_t spi[0x2]; /* spi */ ++ mcc83xx_t mcc; /* mcc */ ++ brg83xx_t brg; /* brg */ ++ usb83xx_t usb; /* USB */ ++ si1_83xx_t si1; /* SI */ ++ u8 res9[0x800]; ++ sir83xx_t sir; /* SI Routing Tables */ ++ ucc83xx_t ucc1; /* ucc1 */ ++ ucc83xx_t ucc3; /* ucc3 */ ++ ucc83xx_t ucc5; /* ucc5 */ ++ ucc83xx_t ucc7; /* ucc7 */ ++ u8 res10[0x600]; ++ upc83xx_t upc1; /* MultiPHY UTOPIA POS Controller 1 */ ++ ucc83xx_t ucc2; /* ucc2 */ ++ ucc83xx_t ucc4; /* ucc4 */ ++ ucc83xx_t ucc6; /* ucc6 */ ++ ucc83xx_t ucc8; /* ucc8 */ ++ u8 res11[0x600]; ++ upc83xx_t upc2; /* MultiPHY UTOPIA POS Controller 2 */ ++ sdma83xx_t sdma; /* SDMA */ ++ dbg83xx_t dbg; /* Debug Space */ ++ rsp83xx_t rsp[0x2]; /* RISC Special Registers (Trap and Breakpoint) */ ++ u8 res12[0x300]; ++ u8 res13[0x3A00]; ++ u8 res14[0x8000]; /* 0x108000 - 0x110000 */ ++ u8 res15[0xC000]; /* 0x110000 - 0x11C000 Multi-user RAM */ ++ u8 res16[0x24000]; /* 0x11C000 - 0x140000 */ ++ u8 res17[0xC0000]; /* 0x140000 - 0x200000 */ ++#endif + } immap_t; + +-#endif /* __IMMAP_8349__ */ ++#endif /* __IMMAP_83xx__ */ +diff -Naupr u-boot-1.1.6/include/asm-ppc/immap_qe.h u-boot-1.1.6-fsl-1/include/asm-ppc/immap_qe.h +--- u-boot-1.1.6/include/asm-ppc/immap_qe.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/asm-ppc/immap_qe.h 2006-11-10 11:24:29.000000000 -0600 +@@ -0,0 +1,550 @@ ++/* ++ * QUICC Engine (QE) Internal Memory Map. ++ * The Internal Memory Map for devices with QE on them. This ++ * is the superset of all QE devices (8360, etc.). ++ * ++ * Copyright (c) 2006 Freescale Semiconductor, Inc. ++ * Author: Shlomi Gridih <gridish@freescale.com> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#ifndef __IMMAP_QE_H__ ++#define __IMMAP_QE_H__ ++ ++/* QE I-RAM ++*/ ++typedef struct qe_iram { ++ u32 iadd; /* I-RAM Address Register */ ++ u32 idata; /* I-RAM Data Register */ ++ u8 res0[0x78]; ++} __attribute__ ((packed)) qe_iram_t; ++ ++/* QE Interrupt Controller ++*/ ++typedef struct qe_ic { ++ u32 qicr; ++ u32 qivec; ++ u32 qripnr; ++ u32 qipnr; ++ u32 qipxcc; ++ u32 qipycc; ++ u32 qipwcc; ++ u32 qipzcc; ++ u32 qimr; ++ u32 qrimr; ++ u32 qicnr; ++ u8 res0[0x4]; ++ u32 qiprta; ++ u32 qiprtb; ++ u8 res1[0x4]; ++ u32 qricr; ++ u8 res2[0x20]; ++ u32 qhivec; ++ u8 res3[0x1C]; ++} __attribute__ ((packed)) qe_ic_t; ++ ++/* Communications Processor ++*/ ++typedef struct cp_qe { ++ u32 cecr; /* QE command register */ ++ u32 ceccr; /* QE controller configuration register */ ++ u32 cecdr; /* QE command data register */ ++ u8 res0[0xA]; ++ u16 ceter; /* QE timer event register */ ++ u8 res1[0x2]; ++ u16 cetmr; /* QE timers mask register */ ++ u32 cetscr; /* QE time-stamp timer control register */ ++ u32 cetsr1; /* QE time-stamp register 1 */ ++ u32 cetsr2; /* QE time-stamp register 2 */ ++ u8 res2[0x8]; ++ u32 cevter; /* QE virtual tasks event register */ ++ u32 cevtmr; /* QE virtual tasks mask register */ ++ u16 cercr; /* QE RAM control register */ ++ u8 res3[0x2]; ++ u8 res4[0x24]; ++ u16 ceexe1; /* QE external request 1 event register */ ++ u8 res5[0x2]; ++ u16 ceexm1; /* QE external request 1 mask register */ ++ u8 res6[0x2]; ++ u16 ceexe2; /* QE external request 2 event register */ ++ u8 res7[0x2]; ++ u16 ceexm2; /* QE external request 2 mask register */ ++ u8 res8[0x2]; ++ u16 ceexe3; /* QE external request 3 event register */ ++ u8 res9[0x2]; ++ u16 ceexm3; /* QE external request 3 mask register */ ++ u8 res10[0x2]; ++ u16 ceexe4; /* QE external request 4 event register */ ++ u8 res11[0x2]; ++ u16 ceexm4; /* QE external request 4 mask register */ ++ u8 res12[0x2]; ++ u8 res13[0x280]; ++} __attribute__ ((packed)) cp_qe_t; ++ ++/* QE Multiplexer ++*/ ++typedef struct qe_mux { ++ u32 cmxgcr; /* CMX general clock route register */ ++ u32 cmxsi1cr_l; /* CMX SI1 clock route low register */ ++ u32 cmxsi1cr_h; /* CMX SI1 clock route high register */ ++ u32 cmxsi1syr; /* CMX SI1 SYNC route register */ ++ u32 cmxucr1; /* CMX UCC1, UCC3 clock route register */ ++ u32 cmxucr2; /* CMX UCC5, UCC7 clock route register */ ++ u32 cmxucr3; /* CMX UCC2, UCC4 clock route register */ ++ u32 cmxucr4; /* CMX UCC6, UCC8 clock route register */ ++ u32 cmxupcr; /* CMX UPC clock route register */ ++ u8 res0[0x1C]; ++} __attribute__ ((packed)) qe_mux_t; ++ ++/* QE Timers ++*/ ++typedef struct qe_timers { ++ u8 gtcfr1; /* Timer 1 2 global configuration register */ ++ u8 res0[0x3]; ++ u8 gtcfr2; /* Timer 3 4 global configuration register */ ++ u8 res1[0xB]; ++ u16 gtmdr1; /* Timer 1 mode register */ ++ u16 gtmdr2; /* Timer 2 mode register */ ++ u16 gtrfr1; /* Timer 1 reference register */ ++ u16 gtrfr2; /* Timer 2 reference register */ ++ u16 gtcpr1; /* Timer 1 capture register */ ++ u16 gtcpr2; /* Timer 2 capture register */ ++ u16 gtcnr1; /* Timer 1 counter */ ++ u16 gtcnr2; /* Timer 2 counter */ ++ u16 gtmdr3; /* Timer 3 mode register */ ++ u16 gtmdr4; /* Timer 4 mode register */ ++ u16 gtrfr3; /* Timer 3 reference register */ ++ u16 gtrfr4; /* Timer 4 reference register */ ++ u16 gtcpr3; /* Timer 3 capture register */ ++ u16 gtcpr4; /* Timer 4 capture register */ ++ u16 gtcnr3; /* Timer 3 counter */ ++ u16 gtcnr4; /* Timer 4 counter */ ++ u16 gtevr1; /* Timer 1 event register */ ++ u16 gtevr2; /* Timer 2 event register */ ++ u16 gtevr3; /* Timer 3 event register */ ++ u16 gtevr4; /* Timer 4 event register */ ++ u16 gtps; /* Timer 1 prescale register */ ++ u8 res2[0x46]; ++} __attribute__ ((packed)) qe_timers_t; ++ ++/* BRG ++*/ ++typedef struct qe_brg { ++ u32 brgc1; /* BRG1 configuration register */ ++ u32 brgc2; /* BRG2 configuration register */ ++ u32 brgc3; /* BRG3 configuration register */ ++ u32 brgc4; /* BRG4 configuration register */ ++ u32 brgc5; /* BRG5 configuration register */ ++ u32 brgc6; /* BRG6 configuration register */ ++ u32 brgc7; /* BRG7 configuration register */ ++ u32 brgc8; /* BRG8 configuration register */ ++ u32 brgc9; /* BRG9 configuration register */ ++ u32 brgc10; /* BRG10 configuration register */ ++ u32 brgc11; /* BRG11 configuration register */ ++ u32 brgc12; /* BRG12 configuration register */ ++ u32 brgc13; /* BRG13 configuration register */ ++ u32 brgc14; /* BRG14 configuration register */ ++ u32 brgc15; /* BRG15 configuration register */ ++ u32 brgc16; /* BRG16 configuration register */ ++ u8 res0[0x40]; ++} __attribute__ ((packed)) qe_brg_t; ++ ++/* SPI ++*/ ++typedef struct spi { ++ u8 res0[0x20]; ++ u32 spmode; /* SPI mode register */ ++ u8 res1[0x2]; ++ u8 spie; /* SPI event register */ ++ u8 res2[0x1]; ++ u8 res3[0x2]; ++ u8 spim; /* SPI mask register */ ++ u8 res4[0x1]; ++ u8 res5[0x1]; ++ u8 spcom; /* SPI command register */ ++ u8 res6[0x2]; ++ u32 spitd; /* SPI transmit data register (cpu mode) */ ++ u32 spird; /* SPI receive data register (cpu mode) */ ++ u8 res7[0x8]; ++} __attribute__ ((packed)) spi_t; ++ ++/* SI ++*/ ++typedef struct si1 { ++ u16 siamr1; /* SI1 TDMA mode register */ ++ u16 sibmr1; /* SI1 TDMB mode register */ ++ u16 sicmr1; /* SI1 TDMC mode register */ ++ u16 sidmr1; /* SI1 TDMD mode register */ ++ u8 siglmr1_h; /* SI1 global mode register high */ ++ u8 res0[0x1]; ++ u8 sicmdr1_h; /* SI1 command register high */ ++ u8 res2[0x1]; ++ u8 sistr1_h; /* SI1 status register high */ ++ u8 res3[0x1]; ++ u16 sirsr1_h; /* SI1 RAM shadow address register high */ ++ u8 sitarc1; /* SI1 RAM counter Tx TDMA */ ++ u8 sitbrc1; /* SI1 RAM counter Tx TDMB */ ++ u8 sitcrc1; /* SI1 RAM counter Tx TDMC */ ++ u8 sitdrc1; /* SI1 RAM counter Tx TDMD */ ++ u8 sirarc1; /* SI1 RAM counter Rx TDMA */ ++ u8 sirbrc1; /* SI1 RAM counter Rx TDMB */ ++ u8 sircrc1; /* SI1 RAM counter Rx TDMC */ ++ u8 sirdrc1; /* SI1 RAM counter Rx TDMD */ ++ u8 res4[0x8]; ++ u16 siemr1; /* SI1 TDME mode register 16 bits */ ++ u16 sifmr1; /* SI1 TDMF mode register 16 bits */ ++ u16 sigmr1; /* SI1 TDMG mode register 16 bits */ ++ u16 sihmr1; /* SI1 TDMH mode register 16 bits */ ++ u8 siglmg1_l; /* SI1 global mode register low 8 bits */ ++ u8 res5[0x1]; ++ u8 sicmdr1_l; /* SI1 command register low 8 bits */ ++ u8 res6[0x1]; ++ u8 sistr1_l; /* SI1 status register low 8 bits */ ++ u8 res7[0x1]; ++ u16 sirsr1_l; /* SI1 RAM shadow address register low 16 bits */ ++ u8 siterc1; /* SI1 RAM counter Tx TDME 8 bits */ ++ u8 sitfrc1; /* SI1 RAM counter Tx TDMF 8 bits */ ++ u8 sitgrc1; /* SI1 RAM counter Tx TDMG 8 bits */ ++ u8 sithrc1; /* SI1 RAM counter Tx TDMH 8 bits */ ++ u8 sirerc1; /* SI1 RAM counter Rx TDME 8 bits */ ++ u8 sirfrc1; /* SI1 RAM counter Rx TDMF 8 bits */ ++ u8 sirgrc1; /* SI1 RAM counter Rx TDMG 8 bits */ ++ u8 sirhrc1; /* SI1 RAM counter Rx TDMH 8 bits */ ++ u8 res8[0x8]; ++ u32 siml1; /* SI1 multiframe limit register */ ++ u8 siedm1; /* SI1 extended diagnostic mode register */ ++ u8 res9[0xBB]; ++} __attribute__ ((packed)) si1_t; ++ ++/* SI Routing Tables ++*/ ++typedef struct sir { ++ u8 tx[0x400]; ++ u8 rx[0x400]; ++ u8 res0[0x800]; ++} __attribute__ ((packed)) sir_t; ++ ++/* USB Controller. ++*/ ++typedef struct usb_ctlr { ++ u8 usb_usmod; ++ u8 usb_usadr; ++ u8 usb_uscom; ++ u8 res1[1]; ++ u16 usb_usep1; ++ u16 usb_usep2; ++ u16 usb_usep3; ++ u16 usb_usep4; ++ u8 res2[4]; ++ u16 usb_usber; ++ u8 res3[2]; ++ u16 usb_usbmr; ++ u8 res4[1]; ++ u8 usb_usbs; ++ u16 usb_ussft; ++ u8 res5[2]; ++ u16 usb_usfrn; ++ u8 res6[0x22]; ++} __attribute__ ((packed)) usb_t; ++ ++/* MCC ++*/ ++typedef struct mcc { ++ u32 mcce; /* MCC event register */ ++ u32 mccm; /* MCC mask register */ ++ u32 mccf; /* MCC configuration register */ ++ u32 merl; /* MCC emergency request level register */ ++ u8 res0[0xF0]; ++} __attribute__ ((packed)) mcc_t; ++ ++/* QE UCC Slow ++*/ ++typedef struct ucc_slow { ++ u32 gumr_l; /* UCCx general mode register (low) */ ++ u32 gumr_h; /* UCCx general mode register (high) */ ++ u16 upsmr; /* UCCx protocol-specific mode register */ ++ u8 res0[0x2]; ++ u16 utodr; /* UCCx transmit on demand register */ ++ u16 udsr; /* UCCx data synchronization register */ ++ u16 ucce; /* UCCx event register */ ++ u8 res1[0x2]; ++ u16 uccm; /* UCCx mask register */ ++ u8 res2[0x1]; ++ u8 uccs; /* UCCx status register */ ++ u8 res3[0x24]; ++ u16 utpt; ++ u8 guemr; /* UCC general extended mode register */ ++ u8 res4[0x200 - 0x091]; ++} __attribute__ ((packed)) ucc_slow_t; ++ ++typedef struct ucc_ethernet { ++ u32 maccfg1; /* mac configuration reg. 1 */ ++ u32 maccfg2; /* mac configuration reg. 2 */ ++ u32 ipgifg; /* interframe gap reg. */ ++ u32 hafdup; /* half-duplex reg. */ ++ u8 res1[0x10]; ++ u32 miimcfg; /* MII management configuration reg */ ++ u32 miimcom; /* MII management command reg */ ++ u32 miimadd; /* MII management address reg */ ++ u32 miimcon; /* MII management control reg */ ++ u32 miimstat; /* MII management status reg */ ++ u32 miimind; /* MII management indication reg */ ++ u32 ifctl; /* interface control reg */ ++ u32 ifstat; /* interface statux reg */ ++ u32 macstnaddr1; /* mac station address part 1 reg */ ++ u32 macstnaddr2; /* mac station address part 2 reg */ ++ u8 res2[0x8]; ++ u32 uempr; /* UCC Ethernet Mac parameter reg */ ++ u32 utbipar; /* UCC tbi address reg */ ++ u16 uescr; /* UCC Ethernet statistics control reg */ ++ u8 res3[0x180 - 0x15A]; ++ u32 tx64; /* Total number of frames (including bad ++ * frames) transmitted that were exactly ++ * of the minimal length (64 for un tagged, ++ * 68 for tagged, or with length exactly ++ * equal to the parameter MINLength */ ++ u32 tx127; /* Total number of frames (including bad ++ * frames) transmitted that were between ++ * MINLength (Including FCS length==4) ++ * and 127 octets */ ++ u32 tx255; /* Total number of frames (including bad ++ * frames) transmitted that were between ++ * 128 (Including FCS length==4) and 255 ++ * octets */ ++ u32 rx64; /* Total number of frames received including ++ * bad frames that were exactly of the ++ * mninimal length (64 bytes) */ ++ u32 rx127; /* Total number of frames (including bad ++ * frames) received that were between ++ * MINLength (Including FCS length==4) ++ * and 127 octets */ ++ u32 rx255; /* Total number of frames (including ++ * bad frames) received that were between ++ * 128 (Including FCS length==4) and 255 ++ * octets */ ++ u32 txok; /* Total number of octets residing in frames ++ * that where involved in succesfull ++ * transmission */ ++ u16 txcf; /* Total number of PAUSE control frames ++ * transmitted by this MAC */ ++ u8 res4[0x2]; ++ u32 tmca; /* Total number of frames that were transmitted ++ * succesfully with the group address bit set ++ * that are not broadcast frames */ ++ u32 tbca; /* Total number of frames transmitted ++ * succesfully that had destination address ++ * field equal to the broadcast address */ ++ u32 rxfok; /* Total number of frames received OK */ ++ u32 rxbok; /* Total number of octets received OK */ ++ u32 rbyt; /* Total number of octets received including ++ * octets in bad frames. Must be implemented ++ * in HW because it includes octets in frames ++ * that never even reach the UCC */ ++ u32 rmca; /* Total number of frames that were received ++ * succesfully with the group address bit set ++ * that are not broadcast frames */ ++ u32 rbca; /* Total number of frames received succesfully ++ * that had destination address equal to the ++ * broadcast address */ ++ u32 scar; /* Statistics carry register */ ++ u32 scam; /* Statistics caryy mask register */ ++ u8 res5[0x200 - 0x1c4]; ++} __attribute__ ((packed)) uec_t; ++ ++/* QE UCC Fast ++*/ ++typedef struct ucc_fast { ++ u32 gumr; /* UCCx general mode register */ ++ u32 upsmr; /* UCCx protocol-specific mode register */ ++ u16 utodr; /* UCCx transmit on demand register */ ++ u8 res0[0x2]; ++ u16 udsr; /* UCCx data synchronization register */ ++ u8 res1[0x2]; ++ u32 ucce; /* UCCx event register */ ++ u32 uccm; /* UCCx mask register. */ ++ u8 uccs; /* UCCx status register */ ++ u8 res2[0x7]; ++ u32 urfb; /* UCC receive FIFO base */ ++ u16 urfs; /* UCC receive FIFO size */ ++ u8 res3[0x2]; ++ u16 urfet; /* UCC receive FIFO emergency threshold */ ++ u16 urfset; /* UCC receive FIFO special emergency ++ * threshold */ ++ u32 utfb; /* UCC transmit FIFO base */ ++ u16 utfs; /* UCC transmit FIFO size */ ++ u8 res4[0x2]; ++ u16 utfet; /* UCC transmit FIFO emergency threshold */ ++ u8 res5[0x2]; ++ u16 utftt; /* UCC transmit FIFO transmit threshold */ ++ u8 res6[0x2]; ++ u16 utpt; /* UCC transmit polling timer */ ++ u8 res7[0x2]; ++ u32 urtry; /* UCC retry counter register */ ++ u8 res8[0x4C]; ++ u8 guemr; /* UCC general extended mode register */ ++ u8 res9[0x100 - 0x091]; ++ uec_t ucc_eth; ++} __attribute__ ((packed)) ucc_fast_t; ++ ++/* QE UCC ++*/ ++typedef struct ucc_common { ++ u8 res1[0x90]; ++ u8 guemr; ++ u8 res2[0x200 - 0x091]; ++} __attribute__ ((packed)) ucc_common_t; ++ ++typedef struct ucc { ++ union { ++ ucc_slow_t slow; ++ ucc_fast_t fast; ++ ucc_common_t common; ++ }; ++} __attribute__ ((packed)) ucc_t; ++ ++/* MultiPHY UTOPIA POS Controllers (UPC) ++*/ ++typedef struct upc { ++ u32 upgcr; /* UTOPIA/POS general configuration register */ ++ u32 uplpa; /* UTOPIA/POS last PHY address */ ++ u32 uphec; /* ATM HEC register */ ++ u32 upuc; /* UTOPIA/POS UCC configuration */ ++ u32 updc1; /* UTOPIA/POS device 1 configuration */ ++ u32 updc2; /* UTOPIA/POS device 2 configuration */ ++ u32 updc3; /* UTOPIA/POS device 3 configuration */ ++ u32 updc4; /* UTOPIA/POS device 4 configuration */ ++ u32 upstpa; /* UTOPIA/POS STPA threshold */ ++ u8 res0[0xC]; ++ u32 updrs1_h; /* UTOPIA/POS device 1 rate select */ ++ u32 updrs1_l; /* UTOPIA/POS device 1 rate select */ ++ u32 updrs2_h; /* UTOPIA/POS device 2 rate select */ ++ u32 updrs2_l; /* UTOPIA/POS device 2 rate select */ ++ u32 updrs3_h; /* UTOPIA/POS device 3 rate select */ ++ u32 updrs3_l; /* UTOPIA/POS device 3 rate select */ ++ u32 updrs4_h; /* UTOPIA/POS device 4 rate select */ ++ u32 updrs4_l; /* UTOPIA/POS device 4 rate select */ ++ u32 updrp1; /* UTOPIA/POS device 1 receive priority low */ ++ u32 updrp2; /* UTOPIA/POS device 2 receive priority low */ ++ u32 updrp3; /* UTOPIA/POS device 3 receive priority low */ ++ u32 updrp4; /* UTOPIA/POS device 4 receive priority low */ ++ u32 upde1; /* UTOPIA/POS device 1 event */ ++ u32 upde2; /* UTOPIA/POS device 2 event */ ++ u32 upde3; /* UTOPIA/POS device 3 event */ ++ u32 upde4; /* UTOPIA/POS device 4 event */ ++ u16 uprp1; ++ u16 uprp2; ++ u16 uprp3; ++ u16 uprp4; ++ u8 res1[0x8]; ++ u16 uptirr1_0; /* Device 1 transmit internal rate 0 */ ++ u16 uptirr1_1; /* Device 1 transmit internal rate 1 */ ++ u16 uptirr1_2; /* Device 1 transmit internal rate 2 */ ++ u16 uptirr1_3; /* Device 1 transmit internal rate 3 */ ++ u16 uptirr2_0; /* Device 2 transmit internal rate 0 */ ++ u16 uptirr2_1; /* Device 2 transmit internal rate 1 */ ++ u16 uptirr2_2; /* Device 2 transmit internal rate 2 */ ++ u16 uptirr2_3; /* Device 2 transmit internal rate 3 */ ++ u16 uptirr3_0; /* Device 3 transmit internal rate 0 */ ++ u16 uptirr3_1; /* Device 3 transmit internal rate 1 */ ++ u16 uptirr3_2; /* Device 3 transmit internal rate 2 */ ++ u16 uptirr3_3; /* Device 3 transmit internal rate 3 */ ++ u16 uptirr4_0; /* Device 4 transmit internal rate 0 */ ++ u16 uptirr4_1; /* Device 4 transmit internal rate 1 */ ++ u16 uptirr4_2; /* Device 4 transmit internal rate 2 */ ++ u16 uptirr4_3; /* Device 4 transmit internal rate 3 */ ++ u32 uper1; /* Device 1 port enable register */ ++ u32 uper2; /* Device 2 port enable register */ ++ u32 uper3; /* Device 3 port enable register */ ++ u32 uper4; /* Device 4 port enable register */ ++ u8 res2[0x150]; ++} __attribute__ ((packed)) upc_t; ++ ++/* SDMA ++*/ ++typedef struct sdma { ++ u32 sdsr; /* Serial DMA status register */ ++ u32 sdmr; /* Serial DMA mode register */ ++ u32 sdtr1; /* SDMA system bus threshold register */ ++ u32 sdtr2; /* SDMA secondary bus threshold register */ ++ u32 sdhy1; /* SDMA system bus hysteresis register */ ++ u32 sdhy2; /* SDMA secondary bus hysteresis register */ ++ u32 sdta1; /* SDMA system bus address register */ ++ u32 sdta2; /* SDMA secondary bus address register */ ++ u32 sdtm1; /* SDMA system bus MSNUM register */ ++ u32 sdtm2; /* SDMA secondary bus MSNUM register */ ++ u8 res0[0x10]; ++ u32 sdaqr; /* SDMA address bus qualify register */ ++ u32 sdaqmr; /* SDMA address bus qualify mask register */ ++ u8 res1[0x4]; ++ u32 sdwbcr; /* SDMA CAM entries base register */ ++ u8 res2[0x38]; ++} __attribute__ ((packed)) sdma_t; ++ ++/* Debug Space ++*/ ++typedef struct dbg { ++ u32 bpdcr; /* Breakpoint debug command register */ ++ u32 bpdsr; /* Breakpoint debug status register */ ++ u32 bpdmr; /* Breakpoint debug mask register */ ++ u32 bprmrr0; /* Breakpoint request mode risc register 0 */ ++ u32 bprmrr1; /* Breakpoint request mode risc register 1 */ ++ u8 res0[0x8]; ++ u32 bprmtr0; /* Breakpoint request mode trb register 0 */ ++ u32 bprmtr1; /* Breakpoint request mode trb register 1 */ ++ u8 res1[0x8]; ++ u32 bprmir; /* Breakpoint request mode immediate register */ ++ u32 bprmsr; /* Breakpoint request mode serial register */ ++ u32 bpemr; /* Breakpoint exit mode register */ ++ u8 res2[0x48]; ++} __attribute__ ((packed)) dbg_t; ++ ++/* RISC Special Registers (Trap and Breakpoint) ++*/ ++typedef struct rsp { ++ u8 fixme[0x100]; ++} __attribute__ ((packed)) rsp_t; ++ ++typedef struct qe_immap { ++ qe_iram_t iram; /* I-RAM */ ++ qe_ic_t ic; /* Interrupt Controller */ ++ cp_qe_t cp; /* Communications Processor */ ++ qe_mux_t qmx; /* QE Multiplexer */ ++ qe_timers_t qet; /* QE Timers */ ++ spi_t spi[0x2]; /* spi */ ++ mcc_t mcc; /* mcc */ ++ qe_brg_t brg; /* brg */ ++ usb_t usb; /* USB */ ++ si1_t si1; /* SI */ ++ u8 res11[0x800]; ++ sir_t sir; /* SI Routing Tables */ ++ ucc_t ucc1; /* ucc1 */ ++ ucc_t ucc3; /* ucc3 */ ++ ucc_t ucc5; /* ucc5 */ ++ ucc_t ucc7; /* ucc7 */ ++ u8 res12[0x600]; ++ upc_t upc1; /* MultiPHY UTOPIA POS Controller 1 */ ++ ucc_t ucc2; /* ucc2 */ ++ ucc_t ucc4; /* ucc4 */ ++ ucc_t ucc6; /* ucc6 */ ++ ucc_t ucc8; /* ucc8 */ ++ u8 res13[0x600]; ++ upc_t upc2; /* MultiPHY UTOPIA POS Controller 2 */ ++ sdma_t sdma; /* SDMA */ ++ dbg_t dbg; /* Debug Space */ ++ rsp_t rsp[0x2]; /* RISC Special Registers ++ * (Trap and Breakpoint) */ ++ u8 res14[0x300]; ++ u8 res15[0x3A00]; ++ u8 res16[0x8000]; /* 0x108000 - 0x110000 */ ++ u8 muram[0xC000]; /* 0x110000 - 0x11C000 Multi-user RAM */ ++ u8 res17[0x24000]; /* 0x11C000 - 0x140000 */ ++ u8 res18[0xC0000]; /* 0x140000 - 0x200000 */ ++} __attribute__ ((packed)) qe_map_t; ++ ++extern qe_map_t *qe_immr; ++ ++#endif /* __IMMAP_QE_H__ */ +diff -Naupr u-boot-1.1.6/include/asm-ppc/processor.h u-boot-1.1.6-fsl-1/include/asm-ppc/processor.h +--- u-boot-1.1.6/include/asm-ppc/processor.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/asm-ppc/processor.h 2006-12-06 10:33:49.000000000 -0600 +@@ -749,6 +749,7 @@ + #define PVR_405EP_RB 0x51210950 + #define PVR_440SP_RA 0x53221850 + #define PVR_440SP_RB 0x53221891 ++#define PVR_440SP_RC 0x53221892 + #define PVR_440SPe_RA 0x53421890 + #define PVR_440SPe_RB 0x53421891 + #define PVR_601 0x00010000 +diff -Naupr u-boot-1.1.6/include/common.h u-boot-1.1.6-fsl-1/include/common.h +--- u-boot-1.1.6/include/common.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/common.h 2006-11-30 12:34:13.000000000 -0600 +@@ -270,7 +270,7 @@ int misc_init_r (void); + void jumptable_init(void); + + /* common/memsize.c */ +-int get_ram_size (volatile long *, long); ++long get_ram_size (volatile long *, long); + + /* $(BOARD)/$(BOARD).c */ + void reset_phy (void); +@@ -402,6 +402,11 @@ void ppcSync(void); + void ppcDcbz(unsigned long value); + #endif + ++#if defined (CONFIG_MPC83XX) ++void ppcDWload(unsigned int *addr, unsigned int *ret); ++void ppcDWstore(unsigned int *addr, unsigned int *value); ++#endif ++ + /* $(CPU)/cpu.c */ + int checkcpu (void); + int checkicache (void); +diff -Naupr u-boot-1.1.6/include/configs/alpr.h u-boot-1.1.6-fsl-1/include/configs/alpr.h +--- u-boot-1.1.6/include/configs/alpr.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/alpr.h 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,346 @@ ++/* ++ * (C) Copyright 2006 ++ * Stefan Roese, DENX Software Engineering, sr@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++/*----------------------------------------------------------------------- ++ * High Level Configuration Options ++ *----------------------------------------------------------------------*/ ++#define CONFIG_ALPR 1 /* Board is ebony */ ++#define CONFIG_440GX 1 /* Specifc GX support */ ++#define CONFIG_4xx 1 /* ... PPC4xx family */ ++#define CONFIG_BOARD_EARLY_INIT_F 1 /* Call board_pre_init */ ++#define CONFIG_LAST_STAGE_INIT 1 /* call last_stage_init() */ ++#undef CFG_DRAM_TEST /* Disable-takes long time! */ ++#define CONFIG_SYS_CLK_FREQ 33333333 /* external freq to pll */ ++ ++/*----------------------------------------------------------------------- ++ * Base addresses -- Note these are effective addresses where the ++ * actual resources get mapped (not physical addresses) ++ *----------------------------------------------------------------------*/ ++#define CFG_SDRAM_BASE 0x00000000 /* _must_ be 0 */ ++#define CFG_FLASH_BASE 0xffe00000 /* start of FLASH */ ++#define CFG_MONITOR_BASE 0xfffc0000 /* start of monitor */ ++#define CFG_PCI_MEMBASE 0x80000000 /* mapped pci memory */ ++#define CFG_PCI_MEMSIZE 0x40000000 /* size of mapped pci memory */ ++#define CFG_PERIPHERAL_BASE 0xe0000000 /* internal peripherals */ ++#define CFG_ISRAM_BASE 0xc0000000 /* internal SRAM */ ++#define CFG_PCI_BASE 0xd0000000 /* internal PCI regs */ ++#define CFG_PCI_MEMBASE1 CFG_PCI_MEMBASE + 0x10000000 ++#define CFG_PCI_MEMBASE2 CFG_PCI_MEMBASE1 + 0x10000000 ++#define CFG_PCI_MEMBASE3 CFG_PCI_MEMBASE2 + 0x10000000 ++ ++ ++#define CFG_FPGA_BASE (CFG_PERIPHERAL_BASE + 0x08300000) ++#define CFG_NVRAM_BASE_ADDR (CFG_PERIPHERAL_BASE + 0x08000000) ++ ++/*----------------------------------------------------------------------- ++ * Initial RAM & stack pointer (placed in internal SRAM) ++ *----------------------------------------------------------------------*/ ++#define CFG_TEMP_STACK_OCM 1 ++#define CFG_OCM_DATA_ADDR CFG_ISRAM_BASE ++#define CFG_INIT_RAM_ADDR CFG_ISRAM_BASE /* Initial RAM address */ ++#define CFG_INIT_RAM_END 0x2000 /* End of used area in RAM */ ++#define CFG_GBL_DATA_SIZE 128 /* num bytes initial data */ ++ ++#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) ++#define CFG_POST_WORD_ADDR (CFG_GBL_DATA_OFFSET - 0x4) ++#define CFG_INIT_SP_OFFSET CFG_POST_WORD_ADDR ++ ++#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */ ++#define CFG_MALLOC_LEN (128 * 1024) /* Reserve 128 kB for malloc*/ ++ ++/*----------------------------------------------------------------------- ++ * Serial Port ++ *----------------------------------------------------------------------*/ ++#undef CFG_EXT_SERIAL_CLOCK ++#define CONFIG_BAUDRATE 115200 ++#define CONFIG_UART1_CONSOLE /* define for uart1 as console */ ++ ++#define CFG_BAUDRATE_TABLE \ ++ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200} ++ ++/*----------------------------------------------------------------------- ++ * FLASH related ++ *----------------------------------------------------------------------*/ ++#define CFG_FLASH_CFI 1 /* The flash is CFI compatible */ ++#define CFG_FLASH_CFI_DRIVER 1 /* Use common CFI driver */ ++#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ ++#define CFG_MAX_FLASH_SECT 512 /* max number of sectors on one chip */ ++#define CFG_FLASH_USE_BUFFER_WRITE 1 /* use buffered writes (20x faster) */ ++#define CFG_FLASH_EMPTY_INFO /* print 'E' for empty sector on flinfo */ ++#define CFG_FLASH_QUIET_TEST 1 /* don't warn upon unknown flash */ ++ ++#define CFG_ENV_IS_IN_FLASH 1 /* use FLASH for environment vars */ ++ ++#define CFG_ENV_SECT_SIZE 0x10000 /* size of one complete sector */ ++#define CFG_ENV_ADDR (CFG_MONITOR_BASE-CFG_ENV_SECT_SIZE) ++#define CFG_ENV_SIZE 0x2000 /* Total Size of Environment Sector */ ++ ++/* Address and size of Redundant Environment Sector */ ++#define CFG_ENV_ADDR_REDUND (CFG_ENV_ADDR-CFG_ENV_SECT_SIZE) ++#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE) ++ ++/*----------------------------------------------------------------------- ++ * DDR SDRAM ++ *----------------------------------------------------------------------*/ ++#undef CONFIG_SPD_EEPROM /* Don't use SPD EEPROM for setup */ ++#define CONFIG_SDRAM_BANK0 1 /* init onboard DDR SDRAM bank 0 */ ++#undef CONFIG_SDRAM_ECC /* enable ECC support */ ++#define CFG_SDRAM_TABLE { \ ++ {(256 << 20), 13, 0x000C4001}, /* 256MB mode 3, 13x10(4)*/ \ ++ {(64 << 20), 12, 0x00082001}} /* 64MB mode 2, 12x9(4) */ ++ ++/*----------------------------------------------------------------------- ++ * I2C ++ *----------------------------------------------------------------------*/ ++#define CONFIG_HARD_I2C 1 /* I2C with hardware support */ ++#undef CONFIG_SOFT_I2C /* I2C bit-banged */ ++#define CFG_I2C_SPEED 100000 /* I2C speed and slave address */ ++#define CFG_I2C_SLAVE 0x7F ++#define CFG_I2C_NOPROBES {0x69} /* Don't probe these addrs */ ++ ++/*----------------------------------------------------------------------- ++ * I2C EEPROM (PCF8594C) ++ *----------------------------------------------------------------------*/ ++#define CFG_I2C_EEPROM_ADDR 0x54 /* EEPROM PCF8594C */ ++#define CFG_I2C_EEPROM_ADDR_LEN 1 /* Bytes of address */ ++/* mask of address bits that overflow into the "EEPROM chip address" */ ++#define CFG_I2C_EEPROM_ADDR_OVERFLOW 0x07 ++#define CFG_EEPROM_PAGE_WRITE_BITS 3 /* The Philips PCF8594C has */ ++ /* 8 byte page write mode using */ ++ /* last 3 bits of the address */ ++#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 40 /* and takes up to 40 msec */ ++#define CFG_EEPROM_PAGE_WRITE_ENABLE ++ ++#define CONFIG_PREBOOT "echo;" \ ++ "echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \ ++ "echo" ++ ++#undef CONFIG_BOOTARGS ++ ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ "netdev=eth3\0" \ ++ "hostname=alpr\0" \ ++ "nfsargs=setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=${serverip}:${rootpath}\0" \ ++ "ramargs=setenv bootargs root=/dev/ram rw\0" \ ++ "addip=setenv bootargs ${bootargs} " \ ++ "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \ ++ ":${hostname}:${netdev}:off panic=1\0" \ ++ "addtty=setenv bootargs ${bootargs} console=ttyS1,${baudrate} " \ ++ "mem=193M\0" \ ++ "flash_nfs=run nfsargs addip addtty;" \ ++ "bootm ${kernel_addr}\0" \ ++ "flash_self=run ramargs addip addtty;" \ ++ "bootm ${kernel_addr} ${ramdisk_addr}\0" \ ++ "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \ ++ "bootm\0" \ ++ "rootpath=/opt/projects/alpr/nfs_root\0" \ ++ "bootfile=/alpr/uImage\0" \ ++ "kernel_addr=fff00000\0" \ ++ "ramdisk_addr=fff10000\0" \ ++ "load=tftp 100000 /alpr/u-boot/u-boot.bin\0" \ ++ "update=protect off fffc0000 ffffffff;era fffc0000 ffffffff;" \ ++ "cp.b 100000 fffc0000 40000;" \ ++ "setenv filesize;saveenv\0" \ ++ "upd=run load;run update\0" \ ++ "" ++#define CONFIG_BOOTCOMMAND "run flash_self" ++ ++#define CONFIG_BOOTDELAY 2 /* autoboot after 5 seconds */ ++ ++#define CONFIG_BAUDRATE 115200 ++ ++#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */ ++#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */ ++ ++#define CONFIG_MII 1 /* MII PHY management */ ++#define CONFIG_NET_MULTI 1 ++#define CONFIG_PHY_ADDR 0x02 /* dummy setting, no EMAC0 used */ ++#define CONFIG_PHY1_ADDR 0x03 /* dummy setting, no EMAC1 used */ ++#define CONFIG_PHY2_ADDR 0x01 /* PHY address for EMAC2 */ ++#define CONFIG_PHY3_ADDR 0x02 /* PHY address for EMAC3 */ ++#define CONFIG_HAS_ETH0 ++#define CONFIG_HAS_ETH1 ++#define CONFIG_HAS_ETH2 ++#define CONFIG_HAS_ETH3 ++#define CONFIG_PHY_RESET 1 /* reset phy upon startup */ ++#define CONFIG_M88E1111_PHY 1 /* needed for PHY specific setup*/ ++#define CONFIG_PHY_GIGE 1 /* Include GbE speed/duplex detection */ ++#define CFG_RX_ETH_BUFFER 32 /* Number of ethernet rx buffers & descriptors */ ++ ++#define CONFIG_NETCONSOLE /* include NetConsole support */ ++ ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \ ++ CFG_CMD_ASKENV | \ ++ CFG_CMD_DHCP | \ ++ CFG_CMD_DIAG | \ ++ CFG_CMD_EEPROM | \ ++ CFG_CMD_ELF | \ ++ CFG_CMD_I2C | \ ++ CFG_CMD_IRQ | \ ++ CFG_CMD_MII | \ ++ CFG_CMD_NET | \ ++ CFG_CMD_NFS | \ ++ CFG_CMD_PCI | \ ++ CFG_CMD_PING | \ ++ CFG_CMD_FPGA | \ ++ CFG_CMD_NAND | \ ++ CFG_CMD_REGINFO) ++ ++/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ ++#include <cmd_confdefs.h> ++ ++#undef CONFIG_WATCHDOG /* watchdog disabled */ ++ ++/* ++ * Miscellaneous configurable options ++ */ ++#define CFG_LONGHELP /* undef to save memory */ ++#define CFG_PROMPT "=> " /* Monitor Command Prompt */ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ ++#else ++#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ++#endif ++#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ ++#define CFG_MAXARGS 16 /* max number of command args */ ++#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ ++ ++#define CFG_MEMTEST_START 0x0400000 /* memtest works on */ ++#define CFG_MEMTEST_END 0x0C00000 /* 4 ... 12 MB in DRAM */ ++ ++#define CFG_LOAD_ADDR 0x100000 /* default load address */ ++#define CFG_EXTBDINFO 1 /* To use extended board_into (bd_t) */ ++ ++#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */ ++ ++#define CONFIG_CMDLINE_EDITING 1 /* add command line history */ ++#define CONFIG_LOOPW 1 /* enable loopw command */ ++#define CONFIG_MX_CYCLIC 1 /* enable mdc/mwc commands */ ++#define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */ ++#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */ ++ ++#define CFG_4xx_RESET_TYPE 0x2 /* use chip reset on this board */ ++ ++/*----------------------------------------------------------------------- ++ * PCI stuff ++ *----------------------------------------------------------------------- ++ */ ++/* General PCI */ ++#define CONFIG_PCI /* include pci support */ ++#define CONFIG_PCI_PNP /* do pci plug-and-play */ ++#define CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */ ++#define CFG_PCI_TARGBASE 0x80000000 /* PCIaddr mapped to CFG_PCI_MEMBASE */ ++#define CONFIG_PCI_BOOTDELAY 1 /* enable pci bootdelay variable*/ ++ ++/* Board-specific PCI */ ++#define CFG_PCI_PRE_INIT /* enable board pci_pre_init() */ ++#define CFG_PCI_TARGET_INIT /* let board init pci target */ ++#define CFG_PCI_MASTER_INIT ++ ++#define CFG_PCI_SUBSYS_VENDORID 0x10e8 /* AMCC */ ++#define CFG_PCI_SUBSYS_DEVICEID 0xcafe /* Whatever */ ++ ++/*----------------------------------------------------------------------- ++ * FPGA stuff ++ *-----------------------------------------------------------------------*/ ++#define CONFIG_FPGA CFG_ALTERA_CYCLON2 ++#define CFG_FPGA_CHECK_CTRLC ++#define CFG_FPGA_PROG_FEEDBACK ++#define CONFIG_FPGA_COUNT 1 /* Ich habe 2 ... aber in ++ Reihe geschaltet -> sollte gehen, ++ aufpassen mit Datasize ist jetzt ++ halt doppelt so gross ... Seite 306 ++ ist das mit den multiple Device in PS ++ Mode erklaert ...*/ ++ ++/* FPGA program pin configuration */ ++#define CFG_GPIO_CLK 18 /* FPGA clk pin (cpu output) */ ++#define CFG_GPIO_DATA 19 /* FPGA data pin (cpu output) */ ++#define CFG_GPIO_STATUS 20 /* FPGA status pin (cpu input) */ ++#define CFG_GPIO_CONFIG 21 /* FPGA CONFIG pin (cpu output) */ ++#define CFG_GPIO_CON_DON 22 /* FPGA CONFIG_DONE pin (cpu input) */ ++ ++#define CFG_GPIO_SEL_DPR 14 /* cpu output */ ++#define CFG_GPIO_SEL_AVR 15 /* cpu output */ ++#define CFG_GPIO_PROG_EN 23 /* cpu output */ ++ ++/*----------------------------------------------------------------------- ++ * Definitions for GPIO setup ++ *-----------------------------------------------------------------------*/ ++#define CFG_GPIO_EREADY (0x80000000 >> 26) ++#define CFG_GPIO_REV0 (0x80000000 >> 14) ++#define CFG_GPIO_REV1 (0x80000000 >> 15) ++ ++/*----------------------------------------------------------------------- ++ * NAND-FLASH stuff ++ *-----------------------------------------------------------------------*/ ++#define CFG_MAX_NAND_DEVICE 4 ++#define NAND_MAX_CHIPS CFG_MAX_NAND_DEVICE ++#define CFG_NAND_BASE 0xF0000000 /* NAND FLASH Base Address */ ++#define CFG_NAND_BASE_LIST { CFG_NAND_BASE + 0, CFG_NAND_BASE + 2, \ ++ CFG_NAND_BASE + 4, CFG_NAND_BASE + 6 } ++#define CFG_NAND_QUIET_TEST 1 /* don't warn upon unknown NAND flash */ ++ ++/*----------------------------------------------------------------------- ++ * External Bus Controller (EBC) Setup ++ *----------------------------------------------------------------------*/ ++#define CFG_FLASH CFG_FLASH_BASE ++ ++/* Memory Bank 0 (Flash Bank 0, NOR-FLASH) initialization */ ++#define CFG_EBC_PB0AP 0x92015480 ++#define CFG_EBC_PB0CR (CFG_FLASH | 0x3A000) /* BS=2MB,BU=R/W,BW=16bit */ ++ ++/* Memory Bank 1 (NAND-FLASH) initialization */ ++#define CFG_EBC_PB1AP 0x01840380 /* TWT=3 */ ++#define CFG_EBC_PB1CR (CFG_NAND_BASE | 0x18000) /* BS=1MB,BU=R/W,BW=8bit */ ++ ++/* ++ * For booting Linux, the board info and command line data ++ * have to be in the first 8 MB of memory, since this is ++ * the maximum mapped by the Linux kernel during initialization. ++ */ ++#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */ ++/*----------------------------------------------------------------------- ++ * Cache Configuration ++ */ ++#define CFG_DCACHE_SIZE 32768 /* For AMCC 440 CPUs */ ++#define CFG_CACHELINE_SIZE 32 /* ... */ ++#define CFG_CACHELINE_SHIFT 5 /* log base 2 of the above value */ ++ ++/* ++ * Internal Definitions ++ * ++ * Boot Flags ++ */ ++#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ ++#define BOOTFLAG_WARM 0x02 /* Software reboot */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CONFIG_KGDB_BAUDRATE 230400 /* speed to run kgdb serial port */ ++#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ ++#endif ++#endif /* __CONFIG_H */ +diff -Naupr u-boot-1.1.6/include/configs/IceCube.h u-boot-1.1.6-fsl-1/include/configs/IceCube.h +--- u-boot-1.1.6/include/configs/IceCube.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/IceCube.h 2006-12-06 10:33:49.000000000 -0600 +@@ -172,6 +172,19 @@ + #undef CFG_IPBSPEED_133 /* define for 133MHz speed */ + #endif + #endif /* CONFIG_MPC5200 */ ++ ++/* pass open firmware flat tree */ ++#define CONFIG_OF_FLAT_TREE 1 ++#define CONFIG_OF_BOARD_SETUP 1 ++ ++/* maximum size of the flat tree (8K) */ ++#define OF_FLAT_TREE_MAX_SIZE 8192 ++ ++#define OF_CPU "PowerPC,5200@0" ++#define OF_SOC "soc5200@f0000000" ++#define OF_TBCLK (bd->bi_busfreq / 8) ++#define OF_STDOUT_PATH "/soc5200@f0000000/serial@2000" ++ + /* + * I2C configuration + */ +diff -Naupr u-boot-1.1.6/include/configs/MPC8349EMDS.h u-boot-1.1.6-fsl-1/include/configs/MPC8349EMDS.h +--- u-boot-1.1.6/include/configs/MPC8349EMDS.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/MPC8349EMDS.h 2006-11-10 11:24:30.000000000 -0600 +@@ -36,6 +36,7 @@ + */ + #define CONFIG_E300 1 /* E300 Family */ + #define CONFIG_MPC83XX 1 /* MPC83XX family */ ++#define CONFIG_MPC834X 1 /* MPC834X family */ + #define CONFIG_MPC8349 1 /* MPC8349 specific */ + #define CONFIG_MPC8349EMDS 1 /* MPC8349EMDS board specific */ + +@@ -59,9 +60,20 @@ + #endif + #endif + ++#define CFG_SCCR_INIT (SCCR_DEFAULT & (~SCCR_CLK_MASK)) ++#define CFG_SCCR_TSEC1CM SCCR_TSEC1CM_1 /* TSEC1 clock setting */ ++#define CFG_SCCR_TSEC2CM SCCR_TSEC2CM_1 /* TSEC2 clock setting */ ++#define CFG_SCCR_ENCCM SCCR_ENCCM_3 /* ENC clock setting */ ++#define CFG_SCCR_USBCM SCCR_USBCM_3 /* USB clock setting */ ++#define CFG_SCCR_VAL ( CFG_SCCR_INIT \ ++ | CFG_SCCR_TSEC1CM \ ++ | CFG_SCCR_TSEC2CM \ ++ | CFG_SCCR_ENCCM \ ++ | CFG_SCCR_USBCM ) ++ + #define CONFIG_BOARD_EARLY_INIT_F /* call board_pre_init */ + +-#define CFG_IMMRBAR 0xE0000000 ++#define CFG_IMMR 0xE0000000 + + #undef CFG_DRAM_TEST /* memory test, takes time */ + #define CFG_MEMTEST_START 0x00000000 /* memtest region */ +@@ -299,8 +311,8 @@ + #define CFG_BAUDRATE_TABLE \ + {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200} + +-#define CFG_NS16550_COM1 (CFG_IMMRBAR+0x4500) +-#define CFG_NS16550_COM2 (CFG_IMMRBAR+0x4600) ++#define CFG_NS16550_COM1 (CFG_IMMR+0x4500) ++#define CFG_NS16550_COM2 (CFG_IMMR+0x4600) + + /* Use the HUSH parser */ + #define CFG_HUSH_PARSER +@@ -308,20 +320,35 @@ + #define CFG_PROMPT_HUSH_PS2 "> " + #endif + ++/* pass open firmware flat tree */ ++#define CONFIG_OF_FLAT_TREE 1 ++#define CONFIG_OF_BOARD_SETUP 1 ++ ++/* maximum size of the flat tree (8K) */ ++#define OF_FLAT_TREE_MAX_SIZE 8192 ++ ++#define OF_CPU "PowerPC,8349@0" ++#define OF_SOC "soc8349@e0000000" ++#define OF_TBCLK (bd->bi_busfreq / 4) ++#define OF_STDOUT_PATH "/soc8349@e0000000/serial@4500" ++ + /* I2C */ + #define CONFIG_HARD_I2C /* I2C with hardware support*/ + #undef CONFIG_SOFT_I2C /* I2C bit-banged */ ++#define CONFIG_FSL_I2C ++#define CONFIG_I2C_MULTI_BUS ++#define CONFIG_I2C_CMD_TREE + #define CFG_I2C_SPEED 400000 /* I2C speed and slave address */ + #define CFG_I2C_SLAVE 0x7F +-#define CFG_I2C_NOPROBES {0x69} /* Don't probe these addrs */ ++#define CFG_I2C_NOPROBES {{0,0x69}} /* Don't probe these addrs */ + #define CFG_I2C_OFFSET 0x3000 + #define CFG_I2C2_OFFSET 0x3100 + + /* TSEC */ + #define CFG_TSEC1_OFFSET 0x24000 +-#define CFG_TSEC1 (CFG_IMMRBAR+CFG_TSEC1_OFFSET) ++#define CFG_TSEC1 (CFG_IMMR+CFG_TSEC1_OFFSET) + #define CFG_TSEC2_OFFSET 0x25000 +-#define CFG_TSEC2 (CFG_IMMRBAR+CFG_TSEC2_OFFSET) ++#define CFG_TSEC2 (CFG_IMMR+CFG_TSEC2_OFFSET) + + /* USB */ + #define CFG_USE_MPC834XSYS_USB_PHY 1 /* Use SYS board PHY */ +@@ -615,8 +642,8 @@ + #endif + + /* IMMRBAR @ 0xE0000000, PCI IO @ 0xE2000000 & BCSR @ 0xE2400000 */ +-#define CFG_IBAT5L (CFG_IMMRBAR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) +-#define CFG_IBAT5U (CFG_IMMRBAR | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_IBAT5L (CFG_IMMR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT5U (CFG_IMMR | BATU_BL_256M | BATU_VS | BATU_VP) + + /* SDRAM @ 0xF0000000, stack in DCACHE 0xFDF00000 & FLASH @ 0xFE000000 */ + #define CFG_IBAT6L (0xF0000000 | BATL_PP_10 | BATL_MEMCOHERENCE) +@@ -666,11 +693,11 @@ + #define CONFIG_ETH1ADDR 00:E0:0C:00:7E:21 + #endif + +-#define CONFIG_IPADDR 192.168.205.5 ++#define CONFIG_IPADDR 192.168.1.253 + + #define CONFIG_HOSTNAME mpc8349emds +-#define CONFIG_ROOTPATH /opt/eldk/ppc_6xx +-#define CONFIG_BOOTFILE /tftpboot/tqm83xx/uImage ++#define CONFIG_ROOTPATH /nfsroot/rootfs ++#define CONFIG_BOOTFILE uImage + + #define CONFIG_SERVERIP 192.168.1.1 + #define CONFIG_GATEWAYIP 192.168.1.1 +@@ -703,14 +730,31 @@ + "bootm ${kernel_addr} ${ramdisk_addr}\0" \ + "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \ + "bootm\0" \ +- "rootpath=/opt/eldk/ppc_6xx\0" \ +- "bootfile=/tftpboot/mpc8349emds/uImage\0" \ + "load=tftp 100000 /tftpboot/mpc8349emds/u-boot.bin\0" \ + "update=protect off fe000000 fe03ffff; " \ + "era fe000000 fe03ffff; cp.b 100000 fe000000 ${filesize}\0" \ + "upd=run load;run update\0" \ ++ "fdtaddr=400000\0" \ ++ "fdtfile=mpc8349emds.dtb\0" \ + "" + ++#define CONFIG_NFSBOOTCOMMAND \ ++ "setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=$serverip:$rootpath " \ ++ "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr - $fdtaddr" ++ ++#define CONFIG_RAMBOOTCOMMAND \ ++ "setenv bootargs root=/dev/ram rw " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $ramdiskaddr $ramdiskfile;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr $ramdiskaddr $fdtaddr" ++ + #define CONFIG_BOOTCOMMAND "run flash_self" + + #endif /* __CONFIG_H */ +diff -Naupr u-boot-1.1.6/include/configs/MPC8349ITX.h u-boot-1.1.6-fsl-1/include/configs/MPC8349ITX.h +--- u-boot-1.1.6/include/configs/MPC8349ITX.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/MPC8349ITX.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,804 @@ ++/* ++ * Copyright (C) Freescale Semiconductor, Inc. 2006. All rights reserved. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/* ++ MPC8349E-mITX board configuration file ++ ++ Memory map: ++ ++ 0x0000_0000-0x0FFF_FFFF DDR SDRAM (256 MB) ++ 0x8000_0000-0x9FFF_FFFF PCI1 memory space (512 MB) ++ 0xA000_0000-0xBFFF_FFFF PCI2 memory space (512 MB) ++ 0xE000_0000-0xEFFF_FFFF IMMR (1 MB) ++ 0xE200_0000-0xE2FF_FFFF PCI1 I/O space (16 MB) ++ 0xE300_0000-0xE3FF_FFFF PCI2 I/O space (16 MB) ++ 0xF000_0000-0xF000_FFFF Compact Flash ++ 0xF001_0000-0xF001_FFFF Local bus expansion slot ++ 0xF800_0000-0xF801_FFFF GBE L2 Switch VSC7385 ++ 0xFF00_0000-0xFF7F_FFFF Alternative bank of Flash memory (8MB) ++ 0xFF80_0000-0xFFFF_FFFF Boot Flash (8 MB) ++ ++ I2C address list: ++ Align. Board ++ Bus Addr Part No. Description Length Location ++ ---------------------------------------------------------------- ++ I2C0 0x50 M24256-BWMN6P Board EEPROM 2 U64 ++ ++ I2C1 0x20 PCF8574 I2C Expander 0 U8 ++ I2C1 0x21 PCF8574 I2C Expander 0 U10 ++ I2C1 0x38 PCF8574A I2C Expander 0 U8 ++ I2C1 0x39 PCF8574A I2C Expander 0 U10 ++ I2C1 0x51 (DDR) DDR EEPROM 1 U1 ++ I2C1 0x68 DS1339 RTC 1 U68 ++ ++ Note that a given board has *either* a pair of 8574s or a pair of 8574As. ++*/ ++ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++#undef DEBUG ++ ++/* ++ * High Level Configuration Options ++ */ ++#define CONFIG_MPC834X /* MPC834x family (8343, 8347, 8349) */ ++#define CONFIG_MPC8349 /* MPC8349 specific */ ++ ++#define CONFIG_PCI ++ ++#define CONFIG_COMPACT_FLASH /* The CF card interface on the back of the board */ ++#define CONFIG_RTC_DS1337 ++ ++/* I2C */ ++#define CONFIG_HARD_I2C ++ ++#ifdef CONFIG_HARD_I2C ++ ++#define CONFIG_MISC_INIT_F ++#define CONFIG_MISC_INIT_R ++ ++#define CONFIG_FSL_I2C ++#define CONFIG_I2C_MULTI_BUS ++#define CONFIG_I2C_CMD_TREE ++#define CFG_I2C_OFFSET 0x3000 ++#define CFG_I2C2_OFFSET 0x3100 ++#define CFG_SPD_BUS_NUM 1 /* The I2C bus for SPD */ ++ ++#define CFG_I2C_8574_ADDR1 0x20 /* I2C1, PCF8574 */ ++#define CFG_I2C_8574_ADDR2 0x21 /* I2C1, PCF8574 */ ++#define CFG_I2C_8574A_ADDR1 0x38 /* I2C1, PCF8574A */ ++#define CFG_I2C_8574A_ADDR2 0x39 /* I2C1, PCF8574A */ ++#define CFG_I2C_EEPROM_ADDR 0x50 /* I2C0, Board EEPROM */ ++#define CFG_I2C_RTC_ADDR 0x68 /* I2C1, DS1339 RTC*/ ++#define SPD_EEPROM_ADDRESS 0x51 /* I2C1, DDR */ ++ ++#define CFG_I2C_SPEED 400000 /* I2C speed and slave address */ ++#define CFG_I2C_SLAVE 0x7F ++ ++/* Don't probe these addresses: */ ++#define CFG_I2C_NOPROBES {{1, CFG_I2C_8574_ADDR1}, \ ++ {1, CFG_I2C_8574_ADDR2}, \ ++ {1, CFG_I2C_8574A_ADDR1}, \ ++ {1, CFG_I2C_8574A_ADDR2}} ++/* Bit definitions for the 8574[A] I2C expander */ ++#define I2C_8574_REVISION 0x03 /* Board revision, 00=0.0, 01=0.1, 10=1.0 */ ++#define I2C_8574_CF 0x08 /* 1=Compact flash absent, 0=present */ ++#define I2C_8574_MPCICLKRN 0x10 /* MiniPCI Clk Run */ ++#define I2C_8574_PCI66 0x20 /* 0=33MHz PCI, 1=66MHz PCI */ ++#define I2C_8574_FLASHSIDE 0x40 /* 0=Reset vector from U4, 1=from U7*/ ++ ++#undef CONFIG_SOFT_I2C ++ ++#endif ++ ++#define CONFIG_TSEC_ENET /* tsec ethernet support */ ++#define CONFIG_ENV_OVERWRITE ++ ++#define PCI_66M ++#ifdef PCI_66M ++#define CONFIG_83XX_CLKIN 66666666 /* in Hz */ ++#else ++#define CONFIG_83XX_CLKIN 33333333 /* in Hz */ ++#endif ++ ++#ifndef CONFIG_SYS_CLK_FREQ ++#ifdef PCI_66M ++#define CONFIG_SYS_CLK_FREQ 66666666 ++#else ++#define CONFIG_SYS_CLK_FREQ 33333333 ++#endif ++#endif ++ ++#define CFG_IMMR 0xE0000000 /* The IMMR is relocated to here */ ++ ++#undef CFG_DRAM_TEST /* memory test, takes time */ ++#define CFG_MEMTEST_START 0x00003000 /* memtest region */ ++#define CFG_MEMTEST_END 0x07100000 /* only has 128M */ ++ ++/* ++ * DDR Setup ++ */ ++#undef CONFIG_DDR_ECC /* only for ECC DDR module */ ++#undef CONFIG_DDR_ECC_CMD /* use DDR ECC user commands */ ++#define CONFIG_SPD_EEPROM /* use SPD EEPROM for DDR setup*/ ++ ++/* ++ * 32-bit data path mode. ++ * ++ * Please note that using this mode for devices with the real density of 64-bit ++ * effectively reduces the amount of available memory due to the effect of ++ * wrapping around while translating address to row/columns, for example in the ++ * 256MB module the upper 128MB get aliased with contents of the lower ++ * 128MB); normally this define should be used for devices with real 32-bit ++ * data path. ++ */ ++#undef CONFIG_DDR_32BIT ++ ++#define CFG_DDR_BASE 0x00000000 /* DDR is system memory*/ ++#define CFG_SDRAM_BASE CFG_DDR_BASE ++#define CFG_DDR_SDRAM_BASE CFG_DDR_BASE ++#undef CONFIG_DDR_2T_TIMING ++#define CFG_83XX_DDR_USES_CS0 ++ ++#ifndef CONFIG_SPD_EEPROM ++/* ++ * Manually set up DDR parameters ++ */ ++ #define CFG_DDR_SIZE 256 /* Mb */ ++ #define CFG_DDR_CONFIG (CSCONFIG_EN | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_10) ++ ++ #define CFG_DDR_TIMING_1 0x26242321 ++ #define CFG_DDR_TIMING_2 0x00000800 /* P9-45, may need tuning */ ++#endif ++ ++/* FLASH on the Local Bus */ ++#define CFG_FLASH_CFI /* use the Common Flash Interface */ ++#define CFG_FLASH_CFI_DRIVER /* use the CFI driver */ ++#define CFG_FLASH_BASE 0xFE000000 /* start of FLASH */ ++#define CFG_FLASH_SIZE 16 /* FLASH size in MB */ ++#define CFG_FLASH_EMPTY_INFO ++ ++#define CFG_BR0_PRELIM (CFG_FLASH_BASE | BR_PS_16 | BR_V) ++#define CFG_OR0_PRELIM ((~(CFG_FLASH_SIZE - 1) << 20) | OR_UPM_XAM | \ ++ OR_GPCM_CSNT | OR_GPCM_ACS_0b11 | OR_GPCM_XACS | OR_GPCM_SCY_15 | \ ++ OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD) ++#define CFG_LBLAWBAR0_PRELIM CFG_FLASH_BASE /* Window base at flash base */ ++#define CFG_LBLAWAR0_PRELIM 0x80000017 /* 16Mb window bytes */ ++ ++/* VSC7385 on the Local Bus */ ++#define CFG_VSC7385_BASE 0xF8000000 /* start of VSC7385 */ ++ ++#define CFG_BR1_PRELIM (CFG_VSC7385_BASE | BR_PS_8 | BR_V) ++#define CFG_OR1_PRELIM (0xFFFE0000 /* 128KB */ | \ ++ OR_GPCM_CSNT | OR_GPCM_XACS | OR_GPCM_SCY_15 | \ ++ OR_GPCM_SETA | OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD) ++ ++#define CFG_LBLAWBAR1_PRELIM CFG_VSC7385_BASE /* Access window base at VSC7385 base */ ++#define CFG_LBLAWAR1_PRELIM 0x80000010 /* Access window size 128K */ ++ ++#define CFG_MAX_FLASH_BANKS 2 /* number of banks */ ++#define CFG_MAX_FLASH_SECT 135 /* sectors per device */ ++ ++#define CFG_FLASH_BANKS_LIST {CFG_FLASH_BASE, CFG_FLASH_BASE + 0x800000} ++ ++#undef CFG_FLASH_CHECKSUM ++#define CFG_FLASH_ERASE_TOUT 60000 /* Flash Erase Timeout (ms) */ ++#define CFG_FLASH_WRITE_TOUT 500 /* Flash Write Timeout (ms) */ ++ ++#define CFG_LED_BASE 0xF9000000 /* start of LED and Board ID */ ++#define CFG_BR2_PRELIM (CFG_LED_BASE | BR_PS_8 | BR_V) ++#define CFG_OR2_PRELIM (0xFFE00000 /* 2MB */ | \ ++ OR_GPCM_CSNT | OR_GPCM_ACS_0b11 | OR_GPCM_XACS | \ ++ OR_GPCM_SCY_9 | \ ++ OR_GPCM_TRLX | OR_GPCM_EHTR | OR_GPCM_EAD) ++ ++#ifdef CONFIG_COMPACT_FLASH ++ ++#define CFG_CF_BASE 0xF0000000 ++ ++#define CFG_BR3_PRELIM (CFG_CF_BASE | BR_PS_16 | BR_MS_UPMA | BR_V) ++#define CFG_OR3_PRELIM (OR_UPM_AM | OR_UPM_BI) ++ ++#define CFG_LBLAWBAR2_PRELIM CFG_CF_BASE /* Window base at flash base + LED & Board ID */ ++#define CFG_LBLAWAR2_PRELIM 0x8000000F /* 64K bytes */ ++ ++#undef CONFIG_IDE_RESET ++#undef CONFIG_IDE_PREINIT ++ ++#define CFG_IDE_MAXBUS 1 ++#define CFG_IDE_MAXDEVICE 1 ++ ++#define CFG_ATA_IDE0_OFFSET 0x0000 ++#define CFG_ATA_BASE_ADDR CFG_CF_BASE ++#define CFG_ATA_DATA_OFFSET 0x0000 ++#define CFG_ATA_REG_OFFSET 0 ++#define CFG_ATA_ALT_OFFSET 0x0200 ++#define CFG_ATA_STRIDE 2 ++ ++#define ATA_RESET_TIME 1 /* If a CF card is not inserted, time out quickly */ ++ ++#endif ++ ++#define CONFIG_DOS_PARTITION ++ ++#define CFG_MID_FLASH_JUMP 0x7F000000 ++#define CFG_MONITOR_BASE TEXT_BASE /* start of monitor */ ++ ++ ++#if (CFG_MONITOR_BASE < CFG_FLASH_BASE) ++#define CFG_RAMBOOT ++#else ++#undef CFG_RAMBOOT ++#endif ++ ++#define CONFIG_L1_INIT_RAM ++#define CFG_INIT_RAM_LOCK ++#define CFG_INIT_RAM_ADDR 0xFD000000 /* Initial RAM address */ ++#define CFG_INIT_RAM_END 0x1000 /* End of used area in RAM*/ ++ ++#define CFG_GBL_DATA_SIZE 0x100 /* num bytes initial data */ ++#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) ++#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET ++ ++#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */ ++#define CFG_MALLOC_LEN (128 * 1024) /* Reserved for malloc */ ++ ++/* ++ * Local Bus LCRR and LBCR regs ++ * LCRR: DLL bypass, Clock divider is 4 ++ * External Local Bus rate is ++ * CLKIN * HRCWL_CSB_TO_CLKIN / HRCWL_LCL_BUS_TO_SCB_CLK / LCRR_CLKDIV ++ */ ++#define CFG_LCRR (LCRR_DBYP | LCRR_CLKDIV_4) ++#define CFG_LBC_LBCR 0x00000000 ++ ++#undef CFG_LB_SDRAM /* if board has SRDAM on local bus */ ++ ++#ifdef CFG_LB_SDRAM ++/*local bus BR2, OR2 definition for SDRAM if soldered on the ADS board*/ ++/* ++ * Base Register 2 and Option Register 2 configure SDRAM. ++ * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000. ++ * ++ * For BR2, need: ++ * Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0 ++ * port-size = 32-bits = BR2[19:20] = 11 ++ * no parity checking = BR2[21:22] = 00 ++ * SDRAM for MSEL = BR2[24:26] = 011 ++ * Valid = BR[31] = 1 ++ * ++ * 0 4 8 12 16 20 24 28 ++ * 1111 0000 0000 0000 0001 1000 0110 0001 = F0001861 ++ */ ++ ++#define CFG_LBC_SDRAM_BASE 0xf0000000 /* Localbus SDRAM */ ++#define CFG_LBC_SDRAM_SIZE 64 /* LBC SDRAM is 64MB */ ++ ++#define CFG_LBLAWBAR2_PRELIM 0xF0000000 ++#define CFG_LBLAWAR2_PRELIM 0x80000019 /* 64M */ ++ ++#define CFG_BR2_PRELIM (CFG_LBC_SDRAM_BASE | BR_PS_32 | BR_MS_SDRAM | BR_V) ++#define CFG_OR2_PRELIM (0xFC000000 /* 64 MB */ | \ ++ OR_SDRAM_XAM | \ ++ ((9 - 7) << OR_SDRAM_COLS_SHIFT) | \ ++ ((13 - 9) << OR_SDRAM_ROWS_SHIFT) | \ ++ OR_SDRAM_EAD) ++ ++#define CFG_LBC_LSRT 0x32000000 /* LB sdram refresh timer, about 6us */ ++#define CFG_LBC_MRTPR 0x20000000 /* LB refresh timer prescal, 266MHz/32*/ ++ ++/* ++ * LSDMR masks ++ */ ++#define CFG_LBC_LSDMR_RFEN (1 << (31 - 1)) ++#define CFG_LBC_LSDMR_BSMA1516 (3 << (31 - 10)) ++#define CFG_LBC_LSDMR_BSMA1617 (4 << (31 - 10)) ++#define CFG_LBC_LSDMR_RFCR5 (3 << (31 - 16)) ++#define CFG_LBC_LSDMR_RFCR8 (5 << (31 - 16)) ++#define CFG_LBC_LSDMR_RFCR16 (7 << (31 - 16)) ++#define CFG_LBC_LSDMR_PRETOACT3 (3 << (31 - 19)) ++#define CFG_LBC_LSDMR_PRETOACT6 (5 << (31 - 19)) ++#define CFG_LBC_LSDMR_PRETOACT7 (7 << (31 - 19)) ++#define CFG_LBC_LSDMR_ACTTORW3 (3 << (31 - 22)) ++#define CFG_LBC_LSDMR_ACTTORW7 (7 << (31 - 22)) ++#define CFG_LBC_LSDMR_ACTTORW6 (6 << (31 - 22)) ++#define CFG_LBC_LSDMR_BL8 (1 << (31 - 23)) ++#define CFG_LBC_LSDMR_WRC2 (2 << (31 - 27)) ++#define CFG_LBC_LSDMR_WRC3 (3 << (31 - 27)) ++#define CFG_LBC_LSDMR_WRC4 (0 << (31 - 27)) ++#define CFG_LBC_LSDMR_BUFCMD (1 << (31 - 29)) ++#define CFG_LBC_LSDMR_CL3 (3 << (31 - 31)) ++ ++#define CFG_LBC_LSDMR_OP_NORMAL (0 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ARFRSH (1 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_SRFRSH (2 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_MRW (3 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PCHALL (5 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ACTBNK (6 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4)) ++ ++#define CFG_LBC_LSDMR_COMMON ( CFG_LBC_LSDMR_RFEN \ ++ | CFG_LBC_LSDMR_BSMA1516 \ ++ | CFG_LBC_LSDMR_RFCR8 \ ++ | CFG_LBC_LSDMR_PRETOACT6 \ ++ | CFG_LBC_LSDMR_ACTTORW3 \ ++ | CFG_LBC_LSDMR_BL8 \ ++ | CFG_LBC_LSDMR_WRC3 \ ++ | CFG_LBC_LSDMR_CL3 \ ++ ) ++ ++/* ++ * SDRAM Controller configuration sequence. ++ */ ++#define CFG_LBC_LSDMR_1 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_PCHALL) ++#define CFG_LBC_LSDMR_2 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_3 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_4 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_MRW) ++#define CFG_LBC_LSDMR_5 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_NORMAL) ++#endif ++ ++/* ++ * Serial Port ++ */ ++#define CONFIG_CONS_INDEX 1 ++#undef CONFIG_SERIAL_SOFTWARE_FIFO ++#define CFG_NS16550 ++#define CFG_NS16550_SERIAL ++#define CFG_NS16550_REG_SIZE 1 ++#define CFG_NS16550_CLK get_bus_freq(0) ++ ++#define CFG_BAUDRATE_TABLE \ ++ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200} ++ ++#define CFG_NS16550_COM1 (CFG_IMMR + 0x4500) ++#define CFG_NS16550_COM2 (CFG_IMMR + 0x4600) ++ ++/* Use the HUSH parser */ ++#define CFG_HUSH_PARSER ++#ifdef CFG_HUSH_PARSER ++#define CFG_PROMPT_HUSH_PS2 "> " ++#endif ++ ++/* pass open firmware flat tree */ ++#define CONFIG_OF_FLAT_TREE 1 ++#define CONFIG_OF_BOARD_SETUP 1 ++ ++/* maximum size of the flat tree (8K) */ ++#define OF_FLAT_TREE_MAX_SIZE 8192 ++ ++#define OF_CPU "PowerPC,8349@0" ++#define OF_SOC "soc8349@e0000000" ++#define OF_TBCLK (bd->bi_busfreq / 4) ++#define OF_STDOUT_PATH "/soc8349@e0000000/serial@4500" ++ ++#ifdef CONFIG_PCI ++ ++#define CONFIG_MPC83XX_PCI2 ++ ++/* ++ * General PCI ++ * Addresses are mapped 1-1. ++ */ ++#define CFG_PCI1_MEM_BASE 0x80000000 ++#define CFG_PCI1_MEM_PHYS CFG_PCI1_MEM_BASE ++#define CFG_PCI1_MEM_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI1_MMIO_BASE (CFG_PCI1_MEM_BASE + CFG_PCI1_MEM_SIZE) ++#define CFG_PCI1_MMIO_PHYS CFG_PCI1_MMIO_BASE ++#define CFG_PCI1_MMIO_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI1_IO_BASE 0x00000000 ++#define CFG_PCI1_IO_PHYS 0xE2000000 ++#define CFG_PCI1_IO_SIZE 0x01000000 /* 16M */ ++ ++#ifdef CONFIG_MPC83XX_PCI2 ++#define CFG_PCI2_MEM_BASE (CFG_PCI1_MMIO_BASE + CFG_PCI1_MMIO_SIZE) ++#define CFG_PCI2_MEM_PHYS CFG_PCI2_MEM_BASE ++#define CFG_PCI2_MEM_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI2_MMIO_BASE (CFG_PCI2_MEM_BASE + CFG_PCI2_MEM_SIZE) ++#define CFG_PCI2_MMIO_PHYS CFG_PCI2_MMIO_BASE ++#define CFG_PCI2_MMIO_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI2_IO_BASE 0x00000000 ++#define CFG_PCI2_IO_PHYS (CFG_PCI1_IO_PHYS + CFG_PCI1_IO_SIZE) ++#define CFG_PCI2_IO_SIZE 0x01000000 /* 16M */ ++#endif ++ ++#define _IO_BASE 0x00000000 /* points to PCI I/O space */ ++ ++#define CONFIG_NET_MULTI ++#define CONFIG_PCI_PNP /* do pci plug-and-play */ ++ ++#ifdef CONFIG_RTL8139 ++/* This macro is used by RTL8139 but not defined in PPC architecture */ ++#define KSEG1ADDR(x) (x) ++#endif ++ ++#ifndef CONFIG_PCI_PNP ++ #define PCI_ENET0_IOADDR 0x00000000 ++ #define PCI_ENET0_MEMADDR CFG_PCI2_MEM_BASE ++ #define PCI_IDSEL_NUMBER 0x0f /* IDSEL = AD15 */ ++#endif ++ ++#define CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */ ++ ++#endif ++ ++/* TSEC */ ++ ++#ifdef CONFIG_TSEC_ENET ++ ++#ifndef CONFIG_NET_MULTI ++#define CONFIG_NET_MULTI ++#endif ++ ++#define CONFIG_MII ++#define CONFIG_PHY_GIGE /* In case CFG_CMD_MII is specified */ ++ ++#define CONFIG_MPC83XX_TSEC1 ++ ++#ifdef CONFIG_MPC83XX_TSEC1 ++#define CONFIG_MPC83XX_TSEC1_NAME "TSEC0" ++#define CFG_TSEC1_OFFSET 0x24000 ++#define TSEC1_PHY_ADDR 0x1c /* VSC8201 uses address 0x1c */ ++#define TSEC1_PHYIDX 0 ++#endif ++ ++#ifdef CONFIG_MPC83XX_TSEC2 ++#define CONFIG_MPC83XX_TSEC2_NAME "TSEC1" ++#define CFG_TSEC2_OFFSET 0x25000 ++#define CONFIG_UNKNOWN_TSEC /* TSEC2 is proprietary */ ++#define TSEC2_PHY_ADDR 4 ++#define TSEC2_PHYIDX 0 ++#endif ++ ++#define CONFIG_ETHPRIME "Freescale TSEC" ++ ++#endif ++ ++ ++/* ++ * Environment ++ */ ++#ifndef CFG_RAMBOOT ++ #define CFG_ENV_IS_IN_FLASH ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE + 0x40000) ++ #define CFG_ENV_SECT_SIZE 0x20000 /* 128K(one sector) for env */ ++ #define CFG_ENV_SIZE 0x2000 ++#else ++ #define CFG_NO_FLASH /* Flash is not usable now */ ++ #define CFG_ENV_IS_NOWHERE /* Store ENV in memory only */ ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE - 0x1000) ++ #define CFG_ENV_SIZE 0x2000 ++#endif ++ ++#define CONFIG_LOADS_ECHO /* echo on for serial download */ ++#define CFG_LOADS_BAUD_CHANGE /* allow baudrate change */ ++ ++/* CONFIG_COMMANDS */ ++ ++#ifdef CONFIG_COMPACT_FLASH ++#define CONFIG_COMMANDS_CF (CFG_CMD_IDE | CFG_CMD_FAT) ++#else ++#define CONFIG_COMMANDS_CF 0 ++#endif ++ ++#ifdef CONFIG_PCI ++#define CONFIG_COMMANDS_PCI CFG_CMD_PCI ++#else ++#define CONFIG_COMMANDS_PCI 0 ++#endif ++ ++#ifdef CONFIG_HARD_I2C ++#define CONFIG_COMMANDS_I2C CFG_CMD_I2C ++#else ++#define CONFIG_COMMANDS_I2C 0 ++#endif ++ ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \ ++ CONFIG_COMMANDS_CF | \ ++ CFG_CMD_NET | \ ++ CFG_CMD_PING | \ ++ CONFIG_COMMANDS_I2C | \ ++ CONFIG_COMMANDS_PCI | \ ++ CFG_CMD_SDRAM | \ ++ CFG_CMD_DATE | \ ++ CFG_CMD_CACHE | \ ++ CFG_CMD_IRQ) ++#include <cmd_confdefs.h> ++ ++/* Watchdog */ ++ ++#undef CONFIG_WATCHDOG /* watchdog disabled */ ++#ifdef CONFIG_WATCHDOG ++#define CFG_WATCHDOG_VALUE 0xFFFFFFC3 ++#endif ++ ++/* ++ * Miscellaneous configurable options ++ */ ++#define CFG_LONGHELP /* undef to save memory */ ++#define CFG_LOAD_ADDR 0x2000000 /* default load address */ ++#define CFG_PROMPT "MPC8349E-mITX> " /* Monitor Command Prompt */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++ #define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ ++#else ++ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ++#endif ++ ++#define CFG_PBSIZE (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) /* Print Buffer Size */ ++#define CFG_MAXARGS 16 /* max number of command args */ ++#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ ++#define CFG_HZ 1000 /* decrementer freq: 1ms ticks */ ++ ++/* ++ * For booting Linux, the board info and command line data ++ * have to be in the first 8 MB of memory, since this is ++ * the maximum mapped by the Linux kernel during initialization. ++ */ ++#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux*/ ++ ++/* Cache Configuration */ ++#define CFG_DCACHE_SIZE 32768 ++#define CFG_CACHELINE_SIZE 32 ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CACHELINE_SHIFT 5 /* log2 of the above value */ ++#endif ++ ++#define CFG_RCWH_PCIHOST 0x80000000 /* PCIHOST */ ++ ++#define CFG_HRCW_LOW (\ ++ HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\ ++ HRCWL_DDR_TO_SCB_CLK_1X1 |\ ++ HRCWL_CSB_TO_CLKIN_4X1 |\ ++ HRCWL_VCO_1X2 |\ ++ HRCWL_CORE_TO_CSB_2X1) ++ ++#ifdef PCI_64BIT ++#define CFG_HRCW_HIGH (\ ++ HRCWH_PCI_HOST |\ ++ HRCWH_64_BIT_PCI |\ ++ HRCWH_PCI1_ARBITER_ENABLE |\ ++ HRCWH_PCI2_ARBITER_DISABLE |\ ++ HRCWH_CORE_ENABLE |\ ++ HRCWH_FROM_0X00000100 |\ ++ HRCWH_BOOTSEQ_DISABLE |\ ++ HRCWH_SW_WATCHDOG_DISABLE |\ ++ HRCWH_ROM_LOC_LOCAL_16BIT |\ ++ HRCWH_TSEC1M_IN_GMII |\ ++ HRCWH_TSEC2M_IN_GMII ) ++#else ++#define CFG_HRCW_HIGH (\ ++ HRCWH_PCI_HOST |\ ++ HRCWH_32_BIT_PCI |\ ++ HRCWH_PCI1_ARBITER_ENABLE |\ ++ HRCWH_PCI2_ARBITER_DISABLE |\ ++ HRCWH_CORE_ENABLE |\ ++ HRCWH_FROM_0XFFF00100 |\ ++ HRCWH_BOOTSEQ_DISABLE |\ ++ HRCWH_SW_WATCHDOG_DISABLE |\ ++ HRCWH_ROM_LOC_LOCAL_16BIT |\ ++ HRCWH_TSEC1M_IN_GMII |\ ++ HRCWH_TSEC2M_IN_GMII ) ++#endif ++ ++/* System performance */ ++#define CFG_ACR_PIPE_DEP 3 /* Arbiter pipeline depth (0-3) */ ++#define CFG_ACR_RPTCNT 3 /* Arbiter repeat count (0-7) */ ++#define CFG_SPCR_TSEC1EP 3 /* TSEC1 emergency priority (0-3) */ ++#define CFG_SPCR_TSEC2EP 3 /* TSEC2 emergency priority (0-3) */ ++#define CFG_SCCR_TSEC1CM 1 /* TSEC1 clock mode (0-3) */ ++#define CFG_SCCR_TSEC2CM 1 /* TSEC2 & I2C0 clock mode (0-3) */ ++#define CFG_ACR_RPTCNT 3 /* Arbiter repeat count */ ++ ++/* System IO Config */ ++#define CFG_SICRH SICRH_TSOBI1 /* Needed for gigabit to work on TSEC 1 */ ++#define CFG_SICRL (SICRL_LDP_A | SICRL_USB1) ++ ++#define CFG_HID0_INIT 0x000000000 ++ ++#define CFG_HID0_FINAL CFG_HID0_INIT ++ ++#define CFG_HID2 HID2_HBE ++ ++/* DDR @ 0x00000000 */ ++#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++ ++/* PCI @ 0x80000000 */ ++#ifdef CONFIG_PCI ++#define CFG_IBAT1L (CFG_PCI1_MEM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT1U (CFG_PCI1_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_IBAT2L (CFG_PCI1_MMIO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT2U (CFG_PCI1_MMIO_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#else ++#define CFG_IBAT1L 0 ++#define CFG_IBAT1U 0 ++#define CFG_IBAT2L 0 ++#define CFG_IBAT2U 0 ++#endif ++ ++#ifdef CONFIG_MPC83XX_PCI2 ++#define CFG_IBAT3L (CFG_PCI2_MEM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT3U (CFG_PCI2_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_IBAT4L (CFG_PCI2_MMIO_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT4U (CFG_PCI2_MMIO_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#else ++#define CFG_IBAT3L 0 ++#define CFG_IBAT3U 0 ++#define CFG_IBAT4L 0 ++#define CFG_IBAT4U 0 ++#endif ++ ++/* IMMRBAR @ 0xE0000000, PCI IO @ 0xE2000000 & BCSR @ 0xE2400000 */ ++#define CFG_IBAT5L (CFG_IMMR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT5U (CFG_IMMR | BATU_BL_256M | BATU_VS | BATU_VP) ++ ++/* SDRAM @ 0xF0000000, stack in DCACHE 0xFDF00000 & FLASH @ 0xFE000000 */ ++#define CFG_IBAT6L (0xF0000000 | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT6U (0xF0000000 | BATU_BL_256M | BATU_VS | BATU_VP) ++ ++#define CFG_IBAT7L 0 ++#define CFG_IBAT7U 0 ++ ++#define CFG_DBAT0L CFG_IBAT0L ++#define CFG_DBAT0U CFG_IBAT0U ++#define CFG_DBAT1L CFG_IBAT1L ++#define CFG_DBAT1U CFG_IBAT1U ++#define CFG_DBAT2L CFG_IBAT2L ++#define CFG_DBAT2U CFG_IBAT2U ++#define CFG_DBAT3L CFG_IBAT3L ++#define CFG_DBAT3U CFG_IBAT3U ++#define CFG_DBAT4L CFG_IBAT4L ++#define CFG_DBAT4U CFG_IBAT4U ++#define CFG_DBAT5L CFG_IBAT5L ++#define CFG_DBAT5U CFG_IBAT5U ++#define CFG_DBAT6L CFG_IBAT6L ++#define CFG_DBAT6U CFG_IBAT6U ++#define CFG_DBAT7L CFG_IBAT7L ++#define CFG_DBAT7U CFG_IBAT7U ++ ++/* ++ * Internal Definitions ++ * ++ * Boot Flags ++ */ ++#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ ++#define BOOTFLAG_WARM 0x02 /* Software reboot */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CONFIG_KGDB_BAUDRATE 230400 /* speed of kgdb serial port */ ++#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ ++#endif ++ ++ ++/* ++ * Environment Configuration ++ */ ++#define CONFIG_ENV_OVERWRITE ++ ++#ifdef CONFIG_MPC83XX_TSEC1 ++#define CONFIG_ETHADDR 00:E0:0C:00:8C:01 ++#endif ++ ++#ifdef CONFIG_MPC83XX_TSEC2 ++#define CONFIG_HAS_ETH1 ++#define CONFIG_ETH1ADDR 00:E0:0C:00:8C:02 ++#endif ++ ++#if 1 ++#define CONFIG_IPADDR 10.82.19.159 ++#define CONFIG_SERVERIP 10.82.48.106 ++#define CONFIG_GATEWAYIP 10.82.19.254 ++#define CONFIG_NETMASK 255.255.252.0 ++#define CONFIG_NETDEV eth0 ++ ++#define CONFIG_HOSTNAME mpc8349emitx ++#define CONFIG_ROOTPATH /nfsroot0/u/timur/itx-ltib/rootfs ++#define CONFIG_BOOTFILE timur/uImage ++ ++#define CONFIG_UBOOTPATH timur/u-boot.bin ++#else ++#define CONFIG_IPADDR 192.168.1.253 ++#define CONFIG_SERVERIP 192.168.1.1 ++#define CONFIG_GATEWAYIP 192.168.1.1 ++#define CONFIG_NETMASK 255.255.252.0 ++#define CONFIG_NETDEV eth0 ++ ++#define CONFIG_HOSTNAME mpc8349emitx ++#define CONFIG_ROOTPATH /nfsroot/rootfs ++#define CONFIG_BOOTFILE uImage ++ ++#define CONFIG_UBOOTPATH u-boot.bin ++#endif ++ ++#define CONFIG_UBOOTSTART fe700000 ++#define CONFIG_UBOOTEND fe77ffff ++ ++#define CONFIG_LOADADDR 200000 /* default location for tftp and bootm */ ++ ++#define CONFIG_BAUDRATE 115200 ++ ++#undef CONFIG_BOOTCOMMAND ++#ifdef CONFIG_BOOTCOMMAND ++#define CONFIG_BOOTDELAY 6 ++#else ++#define CONFIG_BOOTDELAY -1 /* -1 disables auto-boot */ ++#endif ++ ++#define XMK_STR(x) #x ++#define MK_STR(x) XMK_STR(x) ++ ++#define CONFIG_BOOTARGS \ ++ "root=/dev/nfs rw" \ ++ " nfsroot=" MK_STR(CONFIG_SERVERIP) ":" MK_STR(CONFIG_ROOTPATH) \ ++ " ip=" MK_STR(CONFIG_IPADDR) ":" MK_STR(CONFIG_SERVERIP) ":" \ ++ MK_STR(CONFIG_GATEWAYIP) ":" MK_STR(CONFIG_NETMASK) ":" \ ++ MK_STR(CONFIG_HOSTNAME) ":" MK_STR(CONFIG_NETDEV) ":off" \ ++ " console=ttyS0," MK_STR(CONFIG_BAUDRATE) ++ ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ "netdev=" MK_STR(CONFIG_NETDEV) "\0" \ ++ "tftpflash=tftpboot $loadaddr " MK_STR(CONFIG_UBOOTPATH) "; " \ ++ "erase " MK_STR(CONFIG_UBOOTSTART) " " MK_STR(CONFIG_UBOOTEND) "; " \ ++ "cp.b $loadaddr " MK_STR(CONFIG_UBOOTSTART) " $filesize; " \ ++ "cmp.b $loadaddr " MK_STR(CONFIG_UBOOTSTART) " $filesize\0" \ ++ "tftpupdate=tftpboot $loadaddr " MK_STR(CONFIG_UBOOTPATH) "; " \ ++ "protect off FEF00000 FEF7FFFF; " \ ++ "erase FEF00000 FEF7FFFF; " \ ++ "cp.b $loadaddr FEF00000 $filesize; " \ ++ "protect on FEF00000 FEF7FFFF; " \ ++ "cmp.b $loadaddr FEF00000 $filesize\0" \ ++ "tftplinux=tftpboot $loadaddr $bootfile; bootm\0" \ ++ "copyuboot=erase " MK_STR(CONFIG_UBOOTSTART) " " MK_STR(CONFIG_UBOOTEND) "; " \ ++ "cp.b fef00000 " MK_STR(CONFIG_UBOOTSTART) " 80000\0" \ ++ "fdtaddr=400000\0" \ ++ "fdtfile=mpc8349emitx.dtb\0" \ ++ "" ++ ++#define CONFIG_NFSBOOTCOMMAND \ ++ "setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=$serverip:$rootpath " \ ++ "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr - $fdtaddr" ++ ++#define CONFIG_RAMBOOTCOMMAND \ ++ "setenv bootargs root=/dev/ram rw " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $ramdiskaddr $ramdiskfile;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr $ramdiskaddr $fdtaddr" ++ ++ ++#undef MK_STR ++#undef XMK_STR ++ ++#endif +diff -Naupr u-boot-1.1.6/include/configs/MPC8360EMDS.h u-boot-1.1.6-fsl-1/include/configs/MPC8360EMDS.h +--- u-boot-1.1.6/include/configs/MPC8360EMDS.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/MPC8360EMDS.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,635 @@ ++/* ++ * Copyright (C) 2006 Freescale Semiconductor, Inc. ++ * ++ * Dave Liu <daveliu@freescale.com> ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++#undef DEBUG ++ ++/* ++ * High Level Configuration Options ++ */ ++#define CONFIG_E300 1 /* E300 family */ ++#define CONFIG_QE 1 /* Has QE */ ++#define CONFIG_MPC83XX 1 /* MPC83XX family */ ++#define CONFIG_MPC8360 1 /* MPC8360 CPU specific */ ++#define CONFIG_MPC8360EMDS 1 /* MPC8360EMDS board specific */ ++ ++/* ++ * System Clock Setup ++ */ ++#ifdef CONFIG_PCISLAVE ++#define CONFIG_83XX_PCICLK 66000000 /* in HZ */ ++#else ++#define CONFIG_83XX_CLKIN 66000000 /* in Hz */ ++#endif ++ ++#ifndef CONFIG_SYS_CLK_FREQ ++#define CONFIG_SYS_CLK_FREQ 66000000 ++#endif ++ ++/* ++ * Hardware Reset Configuration Word ++ */ ++#define CFG_HRCW_LOW (\ ++ HRCWL_LCL_BUS_TO_SCB_CLK_1X1 |\ ++ HRCWL_DDR_TO_SCB_CLK_1X1 |\ ++ HRCWL_CSB_TO_CLKIN_4X1 |\ ++ HRCWL_VCO_1X2 |\ ++ HRCWL_CE_PLL_VCO_DIV_4 |\ ++ HRCWL_CE_PLL_DIV_1X1 |\ ++ HRCWL_CE_TO_PLL_1X6 |\ ++ HRCWL_CORE_TO_CSB_2X1) ++ ++#ifdef CONFIG_PCISLAVE ++#define CFG_HRCW_HIGH (\ ++ HRCWH_PCI_AGENT |\ ++ HRCWH_PCI1_ARBITER_DISABLE |\ ++ HRCWH_PCICKDRV_DISABLE |\ ++ HRCWH_CORE_ENABLE |\ ++ HRCWH_FROM_0XFFF00100 |\ ++ HRCWH_BOOTSEQ_DISABLE |\ ++ HRCWH_SW_WATCHDOG_DISABLE |\ ++ HRCWH_ROM_LOC_LOCAL_16BIT) ++#else ++#define CFG_HRCW_HIGH (\ ++ HRCWH_PCI_HOST |\ ++ HRCWH_PCI1_ARBITER_ENABLE |\ ++ HRCWH_PCICKDRV_ENABLE |\ ++ HRCWH_CORE_ENABLE |\ ++ HRCWH_FROM_0X00000100 |\ ++ HRCWH_BOOTSEQ_DISABLE |\ ++ HRCWH_SW_WATCHDOG_DISABLE |\ ++ HRCWH_ROM_LOC_LOCAL_16BIT) ++#endif ++ ++/* ++ * System IO Config ++ */ ++#define CFG_SICRH 0x00000000 ++#define CFG_SICRL 0x40000000 ++ ++#define CONFIG_BOARD_EARLY_INIT_F /* call board_pre_init */ ++ ++/* ++ * IMMR new address ++ */ ++#define CFG_IMMR 0xE0000000 ++ ++/* ++ * DDR Setup ++ */ ++#define CFG_DDR_BASE 0x00000000 /* DDR is system memory */ ++#define CFG_SDRAM_BASE CFG_DDR_BASE ++#define CFG_DDR_SDRAM_BASE CFG_DDR_BASE ++ ++#define CFG_83XX_DDR_USES_CS0 ++ ++#undef CONFIG_DDR_ECC /* only for ECC DDR module */ ++#define CONFIG_DDR_ECC_CMD /* Use DDR ECC user commands */ ++ ++#define CONFIG_SPD_EEPROM /* Use SPD EEPROM for DDR setup */ ++#if defined(CONFIG_SPD_EEPROM) ++/* ++ * Determine DDR configuration from I2C interface. ++ */ ++#define SPD_EEPROM_ADDRESS 0x52 /* DDR SODIMM */ ++#else ++/* ++ * Manually set up DDR parameters ++ */ ++#define CFG_DDR_SIZE 256 /* MB */ ++#define CFG_DDR_CONFIG (CSCONFIG_EN | CSCONFIG_ROW_BIT_13 | CSCONFIG_COL_BIT_9) ++#define CFG_DDR_TIMING_1 0x37344321 /* tCL-tRCD-tRP-tRAS=2.5-3-3-7 */ ++#define CFG_DDR_TIMING_2 0x00000800 /* may need tuning */ ++#define CFG_DDR_CONTROL 0x42008000 /* Self refresh,2T timing */ ++#define CFG_DDR_MODE 0x20000162 /* DLL,normal,seq,4/2.5 */ ++#define CFG_DDR_INTERVAL 0x045b0100 /* page mode */ ++#endif ++ ++/* ++ * Memory test ++ */ ++#undef CFG_DRAM_TEST /* memory test, takes time */ ++#define CFG_MEMTEST_START 0x00000000 /* memtest region */ ++#define CFG_MEMTEST_END 0x00100000 ++ ++/* ++ * The reserved memory ++ */ ++ ++#define CFG_MONITOR_BASE TEXT_BASE /* start of monitor */ ++ ++#if (CFG_MONITOR_BASE < CFG_FLASH_BASE) ++#define CFG_RAMBOOT ++#else ++#undef CFG_RAMBOOT ++#endif ++ ++#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */ ++#define CFG_MALLOC_LEN (128 * 1024) /* Reserved for malloc */ ++ ++/* ++ * Initial RAM Base Address Setup ++ */ ++#define CFG_INIT_RAM_LOCK 1 ++#define CFG_INIT_RAM_ADDR 0xE6000000 /* Initial RAM address */ ++#define CFG_INIT_RAM_END 0x1000 /* End of used area in RAM */ ++#define CFG_GBL_DATA_SIZE 0x100 /* num bytes initial data */ ++#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) ++ ++/* ++ * Local Bus Configuration & Clock Setup ++ */ ++#define CFG_LCRR (LCRR_DBYP | LCRR_CLKDIV_4) ++#define CFG_LBC_LBCR 0x00000000 ++ ++/* ++ * FLASH on the Local Bus ++ */ ++#define CFG_FLASH_CFI /* use the Common Flash Interface */ ++#define CFG_FLASH_CFI_DRIVER /* use the CFI driver */ ++#define CFG_FLASH_BASE 0xFE000000 /* FLASH base address */ ++#define CFG_FLASH_SIZE 16 /* FLASH size is 16M */ ++ ++#define CFG_LBLAWBAR0_PRELIM CFG_FLASH_BASE /* Window base at flash base */ ++#define CFG_LBLAWAR0_PRELIM 0x80000018 /* 32MB window size */ ++ ++#define CFG_BR0_PRELIM (CFG_FLASH_BASE | /* Flash Base address */ \ ++ (2 << BR_PS_SHIFT) | /* 16 bit port size */ \ ++ BR_V) /* valid */ ++#define CFG_OR0_PRELIM 0xfe006ff7 /* 16MB Flash size */ ++ ++#define CFG_MAX_FLASH_BANKS 1 /* number of banks */ ++#define CFG_MAX_FLASH_SECT 128 /* sectors per device */ ++ ++#undef CFG_FLASH_CHECKSUM ++ ++/* ++ * BCSR on the Local Bus ++ */ ++#define CFG_BCSR 0xF8000000 ++#define CFG_LBLAWBAR1_PRELIM CFG_BCSR /* Access window base at BCSR base */ ++#define CFG_LBLAWAR1_PRELIM 0x8000000E /* Access window size 32K */ ++ ++#define CFG_BR1_PRELIM (CFG_BCSR|0x00000801) /* Port size=8bit, MSEL=GPCM */ ++#define CFG_OR1_PRELIM 0xFFFFE9f7 /* length 32K */ ++ ++/* ++ * SDRAM on the Local Bus ++ */ ++#define CFG_LBC_SDRAM_BASE 0xF0000000 /* SDRAM base address */ ++#define CFG_LBC_SDRAM_SIZE 64 /* LBC SDRAM is 64MB */ ++ ++#define CFG_LB_SDRAM /* if board has SRDAM on local bus */ ++ ++#ifdef CFG_LB_SDRAM ++#define CFG_LBLAWBAR2_PRELIM CFG_LBC_SDRAM_BASE ++#define CFG_LBLAWAR2_PRELIM 0x80000019 /* 64MB */ ++ ++/*local bus BR2, OR2 definition for SDRAM if soldered on the EPB board */ ++/* ++ * Base Register 2 and Option Register 2 configure SDRAM. ++ * The SDRAM base address, CFG_LBC_SDRAM_BASE, is 0xf0000000. ++ * ++ * For BR2, need: ++ * Base address of 0xf0000000 = BR[0:16] = 1111 0000 0000 0000 0 ++ * port size = 32-bits = BR2[19:20] = 11 ++ * no parity checking = BR2[21:22] = 00 ++ * SDRAM for MSEL = BR2[24:26] = 011 ++ * Valid = BR[31] = 1 ++ * ++ * 0 4 8 12 16 20 24 28 ++ * 1111 0000 0000 0000 0001 1000 0110 0001 = f0001861 ++ * ++ * CFG_LBC_SDRAM_BASE should be masked and OR'ed into ++ * the top 17 bits of BR2. ++ */ ++ ++#define CFG_BR2_PRELIM 0xf0001861 /*Port size=32bit, MSEL=SDRAM */ ++ ++/* ++ * The SDRAM size in MB, CFG_LBC_SDRAM_SIZE, is 64. ++ * ++ * For OR2, need: ++ * 64MB mask for AM, OR2[0:7] = 1111 1100 ++ * XAM, OR2[17:18] = 11 ++ * 9 columns OR2[19-21] = 010 ++ * 13 rows OR2[23-25] = 100 ++ * EAD set for extra time OR[31] = 1 ++ * ++ * 0 4 8 12 16 20 24 28 ++ * 1111 1100 0000 0000 0110 1001 0000 0001 = fc006901 ++ */ ++ ++#define CFG_OR2_PRELIM 0xfc006901 ++ ++#define CFG_LBC_LSRT 0x32000000 /* LB sdram refresh timer, about 6us */ ++#define CFG_LBC_MRTPR 0x20000000 /* LB refresh timer prescal, 266MHz/32 */ ++ ++/* ++ * LSDMR masks ++ */ ++#define CFG_LBC_LSDMR_OP_NORMAL (0 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ARFRSH (1 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_SRFRSH (2 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_MRW (3 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PRECH (4 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_PCHALL (5 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_ACTBNK (6 << (31 - 4)) ++#define CFG_LBC_LSDMR_OP_RWINV (7 << (31 - 4)) ++ ++#define CFG_LBC_LSDMR_COMMON 0x0063b723 ++ ++/* ++ * SDRAM Controller configuration sequence. ++ */ ++#define CFG_LBC_LSDMR_1 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_PCHALL) ++#define CFG_LBC_LSDMR_2 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_3 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_ARFRSH) ++#define CFG_LBC_LSDMR_4 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_MRW) ++#define CFG_LBC_LSDMR_5 ( CFG_LBC_LSDMR_COMMON \ ++ | CFG_LBC_LSDMR_OP_NORMAL) ++ ++#endif ++ ++/* ++ * Windows to access PIB via local bus ++ */ ++#define CFG_LBLAWBAR3_PRELIM 0xf8008000 /* windows base 0xf8008000 */ ++#define CFG_LBLAWAR3_PRELIM 0x8000000f /* windows size 64KB */ ++ ++/* ++ * CS4 on Local Bus, to PIB ++ */ ++#define CFG_BR4_PRELIM 0xf8008801 /* CS4 base address at 0xf8008000 */ ++#define CFG_OR4_PRELIM 0xffffe9f7 /* size 32KB, port size 8bit, GPCM */ ++ ++/* ++ * CS5 on Local Bus, to PIB ++ */ ++#define CFG_BR5_PRELIM 0xf8010801 /* CS5 base address at 0xf8010000 */ ++#define CFG_OR5_PRELIM 0xffffe9f7 /* size 32KB, port size 8bit, GPCM */ ++ ++/* ++ * Serial Port ++ */ ++#define CONFIG_CONS_INDEX 1 ++#undef CONFIG_SERIAL_SOFTWARE_FIFO ++#define CFG_NS16550 ++#define CFG_NS16550_SERIAL ++#define CFG_NS16550_REG_SIZE 1 ++#define CFG_NS16550_CLK get_bus_freq(0) ++ ++#define CFG_BAUDRATE_TABLE \ ++ {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200} ++ ++#define CFG_NS16550_COM1 (CFG_IMMR+0x4500) ++#define CFG_NS16550_COM2 (CFG_IMMR+0x4600) ++ ++/* Use the HUSH parser */ ++#define CFG_HUSH_PARSER ++#ifdef CFG_HUSH_PARSER ++#define CFG_PROMPT_HUSH_PS2 "> " ++#endif ++ ++/* pass open firmware flat tree */ ++#define CONFIG_OF_FLAT_TREE 1 ++#define CONFIG_OF_BOARD_SETUP 1 ++ ++/* maximum size of the flat tree (8K) */ ++#define OF_FLAT_TREE_MAX_SIZE 8192 ++ ++#define OF_CPU "PowerPC,8360@0" ++#define OF_SOC "soc8360@e0000000" ++#define OF_TBCLK (bd->bi_busfreq / 4) ++#define OF_STDOUT_PATH "/soc8360@e0000000/serial@4500" ++ ++/* I2C */ ++#define CONFIG_HARD_I2C /* I2C with hardware support */ ++#undef CONFIG_SOFT_I2C /* I2C bit-banged */ ++#define CONFIG_FSL_I2C ++#define CFG_I2C_SPEED 400000 /* I2C speed and slave address */ ++#define CFG_I2C_SLAVE 0x7F ++#define CFG_I2C_NOPROBES {0x52} /* Don't probe these addrs */ ++#define CFG_I2C_OFFSET 0x3000 ++#define CFG_I2C2_OFFSET 0x3100 ++ ++/* ++ * Config on-board RTC ++ */ ++#define CONFIG_RTC_DS1374 /* use ds1374 rtc via i2c */ ++#define CFG_I2C_RTC_ADDR 0x68 /* at address 0x68 */ ++ ++/* ++ * General PCI ++ * Addresses are mapped 1-1. ++ */ ++#define CFG_PCI_MEM_BASE 0x80000000 ++#define CFG_PCI_MEM_PHYS CFG_PCI_MEM_BASE ++#define CFG_PCI_MEM_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI_MMIO_BASE 0x90000000 ++#define CFG_PCI_MMIO_PHYS CFG_PCI_MMIO_BASE ++#define CFG_PCI_MMIO_SIZE 0x10000000 /* 256M */ ++#define CFG_PCI_IO_BASE 0xE0300000 ++#define CFG_PCI_IO_PHYS 0xE0300000 ++#define CFG_PCI_IO_SIZE 0x100000 /* 1M */ ++ ++#define CFG_PCI_SLV_MEM_LOCAL CFG_SDRAM_BASE ++#define CFG_PCI_SLV_MEM_BUS 0x00000000 ++#define CFG_PCI_SLV_MEM_SIZE 0x80000000 ++ ++ ++#ifdef CONFIG_PCI ++ ++#define CONFIG_NET_MULTI ++#define CONFIG_PCI_PNP /* do pci plug-and-play */ ++ ++#undef CONFIG_EEPRO100 ++#undef CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */ ++#define CFG_PCI_SUBSYS_VENDORID 0x1957 /* Freescale */ ++ ++#endif /* CONFIG_PCI */ ++ ++ ++#ifndef CONFIG_NET_MULTI ++#define CONFIG_NET_MULTI 1 ++#endif ++ ++/* ++ * QE UEC ethernet configuration ++ */ ++#define CONFIG_UEC_ETH ++#define CONFIG_ETHPRIME "Freescale GETH" ++#define CONFIG_PHY_MODE_NEED_CHANGE ++ ++#define CONFIG_UEC_ETH1 /* GETH1 */ ++ ++#ifdef CONFIG_UEC_ETH1 ++#define CFG_UEC1_UCC_NUM 0 /* UCC1 */ ++#define CFG_UEC1_RX_CLK QE_CLK_NONE ++#define CFG_UEC1_TX_CLK QE_CLK9 ++#define CFG_UEC1_ETH_TYPE GIGA_ETH ++#define CFG_UEC1_PHY_ADDR 0 ++#define CFG_UEC1_INTERFACE_MODE ENET_1000_GMII ++#endif ++ ++#define CONFIG_UEC_ETH2 /* GETH2 */ ++ ++#ifdef CONFIG_UEC_ETH2 ++#define CFG_UEC2_UCC_NUM 1 /* UCC2 */ ++#define CFG_UEC2_RX_CLK QE_CLK_NONE ++#define CFG_UEC2_TX_CLK QE_CLK4 ++#define CFG_UEC2_ETH_TYPE GIGA_ETH ++#define CFG_UEC2_PHY_ADDR 1 ++#define CFG_UEC2_INTERFACE_MODE ENET_1000_GMII ++#endif ++ ++/* ++ * Environment ++ */ ++ ++#ifndef CFG_RAMBOOT ++ #define CFG_ENV_IS_IN_FLASH 1 ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE + 0x40000) ++ #define CFG_ENV_SECT_SIZE 0x40000 /* 256K(one sector) for env */ ++ #define CFG_ENV_SIZE 0x2000 ++#else ++ #define CFG_NO_FLASH 1 /* Flash is not usable now */ ++ #define CFG_ENV_IS_NOWHERE 1 /* Store ENV in memory only */ ++ #define CFG_ENV_ADDR (CFG_MONITOR_BASE - 0x1000) ++ #define CFG_ENV_SIZE 0x2000 ++#endif ++ ++#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */ ++#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */ ++ ++#if defined(CFG_RAMBOOT) ++#if defined(CONFIG_PCI) ++#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_PCI \ ++ | CFG_CMD_I2C) \ ++ & \ ++ ~(CFG_CMD_ENV \ ++ | CFG_CMD_LOADS)) ++#else ++#define CONFIG_COMMANDS ((CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C) \ ++ & \ ++ ~(CFG_CMD_ENV \ ++ | CFG_CMD_LOADS)) ++#endif ++#else ++#if defined(CONFIG_PCI) ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ ++ | CFG_CMD_PCI \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C) ++#else ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL \ ++ | CFG_CMD_PING \ ++ | CFG_CMD_ASKENV \ ++ | CFG_CMD_I2C ) ++#endif ++#endif ++ ++#include <cmd_confdefs.h> ++ ++#undef CONFIG_WATCHDOG /* watchdog disabled */ ++ ++/* ++ * Miscellaneous configurable options ++ */ ++#define CFG_LONGHELP /* undef to save memory */ ++#define CFG_LOAD_ADDR 0x2000000 /* default load address */ ++#define CFG_PROMPT "=> " /* Monitor Command Prompt */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++ #define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ ++#else ++ #define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ++#endif ++ ++#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ ++#define CFG_MAXARGS 16 /* max number of command args */ ++#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ ++#define CFG_HZ 1000 /* decrementer freq: 1ms ticks */ ++ ++/* ++ * For booting Linux, the board info and command line data ++ * have to be in the first 8 MB of memory, since this is ++ * the maximum mapped by the Linux kernel during initialization. ++ */ ++#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */ ++ ++/* ++ * Core HID Setup ++ */ ++#define CFG_HID0_INIT 0x000000000 ++#define CFG_HID0_FINAL HID0_ENABLE_MACHINE_CHECK ++#define CFG_HID2 HID2_HBE ++ ++/* ++ * Cache Config ++ */ ++#define CFG_DCACHE_SIZE 32768 ++#define CFG_CACHELINE_SIZE 32 ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CACHELINE_SHIFT 5 /*log base 2 of the above value */ ++#endif ++ ++/* ++ * MMU Setup ++ */ ++ ++/* DDR: cache cacheable */ ++#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT0L CFG_IBAT0L ++#define CFG_DBAT0U CFG_IBAT0U ++ ++/* IMMRBAR & PCI IO: cache-inhibit and guarded */ ++#define CFG_IBAT1L (CFG_IMMR | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT1U (CFG_IMMR | BATU_BL_4M | BATU_VS | BATU_VP) ++#define CFG_DBAT1L CFG_IBAT1L ++#define CFG_DBAT1U CFG_IBAT1U ++ ++/* BCSR: cache-inhibit and guarded */ ++#define CFG_IBAT2L (CFG_BCSR | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT2U (CFG_BCSR | BATU_BL_128K | BATU_VS | BATU_VP) ++#define CFG_DBAT2L CFG_IBAT2L ++#define CFG_DBAT2U CFG_IBAT2U ++ ++/* FLASH: icache cacheable, but dcache-inhibit and guarded */ ++#define CFG_IBAT3L (CFG_FLASH_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT3U (CFG_FLASH_BASE | BATU_BL_32M | BATU_VS | BATU_VP) ++#define CFG_DBAT3L (CFG_FLASH_BASE | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT3U CFG_IBAT3U ++ ++/* Local bus SDRAM: cacheable */ ++#define CFG_IBAT4L (CFG_LBC_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT4U (CFG_LBC_SDRAM_BASE | BATU_BL_64M | BATU_VS | BATU_VP) ++#define CFG_DBAT4L CFG_IBAT4L ++#define CFG_DBAT4U CFG_IBAT4U ++ ++/* Stack in dcache: cacheable, no memory coherence */ ++#define CFG_IBAT5L (CFG_INIT_RAM_ADDR | BATL_PP_10) ++#define CFG_IBAT5U (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP) ++#define CFG_DBAT5L CFG_IBAT5L ++#define CFG_DBAT5U CFG_IBAT5U ++ ++#ifdef CONFIG_PCI ++/* PCI MEM space: cacheable */ ++#define CFG_IBAT6L (CFG_PCI_MEM_PHYS | BATL_PP_10 | BATL_MEMCOHERENCE) ++#define CFG_IBAT6U (CFG_PCI_MEM_PHYS | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT6L CFG_IBAT6L ++#define CFG_DBAT6U CFG_IBAT6U ++/* PCI MMIO space: cache-inhibit and guarded */ ++#define CFG_IBAT7L (CFG_PCI_MMIO_PHYS | BATL_PP_10 | \ ++ BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT7U (CFG_PCI_MMIO_PHYS | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT7L CFG_IBAT7L ++#define CFG_DBAT7U CFG_IBAT7U ++#else ++#define CFG_IBAT6L (0) ++#define CFG_IBAT6U (0) ++#define CFG_IBAT7L (0) ++#define CFG_IBAT7U (0) ++#define CFG_DBAT6L CFG_IBAT6L ++#define CFG_DBAT6U CFG_IBAT6U ++#define CFG_DBAT7L CFG_IBAT7L ++#define CFG_DBAT7U CFG_IBAT7U ++#endif ++ ++/* ++ * Internal Definitions ++ * ++ * Boot Flags ++ */ ++#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ ++#define BOOTFLAG_WARM 0x02 /* Software reboot */ ++ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CONFIG_KGDB_BAUDRATE 230400 /* speed of kgdb serial port */ ++#define CONFIG_KGDB_SER_INDEX 2 /* which serial port to use */ ++#endif ++ ++/* ++ * Environment Configuration ++ */ ++ ++#define CONFIG_ENV_OVERWRITE ++ ++#if defined(CONFIG_UEC_ETH) ++#define CONFIG_ETHADDR 00:04:9f:ef:01:01 ++#define CONFIG_HAS_ETH1 ++#define CONFIG_ETH1ADDR 00:04:9f:ef:01:02 ++#endif ++ ++#define CONFIG_BAUDRATE 115200 ++ ++#define CONFIG_LOADADDR 200000 /* default location for tftp and bootm */ ++ ++#define CONFIG_BOOTDELAY 6 /* -1 disables auto-boot */ ++#undef CONFIG_BOOTARGS /* the boot command will set bootargs */ ++ ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ "netdev=eth0\0" \ ++ "consoledev=ttyS0\0" \ ++ "ramdiskaddr=1000000\0" \ ++ "ramdiskfile=ramfs.83xx\0" \ ++ "fdtaddr=400000\0" \ ++ "fdtfile=mpc8349emds.dtb\0" \ ++ "" ++ ++#define CONFIG_NFSBOOTCOMMAND \ ++ "setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=$serverip:$rootpath " \ ++ "ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr - $fdtaddr" ++ ++#define CONFIG_RAMBOOTCOMMAND \ ++ "setenv bootargs root=/dev/ram rw " \ ++ "console=$consoledev,$baudrate $othbootargs;" \ ++ "tftp $ramdiskaddr $ramdiskfile;" \ ++ "tftp $loadaddr $bootfile;" \ ++ "tftp $fdtaddr $fdtfile;" \ ++ "bootm $loadaddr $ramdiskaddr $fdtaddr" ++ ++ ++#define CONFIG_BOOTCOMMAND CONFIG_NFSBOOTCOMMAND ++ ++#endif /* __CONFIG_H */ +diff -Naupr u-boot-1.1.6/include/configs/p3mx.h u-boot-1.1.6-fsl-1/include/configs/p3mx.h +--- u-boot-1.1.6/include/configs/p3mx.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/p3mx.h 2006-12-06 10:33:49.000000000 -0600 +@@ -0,0 +1,450 @@ ++/* ++ * (C) Copyright 2006 ++ * Stefan Roese, DENX Software Engineering, sr@denx.de. ++ * ++ * Based on original work by ++ * Roel Loeffen, (C) Copyright 2006 Prodrive B.V. ++ * ++ * See file CREDITS for list of people who contributed to this ++ * project. ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of ++ * the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, ++ * MA 02111-1307 USA ++ */ ++ ++/************************************************************************ ++ * p3mx.h - configuration for Prodrive P3M750 & P3M7448 boards ++ * ++ * The defines: ++ * CONFIG_P3M750 or ++ * CONFIG_P3M7448 ++ * are written into include/config.h by the "make xxx_config" command ++ ***********************************************************************/ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++/*----------------------------------------------------------------------- ++ * High Level Configuration Options ++ *----------------------------------------------------------------------*/ ++#define CONFIG_P3Mx /* used for both board versions */ ++ ++#if defined (CONFIG_P3M750) ++#define CONFIG_750FX /* 750GL/GX/FX */ ++#define CFG_BOARD_NAME "P3M750" ++#define CFG_BUS_HZ 100000000 ++#define CFG_BUS_CLK CFG_BUS_HZ ++#define CFG_TCLK 100000000 ++#elif defined (CONFIG_P3M7448) ++#define CONFIG_74xx ++#define CFG_BOARD_NAME "P3M7448" ++#define CFG_BUS_HZ 133333333 ++#define CFG_BUS_CLK CFG_BUS_HZ ++#define CFG_TCLK 133333333 ++#endif ++#define CFG_GT_DUAL_CPU /* also for JTAG even with one cpu */ ++ ++/* which initialization functions to call for this board */ ++#define CFG_BOARD_ASM_INIT 1 ++#define CONFIG_BOARD_EARLY_INIT_F 1 /* Call board_early_init_f */ ++#define CONFIG_BOARD_EARLY_INIT_R 1 /* Call board_early_init_f */ ++#define CONFIG_MISC_INIT_R 1 /* Call misc_init_r() */ ++#define CONFIG_ADD_RAM_INFO 1 /* Print additional info */ ++ ++/*----------------------------------------------------------------------- ++ * Base addresses -- Note these are effective addresses where the ++ * actual resources get mapped (not physical addresses) ++ *----------------------------------------------------------------------*/ ++#define CFG_SDRAM_BASE 0x00000000 ++#ifdef CONFIG_P3M750 ++#define CFG_SDRAM1_BASE 0x10000000 /* each 256 MByte */ ++#endif ++ ++#define CFG_MONITOR_LEN (256 << 10) /* Reserve 256 kB for Monitor */ ++#if defined (CONFIG_P3M750) ++#define CFG_FLASH_BASE 0xff800000 /* start of flash banks */ ++#define CFG_BOOT_SIZE _8M /* boot flash */ ++#elif defined (CONFIG_P3M7448) ++#define CFG_FLASH_BASE 0xff000000 /* start of flash banks */ ++#define CFG_BOOT_SIZE _16M /* boot flash */ ++#endif ++#define CFG_BOOT_SPACE CFG_FLASH_BASE /* BOOT_CS0 flash 0 */ ++#define CFG_MONITOR_BASE 0xfff00000 ++#define CFG_RESET_ADDRESS 0xfff00100 ++#define CFG_MALLOC_LEN (256 << 10) /* Reserve 256 kB for malloc */ ++#define CFG_MISC_REGION_BASE 0xf0000000 ++ ++#define CFG_DFL_GT_REGS 0xf1000000 /* boot time GT_REGS */ ++#define CFG_GT_REGS 0xf1000000 /* GT Registers are mapped here */ ++#define CFG_INT_SRAM_BASE 0x42000000 /* GT offers 256k internal SRAM */ ++ ++/*----------------------------------------------------------------------- ++ * Initial RAM & stack pointer (placed in internal SRAM) ++ *----------------------------------------------------------------------*/ ++ /* ++ * When locking data in cache you should point the CFG_INIT_RAM_ADDRESS ++ * To an unused memory region. The stack will remain in cache until RAM ++ * is initialized ++*/ ++#undef CFG_INIT_RAM_LOCK ++#define CFG_INIT_RAM_ADDR 0x42000000 ++#define CFG_INIT_RAM_END 0x1000 ++#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for init data */ ++#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) ++ ++ ++/*----------------------------------------------------------------------- ++ * Serial Port ++ *----------------------------------------------------------------------*/ ++#define CONFIG_MPSC /* MV64460 Serial */ ++#define CONFIG_MPSC_PORT 0 ++#define CONFIG_BAUDRATE 115200 /* console baudrate */ ++#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, 230400 } ++#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */ ++#define CFG_LOADS_BAUD_CHANGE 1 /* allow baudrate change */ ++ ++/*----------------------------------------------------------------------- ++ * Ethernet ++ *----------------------------------------------------------------------*/ ++/* Change the default ethernet port, use this define (options: 0, 1, 2) */ ++#define CFG_ETH_PORT ETH_0 ++#define CONFIG_NET_MULTI ++#define MV_ETH_DEVS 2 ++#define CONFIG_PHY_RESET 1 /* reset phy upon startup */ ++#define CONFIG_PHY_GIGE 1 /* Include GbE speed/duplex detection */ ++ ++/*----------------------------------------------------------------------- ++ * FLASH related ++ *----------------------------------------------------------------------*/ ++#define CFG_FLASH_CFI /* The flash is CFI compatible */ ++#define CFG_FLASH_CFI_DRIVER /* Use common CFI driver */ ++#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ ++#define CFG_MAX_FLASH_SECT 512 /* max number of sectors on one chip */ ++#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */ ++#define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms) */ ++#define CFG_FLASH_USE_BUFFER_WRITE 1 /* use buffered writes (20x faster) */ ++#define CFG_FLASH_PROTECTION 1 /* use hardware flash protection */ ++#define CFG_FLASH_EMPTY_INFO /* print 'E' for empty sector on flinfo */ ++ ++#define CFG_ENV_IS_IN_FLASH 1 /* use FLASH for environment vars */ ++#if defined (CONFIG_P3M750) ++#define CFG_ENV_SECT_SIZE 0x20000 /* one sector (1 device)*/ ++#elif defined (CONFIG_P3M7448) ++#define CFG_ENV_SECT_SIZE 0x40000 /* two sectors (2 devices parallel */ ++#endif ++#define CFG_ENV_SIZE 0x2000 /* Total Size of Environment Sector */ ++#define CFG_ENV_ADDR (CFG_MONITOR_BASE + CFG_MONITOR_LEN) ++ ++/*----------------------------------------------------------------------- ++ * DDR SDRAM ++ *----------------------------------------------------------------------*/ ++#define CONFIG_MV64460_ECC ++ ++/*----------------------------------------------------------------------- ++ * I2C ++ *----------------------------------------------------------------------*/ ++#define CFG_I2C_SPEED 100000 /* I2C speed default */ ++ ++/* I2C RTC */ ++#define CONFIG_RTC_M41T11 1 ++#define CFG_I2C_RTC_ADDR 0x68 ++#define CFG_M41T11_BASE_YEAR 1900 /* play along with linux */ ++ ++/*----------------------------------------------------------------------- ++ * PCI stuff ++ *----------------------------------------------------------------------*/ ++#define PCI_HOST_ADAPTER 0 /* configure ar pci adapter */ ++#define PCI_HOST_FORCE 1 /* configure as pci host */ ++#define PCI_HOST_AUTO 2 /* detected via arbiter enable */ ++ ++#define CONFIG_PCI /* include pci support */ ++#define CONFIG_PCI_HOST PCI_HOST_FORCE /* select pci host function */ ++#define CONFIG_PCI_PNP /* do pci plug-and-play */ ++#define CONFIG_PCI_SCAN_SHOW /* show devices on bus */ ++ ++/* PCI MEMORY MAP section */ ++#define CFG_PCI0_MEM_BASE 0x80000000 ++#define CFG_PCI0_MEM_SIZE _128M ++#define CFG_PCI1_MEM_BASE 0x88000000 ++#define CFG_PCI1_MEM_SIZE _128M ++ ++#define CFG_PCI0_0_MEM_SPACE (CFG_PCI0_MEM_BASE) ++#define CFG_PCI1_0_MEM_SPACE (CFG_PCI1_MEM_BASE) ++ ++/* PCI I/O MAP section */ ++#define CFG_PCI0_IO_BASE 0xfa000000 ++#define CFG_PCI0_IO_SIZE _16M ++#define CFG_PCI1_IO_BASE 0xfb000000 ++#define CFG_PCI1_IO_SIZE _16M ++ ++#define CFG_PCI0_IO_SPACE (CFG_PCI0_IO_BASE) ++#define CFG_PCI0_IO_SPACE_PCI 0x00000000 ++#define CFG_PCI1_IO_SPACE (CFG_PCI1_IO_BASE) ++#define CFG_PCI1_IO_SPACE_PCI 0x00000000 ++ ++#define CFG_ISA_IO_BASE_ADDRESS (CFG_PCI0_IO_BASE) ++ ++#define CFG_PCI_IDSEL 0x30 ++ ++#undef CONFIG_BOOTARGS ++#define CONFIG_EXTRA_ENV_SETTINGS_COMMON \ ++ "netdev=eth0\0" \ ++ "nfsargs=setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=${serverip}:${rootpath}\0" \ ++ "ramargs=setenv bootargs root=/dev/ram rw\0" \ ++ "addip=setenv bootargs ${bootargs} " \ ++ "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \ ++ ":${hostname}:${netdev}:off panic=1\0" \ ++ "addtty=setenv bootargs ${bootargs} console=ttyS0,${baudrate}\0"\ ++ "flash_nfs=run nfsargs addip addtty;" \ ++ "bootm ${kernel_addr}\0" \ ++ "flash_self=run ramargs addip addtty;" \ ++ "bootm ${kernel_addr} ${ramdisk_addr}\0" \ ++ "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \ ++ "bootm\0" \ ++ "rootpath=/opt/eldk/ppc_6xx\0" \ ++ "u-boot=p3mx/u-boot/u-boot.bin\0" \ ++ "load=tftp 100000 ${u-boot}\0" \ ++ "update=protect off fff00000 fff3ffff;era fff00000 fff3ffff;" \ ++ "cp.b 100000 fff00000 40000;" \ ++ "setenv filesize;saveenv\0" \ ++ "upd=run load;run update\0" \ ++ "serverip=11.0.0.152\0" ++ ++#if defined (CONFIG_P3M750) ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ CONFIG_EXTRA_ENV_SETTINGS_COMMON \ ++ "hostname=p3m750\0" \ ++ "bootfile=/tftpboot/p3mx/vxWorks.st\0" \ ++ "kernel_addr=fc000000\0" \ ++ "ramdisk_addr=fc180000\0" \ ++ "vxfile=p3m750/vxWorks\0" \ ++ "vxuser=ddg\0" \ ++ "vxpass=ddg\0" \ ++ "vxtarget=target\0" \ ++ "vxflags=0x8\0" \ ++ "vxargs=setenv bootargs mgi(0,0)host:${vxfile} h=${serverip} " \ ++ "e=${ipaddr} u=${vxuser} pw=${vxpass} tn=${vxtarget} " \ ++ "f=${vxflags}\0" ++#elif defined (CONFIG_P3M7448) ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ CONFIG_EXTRA_ENV_SETTINGS_COMMON \ ++ "hostname=p3m7448\0" ++#endif ++ ++#if defined (CONFIG_P3M750) ++#define CONFIG_BOOTCOMMAND "tftp;run vxargs;bootvx" ++#elif defined (CONFIG_P3M7448) ++#define CONFIG_BOOTCOMMAND " " ++#endif ++ ++#define CONFIG_BOOTDELAY 3 /* autoboot after 5 seconds */ ++#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAULT | \ ++ CONFIG_BOOTP_BOOTFILESIZE) ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \ ++ CFG_CMD_ASKENV | \ ++ CFG_CMD_DATE | \ ++ CFG_CMD_DIAG | \ ++ CFG_CMD_ELF | \ ++ CFG_CMD_I2C | \ ++ CFG_CMD_IRQ | \ ++ CFG_CMD_MII | \ ++ CFG_CMD_NET | \ ++ CFG_CMD_NFS | \ ++ CFG_CMD_PING | \ ++ CFG_CMD_REGINFO | \ ++ CFG_CMD_PCI | \ ++ CFG_CMD_CACHE | \ ++ CFG_CMD_SDRAM) ++ ++/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ ++#include <cmd_confdefs.h> ++ ++/*----------------------------------------------------------------------- ++ * Miscellaneous configurable options ++ *----------------------------------------------------------------------*/ ++#define CFG_HUSH_PARSER ++#define CFG_PROMPT_HUSH_PS2 "> " ++ ++#define CFG_LONGHELP /* undef to save memory */ ++#define CFG_PROMPT "=> " /* Monitor Command Prompt */ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ ++#else ++#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ++#endif ++#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ ++#define CFG_MAXARGS 16 /* max number of command args */ ++#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ ++ ++#define CFG_MEMTEST_START 0x0400000 /* memtest works on */ ++#define CFG_MEMTEST_END 0x0C00000 /* 4 ... 12 MB in DRAM */ ++ ++#define CFG_LOAD_ADDR 0x08000000 /* default load address */ ++ ++#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */ ++ ++#define CONFIG_CMDLINE_EDITING 1 /* add command line history */ ++#define CONFIG_LOOPW 1 /* enable loopw command */ ++#define CONFIG_MX_CYCLIC 1 /* enable mdc/mwc commands */ ++#define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */ ++#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */ ++ ++/*----------------------------------------------------------------------- ++ * Marvell MV64460 config settings ++ *----------------------------------------------------------------------*/ ++/* Reset values for Port behavior (8bit/ 32bit, etc.) only corrected device width */ ++#if defined (CONFIG_P3M750) ++#define CFG_BOOT_PAR 0x8FDFF87F /* 16 bit flash, disable burst*/ ++#elif defined (CONFIG_P3M7448) ++#define CFG_BOOT_PAR 0x8FEFFFFF /* 32 bit flash, burst enabled */ ++#endif ++ ++/* ++ * MPP[0] Serial Port 0 TxD TxD OUT Connected to P14 (buffered) ++ * MPP[1] Serial Port 0 RxD RxD IN Connected to P14 (buffered) ++ * MPP[2] NC ++ * MPP[3] Serial Port 1 TxD TxD OUT Connected to P14 (buffered) ++ * MPP[4] PCI Monarch# GPIO IN Connected to P12 ++ * MPP[5] Serial Port 1 RxD RxD IN Connected to P14 (buffered) ++ * MPP[6] PMC Carrier Interrupt 0 Int IN Connected to P14 ++ * MPP[7] PMC Carrier Interrupt 1 Int IN Connected to P14 ++ * MPP[8] Reserved Do not use ++ * MPP[9] Reserved Do not use ++ * MPP[10] Reserved Do not use ++ * MPP[11] Reserved Do not use ++ * MPP[12] Phy 0 Interrupt Int IN ++ * MPP[13] Phy 1 Interrupt Int IN ++ * MPP[14] NC ++ * MPP[15] NC ++ * MPP[16] PCI Interrupt C Int IN Connected to P11 ++ * MPP[17] PCI Interrupt D Int IN Connected to P11 ++ * MPP[18] Watchdog NMI# GPIO IN Connected to MPP[24] ++ * MPP[19] Watchdog Expired# WDE OUT Connected to rst logic ++ * MPP[20] Watchdog Status WD_STS IN Read back of rst by watchdog ++ * MPP[21] NC ++ * MPP[22] GP LED Green GPIO OUT ++ * MPP[23] GP LED Red GPIO OUT ++ * MPP[24] Watchdog NMI# Int OUT ++ * MPP[25] NC ++ * MPP[26] NC ++ * MPP[27] PCI Interrupt A Int IN Connected to P11 ++ * MPP[28] NC ++ * MPP[29] PCI Interrupt B Int IN Connected to P11 ++ * MPP[30] Module reset GPIO OUT Board reset ++ * MPP[31] PCI EReady GPIO IN Connected to P12 ++ */ ++#define CFG_MPP_CONTROL_0 0x00303022 ++#define CFG_MPP_CONTROL_1 0x00000000 ++#define CFG_MPP_CONTROL_2 0x00004000 ++#define CFG_MPP_CONTROL_3 0x00000004 ++#define CFG_GPP_LEVEL_CONTROL 0x280730D0 ++ ++/*---------------------------------------------------------------------- ++ * Initial BAT mappings ++ */ ++ ++/* NOTES: ++ * 1) GUARDED and WRITE_THRU not allowed in IBATS ++ * 2) CACHEINHIBIT and WRITETHROUGH not allowed together in same BAT ++ */ ++/* SDRAM */ ++#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_RW | BATL_CACHEINHIBIT) ++#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT0L (CFG_SDRAM_BASE | BATL_PP_RW | BATL_GUARDEDSTORAGE | BATL_CACHEINHIBIT) ++#define CFG_DBAT0U CFG_IBAT0U ++ ++/* init ram */ ++#define CFG_IBAT1L (CFG_INIT_RAM_ADDR | BATL_PP_RW | BATL_MEMCOHERENCE) ++#define CFG_IBAT1U (CFG_INIT_RAM_ADDR | BATU_BL_256K | BATU_VS | BATU_VP) ++#define CFG_DBAT1L CFG_IBAT1L ++#define CFG_DBAT1U CFG_IBAT1U ++ ++/* PCI0, PCI1 in one BAT */ ++#define CFG_IBAT2L BATL_NO_ACCESS ++#define CFG_IBAT2U CFG_DBAT2U ++#define CFG_DBAT2L (CFG_PCI0_MEM_BASE | BATL_CACHEINHIBIT | BATL_PP_RW | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT2U (CFG_PCI0_MEM_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++ ++/* GT regs, bootrom, all the devices, PCI I/O */ ++#define CFG_IBAT3L (CFG_MISC_REGION_BASE | BATL_CACHEINHIBIT | BATL_PP_RW) ++#define CFG_IBAT3U (CFG_MISC_REGION_BASE | BATU_VS | BATU_VP | BATU_BL_256M) ++#define CFG_DBAT3L (CFG_MISC_REGION_BASE | BATL_CACHEINHIBIT | BATL_PP_RW | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT3U CFG_IBAT3U ++ ++#define CFG_IBAT4L (CFG_SDRAM1_BASE | BATL_PP_RW | BATL_CACHEINHIBIT) ++#define CFG_IBAT4U (CFG_SDRAM1_BASE | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT4L (CFG_SDRAM1_BASE | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT4U CFG_IBAT4U ++ ++/* set rest out of range for Linux !!!!!!!!!!! */ ++ ++/* IBAT5 and DBAT5 */ ++#define CFG_IBAT5L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT) ++#define CFG_IBAT5U (0x20000000 | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT5L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT5U CFG_IBAT5U ++ ++/* IBAT6 and DBAT6 */ ++#define CFG_IBAT6L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT) ++#define CFG_IBAT6U (0x20000000 | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT6L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT6U CFG_IBAT6U ++ ++/* IBAT7 and DBAT7 */ ++#define CFG_IBAT7L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT) ++#define CFG_IBAT7U (0x20000000 | BATU_BL_256M | BATU_VS | BATU_VP) ++#define CFG_DBAT7L (0x20000000 | BATL_PP_RW | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_DBAT7U CFG_IBAT7U ++ ++/* ++ * For booting Linux, the board info and command line data ++ * have to be in the first 8 MB of memory, since this is ++ * the maximum mapped by the Linux kernel during initialization. ++ */ ++#define CFG_BOOTMAPSZ (8<<20) /* Initial Memory map for Linux */ ++#define CFG_VXWORKS_MAC_PTR 0x42010000 /* use some memory in SRAM that's not used!!! */ ++ ++/*----------------------------------------------------------------------- ++ * Cache Configuration ++ */ ++#define CFG_CACHELINE_SIZE 32 /* For all MPC74xx CPUs */ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CACHELINE_SHIFT 5 /* log base 2 of the above value */ ++#endif ++ ++/*----------------------------------------------------------------------- ++ * L2CR setup -- make sure this is right for your board! ++ * look in include/mpc74xx.h for the defines used here ++ */ ++#define CFG_L2 ++ ++#if defined (CONFIG_750CX) || defined (CONFIG_750FX) ++#define L2_INIT 0 ++#else ++#define L2_INIT (L2CR_L2SIZ_2M | L2CR_L2CLK_3 | L2CR_L2RAM_BURST | \ ++ L2CR_L2OH_5 | L2CR_L2CTL | L2CR_L2WT) ++#endif ++ ++#define L2_ENABLE (L2_INIT | L2CR_L2E) ++ ++/* ++ * Internal Definitions ++ * ++ * Boot Flags ++ */ ++#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ ++#define BOOTFLAG_WARM 0x02 /* Software reboot */ ++ ++#endif /* __CONFIG_H */ +diff -Naupr u-boot-1.1.6/include/configs/sequoia.h u-boot-1.1.6-fsl-1/include/configs/sequoia.h +--- u-boot-1.1.6/include/configs/sequoia.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/sequoia.h 2006-11-30 12:34:13.000000000 -0600 +@@ -53,7 +53,7 @@ + + #define CFG_BOOT_BASE_ADDR 0xf0000000 + #define CFG_SDRAM_BASE 0x00000000 /* _must_ be 0 */ +-#define CFG_FLASH_BASE 0xfe000000 /* start of FLASH */ ++#define CFG_FLASH_BASE 0xfc000000 /* start of FLASH */ + #define CFG_MONITOR_BASE TEXT_BASE + #define CFG_NAND_ADDR 0xd0000000 /* NAND Flash */ + #define CFG_OCM_BASE 0xe0010000 /* ocm */ +@@ -102,6 +102,7 @@ + #define CFG_ENV_IS_IN_FLASH 1 /* use FLASH for environment vars */ + #else + #define CFG_ENV_IS_IN_NAND 1 /* use NAND for environment vars */ ++#define CFG_ENV_IS_EMBEDDED 1 /* use embedded environment */ + #endif + + /*----------------------------------------------------------------------- +@@ -234,10 +235,10 @@ + "bootm ${kernel_addr} ${ramdisk_addr}\0" \ + "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \ + "bootm\0" \ +- "rootpath=/opt/eldk/ppc_4xx\0" \ ++ "rootpath=/opt/eldk/ppc_4xxFP\0" \ + "bootfile=/tftpboot/sequoia/uImage\0" \ +- "kernel_addr=FE000000\0" \ +- "ramdisk_addr=FE180000\0" \ ++ "kernel_addr=FC000000\0" \ ++ "ramdisk_addr=FC180000\0" \ + "load=tftp 100000 /tftpboot/sequoia/u-boot.bin\0" \ + "update=protect off FFFA0000 FFFFFFFF;era FFFA0000 FFFFFFFF;" \ + "cp.b 100000 FFFA0000 60000\0" \ +@@ -378,7 +379,7 @@ + #define CFG_NAND_CS 3 /* NAND chip connected to CSx */ + /* Memory Bank 0 (NOR-FLASH) initialization */ + #define CFG_EBC_PB0AP 0x03017300 +-#define CFG_EBC_PB0CR (CFG_FLASH | 0xba000) ++#define CFG_EBC_PB0CR (CFG_FLASH | 0xda000) + + /* Memory Bank 3 (NAND-FLASH) initialization */ + #define CFG_EBC_PB3AP 0x018003c0 +@@ -387,7 +388,7 @@ + #define CFG_NAND_CS 0 /* NAND chip connected to CSx */ + /* Memory Bank 3 (NOR-FLASH) initialization */ + #define CFG_EBC_PB3AP 0x03017300 +-#define CFG_EBC_PB3CR (CFG_FLASH | 0xba000) ++#define CFG_EBC_PB3CR (CFG_FLASH | 0xda000) + + /* Memory Bank 0 (NAND-FLASH) initialization */ + #define CFG_EBC_PB0AP 0x018003c0 +diff -Naupr u-boot-1.1.6/include/configs/TQM5200.h u-boot-1.1.6-fsl-1/include/configs/TQM5200.h +--- u-boot-1.1.6/include/configs/TQM5200.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/TQM5200.h 2006-11-30 12:34:13.000000000 -0600 +@@ -217,43 +217,19 @@ + + #undef CONFIG_BOOTARGS + +-#ifdef CONFIG_STK52XX +-# if defined(CONFIG_TQM5200_B) +-# if defined(CFG_LOWBOOT) +-# define ENV_UPDT \ +- "update=protect off FC000000 FC07FFFF;" \ +- "erase FC000000 FC07FFFF;" \ +- "cp.b 200000 FC000000 ${filesize};" \ +- "protect on FC000000 FC07FFFF\0" +-# else /* highboot */ +-# define ENV_UPDT \ +- "update=protect off FFF00000 FFF7FFFF;" \ +- "erase FFF00000 FFF7FFFF;" \ ++#if defined(CONFIG_TQM5200_B) && !defined(CFG_LOWBOOT) ++# define ENV_UPDT \ ++ "update=protect off FFF00000 +${filesize};" \ ++ "erase FFF00000 +${filesize};" \ + "cp.b 200000 FFF00000 ${filesize};" \ +- "protect on FFF00000 FFF7FFFF\0" +-# endif /* CFG_LOWBOOT */ +-# else /* !CONFIG_TQM5200_B */ +-# define ENV_UPDT \ +- "update=protect off FC000000 FC05FFFF;" \ +- "erase FC000000 FC05FFFF;" \ +- "cp.b 200000 FC000000 ${filesize};" \ +- "protect on FC000000 FC05FFFF\0" +-# endif /* CONFIG_TQM5200_B */ +-#elif defined (CONFIG_CAM5200) +-# define ENV_UPDT \ +- "update=protect off FC000000 FC03FFFF;" \ +- "erase FC000000 FC03FFFF;" \ +- "cp.b 200000 FC000000 ${filesize};" \ +- "protect on FC000000 FC03FFFF\0" +-#elif defined (CONFIG_FO300) ++ "protect on FFF00000 +${filesize}\0" ++#else /* default lowboot configuration */ + # define ENV_UPDT \ +- "update=protect off FC000000 FC05FFFF;" \ +- "erase FC000000 FC05FFFF;" \ ++ "update=protect off FC000000 +${filesize};" \ ++ "erase FC000000 +${filesize};" \ + "cp.b 200000 FC000000 ${filesize};" \ +- "protect on FC000000 FC05FFFF\0" +-#else +-# error "Unknown Carrier Board" +-#endif /* CONFIG_STK52XX */ ++ "protect on FC000000 +${filesize}\0" ++#endif + + #define CONFIG_EXTRA_ENV_SETTINGS \ + "netdev=eth0\0" \ +@@ -432,7 +408,7 @@ + */ + #define CFG_ENV_IS_IN_FLASH 1 + #define CFG_ENV_SIZE 0x4000 /* 16 k - keep small for fast booting */ +-#if defined(CONFIG_TQM5200_B) ++#if defined(CONFIG_TQM5200_B) || defined (CONFIG_CAM5200) + #define CFG_ENV_SECT_SIZE 0x40000 + #else + #define CFG_ENV_SECT_SIZE 0x20000 +diff -Naupr u-boot-1.1.6/include/configs/TQM834x.h u-boot-1.1.6-fsl-1/include/configs/TQM834x.h +--- u-boot-1.1.6/include/configs/TQM834x.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/TQM834x.h 2006-11-10 11:24:30.000000000 -0600 +@@ -37,10 +37,11 @@ + #define CONFIG_E300 1 /* E300 Family */ + #define CONFIG_MPC83XX 1 /* MPC83XX family */ + #define CONFIG_MPC834X 1 /* MPC834X specific */ ++#define CONFIG_MPC8349 1 /* MPC8349 specific */ + #define CONFIG_TQM834X 1 /* TQM834X board specific */ + + /* IMMR Base Addres Register, use Freescale default: 0xff400000 */ +-#define CFG_IMMRBAR 0xff400000 ++#define CFG_IMMR 0xff400000 + + /* System clock. Primary input clock when in PCI host mode */ + #define CONFIG_83XX_CLKIN 66666000 /* 66,666 MHz */ +@@ -56,6 +57,17 @@ + */ + #define CFG_LCRR (LCRR_DBYP | LCRR_CLKDIV_8) + ++#define CFG_SCCR_INIT (SCCR_DEFAULT & (~SCCR_CLK_MASK)) ++#define CFG_SCCR_TSEC1CM SCCR_TSEC1CM_1 /* TSEC1 clock setting */ ++#define CFG_SCCR_TSEC2CM SCCR_TSEC2CM_1 /* TSEC2 clock setting */ ++#define CFG_SCCR_ENCCM SCCR_ENCCM_3 /* ENC clock setting */ ++#define CFG_SCCR_USBCM SCCR_USBCM_3 /* USB clock setting */ ++#define CFG_SCCR_VAL ( CFG_SCCR_INIT \ ++ | CFG_SCCR_TSEC1CM \ ++ | CFG_SCCR_TSEC2CM \ ++ | CFG_SCCR_ENCCM \ ++ | CFG_SCCR_USBCM ) ++ + /* board pre init: do not call, nothing to do */ + #undef CONFIG_BOARD_EARLY_INIT_F + +@@ -83,6 +95,7 @@ + #define CFG_FLASH_CFI_DRIVER /* use the CFI driver */ + #undef CFG_FLASH_CHECKSUM + #define CFG_FLASH_BASE 0x80000000 /* start of FLASH */ ++#define CFG_FLASH_SIZE 8 /* FLASH size in MB */ + + /* buffered writes in the AMD chip set is not supported yet */ + #undef CFG_FLASH_USE_BUFFER_WRITE +@@ -197,14 +210,15 @@ extern int tqm834x_num_flash_banks; + #define CFG_BAUDRATE_TABLE \ + {300, 600, 1200, 2400, 4800, 9600, 19200, 38400,115200} + +-#define CFG_NS16550_COM1 (CFG_IMMRBAR + 0x4500) +-#define CFG_NS16550_COM2 (CFG_IMMRBAR + 0x4600) ++#define CFG_NS16550_COM1 (CFG_IMMR + 0x4500) ++#define CFG_NS16550_COM2 (CFG_IMMR + 0x4600) + + /* + * I2C + */ + #define CONFIG_HARD_I2C /* I2C with hardware support */ + #undef CONFIG_SOFT_I2C /* I2C bit-banged */ ++#define CONFIG_FSL_I2C + #define CFG_I2C_SPEED 400000 /* I2C speed: 400KHz */ + #define CFG_I2C_SLAVE 0x7F /* slave address */ + #define CFG_I2C_OFFSET 0x3000 +@@ -235,9 +249,9 @@ extern int tqm834x_num_flash_banks; + #define CONFIG_MII + + #define CFG_TSEC1_OFFSET 0x24000 +-#define CFG_TSEC1 (CFG_IMMRBAR + CFG_TSEC1_OFFSET) ++#define CFG_TSEC1 (CFG_IMMR + CFG_TSEC1_OFFSET) + #define CFG_TSEC2_OFFSET 0x25000 +-#define CFG_TSEC2 (CFG_IMMRBAR + CFG_TSEC2_OFFSET) ++#define CFG_TSEC2 (CFG_IMMR + CFG_TSEC2_OFFSET) + + #if defined(CONFIG_TSEC_ENET) + +@@ -460,8 +474,8 @@ extern int tqm834x_num_flash_banks; + #endif + + /* IMMRBAR */ +-#define CFG_IBAT6L (CFG_IMMRBAR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) +-#define CFG_IBAT6U (CFG_IMMRBAR | BATU_BL_1M | BATU_VS | BATU_VP) ++#define CFG_IBAT6L (CFG_IMMR | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) ++#define CFG_IBAT6U (CFG_IMMR | BATU_BL_1M | BATU_VS | BATU_VP) + + /* FLASH */ + #define CFG_IBAT7L (CFG_FLASH_BASE | BATL_PP_10 | BATL_CACHEINHIBIT | BATL_GUARDEDSTORAGE) +diff -Naupr u-boot-1.1.6/include/configs/v38b.h u-boot-1.1.6-fsl-1/include/configs/v38b.h +--- u-boot-1.1.6/include/configs/v38b.h 1969-12-31 18:00:00.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/v38b.h 2006-11-30 12:34:13.000000000 -0600 +@@ -0,0 +1,343 @@ ++/* ++ * (C) Copyright 2003-2006 Wolfgang Denk, DENX Software Engineering, ++ * wd@denx.de. ++ * ++ * See file CREDITS for list of people who contributed to this project. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the Free ++ * Software Foundation; either version 2 of the License, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., 59 ++ * Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#ifndef __CONFIG_H ++#define __CONFIG_H ++ ++/* ++ * High Level Configuration Options ++ * (easy to change) ++ */ ++#define CONFIG_MPC5xxx 1 /* This is an MPC5xxx CPU */ ++#define CONFIG_MPC5200 1 /* This is an MPC5200 CPU */ ++#define CONFIG_V38B 1 /* ...on V38B board */ ++#define CFG_MPC5XXX_CLKIN 33000000 /* ...running at 33.000000MHz */ ++ ++#define CONFIG_RTC_PCF8563 1 /* has PCF8563 RTC */ ++#define CONFIG_MPC5200_DDR 1 /* has DDR SDRAM */ ++ ++#undef CONFIG_HW_WATCHDOG /* don't use watchdog */ ++ ++#define CONFIG_NETCONSOLE 1 ++ ++#define CONFIG_BOARD_EARLY_INIT_R 1 /* do board-specific init */ ++ ++#define CFG_XLB_PIPELINING 1 /* gives better performance */ ++ ++#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ ++#define BOOTFLAG_WARM 0x02 /* Software reboot */ ++ ++#define CFG_CACHELINE_SIZE 32 /* For MPC5xxx CPUs */ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++# define CFG_CACHELINE_SHIFT 5 /* log base 2 of the above value */ ++#endif ++ ++/* ++ * Serial console configuration ++ */ ++#define CONFIG_PSC_CONSOLE 1 /* console is on PSC1 */ ++#define CONFIG_BAUDRATE 115200 /* ... at 115200 bps */ ++#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, 230400 } ++ ++/* ++ * DDR ++ */ ++#define SDRAM_DDR 1 /* is DDR */ ++/* Settings for XLB = 132 MHz */ ++#define SDRAM_MODE 0x018D0000 ++#define SDRAM_EMODE 0x40090000 ++#define SDRAM_CONTROL 0x704f0f00 ++#define SDRAM_CONFIG1 0x73722930 ++#define SDRAM_CONFIG2 0x47770000 ++#define SDRAM_TAPDELAY 0x10000000 ++ ++/* ++ * PCI - no suport ++ */ ++#undef CONFIG_PCI ++ ++/* ++ * Partitions ++ */ ++#define CONFIG_MAC_PARTITION 1 ++#define CONFIG_DOS_PARTITION 1 ++ ++/* ++ * USB ++ */ ++#define CONFIG_USB_OHCI ++#define CONFIG_USB_STORAGE ++#define CONFIG_USB_CLOCK 0x0001BBBB ++#define CONFIG_USB_CONFIG 0x00001000 ++ ++/* ++ * Supported commands ++ */ ++#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \ ++ CFG_CMD_FAT | \ ++ CFG_CMD_I2C | \ ++ CFG_CMD_IDE | \ ++ CFG_CMD_PING | \ ++ CFG_CMD_DHCP | \ ++ CFG_CMD_DIAG | \ ++ CFG_CMD_IRQ | \ ++ CFG_CMD_JFFS2 | \ ++ CFG_CMD_MII | \ ++ CFG_CMD_SDRAMi | \ ++ CFG_CMD_DATE | \ ++ CFG_CMD_USB | \ ++ CFG_CMD_FAT) ++ ++#define CONFIG_TIMESTAMP /* Print image info with timestamp */ ++ ++/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ ++#include <cmd_confdefs.h> ++ ++/* ++ * Boot low with 16 MB Flash ++ */ ++#define CFG_LOWBOOT 1 ++#define CFG_LOWBOOT16 1 ++ ++/* ++ * Autobooting ++ */ ++#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */ ++ ++#define CONFIG_PREBOOT "echo;" \ ++ "echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \ ++ "echo" ++ ++#undef CONFIG_BOOTARGS ++ ++#define CONFIG_EXTRA_ENV_SETTINGS \ ++ "bootcmd=run net_nfs\0" \ ++ "bootdelay=3\0" \ ++ "baudrate=115200\0" \ ++ "preboot=echo;echo Type \"run flash_nfs\" to mount root " \ ++ "filesystem over NFS; echo\0" \ ++ "netdev=eth0\0" \ ++ "ramargs=setenv bootargs root=/dev/ram rw\0" \ ++ "addip=setenv bootargs $(bootargs) " \ ++ "ip=$(ipaddr):$(serverip):$(gatewayip):" \ ++ "$(netmask):$(hostname):$(netdev):off panic=1\0" \ ++ "flash_nfs=run nfsargs addip;bootm $(kernel_addr)\0" \ ++ "flash_self=run ramargs addip;bootm $(kernel_addr) " \ ++ "$(ramdisk_addr)\0" \ ++ "net_nfs=tftp 200000 $(bootfile);run nfsargs addip;bootm\0" \ ++ "nfsargs=setenv bootargs root=/dev/nfs rw " \ ++ "nfsroot=$(serverip):$(rootpath)\0" \ ++ "hostname=v38b\0" \ ++ "ethact=FEC ETHERNET\0" \ ++ "rootpath=/opt/eldk-3.1.1/ppc_6xx\0" \ ++ "update=prot off ff000000 ff03ffff; era ff000000 ff03ffff; " \ ++ "cp.b 200000 ff000000 $(filesize);" \ ++ "prot on ff000000 ff03ffff\0" \ ++ "load=tftp 200000 $(u-boot)\0" \ ++ "netmask=255.255.0.0\0" \ ++ "ipaddr=192.168.160.18\0" \ ++ "serverip=192.168.1.1\0" \ ++ "ethaddr=00:e0:ee:00:05:2e\0" \ ++ "bootfile=/tftpboot/v38b/uImage\0" \ ++ "u-boot=/tftpboot/v38b/u-boot.bin\0" \ ++ "" ++ ++#define CONFIG_BOOTCOMMAND "run net_nfs" ++ ++#if defined(CONFIG_MPC5200) ++/* ++ * IPB Bus clocking configuration. ++ */ ++#undef CFG_IPBSPEED_133 /* define for 133MHz speed */ ++#endif ++ ++/* ++ * I2C configuration ++ */ ++#define CONFIG_HARD_I2C 1 /* I2C with hardware support */ ++#define CFG_I2C_MODULE 2 /* Select I2C module #1 or #2 */ ++#define CFG_I2C_SPEED 100000 /* 100 kHz */ ++#define CFG_I2C_SLAVE 0x7F ++ ++/* ++ * EEPROM configuration ++ */ ++#define CFG_I2C_EEPROM_ADDR 0x50 /* 1010000x */ ++#define CFG_I2C_EEPROM_ADDR_LEN 1 ++#define CFG_EEPROM_PAGE_WRITE_BITS 3 ++#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 70 ++ ++/* ++ * RTC configuration ++ */ ++#define CFG_I2C_RTC_ADDR 0x51 ++ ++/* ++ * Flash configuration - use CFI driver ++ */ ++#define CFG_FLASH_CFI 1 /* Flash is CFI conformant */ ++#define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */ ++#define CFG_FLASH_CFI_AMD_RESET 1 ++#define CFG_FLASH_BASE 0xFF000000 ++#define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks */ ++#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE } ++#define CFG_FLASH_SIZE 0x01000000 /* 16 MiB */ ++#define CFG_MAX_FLASH_SECT 256 /* max num of sects on one chip */ ++#define CFG_FLASH_USE_BUFFER_WRITE 1 /* flash write speed-up */ ++ ++/* ++ * Environment settings ++ */ ++#define CFG_ENV_IS_IN_FLASH 1 ++#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00040000) ++#define CFG_ENV_SIZE 0x10000 ++#define CFG_ENV_SECT_SIZE 0x10000 ++#define CONFIG_ENV_OVERWRITE 1 ++ ++/* ++ * Memory map ++ */ ++#define CFG_MBAR 0xF0000000 ++#define CFG_SDRAM_BASE 0x00000000 ++#define CFG_DEFAULT_MBAR 0x80000000 ++ ++/* Use SRAM until RAM will be available */ ++#define CFG_INIT_RAM_ADDR MPC5XXX_SRAM ++#define CFG_INIT_RAM_END MPC5XXX_SRAM_SIZE /* End of used area in DPRAM */ ++ ++#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ ++#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) ++#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET ++ ++#define CFG_MONITOR_BASE TEXT_BASE ++#if (CFG_MONITOR_BASE < CFG_FLASH_BASE) ++# define CFG_RAMBOOT 1 ++#endif ++ ++#define CFG_MONITOR_LEN (256 << 10) /* Reserve 256kB for Monitor */ ++#define CFG_MALLOC_LEN (128 << 10) /* Reserve 128kB for malloc() */ ++#define CFG_BOOTMAPSZ (8 << 20) /* Linux initial memory map */ ++ ++/* ++ * Ethernet configuration ++ */ ++#define CONFIG_MPC5xxx_FEC 1 ++#define CONFIG_PHY_ADDR 0x00 ++#define CONFIG_MII 1 ++ ++/* ++ * GPIO configuration ++ */ ++#define CFG_GPS_PORT_CONFIG 0x90001404 ++ ++/* ++ * Miscellaneous configurable options ++ */ ++#define CFG_LONGHELP /* undef to save memory */ ++#define CFG_PROMPT "=> " /* Monitor Command Prompt */ ++#if (CONFIG_COMMANDS & CFG_CMD_KGDB) ++#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ ++#else ++#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ ++#endif ++#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ ++#define CFG_MAXARGS 16 /* max number of command args */ ++#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ ++ ++#define CFG_MEMTEST_START 0x00100000 /* memtest works on */ ++#define CFG_MEMTEST_END 0x00f00000 /* 1 ... 15 MB in DRAM */ ++ ++#define CFG_LOAD_ADDR 0x100000 /* default load address */ ++ ++#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */ ++ ++/* ++ * Various low-level settings ++ */ ++#define CFG_HID0_INIT HID0_ICE | HID0_ICFI ++#define CFG_HID0_FINAL HID0_ICE ++ ++#define CFG_BOOTCS_START CFG_FLASH_BASE ++#define CFG_BOOTCS_SIZE CFG_FLASH_SIZE ++#define CFG_BOOTCS_CFG 0x00047801 ++#define CFG_CS0_START CFG_FLASH_BASE ++#define CFG_CS0_SIZE CFG_FLASH_SIZE ++ ++#define CFG_CS_BURST 0x00000000 ++#define CFG_CS_DEADCYCLE 0x33333333 ++ ++#define CFG_RESET_ADDRESS 0xff000000 ++ ++/* ++ * IDE/ATA (supports IDE harddisk) ++ */ ++#undef CONFIG_IDE_8xx_PCCARD /* Don't use IDE with PC Card Adapter */ ++#undef CONFIG_IDE_8xx_DIRECT /* Direct IDE not supported */ ++#undef CONFIG_IDE_LED /* LED for ide not supported */ ++ ++#define CONFIG_IDE_RESET /* reset for ide supported */ ++#define CONFIG_IDE_PREINIT ++ ++#define CFG_IDE_MAXBUS 1 /* max. 1 IDE bus */ ++#define CFG_IDE_MAXDEVICE 1 /* max. 1 drive per IDE bus */ ++ ++#define CFG_ATA_IDE0_OFFSET 0x0000 ++ ++#define CFG_ATA_BASE_ADDR MPC5XXX_ATA ++ ++#define CFG_ATA_DATA_OFFSET (0x0060) /* data I/O offset */ ++ ++#define CFG_ATA_REG_OFFSET (CFG_ATA_DATA_OFFSET) /* normal register accesses offset */ ++ ++#define CFG_ATA_ALT_OFFSET (0x005C) /* alternate registers offset */ ++ ++#define CFG_ATA_STRIDE 4 /* Interval between registers */ ++ ++/* ++ * Status LED ++ */ ++#define CONFIG_STATUS_LED /* Status LED enabled */ ++#define CONFIG_BOARD_SPECIFIC_LED /* version has board specific leds */ ++ ++#define CFG_LED_BASE MPC5XXX_GPT7_ENABLE /* Timer 7 GPIO */ ++#ifndef __ASSEMBLY__ ++typedef unsigned int led_id_t; ++ ++#define __led_toggle(_msk) \ ++ do { \ ++ *((volatile long *) (CFG_LED_BASE)) ^= (_msk); \ ++ } while(0) ++ ++#define __led_set(_msk, _st) \ ++ do { \ ++ if ((_st)) \ ++ *((volatile long *) (CFG_LED_BASE)) &= ~(_msk); \ ++ else \ ++ *((volatile long *) (CFG_LED_BASE)) |= (_msk); \ ++ } while(0) ++ ++#define __led_init(_msk, st) \ ++ do { \ ++ *((volatile long *) (CFG_LED_BASE)) |= 0x34; \ ++ } while(0) ++#endif /* __ASSEMBLY__ */ ++ ++#endif /* __CONFIG_H */ +diff -Naupr u-boot-1.1.6/include/configs/V38B.h u-boot-1.1.6-fsl-1/include/configs/V38B.h +--- u-boot-1.1.6/include/configs/V38B.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/V38B.h 1969-12-31 18:00:00.000000000 -0600 +@@ -1,368 +0,0 @@ +-/* +- * (C) Copyright 2003-2004 Wolfgang Denk, DENX Software Engineering, +- * wd@denx.de. +- * +- * See file CREDITS for list of people who contributed to this project. +- * +- * This program is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License as published by the Free +- * Software Foundation; either version 2 of the License, or (at your option) +- * any later version. +- * +- * This program is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * for more details. +- * +- * You should have received a copy of the GNU General Public License along +- * with this program; if not, write to the Free Software Foundation, Inc., 59 +- * Temple Place, Suite 330, Boston, MA 02111-1307 USA +- */ +- +-#ifndef __CONFIG_H +-#define __CONFIG_H +- +-#if 0 +-#define DEBUG 0xFFF +-#endif +- +-#if 0 +-#define DEBUG 0x01 +-#endif +- +-/* +- * High Level Configuration Options +- * (easy to change) +-*/ +- +-#define CONFIG_MPC5xxx 1 /* This is an MPC5xxx CPU */ +-#define CONFIG_MPC5200 1 /* This is an MPC5200 CPU */ +-#define CONFIG_V38B 1 /* ... on V38B board */ +-#define CFG_MPC5XXX_CLKIN 33000000 /* ... running at 33.000000MHz */ +- +-#define CONFIG_RTC_PCF8563 1 /* has PCF8563 RTC */ +-#define CONFIG_MPC5200_DDR 1 /* has DDR SDRAM */ +-#define CONFIG_HW_WATCHDOG 1 /* has watchdog */ +- +-#define CONFIG_NETCONSOLE 1 +- +-#define CONFIG_BOARD_EARLY_INIT_R 1 /* make flash read/write */ +- +-#define CFG_XLB_PIPELINING 1 /* gives better performance */ +- +- +-#define BOOTFLAG_COLD 0x01 /* Normal Power-On: Boot from FLASH */ +-#define BOOTFLAG_WARM 0x02 /* Software reboot */ +- +-#define CFG_CACHELINE_SIZE 32 /* For MPC5xxx CPUs */ +-#if (CONFIG_COMMANDS & CFG_CMD_KGDB) +-# define CFG_CACHELINE_SHIFT 5 /* log base 2 of the above value */ +-#endif +- +-/* +- * Serial console configuration +- */ +-#define CONFIG_PSC_CONSOLE 1 /* console is on PSC1 */ +-#define CONFIG_BAUDRATE 115200 /* ... at 115200 bps */ +-#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200, 230400 } +- +- +-/* +- * DDR +- */ +-#define SDRAM_DDR 1 /* is DDR */ +-/* Settings for XLB = 132 MHz */ +-#define SDRAM_MODE 0x018D0000 +-#define SDRAM_EMODE 0x40090000 +-#define SDRAM_CONTROL 0x704f0f00 +-#define SDRAM_CONFIG1 0x73722930 +-#define SDRAM_CONFIG2 0x47770000 +-#define SDRAM_TAPDELAY 0x10000000 +- +- +-/* +- * PCI - no suport +- */ +-#undef CONFIG_PCI +- +-/* +- * Partitions +- */ +-#define CONFIG_MAC_PARTITION 1 +-#define CONFIG_DOS_PARTITION 1 +- +-/* +- * USB +- */ +-#define CONFIG_USB_OHCI +-#define CONFIG_USB_STORAGE +- +-#define CONFIG_TIMESTAMP /* Print image info with timestamp */ +- +-/* +- * Supported commands +- */ +-#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \ +- CFG_CMD_FAT | \ +- CFG_CMD_I2C | \ +- CFG_CMD_IDE | \ +- CFG_CMD_PING | \ +- CFG_CMD_DHCP | \ +- CFG_CMD_DIAG | \ +- CFG_CMD_IRQ | \ +- CFG_CMD_JFFS2 | \ +- CFG_CMD_MII | \ +- CFG_CMD_SDRAMi | \ +- CFG_CMD_DATE | \ +- CFG_CMD_USB | \ +- CFG_CMD_FAT) +- +-/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */ +-#include <cmd_confdefs.h> +- +-/* +- * Boot low with 16 MB Flash +- */ +-# define CFG_LOWBOOT 1 +-# define CFG_LOWBOOT16 1 +- +-/* +- * Autobooting +- */ +-#define CONFIG_BOOTDELAY 3 /* autoboot after 3 seconds */ +- +-#define CONFIG_PREBOOT "echo;" \ +- "echo Type \"run flash_nfs\" to mount root filesystem over NFS;" \ +- "echo" +- +-#undef CONFIG_BOOTARGS +- +-#define CONFIG_EXTRA_ENV_SETTINGS \ +- "netdev=eth0\0" \ +- "devno=5\0" \ +- "hostname=V38B_$(devno)\0" \ +- "ipaddr=10.100.99.$(devno)\0" \ +- "netmask=255.255.0.0\0" \ +- "serverip=10.100.10.90\0" \ +- "gatewayip=10.100.254.254\0" \ +- "ramargs=setenv bootargs root=/dev/ram rw\0" \ +- "rootpath=/opt/eldk/ppc_6xx\0" \ +- "bootfile=mpc5200/uImage\0" \ +- "bootcmd=run net_nfs\0" \ +- "addip=setenv bootargs $(bootargs) " \ +- "ip=$(ipaddr):$(serverip):$(gatewayip):" \ +- "$(netmask):$(hostname):$(netdev):off panic=1\0" \ +- "flash_nfs=run nfsargs addip;bootm $(kernel_addr)\0" \ +- "flash_self=run ramargs addip;bootm $(kernel_addr) " \ +- "$(ramdisk_addr)\0" \ +- "net_nfs=tftp 200000 $(bootfile);run nfsargs " \ +- "addip;bootm\0" \ +- "nfsargs=setenv bootargs root=/dev/nfs rw " \ +- "nfsroot=$(serverip):$(rootpath)\0" \ +- "" +- +-#define CONFIG_BOOTCOMMAND "run net_nfs" +- +-#if defined(CONFIG_MPC5200) +-/* +- * IPB Bus clocking configuration. +- */ +-#undef CFG_IPBSPEED_133 /* define for 133MHz speed */ +-#endif +-/* +- * I2C configuration +- */ +-#define CONFIG_HARD_I2C 1 /* I2C with hardware support */ +-#define CFG_I2C_MODULE 2 /* Select I2C module #1 or #2 */ +- +-#define CFG_I2C_SPEED 100000 /* 100 kHz */ +-#define CFG_I2C_SLAVE 0x7F +- +-/* +- * EEPROM configuration +- */ +-#define CFG_I2C_EEPROM_ADDR 0x50 /* 1010000x */ +-#define CFG_I2C_EEPROM_ADDR_LEN 1 +-#define CFG_EEPROM_PAGE_WRITE_BITS 3 +-#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 70 +- +-/* +- * RTC configuration +- */ +-#define CFG_I2C_RTC_ADDR 0x51 +- +-/* +- * Flash configuration - use CFI driver +- */ +-#define CFG_FLASH_CFI 1 /* Flash is CFI conformant */ +-#define CFG_FLASH_CFI_DRIVER 1 /* Use the common driver */ +-#define CFG_FLASH_CFI_AMD_RESET 1 +-#define CFG_FLASH_BASE 0xFF000000 +-#define CFG_MAX_FLASH_BANKS 1 /* max num of flash banks */ +-#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE } +-#define CFG_FLASH_SIZE 0x01000000 /* 16 MiB */ +-#define CFG_MAX_FLASH_SECT 256 /* max num of sects on one chip */ +-#define CFG_FLASH_USE_BUFFER_WRITE 1 /* flash write speed-up */ +- +-/* +- * Environment settings +- */ +-#define CFG_ENV_IS_IN_FLASH 1 +-#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x00040000) +-#define CFG_ENV_SIZE 0x10000 +-#define CFG_ENV_SECT_SIZE 0x10000 +-#define CONFIG_ENV_OVERWRITE 1 +- +-/* +- * Memory map +- */ +-#define CFG_MBAR 0xF0000000 +-#define CFG_SDRAM_BASE 0x00000000 +-#define CFG_DEFAULT_MBAR 0x80000000 +- +-/* Use SRAM until RAM will be available */ +-#define CFG_INIT_RAM_ADDR MPC5XXX_SRAM +-#define CFG_INIT_RAM_END MPC5XXX_SRAM_SIZE /* End of used area in DPRAM */ +- +- +-#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ +-#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE) +-#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET +- +-#define CFG_MONITOR_BASE TEXT_BASE +-#if (CFG_MONITOR_BASE < CFG_FLASH_BASE) +-# define CFG_RAMBOOT 1 +-#endif +- +-#define CFG_MONITOR_LEN (192 << 10) /* Reserve 192 kB for Monitor */ +-#define CFG_MALLOC_LEN (128 << 10) /* Reserve 128 kB for malloc() */ +-#define CFG_BOOTMAPSZ (8 << 20) /* Initial Memory map for Linux */ +- +-/* +- * Ethernet configuration +- */ +-#define CONFIG_MPC5xxx_FEC 1 +-#define CONFIG_PHY_ADDR 0x00 +-#define CONFIG_MII 1 +- +-/* +- * GPIO configuration +- */ +-#define CFG_GPS_PORT_CONFIG 0x90000404 +- +-/* +- * Miscellaneous configurable options +- */ +-#define CFG_LONGHELP /* undef to save memory */ +-#define CFG_PROMPT "=> " /* Monitor Command Prompt */ +-#if (CONFIG_COMMANDS & CFG_CMD_KGDB) +-#define CFG_CBSIZE 1024 /* Console I/O Buffer Size */ +-#else +-#define CFG_CBSIZE 256 /* Console I/O Buffer Size */ +-#endif +-#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */ +-#define CFG_MAXARGS 16 /* max number of command args */ +-#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */ +- +-#define CFG_MEMTEST_START 0x00100000 /* memtest works on */ +-#define CFG_MEMTEST_END 0x00f00000 /* 1 ... 15 MB in DRAM */ +- +-#define CFG_LOAD_ADDR 0x100000 /* default load address */ +- +-#define CFG_HZ 1000 /* decrementer freq: 1 ms ticks */ +- +-/* +- * Various low-level settings +- */ +-#if defined(CONFIG_MPC5200) +-#define CFG_HID0_INIT HID0_ICE | HID0_ICFI +-#define CFG_HID0_FINAL HID0_ICE +-#else +-#define CFG_HID0_INIT 0 +-#define CFG_HID0_FINAL 0 +-#endif +- +- +-#define CFG_BOOTCS_START CFG_FLASH_BASE +-#define CFG_BOOTCS_SIZE CFG_FLASH_SIZE +-#define CFG_BOOTCS_CFG 0x00047801 +-#define CFG_CS0_START CFG_FLASH_BASE +-#define CFG_CS0_SIZE CFG_FLASH_SIZE +- +-#define CFG_CS_BURST 0x00000000 +-#define CFG_CS_DEADCYCLE 0x33333333 +- +-#define CFG_RESET_ADDRESS 0xff000000 +- +-/*----------------------------------------------------------------------- +- * USB stuff +- *----------------------------------------------------------------------- +- */ +-#define CONFIG_USB_CLOCK 0x0001BBBB +-#define CONFIG_USB_CONFIG 0x00001000 +- +- +-/*----------------------------------------------------------------------- +- * IDE/ATA stuff Supports IDE harddisk +- *----------------------------------------------------------------------- +- */ +- +-#undef CONFIG_IDE_8xx_PCCARD /* Don't use IDE with PC Card Adapter */ +- +-#undef CONFIG_IDE_8xx_DIRECT /* Direct IDE not supported */ +-#undef CONFIG_IDE_LED /* LED for ide not supported */ +- +-#define CONFIG_IDE_RESET /* reset for ide supported */ +-#define CONFIG_IDE_PREINIT +- +-#define CFG_IDE_MAXBUS 1 /* max. 1 IDE bus */ +-#define CFG_IDE_MAXDEVICE 1 /* max. 1 drive per IDE bus */ +- +-#define CFG_ATA_IDE0_OFFSET 0x0000 +- +-#define CFG_ATA_BASE_ADDR MPC5XXX_ATA +- +-/* Offset for data I/O */ +-#define CFG_ATA_DATA_OFFSET (0x0060) +- +-/* Offset for normal register accesses */ +-#define CFG_ATA_REG_OFFSET (CFG_ATA_DATA_OFFSET) +- +-/* Offset for alternate registers */ +-#define CFG_ATA_ALT_OFFSET (0x005C) +- +-/* Interval between registers */ +-#define CFG_ATA_STRIDE 4 +- +-/* Status LED */ +- +-#define CONFIG_STATUS_LED /* Status LED enabled */ +-#define CONFIG_BOARD_SPECIFIC_LED /* version has board specific leds */ +- +-#define CFG_LED_BASE (0xf0000600 + 0x70) /* Timer 7 GPIO */ +- +-#ifndef __ASSEMBLY__ +-/* LEDs */ +-typedef unsigned int led_id_t; +- +-#define __led_toggle(_msk) \ +- do { \ +- *((volatile long *) (CFG_LED_BASE)) ^= (_msk); \ +- } while(0) +- +-#define __led_set(_msk, _st) \ +- do { \ +- if ((_st)) \ +- *((volatile long *) (CFG_LED_BASE)) &= ~(_msk); \ +- else \ +- *((volatile long *) (CFG_LED_BASE)) |= (_msk); \ +- } while(0) +- +-#define __led_init(_msk, st) \ +- { \ +- *((volatile long *) (CFG_LED_BASE)) |= 0x34; \ +- } +- +-#endif +- +-#endif /* __CONFIG_H */ +diff -Naupr u-boot-1.1.6/include/configs/yellowstone.h u-boot-1.1.6-fsl-1/include/configs/yellowstone.h +--- u-boot-1.1.6/include/configs/yellowstone.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/yellowstone.h 2006-11-30 12:34:13.000000000 -0600 +@@ -37,6 +37,7 @@ + + #define CONFIG_BOARD_EARLY_INIT_F 1 /* Call board_early_init_f */ + #define CONFIG_MISC_INIT_R 1 /* call misc_init_r() */ ++#define CONFIG_BOARD_RESET 1 /* call board_reset() */ + + /*----------------------------------------------------------------------- + * Base addresses -- Note these are effective addresses where the +diff -Naupr u-boot-1.1.6/include/configs/yosemite.h u-boot-1.1.6-fsl-1/include/configs/yosemite.h +--- u-boot-1.1.6/include/configs/yosemite.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/configs/yosemite.h 2006-11-30 12:34:13.000000000 -0600 +@@ -37,6 +37,7 @@ + + #define CONFIG_BOARD_EARLY_INIT_F 1 /* Call board_early_init_f */ + #define CONFIG_MISC_INIT_R 1 /* call misc_init_r() */ ++#define CONFIG_BOARD_RESET 1 /* call board_reset() */ + + /*----------------------------------------------------------------------- + * Base addresses -- Note these are effective addresses where the +diff -Naupr u-boot-1.1.6/include/environment.h u-boot-1.1.6-fsl-1/include/environment.h +--- u-boot-1.1.6/include/environment.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/environment.h 2006-11-30 12:34:13.000000000 -0600 +@@ -79,8 +79,7 @@ + # ifdef CFG_ENV_OFFSET_REDUND + # define CFG_REDUNDAND_ENVIRONMENT + # endif +-# if defined(CONFIG_NAND_U_BOOT) +-/* Use embedded environment in NAND boot versions */ ++# ifdef CFG_ENV_IS_EMBEDDED + # define ENV_IS_EMBEDDED 1 + # endif + #endif /* CFG_ENV_IS_IN_NAND */ +diff -Naupr u-boot-1.1.6/include/flash.h u-boot-1.1.6-fsl-1/include/flash.h +--- u-boot-1.1.6/include/flash.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/flash.h 2006-11-30 12:34:13.000000000 -0600 +@@ -43,9 +43,14 @@ typedef struct { + ulong write_tout; /* maximum write timeout */ + ulong buffer_write_tout; /* maximum buffer write timeout */ + ushort vendor; /* the primary vendor id */ +- ushort cmd_reset; /* Vendor specific reset command */ ++ ushort cmd_reset; /* vendor specific reset command */ + ushort interface; /* used for x8/x16 adjustments */ + ushort legacy_unlock; /* support Intel legacy (un)locking */ ++ uchar manufacturer_id; /* manufacturer id */ ++ ushort device_id; /* device id */ ++ ushort device_id2; /* extended device id */ ++ ushort ext_addr; /* extended query table address */ ++ ushort cfi_version; /* cfi version */ + #endif + } flash_info_t; + +@@ -439,6 +444,7 @@ extern void flash_read_factory_serial(fl + #define FLASH_MAN_MT 0x00400000 + #define FLASH_MAN_SHARP 0x00500000 + #define FLASH_MAN_ATM 0x00600000 ++#define FLASH_MAN_CFI 0x01000000 + + + #define FLASH_TYPEMASK 0x0000FFFF /* extract FLASH type information */ +diff -Naupr u-boot-1.1.6/include/i2c.h u-boot-1.1.6-fsl-1/include/i2c.h +--- u-boot-1.1.6/include/i2c.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/i2c.h 2006-11-10 11:24:30.000000000 -0600 +@@ -82,4 +82,49 @@ int i2c_write(uchar chip, uint addr, int + uchar i2c_reg_read (uchar chip, uchar reg); + void i2c_reg_write(uchar chip, uchar reg, uchar val); + ++/* ++ * Functions for setting the current I2C bus and its speed ++ */ ++ ++/* ++ * i2c_set_bus_num: ++ * ++ * Change the active I2C bus. Subsequent read/write calls will ++ * go to this one. ++ * ++ * bus - bus index, zero based ++ * ++ * Returns: 0 on success, not 0 on failure ++ * ++ */ ++int i2c_set_bus_num(unsigned int bus); ++ ++/* ++ * i2c_get_bus_num: ++ * ++ * Returns index of currently active I2C bus. Zero-based. ++ */ ++ ++unsigned int i2c_get_bus_num(void); ++ ++/* ++ * i2c_set_bus_speed: ++ * ++ * Change the speed of the active I2C bus ++ * ++ * speed - bus speed in Hz ++ * ++ * Returns: 0 on success, not 0 on failure ++ * ++ */ ++int i2c_set_bus_speed(unsigned int); ++ ++/* ++ * i2c_get_bus_speed: ++ * ++ * Returns speed of currently active I2C bus in Hz ++ */ ++ ++unsigned int i2c_get_bus_speed(void); ++ + #endif /* _I2C_H_ */ +diff -Naupr u-boot-1.1.6/include/ioports.h u-boot-1.1.6-fsl-1/include/ioports.h +--- u-boot-1.1.6/include/ioports.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/ioports.h 2006-12-06 10:33:49.000000000 -0600 +@@ -53,3 +53,13 @@ typedef struct { + * like the table in the 8260UM (and in the hymod manuals). + */ + extern const iop_conf_t iop_conf_tab[4][32]; ++ ++typedef struct { ++ unsigned char port; ++ unsigned char pin; ++ int dir; ++ int open_drain; ++ int assign; ++} qe_iop_conf_t; ++ ++#define QE_IOP_TAB_END (-1) +diff -Naupr u-boot-1.1.6/include/mpc5xxx.h u-boot-1.1.6-fsl-1/include/mpc5xxx.h +--- u-boot-1.1.6/include/mpc5xxx.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/mpc5xxx.h 2006-11-10 11:24:30.000000000 -0600 +@@ -188,7 +188,14 @@ + #define MPC5XXX_WU_GPIO_ENABLE (MPC5XXX_WU_GPIO + 0x0000) + #define MPC5XXX_WU_GPIO_ODE (MPC5XXX_WU_GPIO + 0x0004) + #define MPC5XXX_WU_GPIO_DIR (MPC5XXX_WU_GPIO + 0x0008) +-#define MPC5XXX_WU_GPIO_DATA (MPC5XXX_WU_GPIO + 0x000c) ++#define MPC5XXX_WU_GPIO_DATA_O (MPC5XXX_WU_GPIO + 0x000c) ++#define MPC5XXX_WU_GPIO_DATA_I (MPC5XXX_WU_GPIO + 0x0020) ++ ++/* GPIO pins */ ++#define GPIO_WKUP_7 0x80000000UL ++#define GPIO_PSC6_0 0x10000000UL ++#define GPIO_PSC3_9 0x04000000UL ++#define GPIO_PSC1_4 0x01000000UL + + /* PCI registers */ + #define MPC5XXX_PCI_CMD (MPC5XXX_PCI + 0x04) +diff -Naupr u-boot-1.1.6/include/mpc83xx.h u-boot-1.1.6-fsl-1/include/mpc83xx.h +--- u-boot-1.1.6/include/mpc83xx.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/mpc83xx.h 2006-11-10 11:24:30.000000000 -0600 +@@ -1,5 +1,5 @@ + /* +- * Copyright 2004 Freescale Semiconductor, Inc. ++ * Copyright (C) 2004-2006 Freescale Semiconductor, Inc. + * + * See file CREDITS for list of people who contributed to this + * project. +@@ -8,16 +8,6 @@ + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, +- * MA 02111-1307 USA + */ + + /* +@@ -29,6 +19,7 @@ + #ifndef __MPC83XX_H__ + #define __MPC83XX_H__ + ++#include <config.h> + #if defined(CONFIG_E300) + #include <asm/e300.h> + #endif +@@ -85,6 +76,33 @@ + #define LBLAWBAR3 0x0038 + #define LBLAWAR3 0x003C + ++/* ++ * The device ID and revision numbers ++ */ ++#define SPR_8349E_REV10 0x80300100 ++#define SPR_8349_REV10 0x80310100 ++#define SPR_8347E_REV10_TBGA 0x80320100 ++#define SPR_8347_REV10_TBGA 0x80330100 ++#define SPR_8347E_REV10_PBGA 0x80340100 ++#define SPR_8347_REV10_PBGA 0x80350100 ++#define SPR_8343E_REV10 0x80360100 ++#define SPR_8343_REV10 0x80370100 ++ ++#define SPR_8349E_REV11 0x80300101 ++#define SPR_8349_REV11 0x80310101 ++#define SPR_8347E_REV11_TBGA 0x80320101 ++#define SPR_8347_REV11_TBGA 0x80330101 ++#define SPR_8347E_REV11_PBGA 0x80340101 ++#define SPR_8347_REV11_PBGA 0x80350101 ++#define SPR_8343E_REV11 0x80360101 ++#define SPR_8343_REV11 0x80370101 ++ ++#define SPR_8360E_REV10 0x80480010 ++#define SPR_8360_REV10 0x80490010 ++#define SPR_8360E_REV11 0x80480011 ++#define SPR_8360_REV11 0x80490011 ++#define SPR_8360E_REV12 0x80480012 ++#define SPR_8360_REV12 0x80490012 + + /* + * Base Registers & Option Registers +@@ -116,9 +134,17 @@ + #define BR_MS_UPMA 0x00000080 /* UPMA */ + #define BR_MS_UPMB 0x000000A0 /* UPMB */ + #define BR_MS_UPMC 0x000000C0 /* UPMC */ ++#if defined (CONFIG_MPC8360) ++#define BR_ATOM 0x0000000C ++#define BR_ATOM_SHIFT 2 ++#endif + #define BR_V 0x00000001 + #define BR_V_SHIFT 0 ++#if defined (CONFIG_MPC8349) + #define BR_RES ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_V) ++#elif defined (CONFIG_MPC8360) ++#define BR_RES ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_ATOM|BR_V) ++#endif + + #define OR0 0x5004 + #define OR1 0x500C +@@ -201,14 +227,21 @@ + #define HRCWH_PCI_AGENT 0x00000000 + #define HRCWH_PCI_HOST 0x80000000 + ++#if defined (CONFIG_MPC8349) + #define HRCWH_32_BIT_PCI 0x00000000 + #define HRCWH_64_BIT_PCI 0x40000000 ++#endif + + #define HRCWH_PCI1_ARBITER_DISABLE 0x00000000 + #define HRCWH_PCI1_ARBITER_ENABLE 0x20000000 + ++#if defined (CONFIG_MPC8349) + #define HRCWH_PCI2_ARBITER_DISABLE 0x00000000 + #define HRCWH_PCI2_ARBITER_ENABLE 0x10000000 ++#elif defined (CONFIG_MPC8360) ++#define HRCWH_PCICKDRV_DISABLE 0x00000000 ++#define HRCWH_PCICKDRV_ENABLE 0x10000000 ++#endif + + #define HRCWH_CORE_DISABLE 0x08000000 + #define HRCWH_CORE_ENABLE 0x00000000 +@@ -225,11 +258,14 @@ + + #define HRCWH_ROM_LOC_DDR_SDRAM 0x00000000 + #define HRCWH_ROM_LOC_PCI1 0x00100000 ++#if defined (CONFIG_MPC8349) + #define HRCWH_ROM_LOC_PCI2 0x00200000 ++#endif + #define HRCWH_ROM_LOC_LOCAL_8BIT 0x00500000 + #define HRCWH_ROM_LOC_LOCAL_16BIT 0x00600000 + #define HRCWH_ROM_LOC_LOCAL_32BIT 0x00700000 + ++#if defined (CONFIG_MPC8349) + #define HRCWH_TSEC1M_IN_RGMII 0x00000000 + #define HRCWH_TSEC1M_IN_RTBI 0x00004000 + #define HRCWH_TSEC1M_IN_GMII 0x00008000 +@@ -239,10 +275,22 @@ + #define HRCWH_TSEC2M_IN_RTBI 0x00001000 + #define HRCWH_TSEC2M_IN_GMII 0x00002000 + #define HRCWH_TSEC2M_IN_TBI 0x00003000 ++#endif ++ ++#if defined (CONFIG_MPC8360) ++#define HRCWH_SECONDARY_DDR_DISABLE 0x00000000 ++#define HRCWH_SECONDARY_DDR_ENABLE 0x00000010 ++#endif + + #define HRCWH_BIG_ENDIAN 0x00000000 + #define HRCWH_LITTLE_ENDIAN 0x00000008 + ++#define HRCWH_LALE_NORMAL 0x00000000 ++#define HRCWH_LALE_EARLY 0x00000004 ++ ++#define HRCWH_LDP_SET 0x00000000 ++#define HRCWH_LDP_CLEAR 0x00000002 ++ + /* + * Hard Reset Configration Word - Low + */ +@@ -281,6 +329,47 @@ + #define HRCWL_CORE_TO_CSB_2_5X1 0x00050000 + #define HRCWL_CORE_TO_CSB_3X1 0x00060000 + ++#if defined (CONFIG_MPC8360) ++#define HRCWL_CE_PLL_VCO_DIV_4 0x00000000 ++#define HRCWL_CE_PLL_VCO_DIV_8 0x00000040 ++#define HRCWL_CE_PLL_VCO_DIV_2 0x00000080 ++ ++#define HRCWL_CE_PLL_DIV_1X1 0x00000000 ++#define HRCWL_CE_PLL_DIV_2X1 0x00000020 ++ ++#define HRCWL_CE_TO_PLL_1X16_ 0x00000000 ++#define HRCWL_CE_TO_PLL_1X2 0x00000002 ++#define HRCWL_CE_TO_PLL_1X3 0x00000003 ++#define HRCWL_CE_TO_PLL_1X4 0x00000004 ++#define HRCWL_CE_TO_PLL_1X5 0x00000005 ++#define HRCWL_CE_TO_PLL_1X6 0x00000006 ++#define HRCWL_CE_TO_PLL_1X7 0x00000007 ++#define HRCWL_CE_TO_PLL_1X8 0x00000008 ++#define HRCWL_CE_TO_PLL_1X9 0x00000009 ++#define HRCWL_CE_TO_PLL_1X10 0x0000000A ++#define HRCWL_CE_TO_PLL_1X11 0x0000000B ++#define HRCWL_CE_TO_PLL_1X12 0x0000000C ++#define HRCWL_CE_TO_PLL_1X13 0x0000000D ++#define HRCWL_CE_TO_PLL_1X14 0x0000000E ++#define HRCWL_CE_TO_PLL_1X15 0x0000000F ++#define HRCWL_CE_TO_PLL_1X16 0x00000010 ++#define HRCWL_CE_TO_PLL_1X17 0x00000011 ++#define HRCWL_CE_TO_PLL_1X18 0x00000012 ++#define HRCWL_CE_TO_PLL_1X19 0x00000013 ++#define HRCWL_CE_TO_PLL_1X20 0x00000014 ++#define HRCWL_CE_TO_PLL_1X21 0x00000015 ++#define HRCWL_CE_TO_PLL_1X22 0x00000016 ++#define HRCWL_CE_TO_PLL_1X23 0x00000017 ++#define HRCWL_CE_TO_PLL_1X24 0x00000018 ++#define HRCWL_CE_TO_PLL_1X25 0x00000019 ++#define HRCWL_CE_TO_PLL_1X26 0x0000001A ++#define HRCWL_CE_TO_PLL_1X27 0x0000001B ++#define HRCWL_CE_TO_PLL_1X28 0x0000001C ++#define HRCWL_CE_TO_PLL_1X29 0x0000001D ++#define HRCWL_CE_TO_PLL_1X30 0x0000001E ++#define HRCWL_CE_TO_PLL_1X31 0x0000001F ++#endif ++ + /* + * LCRR - Clock Ratio Register (10.3.1.16) + */ +@@ -310,4 +399,31 @@ + #define LCRR_CLKDIV_8 0x00000008 + #define LCRR_CLKDIV_SHIFT 0 + ++/* ++ * SCCR-System Clock Control Register ++ */ ++#define SCCR_TSEC1CM_0 0x00000000 ++#define SCCR_TSEC1CM_1 0x40000000 ++#define SCCR_TSEC1CM_2 0x80000000 ++#define SCCR_TSEC1CM_3 0xC0000000 ++#define SCCR_TSEC2CM_0 0x00000000 ++#define SCCR_TSEC2CM_1 0x10000000 ++#define SCCR_TSEC2CM_2 0x20000000 ++#define SCCR_TSEC2CM_3 0x30000000 ++#define SCCR_ENCCM_0 0x00000000 ++#define SCCR_ENCCM_1 0x01000000 ++#define SCCR_ENCCM_2 0x02000000 ++#define SCCR_ENCCM_3 0x03000000 ++#define SCCR_USBCM_0 0x00000000 ++#define SCCR_USBCM_1 0x00500000 ++#define SCCR_USBCM_2 0x00A00000 ++#define SCCR_USBCM_3 0x00F00000 ++ ++#define SCCR_CLK_MASK ( SCCR_TSEC1CM_3 \ ++ | SCCR_TSEC2CM_3 \ ++ | SCCR_ENCCM_3 \ ++ | SCCR_USBCM_3 ) ++ ++#define SCCR_DEFAULT 0xFFFFFFFF ++ + #endif /* __MPC83XX_H__ */ +diff -Naupr u-boot-1.1.6/include/ppc440.h u-boot-1.1.6-fsl-1/include/ppc440.h +--- u-boot-1.1.6/include/ppc440.h 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/include/ppc440.h 2006-12-06 10:33:49.000000000 -0600 +@@ -1350,26 +1350,26 @@ + + #if defined(CONFIG_440SPE) || defined(CONFIG_440EPX) || defined(CONFIG_440GRX) + #define UIC2_DCR_BASE 0xe0 +-#define uic2sr (UIC0_DCR_BASE+0x0) /* UIC2 status-Read Clear */ +-#define uic2srs (UIC0_DCR_BASE+0x1) /* UIC2 status-Read Set */ +-#define uic2er (UIC0_DCR_BASE+0x2) /* UIC2 enable */ +-#define uic2cr (UIC0_DCR_BASE+0x3) /* UIC2 critical */ +-#define uic2pr (UIC0_DCR_BASE+0x4) /* UIC2 polarity */ +-#define uic2tr (UIC0_DCR_BASE+0x5) /* UIC2 triggering */ +-#define uic2msr (UIC0_DCR_BASE+0x6) /* UIC2 masked status */ +-#define uic2vr (UIC0_DCR_BASE+0x7) /* UIC2 vector */ +-#define uic2vcr (UIC0_DCR_BASE+0x8) /* UIC2 vector configuration */ ++#define uic2sr (UIC2_DCR_BASE+0x0) /* UIC2 status-Read Clear */ ++#define uic2srs (UIC2_DCR_BASE+0x1) /* UIC2 status-Read Set */ ++#define uic2er (UIC2_DCR_BASE+0x2) /* UIC2 enable */ ++#define uic2cr (UIC2_DCR_BASE+0x3) /* UIC2 critical */ ++#define uic2pr (UIC2_DCR_BASE+0x4) /* UIC2 polarity */ ++#define uic2tr (UIC2_DCR_BASE+0x5) /* UIC2 triggering */ ++#define uic2msr (UIC2_DCR_BASE+0x6) /* UIC2 masked status */ ++#define uic2vr (UIC2_DCR_BASE+0x7) /* UIC2 vector */ ++#define uic2vcr (UIC2_DCR_BASE+0x8) /* UIC2 vector configuration */ + + #define UIC3_DCR_BASE 0xf0 +-#define uic3sr (UIC1_DCR_BASE+0x0) /* UIC3 status-Read Clear */ +-#define uic3srs (UIC0_DCR_BASE+0x1) /* UIC3 status-Read Set */ +-#define uic3er (UIC1_DCR_BASE+0x2) /* UIC3 enable */ +-#define uic3cr (UIC1_DCR_BASE+0x3) /* UIC3 critical */ +-#define uic3pr (UIC1_DCR_BASE+0x4) /* UIC3 polarity */ +-#define uic3tr (UIC1_DCR_BASE+0x5) /* UIC3 triggering */ +-#define uic3msr (UIC1_DCR_BASE+0x6) /* UIC3 masked status */ +-#define uic3vr (UIC1_DCR_BASE+0x7) /* UIC3 vector */ +-#define uic3vcr (UIC1_DCR_BASE+0x8) /* UIC3 vector configuration */ ++#define uic3sr (UIC3_DCR_BASE+0x0) /* UIC3 status-Read Clear */ ++#define uic3srs (UIC3_DCR_BASE+0x1) /* UIC3 status-Read Set */ ++#define uic3er (UIC3_DCR_BASE+0x2) /* UIC3 enable */ ++#define uic3cr (UIC3_DCR_BASE+0x3) /* UIC3 critical */ ++#define uic3pr (UIC3_DCR_BASE+0x4) /* UIC3 polarity */ ++#define uic3tr (UIC3_DCR_BASE+0x5) /* UIC3 triggering */ ++#define uic3msr (UIC3_DCR_BASE+0x6) /* UIC3 masked status */ ++#define uic3vr (UIC3_DCR_BASE+0x7) /* UIC3 vector */ ++#define uic3vcr (UIC3_DCR_BASE+0x8) /* UIC3 vector configuration */ + #endif /* CONFIG_440SPE */ + + #if defined(CONFIG_440GX) +@@ -3183,7 +3183,7 @@ + #define GPIO0 0 + #define GPIO1 1 + +-#if defined(CONFIG_440GP) ++#if defined(CONFIG_440GP) || defined(CONFIG_440GX) + #define GPIO0_BASE (CFG_PERIPHERAL_BASE+0x00000700) + + #define GPIO0_OR (GPIO0_BASE+0x0) +diff -Naupr u-boot-1.1.6/lib_ppc/board.c u-boot-1.1.6-fsl-1/lib_ppc/board.c +--- u-boot-1.1.6/lib_ppc/board.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/lib_ppc/board.c 2006-12-06 10:33:49.000000000 -0600 +@@ -511,7 +511,7 @@ void board_init_f (ulong bootflag) + bd->bi_mbar_base = CFG_MBAR; /* base of internal registers */ + #endif + #if defined(CONFIG_MPC83XX) +- bd->bi_immrbar = CFG_IMMRBAR; ++ bd->bi_immrbar = CFG_IMMR; + #endif + #if defined(CONFIG_MPC8220) + bd->bi_mbar_base = CFG_MBAR; /* base of internal registers */ +@@ -521,17 +521,17 @@ void board_init_f (ulong bootflag) + bd->bi_pevfreq = gd->pev_clk; + bd->bi_flbfreq = gd->flb_clk; + +- /* store bootparam to sram (backward compatible), here? */ +- { +- u32 *sram = (u32 *)CFG_SRAM_BASE; +- *sram++ = gd->ram_size; +- *sram++ = gd->bus_clk; +- *sram++ = gd->inp_clk; +- *sram++ = gd->cpu_clk; +- *sram++ = gd->vco_clk; +- *sram++ = gd->flb_clk; +- *sram++ = 0xb8c3ba11; /* boot signature */ +- } ++ /* store bootparam to sram (backward compatible), here? */ ++ { ++ u32 *sram = (u32 *)CFG_SRAM_BASE; ++ *sram++ = gd->ram_size; ++ *sram++ = gd->bus_clk; ++ *sram++ = gd->inp_clk; ++ *sram++ = gd->cpu_clk; ++ *sram++ = gd->vco_clk; ++ *sram++ = gd->flb_clk; ++ *sram++ = 0xb8c3ba11; /* boot signature */ ++ } + #endif + + bd->bi_bootflags = bootflag; /* boot / reboot flag (for LynxOS) */ +diff -Naupr u-boot-1.1.6/MAINTAINERS u-boot-1.1.6-fsl-1/MAINTAINERS +--- u-boot-1.1.6/MAINTAINERS 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/MAINTAINERS 2006-12-06 10:33:48.000000000 -0600 +@@ -277,10 +277,13 @@ Daniel Poirot <dan.poirot@windriver.com> + + Stefan Roese <sr@denx.de> + ++ P3M7448 MPC7448 ++ + uc100 MPC857 + + TQM85xx MPC8540/8541/8555/8560 + ++ alpr PPC440GX + bamboo PPC440EP + bunbinga PPC405EP + ebony PPC440GP +@@ -293,6 +296,8 @@ Stefan Roese <sr@denx.de> + yellowstone PPC440GR + yosemite PPC440EP + ++ P3M750 PPC750FX/GX/GL ++ + Yusdi Santoso <yusdi_santoso@adaptec.com> + + HIDDEN_DRAGON MPC8241/MPC8245 +@@ -339,6 +344,18 @@ John Zhan <zhanz@sinovee.com> + + svm_sc8xx MPC8xx + ++Timur Tabi <timur@freescale.com> ++ ++ MPC8349E-mITX MPC8349 ++ ++Kim Phillips <kim.phillips@freescale.com> ++ ++ MPC8349EMDS MPC8349 ++ ++Dave Liu <daveliu@freescale.com> ++ ++ MPC8360EMDS MPC8360 ++ + ------------------------------------------------------------------------- + + Unknown / orphaned boards: +diff -Naupr u-boot-1.1.6/MAKEALL u-boot-1.1.6-fsl-1/MAKEALL +--- u-boot-1.1.6/MAKEALL 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/MAKEALL 2006-12-06 10:33:48.000000000 -0600 +@@ -74,21 +74,21 @@ LIST_8xx=" \ + ######################################################################### + + LIST_4xx=" \ +- ADCIOP AP1000 AR405 ASH405 \ +- bamboo bubinga CANBT CMS700 \ +- CPCI2DP CPCI405 CPCI4052 CPCI405AB \ +- CPCI405DT CPCI440 CPCIISER4 CRAYL1 \ +- csb272 csb472 DASA_SIM DP405 \ +- DU405 ebony ERIC EXBITGEN \ +- G2000 HH405 HUB405 JSE \ +- KAREF luan METROBOX MIP405 \ +- MIP405T ML2 ml300 ocotea \ +- OCRTC ORSG p3p440 PCI405 \ +- pcs440ep PIP405 PLU405 PMC405 \ +- PPChameleonEVB sbc405 sequoia sequoia_nand \ +- VOH405 VOM405 W7OLMC W7OLMG \ +- walnut WUH405 XPEDITE1K yellowstone \ +- yosemite yucca bamboo \ ++ ADCIOP alpr AP1000 AR405 \ ++ ASH405 bamboo bubinga CANBT \ ++ CMS700 CPCI2DP CPCI405 CPCI4052 \ ++ CPCI405AB CPCI405DT CPCI440 CPCIISER4 \ ++ CRAYL1 csb272 csb472 DASA_SIM \ ++ DP405 DU405 ebony ERIC \ ++ EXBITGEN G2000 HH405 HUB405 \ ++ JSE KAREF luan METROBOX \ ++ MIP405 MIP405T ML2 ml300 \ ++ ocotea OCRTC ORSG p3p440 \ ++ PCI405 pcs440ep PIP405 PLU405 \ ++ PMC405 PPChameleonEVB sbc405 sequoia \ ++ sequoia_nand VOH405 VOM405 W7OLMC \ ++ W7OLMG walnut WUH405 XPEDITE1K \ ++ yellowstone yosemite yucca \ + " + + ######################################################################### +@@ -130,7 +130,7 @@ LIST_8260=" \ + ######################################################################### + + LIST_83xx=" \ +- TQM834x MPC8349EMDS \ ++ TQM834x MPC8349EMDS MPC8349ITX MPC8360EMDS \ + " + + +@@ -151,11 +151,12 @@ LIST_85xx=" \ + + LIST_74xx=" \ + DB64360 DB64460 EVB64260 P3G4 \ +- PCIPPC2 PCIPPC6 ZUMA \ ++ p3m7448 PCIPPC2 PCIPPC6 ZUMA \ + " + + LIST_7xx=" \ +- BAB7xx CPCI750 ELPPC ppmc7xx \ ++ BAB7xx CPCI750 ELPPC p3m750 \ ++ ppmc7xx \ + " + + LIST_ppc="${LIST_5xx} ${LIST_5xxx} \ +diff -Naupr u-boot-1.1.6/Makefile u-boot-1.1.6-fsl-1/Makefile +--- u-boot-1.1.6/Makefile 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/Makefile 2006-12-06 10:33:48.000000000 -0600 +@@ -93,7 +93,7 @@ MKCONFIG := $(SRCTREE)/mkconfig + export MKCONFIG + + ifneq ($(OBJTREE),$(SRCTREE)) +-REMOTE_BUILD := 1 ++REMOTE_BUILD := 1 + export REMOTE_BUILD + endif + +@@ -174,9 +174,6 @@ endif + ifeq ($(CPU),ppc4xx) + OBJS += cpu/$(CPU)/resetvec.o + endif +-ifeq ($(CPU),mpc83xx) +-OBJS += cpu/$(CPU)/resetvec.o +-endif + ifeq ($(CPU),mpc85xx) + OBJS += cpu/$(CPU)/resetvec.o + endif +@@ -206,6 +203,9 @@ LIBS += dtt/libdtt.a + LIBS += drivers/libdrivers.a + LIBS += drivers/nand/libnand.a + LIBS += drivers/nand_legacy/libnand_legacy.a ++ifeq ($(CPU),mpc83xx) ++LIBS += drivers/qe/qe.a ++endif + LIBS += drivers/sk98lin/libsk98lin.a + LIBS += post/libpost.a post/cpu/libcpu.a + LIBS += common/libcommon.a +@@ -378,8 +378,8 @@ Lite5200_LOWBOOT08_config \ + icecube_5200_config \ + icecube_5200_LOWBOOT_config \ + icecube_5200_LOWBOOT08_config \ +-icecube_5200_DDR_config \ +-icecube_5200_DDR_LOWBOOT_config \ ++icecube_5200_DDR_config \ ++icecube_5200_DDR_LOWBOOT_config \ + icecube_5200_DDR_LOWBOOT08_config \ + icecube_5100_config: unconfig + @mkdir -p $(obj)include +@@ -412,7 +412,7 @@ icecube_5100_config: unconfig + @$(MKCONFIG) -a IceCube ppc mpc5xxx icecube + + v38b_config: unconfig +- @./mkconfig -a V38B ppc mpc5xxx v38b ++ @./mkconfig -a v38b ppc mpc5xxx v38b + + inka4x0_config: unconfig + @$(MKCONFIG) inka4x0 ppc mpc5xxx inka4x0 +@@ -458,7 +458,7 @@ prs200_highboot_DDR_config: unconfig + @[ -n "$(findstring _SDRAM,$@)" ] || \ + { if [ -n "$(findstring mcc200,$@)" ]; \ + then \ +- echo "... with DDR" ; \ ++ echo "... with DDR" ; \ + else \ + if [ -n "$(findstring _DDR,$@)" ];\ + then \ +@@ -865,9 +865,9 @@ RPXClassic_config: unconfig + RPXlite_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc mpc8xx RPXlite + +-RPXlite_DW_64_config \ +-RPXlite_DW_LCD_config \ +-RPXlite_DW_64_LCD_config \ ++RPXlite_DW_64_config \ ++RPXlite_DW_LCD_config \ ++RPXlite_DW_64_LCD_config \ + RPXlite_DW_NVRAM_config \ + RPXlite_DW_NVRAM_64_config \ + RPXlite_DW_NVRAM_LCD_config \ +@@ -880,12 +880,12 @@ RPXlite_DW_config: unconfig + echo "... with 64MHz system clock ..."; \ + } + @[ -z "$(findstring _LCD,$@)" ] || \ +- { echo "#define CONFIG_LCD" >>$(obj)include/config.h ; \ ++ { echo "#define CONFIG_LCD" >>$(obj)include/config.h ; \ + echo "#define CONFIG_NEC_NL6448BC20" >>$(obj)include/config.h ; \ + echo "... with LCD display ..."; \ + } + @[ -z "$(findstring _NVRAM,$@)" ] || \ +- { echo "#define CFG_ENV_IS_IN_NVRAM" >>$(obj)include/config.h ; \ ++ { echo "#define CFG_ENV_IS_IN_NVRAM" >>$(obj)include/config.h ; \ + echo "... with ENV in NVRAM ..."; \ + } + @$(MKCONFIG) -a RPXlite_DW ppc mpc8xx RPXlite_dw +@@ -984,6 +984,9 @@ xtract_4xx = $(subst _25,,$(subst _33,,$ + ADCIOP_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc ppc4xx adciop esd + ++alpr_config: unconfig ++ @./mkconfig $(@:_config=) ppc ppc4xx alpr prodrive ++ + AP1000_config:unconfig + @$(MKCONFIG) $(@:_config=) ppc ppc4xx ap1000 amirix + +@@ -1585,15 +1588,39 @@ r5200_config : unconfig + ## MPC83xx Systems + ######################################################################### + +-MPC8349ADS_config: unconfig +- @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349ads +- + TQM834x_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc mpc83xx tqm834x + + MPC8349EMDS_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349emds + ++MPC8360EMDS_config \ ++MPC8360EMDS_HOST_33_config \ ++MPC8360EMDS_HOST_66_config \ ++MPC8360EMDS_SLAVE_config: unconfig ++ @echo "" >include/config.h ; \ ++ if [ "$(findstring _HOST_,$@)" ] ; then \ ++ echo -n "... PCI HOST " ; \ ++ echo "#define CONFIG_PCI" >>include/config.h ; \ ++ fi ; \ ++ if [ "$(findstring _SLAVE_,$@)" ] ; then \ ++ echo "...PCI SLAVE 66M" ; \ ++ echo "#define CONFIG_PCI" >>include/config.h ; \ ++ echo "#define CONFIG_PCISLAVE" >>include/config.h ; \ ++ fi ; \ ++ if [ "$(findstring _33_,$@)" ] ; then \ ++ echo -n "...33M ..." ; \ ++ echo "#define PCI_33M" >>include/config.h ; \ ++ fi ; \ ++ if [ "$(findstring _66_,$@)" ] ; then \ ++ echo -n "...66M..." ; \ ++ echo "#define PCI_66M" >>include/config.h ; \ ++ fi ; ++ @$(MKCONFIG) -a MPC8360EMDS ppc mpc83xx mpc8360emds ++ ++MPC8349ITX_config: unconfig ++ @$(MKCONFIG) $(@:_config=) ppc mpc83xx mpc8349itx ++ + ######################################################################### + ## MPC85xx Systems + ######################################################################### +@@ -1721,6 +1748,16 @@ EVB64260_750CX_config: unconfig + P3G4_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc 74xx_7xx evb64260 + ++p3m750_config \ ++p3m7448_config: unconfig ++ @mkdir -p $(obj)include ++ @if [ "$(findstring 750_,$@)" ] ; then \ ++ echo "#define CONFIG_P3M750" >>$(obj)include/config.h ; \ ++ else \ ++ echo "#define CONFIG_P3M7448" >>$(obj)include/config.h ; \ ++ fi ++ @$(MKCONFIG) -a p3mx ppc 74xx_7xx p3mx prodrive ++ + PCIPPC2_config \ + PCIPPC6_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc 74xx_7xx pcippc2 +@@ -1784,7 +1821,7 @@ ap966_config \ + ap922_config \ + ap922_XA10_config \ + ap7_config \ +-ap720t_config \ ++ap720t_config \ + ap920t_config \ + ap926ejs_config \ + ap946es_config: unconfig +@@ -1941,7 +1978,7 @@ cm4008_config : unconfig + cm41xx_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm920t cm41xx NULL ks8695 + +-gth2_config : unconfig ++gth2_config : unconfig + @mkdir -p $(obj)include + @ >$(obj)include/config.h + @echo "#define CONFIG_GTH2 1" >>$(obj)include/config.h +@@ -2087,19 +2124,19 @@ tb0229_config: unconfig + ######################################################################### + ## MIPS32 AU1X00 + ######################################################################### +-dbau1000_config : unconfig ++dbau1000_config : unconfig + @mkdir -p $(obj)include + @ >$(obj)include/config.h + @echo "#define CONFIG_DBAU1000 1" >>$(obj)include/config.h + @$(MKCONFIG) -a dbau1x00 mips mips dbau1x00 + +-dbau1100_config : unconfig ++dbau1100_config : unconfig + @mkdir -p $(obj)include + @ >$(obj)include/config.h + @echo "#define CONFIG_DBAU1100 1" >>$(obj)include/config.h + @$(MKCONFIG) -a dbau1x00 mips mips dbau1x00 + +-dbau1500_config : unconfig ++dbau1500_config : unconfig + @mkdir -p $(obj)include + @ >$(obj)include/config.h + @echo "#define CONFIG_DBAU1500 1" >>$(obj)include/config.h +@@ -2117,7 +2154,7 @@ dbau1550_el_config : unconfig + @echo "#define CONFIG_DBAU1550 1" >>$(obj)include/config.h + @$(MKCONFIG) -a dbau1x00 mips mips dbau1x00 + +-pb1000_config : unconfig ++pb1000_config : unconfig + @mkdir -p $(obj)include + @ >$(obj)include/config.h + @echo "#define CONFIG_PB1000 1" >>$(obj)include/config.h +diff -Naupr u-boot-1.1.6/net/eth.c u-boot-1.1.6-fsl-1/net/eth.c +--- u-boot-1.1.6/net/eth.c 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/net/eth.c 2006-12-06 10:33:49.000000000 -0600 +@@ -54,6 +54,7 @@ extern int scc_initialize(bd_t*); + extern int skge_initialize(bd_t*); + extern int tsec_initialize(bd_t*, int, char *); + extern int npe_initialize(bd_t *); ++extern int uec_initialize(int); + + static struct eth_device *eth_devices, *eth_current; + +@@ -142,13 +143,10 @@ int eth_initialize(bd_t *bis) + miiphy_init(); + #endif + +-#ifdef CONFIG_DB64360 ++#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750) + mv6436x_eth_initialize(bis); + #endif +-#ifdef CONFIG_CPCI750 +- mv6436x_eth_initialize(bis); +-#endif +-#ifdef CONFIG_DB64460 ++#if defined(CONFIG_DB64460) || defined(CONFIG_P3Mx) + mv6446x_eth_initialize(bis); + #endif + #if defined(CONFIG_4xx) && !defined(CONFIG_IOP480) && !defined(CONFIG_AP1000) +@@ -196,6 +194,12 @@ int eth_initialize(bd_t *bis) + tsec_initialize(bis, 3, CONFIG_MPC83XX_TSEC4_NAME); + # endif + #endif ++#if defined(CONFIG_UEC_ETH1) ++ uec_initialize(0); ++#endif ++#if defined(CONFIG_UEC_ETH2) ++ uec_initialize(1); ++#endif + #if defined(CONFIG_MPC86XX_TSEC1) + tsec_initialize(bis, 0, CONFIG_MPC86XX_TSEC1_NAME); + #endif +diff -Naupr u-boot-1.1.6/README u-boot-1.1.6-fsl-1/README +--- u-boot-1.1.6/README 2006-11-02 08:15:01.000000000 -0600 ++++ u-boot-1.1.6-fsl-1/README 2006-11-30 12:34:13.000000000 -0600 +@@ -1207,7 +1207,12 @@ The following options need to be configu + clock chips. See common/cmd_i2c.c for a description of the + command line interface. + +- CONFIG_HARD_I2C selects the CPM hardware driver for I2C. ++ CONFIG_I2C_CMD_TREE is a recommended option that places ++ all I2C commands under a single 'i2c' root command. The ++ older 'imm', 'imd', 'iprobe' etc. commands are considered ++ deprecated and may disappear in the future. ++ ++ CONFIG_HARD_I2C selects a hardware I2C controller. + + CONFIG_SOFT_I2C configures u-boot to use a software (aka + bit-banging) driver instead of CPM or similar hardware +@@ -1312,6 +1317,42 @@ The following options need to be configu + in u-boot bd_info structure based on u-boot environment + variable "i2cfast". (see also i2cfast) + ++ CONFIG_I2C_MULTI_BUS ++ ++ This option allows the use of multiple I2C buses, each of which ++ must have a controller. At any point in time, only one bus is ++ active. To switch to a different bus, use the 'i2c dev' command. ++ Note that bus numbering is zero-based. ++ ++ CFG_I2C_NOPROBES ++ ++ This option specifies a list of I2C devices that will be skipped ++ when the 'i2c probe' command is issued (or 'iprobe' using the legacy ++ command). If CONFIG_I2C_MULTI_BUS is set, specify a list of bus-device ++ pairs. Otherwise, specify a 1D array of device addresses ++ ++ e.g. ++ #undef CONFIG_I2C_MULTI_BUS ++ #define CFG_I2C_NOPROBES {0x50,0x68} ++ ++ will skip addresses 0x50 and 0x68 on a board with one I2C bus ++ ++ #define CONFIG_I2C_MULTI_BUS ++ #define CFG_I2C_MULTI_NOPROBES {{0,0x50},{0,0x68},{1,0x54}} ++ ++ will skip addresses 0x50 and 0x68 on bus 0 and address 0x54 on bus 1 ++ ++ CFG_SPD_BUS_NUM ++ ++ If defined, then this indicates the I2C bus number for DDR SPD. ++ If not defined, then U-Boot assumes that SPD is on I2C bus 0. ++ ++ CONFIG_FSL_I2C ++ ++ Define this option if you want to use Freescale's I2C driver in ++ drivers/fsl_i2c.c. ++ ++ + - SPI Support: CONFIG_SPI + + Enables SPI driver (so far only tested with +@@ -1470,8 +1511,8 @@ The following options need to be configu + + Enable auto completion of commands using TAB. + +- Note that this feature has NOT been implemented yet +- for the "hush" shell. ++ Note that this feature has NOT been implemented yet ++ for the "hush" shell. + + + CFG_HUSH_PARSER +@@ -2209,6 +2250,24 @@ Low Level (hardware related) configurati + CFG_POCMR2_MASK_ATTRIB: (MPC826x only) + Overrides the default PCI memory map in cpu/mpc8260/pci.c if set. + ++- CONFIG_SPD_EEPROM ++ Get DDR timing information from an I2C EEPROM. Common with pluggable ++ memory modules such as SODIMMs ++ SPD_EEPROM_ADDRESS ++ I2C address of the SPD EEPROM ++ ++- CFG_SPD_BUS_NUM ++ If SPD EEPROM is on an I2C bus other than the first one, specify here. ++ Note that the value must resolve to something your driver can deal with. ++ ++- CFG_83XX_DDR_USES_CS0 ++ Only for 83xx systems. If specified, then DDR should be configured ++ using CS0 and CS1 instead of CS2 and CS3. ++ ++- CFG_83XX_DDR_USES_CS0 ++ Only for 83xx systems. If specified, then DDR should be configured ++ using CS0 and CS1 instead of CS2 and CS3. ++ + - CONFIG_ETHER_ON_FEC[12] + Define to enable FEC[12] on a 8xx series processor. + +@@ -3114,11 +3173,11 @@ loadaddr=200000 + oftaddr=0x300000 + => bootm $loadaddr - $oftaddr + ## Booting image at 00200000 ... +- Image Name: Linux-2.6.17-dirty +- Image Type: PowerPC Linux Kernel Image (gzip compressed) +- Data Size: 1029343 Bytes = 1005.2 kB ++ Image Name: Linux-2.6.17-dirty ++ Image Type: PowerPC Linux Kernel Image (gzip compressed) ++ Data Size: 1029343 Bytes = 1005.2 kB + Load Address: 00000000 +- Entry Point: 00000000 ++ Entry Point: 00000000 + Verifying Checksum ... OK + Uncompressing Kernel Image ... OK + Booting using flat device tree at 0x300000 diff --git a/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-streamline-the-83xx-immr-head-file.patch b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-streamline-the-83xx-immr-head-file.patch new file mode 100644 index 0000000000..30981dc43c --- /dev/null +++ b/packages/uboot/u-boot-1.1.6/u-boot-1.1.6-fsl-1-streamline-the-83xx-immr-head-file.patch @@ -0,0 +1,3640 @@ +ce4d6db21531bc35da7180436c6f49efac7c0461 +diff --git a/board/tqm834x/tqm834x.c b/board/tqm834x/tqm834x.c +index 36d901f..9c35e22 100644 +--- a/board/tqm834x/tqm834x.c ++++ b/board/tqm834x/tqm834x.c +@@ -148,14 +148,14 @@ int checkboard (void) + u32 w, f; + + immr = (immap_t *)CFG_IMMR; +- if (!(immr->reset.rcwh & RCWH_PCIHOST)) { ++ if (!(immr->reset.rcwh & HRCWH_PCI_HOST)) { + printf("PCI: NOT in host mode..?!\n"); + return 0; + } + + /* get bus width */ + w = 32; +- if (immr->reset.rcwh & RCWH_PCI64) ++ if (immr->reset.rcwh & HRCWH_64_BIT_PCI) + w = 64; + + /* get clock */ +diff --git a/cpu/mpc83xx/cpu_init.c b/cpu/mpc83xx/cpu_init.c +index e5725fb..7574fab 100644 +--- a/cpu/mpc83xx/cpu_init.c ++++ b/cpu/mpc83xx/cpu_init.c +@@ -202,12 +202,12 @@ void cpu_init_f (volatile immap_t * im) + im->sysconf.lblaw[7].ar = CFG_LBLAWAR7_PRELIM; + #endif + #ifdef CFG_GPIO1_PRELIM +- im->pgio[0].dir = CFG_GPIO1_DIR; +- im->pgio[0].dat = CFG_GPIO1_DAT; ++ im->gpio[0].dir = CFG_GPIO1_DIR; ++ im->gpio[0].dat = CFG_GPIO1_DAT; + #endif + #ifdef CFG_GPIO2_PRELIM +- im->pgio[1].dir = CFG_GPIO2_DIR; +- im->pgio[1].dat = CFG_GPIO2_DAT; ++ im->gpio[1].dir = CFG_GPIO2_DIR; ++ im->gpio[1].dat = CFG_GPIO2_DAT; + #endif + } + +diff --git a/cpu/mpc83xx/qe_io.c b/cpu/mpc83xx/qe_io.c +index ebe3487..8b3937a 100644 +--- a/cpu/mpc83xx/qe_io.c ++++ b/cpu/mpc83xx/qe_io.c +@@ -35,7 +35,7 @@ void qe_config_iopin(u8 port, u8 pin, int dir, int open_drain, int assign) + u32 pin_1bit_mask; + u32 tmp_val; + volatile immap_t *im = (volatile immap_t *)CFG_IMMR; +- volatile gpio83xx_t *par_io =(volatile gpio83xx_t *)&im->gpio; ++ volatile qepio83xx_t *par_io = (volatile qepio83xx_t *)&im->qepio; + + /* Caculate pin location and 2bit mask and dir */ + pin_2bit_mask = (u32)(0x3 << (NUM_OF_PINS-(pin%(NUM_OF_PINS/2)+1)*2)); +diff --git a/cpu/mpc83xx/speed.c b/cpu/mpc83xx/speed.c +index 7e53b1e..40ba6b0 100644 +--- a/cpu/mpc83xx/speed.c ++++ b/cpu/mpc83xx/speed.c +@@ -139,7 +139,7 @@ int get_clocks(void) + #endif + } + +- spmf = ((im->reset.rcwl & RCWL_SPMF) >> RCWL_SPMF_SHIFT); ++ spmf = ((im->reset.rcwl & HRCWL_SPMF) >> HRCWL_SPMF_SHIFT); + csb_clk = pci_sync_in * (1 + clkin_div) * spmf; + + sccr = im->clk.sccr; +@@ -251,7 +251,7 @@ int get_clocks(void) + } + #if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360) + lbiu_clk = csb_clk * +- (1 + ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT)); ++ (1 + ((im->reset.rcwl & HRCWL_LBIUCM) >> HRCWL_LBIUCM_SHIFT)); + #else + #error Unknown MPC83xx chip + #endif +@@ -268,11 +268,11 @@ int get_clocks(void) + } + #if defined(CONFIG_MPC8349) || defined(CONFIG_MPC8360) + ddr_clk = csb_clk * +- (1 + ((im->reset.rcwl & RCWL_DDRCM) >> RCWL_DDRCM_SHIFT)); +- corepll = (im->reset.rcwl & RCWL_COREPLL) >> RCWL_COREPLL_SHIFT; ++ (1 + ((im->reset.rcwl & HRCWL_DDRCM) >> HRCWL_DDRCM_SHIFT)); ++ corepll = (im->reset.rcwl & HRCWL_COREPLL) >> HRCWL_COREPLL_SHIFT; + #if defined (CONFIG_MPC8360) + ddr_sec_clk = csb_clk * (1 + +- ((im->reset.rcwl & RCWL_LBIUCM) >> RCWL_LBIUCM_SHIFT)); ++ ((im->reset.rcwl & HRCWL_LBIUCM) >> HRCWL_LBIUCM_SHIFT)); + #endif + #else + #error Unknown MPC83xx chip +@@ -307,8 +307,8 @@ int get_clocks(void) + } + + #if defined (CONFIG_MPC8360) +- qepmf = (im->reset.rcwl & RCWL_CEPMF) >> RCWL_CEPMF_SHIFT; +- qepdf = (im->reset.rcwl & RCWL_CEPDF) >> RCWL_CEPDF_SHIFT; ++ qepmf = (im->reset.rcwl & HRCWL_CEPMF) >> HRCWL_CEPMF_SHIFT; ++ qepdf = (im->reset.rcwl & HRCWL_CEPDF) >> HRCWL_CEPDF_SHIFT; + qe_clk = (pci_sync_in * qepmf) / (1 + qepdf); + brg_clk = qe_clk / 2; + #endif +diff --git a/include/asm-ppc/immap_83xx.h b/include/asm-ppc/immap_83xx.h +index 43cde5e..67b035c 100644 +--- a/include/asm-ppc/immap_83xx.h ++++ b/include/asm-ppc/immap_83xx.h +@@ -3,20 +3,11 @@ + * + * MPC83xx Internal Memory Map + * +- * History : +- * 20060601: Daveliu (daveliu@freescale.com) +- * TanyaJiang (tanya.jiang@freescale.com) +- * Unified variable names for mpc83xx +- * 2005 : Mandy Lavi (mandy.lavi@freescale.com) +- * support for mpc8360e +- * 2004 : Eran Liberty (liberty@freescale.com) +- * Initialized for mpc8349 +- * based on: +- * MPC8260 Internal Memory Map +- * Copyright (c) 1999 Dan Malek (dmalek@jlc.net) +- * MPC85xx Internal Memory Map +- * Copyright(c) 2002,2003 Motorola Inc. +- * Xianghua Xiao (x.xiao@motorola.com) ++ * Contributors: ++ * Dave Liu <daveliu@freescale.com> ++ * Tanya Jiang <tanya.jiang@freescale.com> ++ * Mandy Lavi <mandy.lavi@freescale.com> ++ * Eran Liberty <liberty@freescale.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as +@@ -25,7 +16,7 @@ + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License +@@ -37,36 +28,24 @@ + #ifndef __IMMAP_83xx__ + #define __IMMAP_83xx__ + +-#include <config.h> + #include <asm/types.h> + #include <asm/fsl_i2c.h> + + /* +- * Local Access Window. ++ * Local Access Window + */ + typedef struct law83xx { + u32 bar; /* LBIU local access window base address register */ +-/* Identifies the 20 most-significant address bits of the base of local +- * access window n. The specified base address should be aligned to the +- * window size, as defined by LBLAWARn[SIZE]. +- */ +-#define LAWBAR_BAR 0xFFFFF000 +-#define LAWBAR_RES ~(LAWBAR_BAR) + u32 ar; /* LBIU local access window attribute register */ + } law83xx_t; + + /* +- * System configuration registers. ++ * System configuration registers + */ + typedef struct sysconf83xx { + u32 immrbar; /* Internal memory map base address register */ + u8 res0[0x04]; + u32 altcbar; /* Alternate configuration base address register */ +-/* Identifies the12 most significant address bits of an alternate base +- * address used for boot sequencer configuration accesses. +- */ +-#define ALTCBAR_BASE_ADDR 0xFFF00000 +-#define ALTCBAR_RES ~(ALTCBAR_BASE_ADDR) /* Reserved. Write has no effect, read returns 0. */ + u8 res1[0x14]; + law83xx_t lblaw[4]; /* LBIU local access window */ + u8 res2[0x20]; +@@ -77,115 +56,10 @@ typedef struct sysconf83xx { + u32 sgprl; /* System General Purpose Register Low */ + u32 sgprh; /* System General Purpose Register High */ + u32 spridr; /* System Part and Revision ID Register */ +-#define SPRIDR_PARTID 0xFFFF0000 /* Part Identification. */ +-#define SPRIDR_REVID 0x0000FFFF /* Revision Identification. */ + u8 res5[0x04]; + u32 spcr; /* System Priority Configuration Register */ +-#define SPCR_PCIHPE 0x10000000 /* PCI Highest Priority Enable. */ +-#define SPCR_PCIHPE_SHIFT (31-3) +-#define SPCR_PCIPR 0x03000000 /* PCI bridge system bus request priority. */ +-#define SPCR_PCIPR_SHIFT (31-7) +-#define SPCR_OPT 0x00800000 /* Optimize */ +-#define SPCR_TBEN 0x00400000 /* E300 PowerPC core time base unit enable. */ +-#define SPCR_TBEN_SHIFT (31-9) +-#define SPCR_COREPR 0x00300000 /* E300 PowerPC Core system bus request priority. */ +-#define SPCR_COREPR_SHIFT (31-11) +-#if defined (CONFIG_MPC8349) +-#define SPCR_TSEC1DP 0x00003000 /* TSEC1 data priority. */ +-#define SPCR_TSEC1DP_SHIFT (31-19) +-#define SPCR_TSEC1BDP 0x00000C00 /* TSEC1 buffer descriptor priority. */ +-#define SPCR_TSEC1BDP_SHIFT (31-21) +-#define SPCR_TSEC1EP 0x00000300 /* TSEC1 emergency priority. */ +-#define SPCR_TSEC1EP_SHIFT (31-23) +-#define SPCR_TSEC2DP 0x00000030 /* TSEC2 data priority. */ +-#define SPCR_TSEC2DP_SHIFT (31-27) +-#define SPCR_TSEC2BDP 0x0000000C /* TSEC2 buffer descriptor priority. */ +-#define SPCR_TSEC2BDP_SHIFT (31-29) +-#define SPCR_TSEC2EP 0x00000003 /* TSEC2 emergency priority. */ +-#define SPCR_TSEC2EP_SHIFT (31-31) +-#define SPCR_RES ~(SPCR_PCIHPE | SPCR_PCIPR | SPCR_TBEN | SPCR_COREPR \ +- | SPCR_TSEC1DP | SPCR_TSEC1BDP | SPCR_TSEC1EP \ +- | SPCR_TSEC2DP | SPCR_TSEC2BDP | SPCR_TSEC2EP) +-#elif defined (CONFIG_MPC8360) +-#define SPCR_RES ~(SPCR_PCIHPE|SPCR_PCIPR|SPCR_OPT|SPCR_TBEN|SPCR_COREPR) +-#endif +- u32 sicrl; /* System General Purpose Register Low */ +-#if defined (CONFIG_MPC8349) +-#define SICRL_LDP_A 0x80000000 +-#define SICRL_USB1 0x40000000 +-#define SICRL_USB0 0x20000000 +-#define SICRL_UART 0x0C000000 +-#define SICRL_GPIO1_A 0x02000000 +-#define SICRL_GPIO1_B 0x01000000 +-#define SICRL_GPIO1_C 0x00800000 +-#define SICRL_GPIO1_D 0x00400000 +-#define SICRL_GPIO1_E 0x00200000 +-#define SICRL_GPIO1_F 0x00180000 +-#define SICRL_GPIO1_G 0x00040000 +-#define SICRL_GPIO1_H 0x00020000 +-#define SICRL_GPIO1_I 0x00010000 +-#define SICRL_GPIO1_J 0x00008000 +-#define SICRL_GPIO1_K 0x00004000 +-#define SICRL_GPIO1_L 0x00003000 +-#define SICRL_RES ~(SICRL_LDP_A | SICRL_USB0 | SICRL_USB1 | SICRL_UART \ +- | SICRL_GPIO1_A | SICRL_GPIO1_B | SICRL_GPIO1_C \ +- | SICRL_GPIO1_D | SICRL_GPIO1_E | SICRL_GPIO1_F \ +- | SICRL_GPIO1_G | SICRL_GPIO1_H | SICRL_GPIO1_I \ +- | SICRL_GPIO1_J | SICRL_GPIO1_K | SICRL_GPIO1_L ) +-#elif defined (CONFIG_MPC8360) +-#define SICRL_LDP_A 0xC0000000 +-#define SICRL_LCLK_1 0x10000000 +-#define SICRL_LCLK_2 0x08000000 +-#define SICRL_SRCID_A 0x03000000 +-#define SICRL_IRQ_CKSTP_A 0x00C00000 +-#define SICRL_RES ~(SICRL_LDP_A | SICRL_LCLK_1 | SICRL_LCLK_2 | \ +- SICRL_SRCID_A | SICRL_IRQ_CKSTP_A) +-#endif +- u32 sicrh; /* System General Purpose Register High */ +-#define SICRH_DDR 0x80000000 +-#if defined (CONFIG_MPC8349) +-#define SICRH_TSEC1_A 0x10000000 +-#define SICRH_TSEC1_B 0x08000000 +-#define SICRH_TSEC1_C 0x04000000 +-#define SICRH_TSEC1_D 0x02000000 +-#define SICRH_TSEC1_E 0x01000000 +-#define SICRH_TSEC1_F 0x00800000 +-#define SICRH_TSEC2_A 0x00400000 +-#define SICRH_TSEC2_B 0x00200000 +-#define SICRH_TSEC2_C 0x00100000 +-#define SICRH_TSEC2_D 0x00080000 +-#define SICRH_TSEC2_E 0x00040000 +-#define SICRH_TSEC2_F 0x00020000 +-#define SICRH_TSEC2_G 0x00010000 +-#define SICRH_TSEC2_H 0x00008000 +-#define SICRH_GPIO2_A 0x00004000 +-#define SICRH_GPIO2_B 0x00002000 +-#define SICRH_GPIO2_C 0x00001000 +-#define SICRH_GPIO2_D 0x00000800 +-#define SICRH_GPIO2_E 0x00000400 +-#define SICRH_GPIO2_F 0x00000200 +-#define SICRH_GPIO2_G 0x00000180 +-#define SICRH_GPIO2_H 0x00000060 +-#define SICRH_TSOBI1 0x00000002 +-#define SICRH_TSOBI2 0x00000001 +-#define SICRH_RES ~( SICRH_DDR | SICRH_TSEC1_A | SICRH_TSEC1_B \ +- | SICRH_TSEC1_C | SICRH_TSEC1_D | SICRH_TSEC1_E \ +- | SICRH_TSEC1_F | SICRH_TSEC2_A | SICRH_TSEC2_B \ +- | SICRH_TSEC2_C | SICRH_TSEC2_D | SICRH_TSEC2_E \ +- | SICRH_TSEC2_F | SICRH_TSEC2_G | SICRH_TSEC2_H \ +- | SICRH_GPIO2_A | SICRH_GPIO2_B | SICRH_GPIO2_C \ +- | SICRH_GPIO2_D | SICRH_GPIO2_E | SICRH_GPIO2_F \ +- | SICRH_GPIO2_G | SICRH_GPIO2_H | SICRH_TSOBI1 \ +- | SICRH_TSOBI2) +-#elif defined (CONFIG_MPC8360) +-#define SICRH_SECONDARY_DDR 0x40000000 +-#define SICRH_SDDROE 0x02000000 /* SDDRIOE bit from reset configuration word high. */ +-#define SICRH_UC1EOBI 0x00000004 /* UCC1 Ethernet Output Buffer Impedance. */ +-#define SICRH_UC2E1OBI 0x00000002 /* UCC2 Ethernet pin option 1 Output Buffer Impedance. */ +-#define SICRH_UC2E2OBI 0x00000001 /* UCC2 Ethernet pin option 2 Output Buffer Impedance. */ +-#define SICRH_RES ~(SICRH_DDR | SICRH_SECONDARY_DDR | SICRH_SDDROE | \ +- SICRH_UC2E1OBI | SICRH_UC2E2OBI | SICRH_UC2E2OBI) +-#endif ++ u32 sicrl; /* System I/O Configuration Register Low */ ++ u32 sicrh; /* System I/O Configuration Register High */ + u8 res6[0xE4]; + } sysconf83xx_t; + +@@ -196,11 +70,8 @@ typedef struct wdt83xx { + u8 res0[4]; + u32 swcrr; /* System watchdog control register */ + u32 swcnr; /* System watchdog count register */ +-#define SWCNR_SWCN 0x0000FFFF Software Watchdog Count Field. +-#define SWCNR_RES ~(SWCNR_SWCN) + u8 res1[2]; + u16 swsrr; /* System watchdog service register */ +-#define SWSRR_WS 0x0000FFFF /* Software Watchdog Service Field. */ + u8 res2[0xF0]; + } wdt83xx_t; + +@@ -209,91 +80,46 @@ typedef struct wdt83xx { + */ + typedef struct rtclk83xx { + u32 cnr; /* control register */ +-#define CNR_CLEN 0x00000080 /* Clock Enable Control Bit */ +-#define CNR_CLIN 0x00000040 /* Input Clock Control Bit */ +-#define CNR_AIM 0x00000002 /* Alarm Interrupt Mask Bit */ +-#define CNR_SIM 0x00000001 /* Second Interrupt Mask Bit */ +-#define CNR_RES ~(CNR_CLEN | CNR_CLIN | CNR_AIM | CNR_SIM) + u32 ldr; /* load register */ +-#define LDR_CLDV 0xFFFFFFFF /* Contains the 32-bit value to be +- * loaded in a 32-bit RTC counter.*/ + u32 psr; /* prescale register */ +-#define PSR_PRSC 0xFFFFFFFF /* RTC Prescaler bits. */ +- u32 ctr; /* Counter value field register */ +-#define CRT_CNTV 0xFFFFFFFF /* RTC Counter value field. */ ++ u32 ctr; /* counter value field register */ + u32 evr; /* event register */ +-#define RTEVR_SIF 0x00000001 /* Second Interrupt Flag Bit */ +-#define RTEVR_AIF 0x00000002 /* Alarm Interrupt Flag Bit */ +-#define RTEVR_RES ~(RTEVR_SIF | RTEVR_AIF) +-#define PTEVR_PIF 0x00000001 /* Periodic interrupt flag bit. */ +-#define PTEVR_RES ~(PTEVR_PIF) + u32 alr; /* alarm register */ + u8 res0[0xE8]; + } rtclk83xx_t; + + /* +- * Global timper module ++ * Global timer module + */ +- + typedef struct gtm83xx { +- u8 cfr1; /* Timer1/2 Configuration */ +-#define CFR1_PCAS 0x80 /* Pair Cascade mode */ +-#define CFR1_BCM 0x40 /* Backward compatible mode */ +-#define CFR1_STP2 0x20 /* Stop timer */ +-#define CFR1_RST2 0x10 /* Reset timer */ +-#define CFR1_GM2 0x08 /* Gate mode for pin 2 */ +-#define CFR1_GM1 0x04 /* Gate mode for pin 1 */ +-#define CFR1_STP1 0x02 /* Stop timer */ +-#define CFR1_RST1 0x01 /* Reset timer */ +-#define CFR1_RES ~(CFR1_PCAS | CFR1_STP2 | CFR1_RST2 | CFR1_GM2 |\ +- CFR1_GM1 | CFR1_STP1 | CFR1_RST1) ++ u8 cfr1; /* Timer1/2 Configuration */ + u8 res0[3]; +- u8 cfr2; /* Timer3/4 Configuration */ +-#define CFR2_PCAS 0x80 /* Pair Cascade mode */ +-#define CFR2_SCAS 0x40 /* Super Cascade mode */ +-#define CFR2_STP4 0x20 /* Stop timer */ +-#define CFR2_RST4 0x10 /* Reset timer */ +-#define CFR2_GM4 0x08 /* Gate mode for pin 4 */ +-#define CFR2_GM3 0x04 /* Gate mode for pin 3 */ +-#define CFR2_STP3 0x02 /* Stop timer */ +-#define CFR2_RST3 0x01 /* Reset timer */ ++ u8 cfr2; /* Timer3/4 Configuration */ + u8 res1[10]; +- u16 mdr1; /* Timer1 Mode Register */ +-#define MDR_SPS 0xff00 /* Secondary Prescaler value */ +-#define MDR_CE 0x00c0 /* Capture edge and enable interrupt */ +-#define MDR_OM 0x0020 /* Output mode */ +-#define MDR_ORI 0x0010 /* Output reference interrupt enable */ +-#define MDR_FRR 0x0008 /* Free run/restart */ +-#define MDR_ICLK 0x0006 /* Input clock source for the timer */ +-#define MDR_GE 0x0001 /* Gate enable */ +- u16 mdr2; /* Timer2 Mode Register */ +- u16 rfr1; /* Timer1 Reference Register */ +- u16 rfr2; /* Timer2 Reference Register */ +- u16 cpr1; /* Timer1 Capture Register */ +- u16 cpr2; /* Timer2 Capture Register */ +- u16 cnr1; /* Timer1 Counter Register */ +- u16 cnr2; /* Timer2 Counter Register */ +- u16 mdr3; /* Timer3 Mode Register */ +- u16 mdr4; /* Timer4 Mode Register */ +- u16 rfr3; /* Timer3 Reference Register */ +- u16 rfr4; /* Timer4 Reference Register */ +- u16 cpr3; /* Timer3 Capture Register */ +- u16 cpr4; /* Timer4 Capture Register */ +- u16 cnr3; /* Timer3 Counter Register */ +- u16 cnr4; /* Timer4 Counter Register */ +- u16 evr1; /* Timer1 Event Register */ +- u16 evr2; /* Timer2 Event Register */ +- u16 evr3; /* Timer3 Event Register */ +- u16 evr4; /* Timer4 Event Register */ +-#define GTEVR_REF 0x0002 /* Output reference event */ +-#define GTEVR_CAP 0x0001 /* Counter Capture event */ +-#define GTEVR_RES ~(EVR_CAP|EVR_REF) +- u16 psr1; /* Timer1 Prescaler Register */ +- u16 psr2; /* Timer2 Prescaler Register */ +- u16 psr3; /* Timer3 Prescaler Register */ +- u16 psr4; /* Timer4 Prescaler Register */ +-#define GTPSR_PPS 0x00FF /* Primary Prescaler Bits. */ +-#define GTPSR_RES ~(GTPSR_PPS) ++ u16 mdr1; /* Timer1 Mode Register */ ++ u16 mdr2; /* Timer2 Mode Register */ ++ u16 rfr1; /* Timer1 Reference Register */ ++ u16 rfr2; /* Timer2 Reference Register */ ++ u16 cpr1; /* Timer1 Capture Register */ ++ u16 cpr2; /* Timer2 Capture Register */ ++ u16 cnr1; /* Timer1 Counter Register */ ++ u16 cnr2; /* Timer2 Counter Register */ ++ u16 mdr3; /* Timer3 Mode Register */ ++ u16 mdr4; /* Timer4 Mode Register */ ++ u16 rfr3; /* Timer3 Reference Register */ ++ u16 rfr4; /* Timer4 Reference Register */ ++ u16 cpr3; /* Timer3 Capture Register */ ++ u16 cpr4; /* Timer4 Capture Register */ ++ u16 cnr3; /* Timer3 Counter Register */ ++ u16 cnr4; /* Timer4 Counter Register */ ++ u16 evr1; /* Timer1 Event Register */ ++ u16 evr2; /* Timer2 Event Register */ ++ u16 evr3; /* Timer3 Event Register */ ++ u16 evr4; /* Timer4 Event Register */ ++ u16 psr1; /* Timer1 Prescaler Register */ ++ u16 psr2; /* Timer2 Prescaler Register */ ++ u16 psr3; /* Timer3 Prescaler Register */ ++ u16 psr4; /* Timer4 Prescaler Register */ + u8 res[0xC0]; + } gtm83xx_t; + +@@ -301,188 +127,31 @@ typedef struct gtm83xx { + * Integrated Programmable Interrupt Controller + */ + typedef struct ipic83xx { +- u32 sicfr; /* System Global Interrupt Configuration Register (SICFR) */ +-#define SICFR_HPI 0x7f000000 /* Highest Priority Interrupt */ +-#define SICFR_MPSB 0x00400000 /* Mixed interrupts Priority Scheme for group B */ +-#define SICFR_MPSA 0x00200000 /* Mixed interrupts Priority Scheme for group A */ +-#define SICFR_IPSD 0x00080000 /* Internal interrupts Priority Scheme for group D */ +-#define SICFR_IPSA 0x00010000 /* Internal interrupts Priority Scheme for group A */ +-#define SICFR_HPIT 0x00000300 /* HPI priority position IPIC output interrupt Type */ +-#define SICFR_RES ~(SICFR_HPI|SICFR_MPSB|SICFR_MPSA|SICFR_IPSD|SICFR_IPSA|SICFR_HPIT) +- u32 sivcr; /* System Global Interrupt Vector Register (SIVCR) */ +-#define SICVR_IVECX 0xfc000000 /* Interrupt vector (for CE compatibility purpose only not used in 8349 IPIC implementation) */ +-#define SICVR_IVEC 0x0000007f /* Interrupt vector */ +-#define SICVR_RES ~(SICVR_IVECX|SICVR_IVEC) +- u32 sipnr_h; /* System Internal Interrupt Pending Register - High (SIPNR_H) */ +-#if defined (CONFIG_MPC8349) +-#define SIIH_TSEC1TX 0x80000000 /* TSEC1 Tx interrupt */ +-#define SIIH_TSEC1RX 0x40000000 /* TSEC1 Rx interrupt */ +-#define SIIH_TSEC1ER 0x20000000 /* TSEC1 Eror interrupt */ +-#define SIIH_TSEC2TX 0x10000000 /* TSEC2 Tx interrupt */ +-#define SIIH_TSEC2RX 0x08000000 /* TSEC2 Rx interrupt */ +-#define SIIH_TSEC2ER 0x04000000 /* TSEC2 Eror interrupt */ +-#define SIIH_USB2DR 0x02000000 /* USB2 DR interrupt */ +-#define SIIH_USB2MPH 0x01000000 /* USB2 MPH interrupt */ +-#endif +-#if defined (CONFIG_MPC8360) +-#define SIIH_H_QE_H 0x80000000 /* QE high interrupt */ +-#define SIIH_H_QE_L 0x40000000 /* QE low interrupt */ +-#endif +-#define SIIH_UART1 0x00000080 /* UART1 interrupt */ +-#define SIIH_UART2 0x00000040 /* UART2 interrupt */ +-#define SIIH_SEC 0x00000020 /* SEC interrupt */ +-#define SIIH_I2C1 0x00000004 /* I2C1 interrupt */ +-#define SIIH_I2C2 0x00000002 /* I2C2 interrupt */ +-#if defined (CONFIG_MPC8349) +-#define SIIH_SPI 0x00000001 /* SPI interrupt */ +-#define SIIH_RES ~(SIIH_TSEC1TX | SIIH_TSEC1RX | SIIH_TSEC1ER \ +- | SIIH_TSEC2TX | SIIH_TSEC2RX | SIIH_TSEC2ER \ +- | SIIH_USB2DR | SIIH_USB2MPH | SIIH_UART1 \ +- | SIIH_UART2 | SIIH_SEC | SIIH_I2C1 \ +- | SIIH_I2C2 | SIIH_SPI) +-#endif +-#if defined (CONFIG_MPC8360) +-#define SIIH_RES ~(SIIH_H_QE_H | SIIH_H_QE_L | SIIH_H_UART1 | \ +- SIIH_H_UART2| SIIH_H_SEC | SIIH_H_I2C1 |SIIH_H_I2C2) +-#endif +- u32 sipnr_l; /* System Internal Interrupt Pending Register - Low (SIPNR_L) */ +-#define SIIL_RTCS 0x80000000 /* RTC SECOND interrupt */ +-#define SIIL_PIT 0x40000000 /* PIT interrupt */ +-#define SIIL_PCI1 0x20000000 /* PCI1 interrupt */ +-#if defined (CONFIG_MPC8349) +-#define SIIL_PCI2 0x10000000 /* PCI2 interrupt */ +-#endif +-#define SIIL_RTCA 0x08000000 /* RTC ALARM interrupt */ +-#define SIIL_MU 0x04000000 /* Message Unit interrupt */ +-#define SIIL_SBA 0x02000000 /* System Bus Arbiter interrupt */ +-#define SIIL_DMA 0x01000000 /* DMA interrupt */ +-#define SIIL_GTM4 0x00800000 /* GTM4 interrupt */ +-#define SIIL_GTM8 0x00400000 /* GTM8 interrupt */ +-#if defined (CONFIG_MPC8349) +-#define SIIL_GPIO1 0x00200000 /* GPIO1 interrupt */ +-#define SIIL_GPIO2 0x00100000 /* GPIO2 interrupt */ +-#endif +-#if defined (CONFIG_MPC8360) +-#define SIIL_QEP 0x00200000 /* QE ports interrupt */ +-#define SIIL_SDDR 0x00100000 /* SDDR interrupt */ +-#endif +-#define SIIL_DDR 0x00080000 /* DDR interrupt */ +-#define SIIL_LBC 0x00040000 /* LBC interrupt */ +-#define SIIL_GTM2 0x00020000 /* GTM2 interrupt */ +-#define SIIL_GTM6 0x00010000 /* GTM6 interrupt */ +-#define SIIL_PMC 0x00008000 /* PMC interrupt */ +-#define SIIL_GTM3 0x00000800 /* GTM3 interrupt */ +-#define SIIL_GTM7 0x00000400 /* GTM7 interrupt */ +-#define SIIL_GTM1 0x00000020 /* GTM1 interrupt */ +-#define SIIL_GTM5 0x00000010 /* GTM5 interrupt */ +-#define SIIL_DPTC 0x00000001 /* DPTC interrupt (!!! Invisible for user !!!) */ +-#if defined (CONFIG_MPC8349) +-#define SIIL_RES ~(SIIL_RTCS | SIIL_PIT | SIIL_PCI1 | SIIL_PCI2 \ +- | SIIL_RTCA | SIIL_MU | SIIL_SBA | SIIL_DMA \ +- | SIIL_GTM4 | SIIL_GTM8 | SIIL_GPIO1 | SIIL_GPIO2 \ +- | SIIL_DDR | SIIL_LBC | SIIL_GTM2 | SIIL_GTM6 \ +- | SIIL_PMC |SIIL_GTM3 | SIIL_GTM7 | SIIL_GTM1 \ +- | SIIL_GTM5 |SIIL_DPTC ) +-#endif +-#if defined (CONFIG_MPC8360) +-#define SIIL_RES ~(SIIL_RTCS |SIIL_PIT |SIIL_PCI1 |SIIL_RTCALR \ +- |SIIL_MU |SIIL_SBA |SIIL_DMA |SIIL_GTM4 |SIIL_GTM8 \ +- |SIIL_QEP | SIIL_SDDR| SIIL_DDR |SIIL_LBC |SIIL_GTM2 \ +- |SIIL_GTM6 |SIIL_PMC |SIIL_GTM3 |SIIL_GTM7 |SIIL_GTM1 \ +- |SIIL_GTM5 ) +-#endif +- u32 siprr_a; /* System Internal Interrupt Group A Priority Register (PRR) */ ++ u32 sicfr; /* System Global Interrupt Configuration Register */ ++ u32 sivcr; /* System Global Interrupt Vector Register */ ++ u32 sipnr_h; /* System Internal Interrupt Pending Register - High */ ++ u32 sipnr_l; /* System Internal Interrupt Pending Register - Low */ ++ u32 siprr_a; /* System Internal Interrupt Group A Priority Register */ + u8 res0[8]; +- u32 siprr_d; /* System Internal Interrupt Group D Priority Register (PRR) */ +- u32 simsr_h; /* System Internal Interrupt Mask Register - High (SIIH) */ +- u32 simsr_l; /* System Internal Interrupt Mask Register - Low (SIIL) */ ++ u32 siprr_d; /* System Internal Interrupt Group D Priority Register */ ++ u32 simsr_h; /* System Internal Interrupt Mask Register - High */ ++ u32 simsr_l; /* System Internal Interrupt Mask Register - Low */ + u8 res1[4]; +- u32 sepnr; /* System External Interrupt Pending Register (SEI) */ +- u32 smprr_a; /* System Mixed Interrupt Group A Priority Register (PRR) */ +- u32 smprr_b; /* System Mixed Interrupt Group B Priority Register (PRR) */ +-#define PRR_0 0xe0000000 /* Priority Register, Position 0 programming */ +-#define PRR_1 0x1c000000 /* Priority Register, Position 1 programming */ +-#define PRR_2 0x03800000 /* Priority Register, Position 2 programming */ +-#define PRR_3 0x00700000 /* Priority Register, Position 3 programming */ +-#define PRR_4 0x0000e000 /* Priority Register, Position 4 programming */ +-#define PRR_5 0x00001c00 /* Priority Register, Position 5 programming */ +-#define PRR_6 0x00000380 /* Priority Register, Position 6 programming */ +-#define PRR_7 0x00000070 /* Priority Register, Position 7 programming */ +-#define PRR_RES ~(PRR_0|PRR_1|PRR_2|PRR_3|PRR_4|PRR_5|PRR_6|PRR_7) +- u32 semsr; /* System External Interrupt Mask Register (SEI) */ +-#define SEI_IRQ0 0x80000000 /* IRQ0 external interrupt */ +-#define SEI_IRQ1 0x40000000 /* IRQ1 external interrupt */ +-#define SEI_IRQ2 0x20000000 /* IRQ2 external interrupt */ +-#define SEI_IRQ3 0x10000000 /* IRQ3 external interrupt */ +-#define SEI_IRQ4 0x08000000 /* IRQ4 external interrupt */ +-#define SEI_IRQ5 0x04000000 /* IRQ5 external interrupt */ +-#define SEI_IRQ6 0x02000000 /* IRQ6 external interrupt */ +-#define SEI_IRQ7 0x01000000 /* IRQ7 external interrupt */ +-#define SEI_SIRQ0 0x00008000 /* SIRQ0 external interrupt */ +-#define SEI_RES ~( SEI_IRQ0 | SEI_IRQ1 | SEI_IRQ2 | SEI_IRQ3 \ +- | SEI_IRQ4 | SEI_IRQ5 | SEI_IRQ6 | SEI_IRQ7 \ +- | SEI_SIRQ0) +- u32 secnr; /* System External Interrupt Control Register (SECNR) */ +-#define SECNR_MIXB0T 0xc0000000 /* MIXB0 priority position IPIC output interrupt type */ +-#define SECNR_MIXB1T 0x30000000 /* MIXB1 priority position IPIC output interrupt type */ +-#define SECNR_MIXA0T 0x00c00000 /* MIXA0 priority position IPIC output interrupt type */ +-#define SECNR_SYSA1T 0x00300000 /* MIXA1 priority position IPIC output interrupt type */ +-#define SECNR_EDI0 0x00008000 /* IRQ0 external interrupt edge/level detect */ +-#define SECNR_EDI1 0x00004000 /* IRQ1 external interrupt edge/level detect */ +-#define SECNR_EDI2 0x00002000 /* IRQ2 external interrupt edge/level detect */ +-#define SECNR_EDI3 0x00001000 /* IRQ3 external interrupt edge/level detect */ +-#define SECNR_EDI4 0x00000800 /* IRQ4 external interrupt edge/level detect */ +-#define SECNR_EDI5 0x00000400 /* IRQ5 external interrupt edge/level detect */ +-#define SECNR_EDI6 0x00000200 /* IRQ6 external interrupt edge/level detect */ +-#define SECNR_EDI7 0x00000100 /* IRQ7 external interrupt edge/level detect */ +-#define SECNR_RES ~( SECNR_MIXB0T | SECNR_MIXB1T | SECNR_MIXA0T \ +- | SECNR_SYSA1T | SECNR_EDI0 | SECNR_EDI1 \ +- | SECNR_EDI2 | SECNR_EDI3 | SECNR_EDI4 \ +- | SECNR_EDI5 | SECNR_EDI6 | SECNR_EDI7) +- u32 sersr; /* System Error Status Register (SERR) */ +- u32 sermr; /* System Error Mask Register (SERR) */ +-#define SERR_IRQ0 0x80000000 /* IRQ0 MCP request */ +-#define SERR_WDT 0x40000000 /* WDT MCP request */ +-#define SERR_SBA 0x20000000 /* SBA MCP request */ +-#if defined (CONFIG_MPC8349) +-#define SERR_DDR 0x10000000 /* DDR MCP request */ +-#define SERR_LBC 0x08000000 /* LBC MCP request */ +-#define SERR_PCI1 0x04000000 /* PCI1 MCP request */ +-#define SERR_PCI2 0x02000000 /* PCI2 MCP request */ +-#endif +-#if defined (CONFIG_MPC8360) +-#define SERR_CIEE 0x10000000 /* CIEE MCP request */ +-#define SERR_CMEE 0x08000000 /* CMEEMCP request */ +-#define SERR_PCI 0x04000000 /* PCI MCP request */ +-#endif +-#define SERR_MU 0x01000000 /* MU MCP request */ +-#define SERR_RNC 0x00010000 /* MU MCP request (!!! Non-visible for users !!!) */ +-#if defined (CONFIG_MPC8349) +-#define SERR_RES ~( SERR_IRQ0 | SERR_WDT | SERR_SBA | SERR_DDR \ +- |SERR_LBC | SERR_PCI1 | SERR_PCI2 | SERR_MU \ +- |SERR_RNC ) +-#elif defined (CONFIG_MPC8360) +-#define SERR_RES ~( SERR_IRQ0|SERR_WDT |SERR_SBA |SERR_CIEE\ +- |SERR_CMEE|SERR_PCI|SERR_MU) +-#endif +- u32 sercr; /* System Error Control Register (SERCR) */ +-#define SERCR_MCPR 0x00000001 /* MCP Route */ +-#define SERCR_RES ~(SERCR_MCPR) ++ u32 sepnr; /* System External Interrupt Pending Register */ ++ u32 smprr_a; /* System Mixed Interrupt Group A Priority Register */ ++ u32 smprr_b; /* System Mixed Interrupt Group B Priority Register */ ++ u32 semsr; /* System External Interrupt Mask Register */ ++ u32 secnr; /* System External Interrupt Control Register */ ++ u32 sersr; /* System Error Status Register */ ++ u32 sermr; /* System Error Mask Register */ ++ u32 sercr; /* System Error Control Register */ + u8 res2[4]; +- u32 sifcr_h; /* System Internal Interrupt Force Register - High (SIIH) */ +- u32 sifcr_l; /* System Internal Interrupt Force Register - Low (SIIL) */ +- u32 sefcr; /* System External Interrupt Force Register (SEI) */ +- u32 serfr; /* System Error Force Register (SERR) */ ++ u32 sifcr_h; /* System Internal Interrupt Force Register - High */ ++ u32 sifcr_l; /* System Internal Interrupt Force Register - Low */ ++ u32 sefcr; /* System External Interrupt Force Register */ ++ u32 serfr; /* System Error Force Register */ + u32 scvcr; /* System Critical Interrupt Vector Register */ +-#define SCVCR_CVECX 0xFC000000 /* Backward (MPC8260) compatible +- critical interrupt vector. */ +-#define SCVCR_CVEC 0x0000007F /* Critical interrupt vector */ +-#define SCVCR_RES ~(SCVCR_CVECX|SCVCR_CVEC) + u32 smvcr; /* System Management Interrupt Vector Register */ +-#define SMVCR_CVECX 0xFC000000 /* Backward (MPC8260) compatible +- critical interrupt vector. */ +-#define SMVCR_CVEC 0x0000007F /* Critical interrupt vector */ +-#define SMVCR_RES ~(SMVCR_CVECX|SMVCR_CVEC) + u8 res3[0x98]; + } ipic83xx_t; + +@@ -491,43 +160,14 @@ typedef struct ipic83xx { + */ + typedef struct arbiter83xx { + u32 acr; /* Arbiter Configuration Register */ +-#define ACR_COREDIS 0x10000000 /* Core disable. */ +-#define ACR_COREDIS_SHIFT (31-7) +-#define ACR_PIPE_DEP 0x00070000 /* Pipeline depth (number of outstanding transactions). */ +-#define ACR_PIPE_DEP_SHIFT (31-15) +-#define ACR_PCI_RPTCNT 0x00007000 /* PCI repeat count. */ +-#define ACR_PCI_RPTCNT_SHIFT (31-19) +-#define ACR_RPTCNT 0x00000700 /* Repeat count. */ +-#define ACR_RPTCNT_SHIFT (31-23) +-#define ACR_APARK 0x00000030 /* Address parking. */ +-#define ACR_APARK_SHIFT (31-27) +-#define ACR_PARKM 0x0000000F /* Parking master. */ +-#define ACR_PARKM_SHIFT (31-31) +-#define ACR_RES ~(ACR_COREDIS|ACR_PIPE_DEP|ACR_PCI_RPTCNT|ACR_RPTCNT|ACR_APARK|ACR_PARKM) + u32 atr; /* Arbiter Timers Register */ +-#define ATR_DTO 0x00FF0000 /* Data time out. */ +-#define ATR_ATO 0x000000FF /* Address time out. */ +-#define ATR_RES ~(ATR_DTO|ATR_ATO) + u8 res[4]; +- u32 aer; /* Arbiter Event Register (AE) */ +- u32 aidr; /* Arbiter Interrupt Definition Register (AE) */ +- u32 amr; /* Arbiter Mask Register (AE) */ ++ u32 aer; /* Arbiter Event Register */ ++ u32 aidr; /* Arbiter Interrupt Definition Register */ ++ u32 amr; /* Arbiter Mask Register */ + u32 aeatr; /* Arbiter Event Attributes Register */ +-#define AEATR_EVENT 0x07000000 /* Event type. */ +-#define AEATR_MSTR_ID 0x001F0000 /* Master Id. */ +-#define AEATR_TBST 0x00000800 /* Transfer burst. */ +-#define AEATR_TSIZE 0x00000700 /* Transfer Size. */ +-#define AEATR_TTYPE 0x0000001F /* Transfer Type. */ +-#define AEATR_RES ~(AEATR_EVENT|AEATR_MSTR_ID|AEATR_TBST|AEATR_TSIZE|AEATR_TTYPE) + u32 aeadr; /* Arbiter Event Address Register */ +- u32 aerr; /* Arbiter Event Response Register (AE) */ +-#define AE_ETEA 0x00000020 /* Transfer error. */ +-#define AE_RES_ 0x00000010 /* Reserved transfer type. */ +-#define AE_ECW 0x00000008 /* External control word transfer type. */ +-#define AE_AO 0x00000004 /* Address Only transfer type. */ +-#define AE_DTO 0x00000002 /* Data time out. */ +-#define AE_ATO 0x00000001 /* Address time out. */ +-#define AE_RSRV ~(AE_ETEA|AE_RES_|AE_ECW|AE_AO|AE_DTO|AE_ATO) ++ u32 aerr; /* Arbiter Event Response Register */ + u8 res1[0xDC]; + } arbiter83xx_t; + +@@ -535,184 +175,24 @@ typedef struct arbiter83xx { + * Reset Module + */ + typedef struct reset83xx { +- u32 rcwl; /* RCWL Register */ +-#define RCWL_LBIUCM 0x80000000 /* LBIUCM */ +-#define RCWL_LBIUCM_SHIFT 31 +-#define RCWL_DDRCM 0x40000000 /* DDRCM */ +-#define RCWL_DDRCM_SHIFT 30 +-#if defined (CONFIG_MPC8349) +-#define RCWL_SVCOD 0x30000000 /* SVCOD */ +-#endif +-#define RCWL_SPMF 0x0f000000 /* SPMF */ +-#define RCWL_SPMF_SHIFT 24 +-#define RCWL_COREPLL 0x007F0000 /* COREPLL */ +-#define RCWL_COREPLL_SHIFT 16 +-#define RCWL_CEVCOD 0x000000C0 /* CEVCOD */ +-#define RCWL_CEPDF 0x00000020 /* CEPDF */ +-#define RCWL_CEPDF_SHIFT 5 +-#define RCWL_CEPMF 0x0000001F /* CEPMF */ +-#define RCWL_CEPMF_SHIFT 0 +-#if defined (CONFIG_MPC8349) +-#define RCWL_RES ~(RCWL_LBIUCM|RCWL_DDRCM|RCWL_SVCOD|RCWL_SPMF|RCWL_COREPLL|RCWL_CEVCOD|RCWL_CEPDF|RCWL_CEPMF) +-#elif defined (CONFIG_MPC8360) +-#define RCWL_RES ~(RCWL_LBIUCM|RCWL_DDRCM|RCWL_SPMF|RCWL_COREPLL|RCWL_CEPDF|RCWL_CEPMF) +-#endif +- u32 rcwh; /* RCHL Register */ +-#define RCWH_PCIHOST 0x80000000 /* PCIHOST */ +-#define RCWH_PCIHOST_SHIFT 31 +-#if defined (CONFIG_MPC8349) +-#define RCWH_PCI64 0x40000000 /* PCI64 */ +-#define RCWH_PCI1ARB 0x20000000 /* PCI1ARB */ +-#define RCWH_PCI2ARB 0x10000000 /* PCI2ARB */ +-#elif defined (CONFIG_MPC8360) +-#define RCWH_PCIARB 0x20000000 /* PCI internal arbiter mode. */ +-#define RCWH_PCICKDRV 0x10000000 /* PCI clock output drive. */ +-#endif +-#define RCWH_COREDIS 0x08000000 /* COREDIS */ +-#define RCWH_BMS 0x04000000 /* BMS */ +-#define RCWH_BOOTSEQ 0x03000000 /* BOOTSEQ */ +-#define RCWH_SWEN 0x00800000 /* SWEN */ +-#define RCWH_ROMLOC 0x00700000 /* ROMLOC */ +-#if defined (CONFIG_MPC8349) +-#define RCWH_TSEC1M 0x0000c000 /* TSEC1M */ +-#define RCWH_TSEC2M 0x00003000 /* TSEC2M */ +-#define RCWH_TPR 0x00000100 /* TPR */ +-#elif defined (CONFIG_MPC8360) +-#define RCWH_SDDRIOE 0x00000010 /* Secondary DDR IO Enable. */ +-#endif +-#define RCWH_TLE 0x00000008 /* TLE */ +-#define RCWH_LALE 0x00000004 /* LALE */ +-#if defined (CONFIG_MPC8349) +-#define RCWH_RES ~(RCWH_PCIHOST | RCWH_PCI64 | RCWH_PCI1ARB \ +- | RCWH_PCI2ARB | RCWH_COREDIS | RCWH_BMS \ +- | RCWH_BOOTSEQ | RCWH_SWEN | RCWH_ROMLOC \ +- | RCWH_TSEC1M | RCWH_TSEC2M | RCWH_TPR \ +- | RCWH_TLE | RCWH_LALE) +-#elif defined (CONFIG_MPC8360) +-#define RCWH_RES ~(RCWH_PCIHOST|RCWH_PCIARB|RCWH_PCICKDRV \ +- |RCWH_COREDIS|RCWH_BMS|RCWH_BOOTSEQ|RCWH_SWEN \ +- |RCWH_SDDRIOE |RCWH_TLE) +-#endif ++ u32 rcwl; /* Reset Configuration Word Low Register */ ++ u32 rcwh; /* Reset Configuration Word High Register */ + u8 res0[8]; +- u32 rsr; /* Reset status Register */ +-#define RSR_RSTSRC 0xE0000000 /* Reset source */ +-#define RSR_RSTSRC_SHIFT 29 +-#define RSR_BSF 0x00010000 /* Boot seq. fail */ +-#define RSR_BSF_SHIFT 16 +-#define RSR_SWSR 0x00002000 /* software soft reset */ +-#define RSR_SWSR_SHIFT 13 +-#define RSR_SWHR 0x00001000 /* software hard reset */ +-#define RSR_SWHR_SHIFT 12 +-#define RSR_JHRS 0x00000200 /* jtag hreset */ +-#define RSR_JHRS_SHIFT 9 +-#define RSR_JSRS 0x00000100 /* jtag sreset status */ +-#define RSR_JSRS_SHIFT 8 +-#define RSR_CSHR 0x00000010 /* checkstop reset status */ +-#define RSR_CSHR_SHIFT 4 +-#define RSR_SWRS 0x00000008 /* software watchdog reset status */ +-#define RSR_SWRS_SHIFT 3 +-#define RSR_BMRS 0x00000004 /* bus monitop reset status */ +-#define RSR_BMRS_SHIFT 2 +-#define RSR_SRS 0x00000002 /* soft reset status */ +-#define RSR_SRS_SHIFT 1 +-#define RSR_HRS 0x00000001 /* hard reset status */ +-#define RSR_HRS_SHIFT 0 +-#define RSR_RES ~(RSR_RSTSRC | RSR_BSF | RSR_SWSR | RSR_SWHR | RSR_JHRS | RSR_JSRS | RSR_CSHR | RSR_SWRS | RSR_BMRS | RSR_SRS | RSR_HRS) +- u32 rmr; /* Reset mode Register */ +-#define RMR_CSRE 0x00000001 /* checkstop reset enable */ +-#define RMR_CSRE_SHIFT 0 +-#define RMR_RES ~(RMR_CSRE) +- u32 rpr; /* Reset protection Register */ +- u32 rcr; /* Reset Control Register */ +-#define RCR_SWHR 0x00000002 /* software hard reset */ +-#define RCR_SWSR 0x00000001 /* software soft reset */ +-#define RCR_RES ~(RCR_SWHR | RCR_SWSR) +- u32 rcer; /* Reset Control Enable Register */ +-#define RCER_CRE 0x00000001 /* software hard reset */ +-#define RCER_RES ~(RCER_CRE) ++ u32 rsr; /* Reset Status Register */ ++ u32 rmr; /* Reset Mode Register */ ++ u32 rpr; /* Reset protection Register */ ++ u32 rcr; /* Reset Control Register */ ++ u32 rcer; /* Reset Control Enable Register */ + u8 res1[0xDC]; + } reset83xx_t; + ++/* ++ * Clock Module ++ */ + typedef struct clk83xx { +- u32 spmr; /* system PLL mode Register */ +-#define SPMR_LBIUCM 0x80000000 /* LBIUCM */ +-#define SPMR_DDRCM 0x40000000 /* DDRCM */ +-#if defined (CONFIG_MPC8349) +-#define SPMR_SVCOD 0x30000000 /* SVCOD */ +-#endif +-#define SPMR_SPMF 0x0F000000 /* SPMF */ +-#define SPMR_CKID 0x00800000 /* CKID */ +-#define SPMR_CKID_SHIFT 23 +-#define SPMR_COREPLL 0x007F0000 /* COREPLL */ +-#define SPMR_CEVCOD 0x000000C0 /* CEVCOD */ +-#define SPMR_CEPDF 0x00000020 /* CEPDF */ +-#define SPMR_CEPMF 0x0000001F /* CEPMF */ +-#if defined (CONFIG_MPC8349) +-#define SPMR_RES ~(SPMR_LBIUCM | SPMR_DDRCM | SPMR_SVCOD \ +- | SPMR_SPMF | SPMR_CKID | SPMR_COREPLL \ +- | SPMR_CEVCOD | SPMR_CEPDF | SPMR_CEPMF) +-#elif defined (CONFIG_MPC8360) +-#define SPMR_RES ~(SPMR_LBIUCM | SPMR_DDRCM | SPMR_SPMF \ +- | SPMR_CKID | SPMR_COREPLL | SPMR_CEVCOD \ +- | SPMR_CEPDF | SPMR_CEPMF) +-#endif +- u32 occr; /* output clock control Register */ +-#define OCCR_PCICOE0 0x80000000 /* PCICOE0 */ +-#define OCCR_PCICOE1 0x40000000 /* PCICOE1 */ +-#define OCCR_PCICOE2 0x20000000 /* PCICOE2 */ +-#if defined (CONFIG_MPC8349) +-#define OCCR_PCICOE3 0x10000000 /* PCICOE3 */ +-#define OCCR_PCICOE4 0x08000000 /* PCICOE4 */ +-#define OCCR_PCICOE5 0x04000000 /* PCICOE5 */ +-#define OCCR_PCICOE6 0x02000000 /* PCICOE6 */ +-#define OCCR_PCICOE7 0x01000000 /* PCICOE7 */ +-#endif +-#define OCCR_PCICD0 0x00800000 /* PCICD0 */ +-#define OCCR_PCICD1 0x00400000 /* PCICD1 */ +-#define OCCR_PCICD2 0x00200000 /* PCICD2 */ +-#if defined (CONFIG_MPC8349) +-#define OCCR_PCICD3 0x00100000 /* PCICD3 */ +-#define OCCR_PCICD4 0x00080000 /* PCICD4 */ +-#define OCCR_PCICD5 0x00040000 /* PCICD5 */ +-#define OCCR_PCICD6 0x00020000 /* PCICD6 */ +-#define OCCR_PCICD7 0x00010000 /* PCICD7 */ +-#define OCCR_PCI1CR 0x00000002 /* PCI1CR */ +-#define OCCR_PCI2CR 0x00000001 /* PCI2CR */ +-#define OCCR_RES ~(OCCR_PCICOE0 | OCCR_PCICOE1 | OCCR_PCICOE2 \ +- | OCCR_PCICOE3 | OCCR_PCICOE4 | OCCR_PCICOE5 \ +- | OCCR_PCICOE6 | OCCR_PCICOE7 | OCCR_PCICD0 \ +- | OCCR_PCICD1 | OCCR_PCICD2 | OCCR_PCICD3 \ +- | OCCR_PCICD4 | OCCR_PCICD5 | OCCR_PCICD6 \ +- | OCCR_PCICD7 | OCCR_PCI1CR | OCCR_PCI2CR ) +-#endif +-#if defined (CONFIG_MPC8360) +-#define OCCR_PCICR 0x00000002 /* PCI clock rate */ +-#define OCCR_RES ~(OCCR_PCICOE0|OCCR_PCICOE1|OCCR_PCICOE2 \ +- |OCCR_PCICD0|OCCR_PCICD1|OCCR_PCICD2|OCCR_PCICR ) +-#endif +- u32 sccr; /* system clock control Register */ +-#if defined (CONFIG_MPC8349) +-#define SCCR_TSEC1CM 0xc0000000 /* TSEC1CM */ +-#define SCCR_TSEC1CM_SHIFT 30 +-#define SCCR_TSEC2CM 0x30000000 /* TSEC2CM */ +-#define SCCR_TSEC2CM_SHIFT 28 +-#endif +-#define SCCR_ENCCM 0x03000000 /* ENCCM */ +-#define SCCR_ENCCM_SHIFT 24 +-#if defined (CONFIG_MPC8349) +-#define SCCR_USBMPHCM 0x00c00000 /* USBMPHCM */ +-#define SCCR_USBMPHCM_SHIFT 22 +-#define SCCR_USBDRCM 0x00300000 /* USBDRCM */ +-#define SCCR_USBDRCM_SHIFT 20 +-#endif +-#define SCCR_PCICM 0x00010000 /* PCICM */ +-#if defined (CONFIG_MPC8349) +-#define SCCR_RES ~( SCCR_TSEC1CM | SCCR_TSEC2CM | SCCR_ENCCM \ +- | SCCR_USBMPHCM | SCCR_USBDRCM | SCCR_PCICM) +-#endif +-#if defined (CONFIG_MPC8360) +-#define SCCR_RES ~(SCCR_ENCCM | SCCR_PCICM) +-#endif ++ u32 spmr; /* system PLL mode Register */ ++ u32 occr; /* output clock control Register */ ++ u32 sccr; /* system clock control Register */ + u8 res0[0xF4]; + } clk83xx_t; + +@@ -720,27 +200,14 @@ typedef struct clk83xx { + * Power Management Control Module + */ + typedef struct pmc83xx { +- u32 pmccr; /* PMC Configuration Register */ +-#define PMCCR_SLPEN 0x00000001 /* System Low Power Enable */ +-#define PMCCR_DLPEN 0x00000002 /* DDR SDRAM Low Power Enable */ +-#if defined (CONFIG_MPC8360) +-#define PMCCR_SDLPEN 0x00000004 /* Secondary DDR SDRAM Low Power Enable */ +-#define PMCCR_RES ~(PMCCR_SLPEN | PMCCR_DLPEN | PMCCR_SDLPEN) +-#elif defined (CONFIG_MPC8349) +-#define PMCCR_RES ~(PMCCR_SLPEN | PMCCR_DLPEN) +-#endif +- u32 pmcer; /* PMC Event Register */ +-#define PMCER_PMCI 0x00000001 /* PMC Interrupt */ +-#define PMCER_RES ~(PMCER_PMCI) +- u32 pmcmr; /* PMC Mask Register */ +-#define PMCMR_PMCIE 0x0001 /* PMC Interrupt Enable */ +-#define PMCMR_RES ~(PMCMR_PMCIE) ++ u32 pmccr; /* PMC Configuration Register */ ++ u32 pmcer; /* PMC Event Register */ ++ u32 pmcmr; /* PMC Mask Register */ + u8 res0[0xF4]; + } pmc83xx_t; + +-#if defined (CONFIG_MPC8349) + /* +- * general purpose I/O module ++ * General purpose I/O module + */ + typedef struct gpio83xx { + u32 dir; /* direction register */ +@@ -751,124 +218,20 @@ typedef struct gpio83xx { + u32 icr; /* external interrupt control register */ + u8 res0[0xE8]; + } gpio83xx_t; +-#endif + +-#if defined (CONFIG_MPC8360) + /* + * QE Ports Interrupts Registers + */ + typedef struct qepi83xx { + u8 res0[0xC]; + u32 qepier; /* QE Ports Interrupt Event Register */ +-#define QEPIER_PA15 0x80000000 +-#define QEPIER_PA16 0x40000000 +-#define QEPIER_PA29 0x20000000 +-#define QEPIER_PA30 0x10000000 +-#define QEPIER_PB3 0x08000000 +-#define QEPIER_PB5 0x04000000 +-#define QEPIER_PB12 0x02000000 +-#define QEPIER_PB13 0x01000000 +-#define QEPIER_PB26 0x00800000 +-#define QEPIER_PB27 0x00400000 +-#define QEPIER_PC27 0x00200000 +-#define QEPIER_PC28 0x00100000 +-#define QEPIER_PC29 0x00080000 +-#define QEPIER_PD12 0x00040000 +-#define QEPIER_PD13 0x00020000 +-#define QEPIER_PD16 0x00010000 +-#define QEPIER_PD17 0x00008000 +-#define QEPIER_PD26 0x00004000 +-#define QEPIER_PD27 0x00002000 +-#define QEPIER_PE12 0x00001000 +-#define QEPIER_PE13 0x00000800 +-#define QEPIER_PE24 0x00000400 +-#define QEPIER_PE25 0x00000200 +-#define QEPIER_PE26 0x00000100 +-#define QEPIER_PE27 0x00000080 +-#define QEPIER_PE31 0x00000040 +-#define QEPIER_PF20 0x00000020 +-#define QEPIER_PG31 0x00000010 +-#define QEPIER_RES ~(QEPIER_PA15|QEPIER_PA16|QEPIER_PA29|QEPIER_PA30|QEPIER_PB3 \ +- |QEPIER_PB5|QEPIER_PB12|QEPIER_PB13|QEPIER_PB26|QEPIER_PB27 \ +- |QEPIER_PC27|QEPIER_PC28|QEPIER_PC29|QEPIER_PD12|QEPIER_PD13 \ +- |QEPIER_PD16|QEPIER_PD17|QEPIER_PD26|QEPIER_PD27|QEPIER_PE12 \ +- |QEPIER_PE13|QEPIER_PE24|QEPIER_PE25|QEPIER_PE26|QEPIER_PE27 \ +- |QEPIER_PE31|QEPIER_PF20|QEPIER_PG31) + u32 qepimr; /* QE Ports Interrupt Mask Register */ +-#define QEPIMR_PA15 0x80000000 +-#define QEPIMR_PA16 0x40000000 +-#define QEPIMR_PA29 0x20000000 +-#define QEPIMR_PA30 0x10000000 +-#define QEPIMR_PB3 0x08000000 +-#define QEPIMR_PB5 0x04000000 +-#define QEPIMR_PB12 0x02000000 +-#define QEPIMR_PB13 0x01000000 +-#define QEPIMR_PB26 0x00800000 +-#define QEPIMR_PB27 0x00400000 +-#define QEPIMR_PC27 0x00200000 +-#define QEPIMR_PC28 0x00100000 +-#define QEPIMR_PC29 0x00080000 +-#define QEPIMR_PD12 0x00040000 +-#define QEPIMR_PD13 0x00020000 +-#define QEPIMR_PD16 0x00010000 +-#define QEPIMR_PD17 0x00008000 +-#define QEPIMR_PD26 0x00004000 +-#define QEPIMR_PD27 0x00002000 +-#define QEPIMR_PE12 0x00001000 +-#define QEPIMR_PE13 0x00000800 +-#define QEPIMR_PE24 0x00000400 +-#define QEPIMR_PE25 0x00000200 +-#define QEPIMR_PE26 0x00000100 +-#define QEPIMR_PE27 0x00000080 +-#define QEPIMR_PE31 0x00000040 +-#define QEPIMR_PF20 0x00000020 +-#define QEPIMR_PG31 0x00000010 +-#define QEPIMR_RES ~(QEPIMR_PA15|QEPIMR_PA16|QEPIMR_PA29|QEPIMR_PA30|QEPIMR_PB3 \ +- |QEPIMR_PB5|QEPIMR_PB12|QEPIMR_PB13|QEPIMR_PB26|QEPIMR_PB27 \ +- |QEPIMR_PC27|QEPIMR_PC28|QEPIMR_PC29|QEPIMR_PD12|QEPIMR_PD13 \ +- |QEPIMR_PD16|QEPIMR_PD17|QEPIMR_PD26|QEPIMR_PD27|QEPIMR_PE12 \ +- |QEPIMR_PE13|QEPIMR_PE24|QEPIMR_PE25|QEPIMR_PE26|QEPIMR_PE27 \ +- |QEPIMR_PE31|QEPIMR_PF20|QEPIMR_PG31) + u32 qepicr; /* QE Ports Interrupt Control Register */ +-#define QEPICR_PA15 0x80000000 +-#define QEPICR_PA16 0x40000000 +-#define QEPICR_PA29 0x20000000 +-#define QEPICR_PA30 0x10000000 +-#define QEPICR_PB3 0x08000000 +-#define QEPICR_PB5 0x04000000 +-#define QEPICR_PB12 0x02000000 +-#define QEPICR_PB13 0x01000000 +-#define QEPICR_PB26 0x00800000 +-#define QEPICR_PB27 0x00400000 +-#define QEPICR_PC27 0x00200000 +-#define QEPICR_PC28 0x00100000 +-#define QEPICR_PC29 0x00080000 +-#define QEPICR_PD12 0x00040000 +-#define QEPICR_PD13 0x00020000 +-#define QEPICR_PD16 0x00010000 +-#define QEPICR_PD17 0x00008000 +-#define QEPICR_PD26 0x00004000 +-#define QEPICR_PD27 0x00002000 +-#define QEPICR_PE12 0x00001000 +-#define QEPICR_PE13 0x00000800 +-#define QEPICR_PE24 0x00000400 +-#define QEPICR_PE25 0x00000200 +-#define QEPICR_PE26 0x00000100 +-#define QEPICR_PE27 0x00000080 +-#define QEPICR_PE31 0x00000040 +-#define QEPICR_PF20 0x00000020 +-#define QEPICR_PG31 0x00000010 +-#define QEPICR_RES ~(QEPICR_PA15|QEPICR_PA16|QEPICR_PA29|QEPICR_PA30|QEPICR_PB3 \ +- |QEPICR_PB5|QEPICR_PB12|QEPICR_PB13|QEPICR_PB26|QEPICR_PB27 \ +- |QEPICR_PC27|QEPICR_PC28|QEPICR_PC29|QEPICR_PD12|QEPICR_PD13 \ +- |QEPICR_PD16|QEPICR_PD17|QEPICR_PD26|QEPICR_PD27|QEPICR_PE12 \ +- |QEPICR_PE13|QEPICR_PE24|QEPICR_PE25|QEPICR_PE26|QEPICR_PE27 \ +- |QEPICR_PE31|QEPICR_PF20|QEPICR_PG31) + u8 res1[0xE8]; + } qepi83xx_t; + + /* +- * general purpose I/O module ++ * QE Parallel I/O Ports + */ + typedef struct gpio_n { + u32 podr; /* Open Drain Register */ +@@ -879,238 +242,83 @@ typedef struct gpio_n { + u32 ppar2; /* Pin Assignment Register 2 */ + } gpio_n_t; + +-typedef struct gpio83xx { ++typedef struct qegpio83xx { + gpio_n_t ioport[0x7]; + u8 res0[0x358]; +-} gpio83xx_t; ++} qepio83xx_t; + + /* + * QE Secondary Bus Access Windows + */ +- + typedef struct qesba83xx { + u32 lbmcsar; /* Local bus memory controller start address */ +-#define LBMCSAR_SA 0x000FFFFF /* 20 most-significant bits of the start address */ +-#define LBMCSAR_RES ~(LBMCSAR_SA) + u32 sdmcsar; /* Secondary DDR memory controller start address */ +-#define SDMCSAR_SA 0x000FFFFF /* 20 most-significant bits of the start address */ +-#define SDMCSAR_RES ~(SDMCSAR_SA) + u8 res0[0x38]; + u32 lbmcear; /* Local bus memory controller end address */ +-#define LBMCEAR_EA 0x000FFFFF /* 20 most-significant bits of the end address */ +-#define LBMCEAR_RES ~(LBMCEAR_EA) + u32 sdmcear; /* Secondary DDR memory controller end address */ +-#define SDMCEAR_EA 0x000FFFFF /* 20 most-significant bits of the end address */ +-#define SDMCEAR_RES ~(SDMCEAR_EA) + u8 res1[0x38]; +- u32 lbmcar; /* Local bus memory controller attributes */ +-#define LBMCAR_WEN 0x00000001 /* Forward transactions to the QE local bus */ +-#define LBMCAR_RES ~(LBMCAR_WEN) ++ u32 lbmcar; /* Local bus memory controller attributes */ + u32 sdmcar; /* Secondary DDR memory controller attributes */ +-#define SDMCAR_WEN 0x00000001 /* Forward transactions to the second DDR bus */ +-#define SDMCAR_RES ~(SDMCAR_WEN) +- u8 res2[0x778]; ++ u8 res2[0x378]; + } qesba83xx_t; +-#endif + + /* + * DDR Memory Controller Memory Map + */ + typedef struct ddr_cs_bnds { + u32 csbnds; +-#define CSBNDS_SA 0x00FF0000 +-#define CSBNDS_SA_SHIFT 8 +-#define CSBNDS_EA 0x000000FF +-#define CSBNDS_EA_SHIFT 24 + u8 res0[4]; + } ddr_cs_bnds_t; + + typedef struct ddr83xx { +- ddr_cs_bnds_t csbnds[4]; /**< Chip Select x Memory Bounds */ ++ ddr_cs_bnds_t csbnds[4];/* Chip Select x Memory Bounds */ + u8 res0[0x60]; +- u32 cs_config[4]; /**< Chip Select x Configuration */ +-#define CSCONFIG_EN 0x80000000 +-#define CSCONFIG_AP 0x00800000 +-#define CSCONFIG_ROW_BIT 0x00000700 +-#define CSCONFIG_ROW_BIT_12 0x00000000 +-#define CSCONFIG_ROW_BIT_13 0x00000100 +-#define CSCONFIG_ROW_BIT_14 0x00000200 +-#define CSCONFIG_COL_BIT 0x00000007 +-#define CSCONFIG_COL_BIT_8 0x00000000 +-#define CSCONFIG_COL_BIT_9 0x00000001 +-#define CSCONFIG_COL_BIT_10 0x00000002 +-#define CSCONFIG_COL_BIT_11 0x00000003 ++ u32 cs_config[4]; /* Chip Select x Configuration */ + u8 res1[0x78]; +- u32 timing_cfg_1; /**< SDRAM Timing Configuration 1 */ +-#define TIMING_CFG1_PRETOACT 0x70000000 +-#define TIMING_CFG1_PRETOACT_SHIFT 28 +-#define TIMING_CFG1_ACTTOPRE 0x0F000000 +-#define TIMING_CFG1_ACTTOPRE_SHIFT 24 +-#define TIMING_CFG1_ACTTORW 0x00700000 +-#define TIMING_CFG1_ACTTORW_SHIFT 20 +-#define TIMING_CFG1_CASLAT 0x00070000 +-#define TIMING_CFG1_CASLAT_SHIFT 16 +-#define TIMING_CFG1_REFREC 0x0000F000 +-#define TIMING_CFG1_REFREC_SHIFT 12 +-#define TIMING_CFG1_WRREC 0x00000700 +-#define TIMING_CFG1_WRREC_SHIFT 8 +-#define TIMING_CFG1_ACTTOACT 0x00000070 +-#define TIMING_CFG1_ACTTOACT_SHIFT 4 +-#define TIMING_CFG1_WRTORD 0x00000007 +-#define TIMING_CFG1_WRTORD_SHIFT 0 +-#define TIMING_CFG1_CASLAT_20 0x00030000 /* CAS latency = 2.0 */ +-#define TIMING_CFG1_CASLAT_25 0x00040000 /* CAS latency = 2.5 */ +- +- u32 timing_cfg_2; /**< SDRAM Timing Configuration 2 */ +-#define TIMING_CFG2_CPO 0x0F000000 +-#define TIMING_CFG2_CPO_SHIFT 24 +-#define TIMING_CFG2_ACSM 0x00080000 +-#define TIMING_CFG2_WR_DATA_DELAY 0x00001C00 +-#define TIMING_CFG2_WR_DATA_DELAY_SHIFT 10 +-#define TIMING_CFG2_CPO_DEF 0x00000000 /* default (= CASLAT + 1) */ +- +- u32 sdram_cfg; /**< SDRAM Control Configuration */ +-#define SDRAM_CFG_MEM_EN 0x80000000 +-#define SDRAM_CFG_SREN 0x40000000 +-#define SDRAM_CFG_ECC_EN 0x20000000 +-#define SDRAM_CFG_RD_EN 0x10000000 +-#define SDRAM_CFG_SDRAM_TYPE 0x03000000 +-#define SDRAM_CFG_SDRAM_TYPE_SHIFT 24 +-#define SDRAM_CFG_DYN_PWR 0x00200000 +-#define SDRAM_CFG_32_BE 0x00080000 +-#define SDRAM_CFG_8_BE 0x00040000 +-#define SDRAM_CFG_NCAP 0x00020000 +-#define SDRAM_CFG_2T_EN 0x00008000 +-#define SDRAM_CFG_SDRAM_TYPE_DDR 0x02000000 +- ++ u32 timing_cfg_1; /* SDRAM Timing Configuration 1 */ ++ u32 timing_cfg_2; /* SDRAM Timing Configuration 2 */ ++ u32 sdram_cfg; /* SDRAM Control Configuration */ + u8 res2[4]; +- u32 sdram_mode; /**< SDRAM Mode Configuration */ +-#define SDRAM_MODE_ESD 0xFFFF0000 +-#define SDRAM_MODE_ESD_SHIFT 16 +-#define SDRAM_MODE_SD 0x0000FFFF +-#define SDRAM_MODE_SD_SHIFT 0 +-#define DDR_MODE_EXT_MODEREG 0x4000 /* select extended mode reg */ +-#define DDR_MODE_EXT_OPMODE 0x3FF8 /* operating mode, mask */ +-#define DDR_MODE_EXT_OP_NORMAL 0x0000 /* normal operation */ +-#define DDR_MODE_QFC 0x0004 /* QFC / compatibility, mask */ +-#define DDR_MODE_QFC_COMP 0x0000 /* compatible to older SDRAMs */ +-#define DDR_MODE_WEAK 0x0002 /* weak drivers */ +-#define DDR_MODE_DLL_DIS 0x0001 /* disable DLL */ +-#define DDR_MODE_CASLAT 0x0070 /* CAS latency, mask */ +-#define DDR_MODE_CASLAT_15 0x0010 /* CAS latency 1.5 */ +-#define DDR_MODE_CASLAT_20 0x0020 /* CAS latency 2 */ +-#define DDR_MODE_CASLAT_25 0x0060 /* CAS latency 2.5 */ +-#define DDR_MODE_CASLAT_30 0x0030 /* CAS latency 3 */ +-#define DDR_MODE_BTYPE_SEQ 0x0000 /* sequential burst */ +-#define DDR_MODE_BTYPE_ILVD 0x0008 /* interleaved burst */ +-#define DDR_MODE_BLEN_2 0x0001 /* burst length 2 */ +-#define DDR_MODE_BLEN_4 0x0002 /* burst length 4 */ +-#define DDR_REFINT_166MHZ_7US 1302 /* exact value for 7.8125 µs */ +-#define DDR_BSTOPRE 256 /* use 256 cycles as a starting point */ +-#define DDR_MODE_MODEREG 0x0000 /* select mode register */ +- ++ u32 sdram_mode; /* SDRAM Mode Configuration */ + u8 res3[8]; +- u32 sdram_interval; /**< SDRAM Interval Configuration */ +-#define SDRAM_INTERVAL_REFINT 0x3FFF0000 +-#define SDRAM_INTERVAL_REFINT_SHIFT 16 +-#define SDRAM_INTERVAL_BSTOPRE 0x00003FFF +-#define SDRAM_INTERVAL_BSTOPRE_SHIFT 0 ++ u32 sdram_interval; /* SDRAM Interval Configuration */ + u8 res9[8]; + u32 sdram_clk_cntl; +-#define DDR_SDRAM_CLK_CNTL_SS_EN 0x80000000 +-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_025 0x01000000 +-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05 0x02000000 +-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_075 0x03000000 +-#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_1 0x04000000 +- + u8 res4[0xCCC]; +- u32 data_err_inject_hi; /**< Memory Data Path Error Injection Mask High */ +- u32 data_err_inject_lo; /**< Memory Data Path Error Injection Mask Low */ +- u32 ecc_err_inject; /**< Memory Data Path Error Injection Mask ECC */ +-#define ECC_ERR_INJECT_EMB (0x80000000>>22) /* ECC Mirror Byte */ +-#define ECC_ERR_INJECT_EIEN (0x80000000>>23) /* Error Injection Enable */ +-#define ECC_ERR_INJECT_EEIM (0xff000000>>24) /* ECC Erroe Injection Enable */ +-#define ECC_ERR_INJECT_EEIM_SHIFT 0 ++ u32 data_err_inject_hi; /* Memory Data Path Error Injection Mask High */ ++ u32 data_err_inject_lo; /* Memory Data Path Error Injection Mask Low */ ++ u32 ecc_err_inject; /* Memory Data Path Error Injection Mask ECC */ + u8 res5[0x14]; +- u32 capture_data_hi; /**< Memory Data Path Read Capture High */ +- u32 capture_data_lo; /**< Memory Data Path Read Capture Low */ +- u32 capture_ecc; /**< Memory Data Path Read Capture ECC */ +-#define CAPTURE_ECC_ECE (0xff000000>>24) +-#define CAPTURE_ECC_ECE_SHIFT 0 ++ u32 capture_data_hi; /* Memory Data Path Read Capture High */ ++ u32 capture_data_lo; /* Memory Data Path Read Capture Low */ ++ u32 capture_ecc; /* Memory Data Path Read Capture ECC */ + u8 res6[0x14]; +- u32 err_detect; /**< Memory Error Detect */ +-#define ECC_ERROR_DETECT_MME (0x80000000>>0) /* Multiple Memory Errors */ +-#define ECC_ERROR_DETECT_MBE (0x80000000>>28) /* Multiple-Bit Error */ +-#define ECC_ERROR_DETECT_SBE (0x80000000>>29) /* Single-Bit ECC Error Pickup */ +-#define ECC_ERROR_DETECT_MSE (0x80000000>>31) /* Memory Select Error */ +- u32 err_disable; /**< Memory Error Disable */ +-#define ECC_ERROR_DISABLE_MBED (0x80000000>>28) /* Multiple-Bit ECC Error Disable */ +-#define ECC_ERROR_DISABLE_SBED (0x80000000>>29) /* Sinle-Bit ECC Error disable */ +-#define ECC_ERROR_DISABLE_MSED (0x80000000>>31) /* Memory Select Error Disable */ +-#define ECC_ERROR_ENABLE ~(ECC_ERROR_DISABLE_MSED|ECC_ERROR_DISABLE_SBED|ECC_ERROR_DISABLE_MBED) +- u32 err_int_en; /**< Memory Error Interrupt Enable */ +-#define ECC_ERR_INT_EN_MBEE (0x80000000>>28) /* Multiple-Bit ECC Error Interrupt Enable */ +-#define ECC_ERR_INT_EN_SBEE (0x80000000>>29) /* Single-Bit ECC Error Interrupt Enable */ +-#define ECC_ERR_INT_EN_MSEE (0x80000000>>31) /* Memory Select Error Interrupt Enable */ +-#define ECC_ERR_INT_DISABLE ~(ECC_ERR_INT_EN_MBEE|ECC_ERR_INT_EN_SBEE|ECC_ERR_INT_EN_MSEE) +- u32 capture_attributes; /**< Memory Error Attributes Capture */ +-#define ECC_CAPT_ATTR_BNUM (0xe0000000>>1) /* Data Beat Num */ +-#define ECC_CAPT_ATTR_BNUM_SHIFT 28 +-#define ECC_CAPT_ATTR_TSIZ (0xc0000000>>6) /* Transaction Size */ +-#define ECC_CAPT_ATTR_TSIZ_FOUR_DW 0 +-#define ECC_CAPT_ATTR_TSIZ_ONE_DW 1 +-#define ECC_CAPT_ATTR_TSIZ_TWO_DW 2 +-#define ECC_CAPT_ATTR_TSIZ_THREE_DW 3 +-#define ECC_CAPT_ATTR_TSIZ_SHIFT 24 +-#define ECC_CAPT_ATTR_TSRC (0xf8000000>>11) /* Transaction Source */ +-#define ECC_CAPT_ATTR_TSRC_E300_CORE_DT 0x0 +-#define ECC_CAPT_ATTR_TSRC_E300_CORE_IF 0x2 +-#define ECC_CAPT_ATTR_TSRC_TSEC1 0x4 +-#define ECC_CAPT_ATTR_TSRC_TSEC2 0x5 +-#define ECC_CAPT_ATTR_TSRC_USB (0x06|0x07) +-#define ECC_CAPT_ATTR_TSRC_ENCRYPT 0x8 +-#define ECC_CAPT_ATTR_TSRC_I2C 0x9 +-#define ECC_CAPT_ATTR_TSRC_JTAG 0xA +-#define ECC_CAPT_ATTR_TSRC_PCI1 0xD +-#define ECC_CAPT_ATTR_TSRC_PCI2 0xE +-#define ECC_CAPT_ATTR_TSRC_DMA 0xF +-#define ECC_CAPT_ATTR_TSRC_SHIFT 16 +-#define ECC_CAPT_ATTR_TTYP (0xe0000000>>18) /* Transaction Type */ +-#define ECC_CAPT_ATTR_TTYP_WRITE 0x1 +-#define ECC_CAPT_ATTR_TTYP_READ 0x2 +-#define ECC_CAPT_ATTR_TTYP_R_M_W 0x3 +-#define ECC_CAPT_ATTR_TTYP_SHIFT 12 +-#define ECC_CAPT_ATTR_VLD (0x80000000>>31) /* Valid */ +- u32 capture_address; /**< Memory Error Address Capture */ +- u32 capture_ext_address;/**< Memory Error Extended Address Capture */ +- u32 err_sbe; /**< Memory Single-Bit ECC Error Management */ +-#define ECC_ERROR_MAN_SBET (0xff000000>>8) /* Single-Bit Error Threshold 0..255 */ +-#define ECC_ERROR_MAN_SBET_SHIFT 16 +-#define ECC_ERROR_MAN_SBEC (0xff000000>>24) /* Single Bit Error Counter 0..255 */ +-#define ECC_ERROR_MAN_SBEC_SHIFT 0 ++ u32 err_detect; /* Memory Error Detect */ ++ u32 err_disable; /* Memory Error Disable */ ++ u32 err_int_en; /* Memory Error Interrupt Enable */ ++ u32 capture_attributes; /* Memory Error Attributes Capture */ ++ u32 capture_address; /* Memory Error Address Capture */ ++ u32 capture_ext_address;/* Memory Error Extended Address Capture */ ++ u32 err_sbe; /* Memory Single-Bit ECC Error Management */ + u8 res7[0xA4]; + u32 debug_reg; + u8 res8[0xFC]; + } ddr83xx_t; + + /* +- * I2C1 Controller +- */ +- +-/* + * DUART + */ + typedef struct duart83xx { +- u8 urbr_ulcr_udlb; /**< combined register for URBR, UTHR and UDLB */ +- u8 uier_udmb; /**< combined register for UIER and UDMB */ +- u8 uiir_ufcr_uafr; /**< combined register for UIIR, UFCR and UAFR */ +- u8 ulcr; /**< line control register */ +- u8 umcr; /**< MODEM control register */ +- u8 ulsr; /**< line status register */ +- u8 umsr; /**< MODEM status register */ +- u8 uscr; /**< scratch register */ ++ u8 urbr_ulcr_udlb; /* combined register for URBR, UTHR and UDLB */ ++ u8 uier_udmb; /* combined register for UIER and UDMB */ ++ u8 uiir_ufcr_uafr; /* combined register for UIIR, UFCR and UAFR */ ++ u8 ulcr; /* line control register */ ++ u8 umcr; /* MODEM control register */ ++ u8 ulsr; /* line status register */ ++ u8 umsr; /* MODEM status register */ ++ u8 uscr; /* scratch register */ + u8 res0[8]; +- u8 udsr; /**< DMA status register */ ++ u8 udsr; /* DMA status register */ + u8 res1[3]; + u8 res2[0xEC]; + } duart83xx_t; +@@ -1119,75 +327,52 @@ typedef struct duart83xx { + * Local Bus Controller Registers + */ + typedef struct lbus_bank { +- u32 br; /**< Base Register */ +- u32 or; /**< Base Register */ ++ u32 br; /* Base Register */ ++ u32 or; /* Option Register */ + } lbus_bank_t; + + typedef struct lbus83xx { + lbus_bank_t bank[8]; + u8 res0[0x28]; +- u32 mar; /**< UPM Address Register */ ++ u32 mar; /* UPM Address Register */ + u8 res1[0x4]; +- u32 mamr; /**< UPMA Mode Register */ +- u32 mbmr; /**< UPMB Mode Register */ +- u32 mcmr; /**< UPMC Mode Register */ ++ u32 mamr; /* UPMA Mode Register */ ++ u32 mbmr; /* UPMB Mode Register */ ++ u32 mcmr; /* UPMC Mode Register */ + u8 res2[0x8]; +- u32 mrtpr; /**< Memory Refresh Timer Prescaler Register */ +- u32 mdr; /**< UPM Data Register */ ++ u32 mrtpr; /* Memory Refresh Timer Prescaler Register */ ++ u32 mdr; /* UPM Data Register */ + u8 res3[0x8]; +- u32 lsdmr; /**< SDRAM Mode Register */ ++ u32 lsdmr; /* SDRAM Mode Register */ + u8 res4[0x8]; +- u32 lurt; /**< UPM Refresh Timer */ +- u32 lsrt; /**< SDRAM Refresh Timer */ ++ u32 lurt; /* UPM Refresh Timer */ ++ u32 lsrt; /* SDRAM Refresh Timer */ + u8 res5[0x8]; +- u32 ltesr; /**< Transfer Error Status Register */ +- u32 ltedr; /**< Transfer Error Disable Register */ +- u32 lteir; /**< Transfer Error Interrupt Register */ +- u32 lteatr; /**< Transfer Error Attributes Register */ +- u32 ltear; /**< Transfer Error Address Register */ ++ u32 ltesr; /* Transfer Error Status Register */ ++ u32 ltedr; /* Transfer Error Disable Register */ ++ u32 lteir; /* Transfer Error Interrupt Register */ ++ u32 lteatr; /* Transfer Error Attributes Register */ ++ u32 ltear; /* Transfer Error Address Register */ + u8 res6[0xC]; +- u32 lbcr; /**< Configuration Register */ +-#define LBCR_LDIS 0x80000000 +-#define LBCR_LDIS_SHIFT 31 +-#define LBCR_BCTLC 0x00C00000 +-#define LBCR_BCTLC_SHIFT 22 +-#define LBCR_LPBSE 0x00020000 +-#define LBCR_LPBSE_SHIFT 17 +-#define LBCR_EPAR 0x00010000 +-#define LBCR_EPAR_SHIFT 16 +-#define LBCR_BMT 0x0000FF00 +-#define LBCR_BMT_SHIFT 8 +- u32 lcrr; /**< Clock Ratio Register */ +-#define LCRR_DBYP 0x80000000 +-#define LCRR_DBYP_SHIFT 31 +-#define LCRR_BUFCMDC 0x30000000 +-#define LCRR_BUFCMDC_SHIFT 28 +-#define LCRR_ECL 0x03000000 +-#define LCRR_ECL_SHIFT 24 +-#define LCRR_EADC 0x00030000 +-#define LCRR_EADC_SHIFT 16 +-#define LCRR_CLKDIV 0x0000000F +-#define LCRR_CLKDIV_SHIFT 0 +- ++ u32 lbcr; /* Configuration Register */ ++ u32 lcrr; /* Clock Ratio Register */ + u8 res7[0x28]; + u8 res8[0xF00]; + } lbus83xx_t; + +-#if defined (CONFIG_MPC8349) + /* + * Serial Peripheral Interface + */ + typedef struct spi83xx { +- u32 mode; /**< mode register */ +- u32 event; /**< event register */ +- u32 mask; /**< mask register */ +- u32 com; /**< command register */ ++ u32 mode; /* mode register */ ++ u32 event; /* event register */ ++ u32 mask; /* mask register */ ++ u32 com; /* command register */ + u8 res0[0x10]; +- u32 tx; /**< transmit register */ +- u32 rx; /**< receive register */ +- u8 res1[0xD8]; ++ u32 tx; /* transmit register */ ++ u32 rx; /* receive register */ ++ u8 res1[0xFD8]; + } spi83xx_t; +-#endif + + /* + * DMA/Messaging Unit +@@ -1197,21 +382,17 @@ typedef struct dma83xx { + u32 omisr; /* 0x30 Outbound message interrupt status register */ + u32 omimr; /* 0x34 Outbound message interrupt mask register */ + u32 res1[0x6]; /* 0x38-0x49 reserved */ +- + u32 imr0; /* 0x50 Inbound message register 0 */ + u32 imr1; /* 0x54 Inbound message register 1 */ + u32 omr0; /* 0x58 Outbound message register 0 */ + u32 omr1; /* 0x5C Outbound message register 1 */ +- + u32 odr; /* 0x60 Outbound doorbell register */ + u32 res2; /* 0x64-0x67 reserved */ + u32 idr; /* 0x68 Inbound doorbell register */ + u32 res3[0x5]; /* 0x6C-0x79 reserved */ +- + u32 imisr; /* 0x80 Inbound message interrupt status register */ + u32 imimr; /* 0x84 Inbound message interrupt mask register */ + u32 res4[0x1E]; /* 0x88-0x99 reserved */ +- + u32 dmamr0; /* 0x100 DMA 0 mode register */ + u32 dmasr0; /* 0x104 DMA 0 status register */ + u32 dmacdar0; /* 0x108 DMA 0 current descriptor address register */ +@@ -1223,7 +404,6 @@ typedef struct dma83xx { + u32 dmabcr0; /* 0x120 DMA 0 byte count register */ + u32 dmandar0; /* 0x124 DMA 0 next descriptor address register */ + u32 res8[0x16]; /* 0x128-0x179 reserved */ +- + u32 dmamr1; /* 0x180 DMA 1 mode register */ + u32 dmasr1; /* 0x184 DMA 1 status register */ + u32 dmacdar1; /* 0x188 DMA 1 current descriptor address register */ +@@ -1235,7 +415,6 @@ typedef struct dma83xx { + u32 dmabcr1; /* 0x1A0 DMA 1 byte count register */ + u32 dmandar1; /* 0x1A4 DMA 1 next descriptor address register */ + u32 res12[0x16]; /* 0x1A8-0x199 reserved */ +- + u32 dmamr2; /* 0x200 DMA 2 mode register */ + u32 dmasr2; /* 0x204 DMA 2 status register */ + u32 dmacdar2; /* 0x208 DMA 2 current descriptor address register */ +@@ -1247,7 +426,6 @@ typedef struct dma83xx { + u32 dmabcr2; /* 0x220 DMA 2 byte count register */ + u32 dmandar2; /* 0x224 DMA 2 next descriptor address register */ + u32 res16[0x16]; /* 0x228-0x279 reserved */ +- + u32 dmamr3; /* 0x280 DMA 3 mode register */ + u32 dmasr3; /* 0x284 DMA 3 status register */ + u32 dmacdar3; /* 0x288 DMA 3 current descriptor address register */ +@@ -1258,39 +436,15 @@ typedef struct dma83xx { + u32 res19; /* 0x29C reserved */ + u32 dmabcr3; /* 0x2A0 DMA 3 byte count register */ + u32 dmandar3; /* 0x2A4 DMA 3 next descriptor address register */ +- + u32 dmagsr; /* 0x2A8 DMA general status register */ + u32 res20[0x15]; /* 0x2AC-0x2FF reserved */ + } dma83xx_t; + +-/* DMAMRn bits */ +-#define DMA_CHANNEL_START (0x00000001) /* Bit - DMAMRn CS */ +-#define DMA_CHANNEL_TRANSFER_MODE_DIRECT (0x00000004) /* Bit - DMAMRn CTM */ +-#define DMA_CHANNEL_SOURCE_ADRESSS_HOLD_EN (0x00001000) /* Bit - DMAMRn SAHE */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_1B (0x00000000) /* 2Bit- DMAMRn SAHTS 1byte */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_2B (0x00004000) /* 2Bit- DMAMRn SAHTS 2bytes */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_4B (0x00008000) /* 2Bit- DMAMRn SAHTS 4bytes */ +-#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_8B (0x0000c000) /* 2Bit- DMAMRn SAHTS 8bytes */ +-#define DMA_CHANNEL_SNOOP (0x00010000) /* Bit - DMAMRn DMSEN */ +- +-/* DMASRn bits */ +-#define DMA_CHANNEL_BUSY (0x00000004) /* Bit - DMASRn CB */ +-#define DMA_CHANNEL_TRANSFER_ERROR (0x00000080) /* Bit - DMASRn TE */ +- + /* + * PCI Software Configuration Registers + */ + typedef struct pciconf83xx { + u32 config_address; +-#define PCI_CONFIG_ADDRESS_EN 0x80000000 +-#define PCI_CONFIG_ADDRESS_BN_SHIFT 16 +-#define PCI_CONFIG_ADDRESS_BN_MASK 0x00ff0000 +-#define PCI_CONFIG_ADDRESS_DN_SHIFT 11 +-#define PCI_CONFIG_ADDRESS_DN_MASK 0x0000f800 +-#define PCI_CONFIG_ADDRESS_FN_SHIFT 8 +-#define PCI_CONFIG_ADDRESS_FN_MASK 0x00000700 +-#define PCI_CONFIG_ADDRESS_RN_SHIFT 0 +-#define PCI_CONFIG_ADDRESS_RN_MASK 0x000000fc + u32 config_data; + u32 int_ack; + u8 res[116]; +@@ -1313,34 +467,6 @@ typedef struct pci_outbound_window { + */ + typedef struct ios83xx { + pot83xx_t pot[6]; +-#define POTAR_TA_MASK 0x000fffff +-#define POBAR_BA_MASK 0x000fffff +-#define POCMR_EN 0x80000000 +-#define POCMR_IO 0x40000000 /* 0--memory space 1--I/O space */ +-#define POCMR_SE 0x20000000 /* streaming enable */ +-#define POCMR_DST 0x10000000 /* 0--PCI1 1--PCI2 */ +-#define POCMR_CM_MASK 0x000fffff +-#define POCMR_CM_4G 0x00000000 +-#define POCMR_CM_2G 0x00080000 +-#define POCMR_CM_1G 0x000C0000 +-#define POCMR_CM_512M 0x000E0000 +-#define POCMR_CM_256M 0x000F0000 +-#define POCMR_CM_128M 0x000F8000 +-#define POCMR_CM_64M 0x000FC000 +-#define POCMR_CM_32M 0x000FE000 +-#define POCMR_CM_16M 0x000FF000 +-#define POCMR_CM_8M 0x000FF800 +-#define POCMR_CM_4M 0x000FFC00 +-#define POCMR_CM_2M 0x000FFE00 +-#define POCMR_CM_1M 0x000FFF00 +-#define POCMR_CM_512K 0x000FFF80 +-#define POCMR_CM_256K 0x000FFFC0 +-#define POCMR_CM_128K 0x000FFFE0 +-#define POCMR_CM_64K 0x000FFFF0 +-#define POCMR_CM_32K 0x000FFFF8 +-#define POCMR_CM_16K 0x000FFFFC +-#define POCMR_CM_8K 0x000FFFFE +-#define POCMR_CM_4K 0x000FFFFF + u8 res0[0x60]; + u32 pmcr; + u8 res1[4]; +@@ -1353,74 +479,13 @@ typedef struct ios83xx { + */ + typedef struct pcictrl83xx { + u32 esr; +-#define ESR_MERR 0x80000000 +-#define ESR_APAR 0x00000400 +-#define ESR_PCISERR 0x00000200 +-#define ESR_MPERR 0x00000100 +-#define ESR_TPERR 0x00000080 +-#define ESR_NORSP 0x00000040 +-#define ESR_TABT 0x00000020 + u32 ecdr; +-#define ECDR_APAR 0x00000400 +-#define ECDR_PCISERR 0x00000200 +-#define ECDR_MPERR 0x00000100 +-#define ECDR_TPERR 0x00000080 +-#define ECDR_NORSP 0x00000040 +-#define ECDR_TABT 0x00000020 + u32 eer; +-#define EER_APAR 0x00000400 +-#define EER_PCISERR 0x00000200 +-#define EER_MPERR 0x00000100 +-#define EER_TPERR 0x00000080 +-#define EER_NORSP 0x00000040 +-#define EER_TABT 0x00000020 + u32 eatcr; +-#define EATCR_ERRTYPR_MASK 0x70000000 +-#define EATCR_ERRTYPR_APR 0x00000000 /* address parity error */ +-#define EATCR_ERRTYPR_WDPR 0x10000000 /* write data parity error */ +-#define EATCR_ERRTYPR_RDPR 0x20000000 /* read data parity error */ +-#define EATCR_ERRTYPR_MA 0x30000000 /* master abort */ +-#define EATCR_ERRTYPR_TA 0x40000000 /* target abort */ +-#define EATCR_ERRTYPR_SE 0x50000000 /* system error indication received */ +-#define EATCR_ERRTYPR_PEA 0x60000000 /* parity error indication received on a read */ +-#define EATCR_ERRTYPR_PEW 0x70000000 /* parity error indication received on a write */ +-#define EATCR_BN_MASK 0x0f000000 /* beat number */ +-#define EATCR_BN_1st 0x00000000 +-#define EATCR_BN_2ed 0x01000000 +-#define EATCR_BN_3rd 0x02000000 +-#define EATCR_BN_4th 0x03000000 +-#define EATCR_BN_5th 0x0400000 +-#define EATCR_BN_6th 0x05000000 +-#define EATCR_BN_7th 0x06000000 +-#define EATCR_BN_8th 0x07000000 +-#define EATCR_BN_9th 0x08000000 +-#define EATCR_TS_MASK 0x00300000 /* transaction size */ +-#define EATCR_TS_4 0x00000000 +-#define EATCR_TS_1 0x00100000 +-#define EATCR_TS_2 0x00200000 +-#define EATCR_TS_3 0x00300000 +-#define EATCR_ES_MASK 0x000f0000 /* error source */ +-#define EATCR_ES_EM 0x00000000 /* external master */ +-#define EATCR_ES_DMA 0x00050000 +-#define EATCR_CMD_MASK 0x0000f000 +-#if defined (CONFIG_MPC8349) +-#define EATCR_HBE_MASK 0x00000f00 /* PCI high byte enable */ +-#endif +-#define EATCR_BE_MASK 0x000000f0 /* PCI byte enable */ +-#if defined (CONFIG_MPC8349) +-#define EATCR_HPB 0x00000004 /* high parity bit */ +-#endif +-#define EATCR_PB 0x00000002 /* parity bit */ +-#define EATCR_VI 0x00000001 /* error information valid */ + u32 eacr; + u32 eeacr; +-#if defined (CONFIG_MPC8349) + u32 edlcr; + u32 edhcr; +-#elif defined (CONFIG_MPC8360) +- u32 edcr; /* was edlcr */ +- u8 res_edcr[0x4]; +-#endif + u32 gcr; + u32 ecr; + u32 gsr; +@@ -1443,41 +508,8 @@ typedef struct pcictrl83xx { + u8 res6[4]; + u32 piwar0; + u8 res7[132]; +-#define PITAR_TA_MASK 0x000fffff +-#define PIBAR_MASK 0xffffffff +-#define PIEBAR_EBA_MASK 0x000fffff +-#define PIWAR_EN 0x80000000 +-#define PIWAR_PF 0x20000000 +-#define PIWAR_RTT_MASK 0x000f0000 +-#define PIWAR_RTT_NO_SNOOP 0x00040000 +-#define PIWAR_RTT_SNOOP 0x00050000 +-#define PIWAR_WTT_MASK 0x0000f000 +-#define PIWAR_WTT_NO_SNOOP 0x00004000 +-#define PIWAR_WTT_SNOOP 0x00005000 +-#define PIWAR_IWS_MASK 0x0000003F +-#define PIWAR_IWS_4K 0x0000000B +-#define PIWAR_IWS_8K 0x0000000C +-#define PIWAR_IWS_16K 0x0000000D +-#define PIWAR_IWS_32K 0x0000000E +-#define PIWAR_IWS_64K 0x0000000F +-#define PIWAR_IWS_128K 0x00000010 +-#define PIWAR_IWS_256K 0x00000011 +-#define PIWAR_IWS_512K 0x00000012 +-#define PIWAR_IWS_1M 0x00000013 +-#define PIWAR_IWS_2M 0x00000014 +-#define PIWAR_IWS_4M 0x00000015 +-#define PIWAR_IWS_8M 0x00000016 +-#define PIWAR_IWS_16M 0x00000017 +-#define PIWAR_IWS_32M 0x00000018 +-#define PIWAR_IWS_64M 0x00000019 +-#define PIWAR_IWS_128M 0x0000001A +-#define PIWAR_IWS_256M 0x0000001B +-#define PIWAR_IWS_512M 0x0000001C +-#define PIWAR_IWS_1G 0x0000001D +-#define PIWAR_IWS_2G 0x0000001E + } pcictrl83xx_t; + +-#if defined (CONFIG_MPC8349) + /* + * USB + */ +@@ -1491,7 +523,6 @@ typedef struct usb83xx { + typedef struct tsec83xx { + u8 fixme[0x1000]; + } tsec83xx_t; +-#endif + + /* + * Security +@@ -1500,581 +531,82 @@ typedef struct security83xx { + u8 fixme[0x10000]; + } security83xx_t; + +-#if defined (CONFIG_MPC8360) +-/* +- * iram +- */ +-typedef struct iram83xx { +- u32 iadd; /* I-RAM address register */ +- u32 idata; /* I-RAM data register */ +- u8 res0[0x78]; +-} iram83xx_t; +- +-/* +- * Interrupt Controller +- */ +-typedef struct irq83xx { +- u32 cicr; /* QE system interrupt configuration */ +- u32 civec; /* QE system interrupt vector register */ +- u32 cripnr; /* QE RISC interrupt pending register */ +- u32 cipnr; /* QE system interrupt pending register */ +- u32 cipxcc; /* QE interrupt priority register */ +- u32 cipycc; /* QE interrupt priority register */ +- u32 cipwcc; /* QE interrupt priority register */ +- u32 cipzcc; /* QE interrupt priority register */ +- u32 cimr; /* QE system interrupt mask register */ +- u32 crimr; /* QE RISC interrupt mask register */ +- u32 cicnr; /* QE system interrupt control register */ +- u8 res0[0x4]; +- u32 ciprta; /* QE system interrupt priority register for RISC tasks A */ +- u32 ciprtb; /* QE system interrupt priority register for RISC tasks B */ +- u8 res1[0x4]; +- u32 cricr; /* QE system RISC interrupt control */ +- u8 res2[0x20]; +- u32 chivec; /* QE high system interrupt vector */ +- u8 res3[0x1C]; +-} irq83xx_t; +- +-/* +- * Communications Processor +- */ +-typedef struct cp83xx { +- u32 cecr; /* QE command register */ +- u32 ceccr; /* QE controller configuration register */ +- u32 cecdr; /* QE command data register */ +- u8 res0[0xA]; +- u16 ceter; /* QE timer event register */ +- u8 res1[0x2]; +- u16 cetmr; /* QE timers mask register */ +- u32 cetscr; /* QE time-stamp timer control register */ +- u32 cetsr1; /* QE time-stamp register 1 */ +- u32 cetsr2; /* QE time-stamp register 2 */ +- u8 res2[0x8]; +- u32 cevter; /* QE virtual tasks event register */ +- u32 cevtmr; /* QE virtual tasks mask register */ +- u16 cercr; /* QE RAM control register */ +- u8 res3[0x2]; +- u8 res4[0x24]; +- u16 ceexe1; /* QE external request 1 event register */ +- u8 res5[0x2]; +- u16 ceexm1; /* QE external request 1 mask register */ +- u8 res6[0x2]; +- u16 ceexe2; /* QE external request 2 event register */ +- u8 res7[0x2]; +- u16 ceexm2; /* QE external request 2 mask register */ +- u8 res8[0x2]; +- u16 ceexe3; /* QE external request 3 event register */ +- u8 res9[0x2]; +- u16 ceexm3; /* QE external request 3 mask register */ +- u8 res10[0x2]; +- u16 ceexe4; /* QE external request 4 event register */ +- u8 res11[0x2]; +- u16 ceexm4; /* QE external request 4 mask register */ +- u8 res12[0x2]; +- u8 res13[0x280]; +-} cp83xx_t; +- +-/* +- * QE Multiplexer +- */ +- +-typedef struct qmx83xx { +- u32 cmxgcr; /* CMX general clock route register */ +- u32 cmxsi1cr_l; /* CMX SI1 clock route low register */ +- u32 cmxsi1cr_h; /* CMX SI1 clock route high register */ +- u32 cmxsi1syr; /* CMX SI1 SYNC route register */ +- u32 cmxucr1; /* CMX UCC1, UCC3 clock route register */ +- u32 cmxucr2; /* CMX UCC5, UCC7 clock route register */ +- u32 cmxucr3; /* CMX UCC2, UCC4 clock route register */ +- u32 cmxucr4; /* CMX UCC6, UCC8 clock route register */ +- u32 cmxupcr; /* CMX UPC clock route register */ +- u8 res0[0x1C]; +-} qmx83xx_t; +- +-/* +-* QE Timers +-*/ +- +-typedef struct qet83xx { +- u8 gtcfr1; /* Timer 1 and Timer 2 global configuration register */ +- u8 res0[0x3]; +- u8 gtcfr2; /* Timer 3 and timer 4 global configuration register */ +- u8 res1[0xB]; +- u16 gtmdr1; /* Timer 1 mode register */ +- u16 gtmdr2; /* Timer 2 mode register */ +- u16 gtrfr1; /* Timer 1 reference register */ +- u16 gtrfr2; /* Timer 2 reference register */ +- u16 gtcpr1; /* Timer 1 capture register */ +- u16 gtcpr2; /* Timer 2 capture register */ +- u16 gtcnr1; /* Timer 1 counter */ +- u16 gtcnr2; /* Timer 2 counter */ +- u16 gtmdr3; /* Timer 3 mode register */ +- u16 gtmdr4; /* Timer 4 mode register */ +- u16 gtrfr3; /* Timer 3 reference register */ +- u16 gtrfr4; /* Timer 4 reference register */ +- u16 gtcpr3; /* Timer 3 capture register */ +- u16 gtcpr4; /* Timer 4 capture register */ +- u16 gtcnr3; /* Timer 3 counter */ +- u16 gtcnr4; /* Timer 4 counter */ +- u16 gtevr1; /* Timer 1 event register */ +- u16 gtevr2; /* Timer 2 event register */ +- u16 gtevr3; /* Timer 3 event register */ +- u16 gtevr4; /* Timer 4 event register */ +- u16 gtps; /* Timer 1 prescale register */ +- u8 res2[0x46]; +-} qet83xx_t; +- +-/* +-* spi +-*/ +- +-typedef struct spi83xx { +- u8 res0[0x20]; +- u32 spmode; /* SPI mode register */ +- u8 res1[0x2]; +- u8 spie; /* SPI event register */ +- u8 res2[0x1]; +- u8 res3[0x2]; +- u8 spim; /* SPI mask register */ +- u8 res4[0x1]; +- u8 res5[0x1]; +- u8 spcom; /* SPI command register */ +- u8 res6[0x2]; +- u32 spitd; /* SPI transmit data register (cpu mode) */ +- u32 spird; /* SPI receive data register (cpu mode) */ +- u8 res7[0x8]; +-} spi83xx_t; +- +-/* +-* mcc +-*/ +- +-typedef struct mcc83xx { +- u32 mcce; /* MCC event register */ +- u32 mccm; /* MCC mask register */ +- u32 mccf; /* MCC configuration register */ +- u32 merl; /* MCC emergency request level register */ +- u8 res0[0xF0]; +-} mcc83xx_t; +- +-/* +-* brg +-*/ +- +-typedef struct brg83xx { +- u32 brgc1; /* BRG1 configuration register */ +- u32 brgc2; /* BRG2 configuration register */ +- u32 brgc3; /* BRG3 configuration register */ +- u32 brgc4; /* BRG4 configuration register */ +- u32 brgc5; /* BRG5 configuration register */ +- u32 brgc6; /* BRG6 configuration register */ +- u32 brgc7; /* BRG7 configuration register */ +- u32 brgc8; /* BRG8 configuration register */ +- u32 brgc9; /* BRG9 configuration register */ +- u32 brgc10; /* BRG10 configuration register */ +- u32 brgc11; /* BRG11 configuration register */ +- u32 brgc12; /* BRG12 configuration register */ +- u32 brgc13; /* BRG13 configuration register */ +- u32 brgc14; /* BRG14 configuration register */ +- u32 brgc15; /* BRG15 configuration register */ +- u32 brgc16; /* BRG16 configuration register */ +- u8 res0[0x40]; +-} brg83xx_t; +- +-/* +-* USB +-*/ +- +-typedef struct usb83xx { +- u8 usmod; /* USB mode register */ +- u8 usadd; /* USB address register */ +- u8 uscom; /* USB command register */ +- u8 res0[0x1]; +- u16 usep0; /* USB endpoint register 0 */ +- u16 usep1; /* USB endpoint register 1 */ +- u16 usep2; /* USB endpoint register 2 */ +- u16 usep3; /* USB endpoint register 3 */ +- u8 res1[0x4]; +- u16 usber; /* USB event register */ +- u8 res2[0x2]; +- u16 usbmr; /* USB mask register */ +- u8 res3[0x1]; +- u8 usbs; /* USB status register */ +- u32 ussft; /* USB start of frame timer */ +- u8 res4[0x24]; +-} usb83xx_t; +- +-/* +-* SI +-*/ +- +-typedef struct si1_83xx { +- u16 siamr1; /* SI1 TDMA mode register */ +- u16 sibmr1; /* SI1 TDMB mode register */ +- u16 sicmr1; /* SI1 TDMC mode register */ +- u16 sidmr1; /* SI1 TDMD mode register */ +- u8 siglmr1_h; /* SI1 global mode register high */ +- u8 res0[0x1]; +- u8 sicmdr1_h; /* SI1 command register high */ +- u8 res2[0x1]; +- u8 sistr1_h; /* SI1 status register high */ +- u8 res3[0x1]; +- u16 sirsr1_h; /* SI1 RAM shadow address register high */ +- u8 sitarc1; /* SI1 RAM counter Tx TDMA */ +- u8 sitbrc1; /* SI1 RAM counter Tx TDMB */ +- u8 sitcrc1; /* SI1 RAM counter Tx TDMC */ +- u8 sitdrc1; /* SI1 RAM counter Tx TDMD */ +- u8 sirarc1; /* SI1 RAM counter Rx TDMA */ +- u8 sirbrc1; /* SI1 RAM counter Rx TDMB */ +- u8 sircrc1; /* SI1 RAM counter Rx TDMC */ +- u8 sirdrc1; /* SI1 RAM counter Rx TDMD */ +- u8 res4[0x8]; +- u16 siemr1; /* SI1 TDME mode register 16 bits */ +- u16 sifmr1; /* SI1 TDMF mode register 16 bits */ +- u16 sigmr1; /* SI1 TDMG mode register 16 bits */ +- u16 sihmr1; /* SI1 TDMH mode register 16 bits */ +- u8 siglmg1_l; /* SI1 global mode register low 8 bits */ +- u8 res5[0x1]; +- u8 sicmdr1_l; /* SI1 command register low 8 bits */ +- u8 res6[0x1]; +- u8 sistr1_l; /* SI1 status register low 8 bits */ +- u8 res7[0x1]; +- u16 sirsr1_l; /* SI1 RAM shadow address register low 16 bits */ +- u8 siterc1; /* SI1 RAM counter Tx TDME 8 bits */ +- u8 sitfrc1; /* SI1 RAM counter Tx TDMF 8 bits */ +- u8 sitgrc1; /* SI1 RAM counter Tx TDMG 8 bits */ +- u8 sithrc1; /* SI1 RAM counter Tx TDMH 8 bits */ +- u8 sirerc1; /* SI1 RAM counter Rx TDME 8 bits */ +- u8 sirfrc1; /* SI1 RAM counter Rx TDMF 8 bits */ +- u8 sirgrc1; /* SI1 RAM counter Rx TDMG 8 bits */ +- u8 sirhrc1; /* SI1 RAM counter Rx TDMH 8 bits */ +- u8 res8[0x8]; +- u32 siml1; /* SI1 multiframe limit register */ +- u8 siedm1; /* SI1 extended diagnostic mode register */ +- u8 res9[0xBB]; +-} si1_83xx_t; +- +-/* +-* SI Routing Tables +-*/ +- +-typedef struct sir83xx { +- u8 tx[0x400]; +- u8 rx[0x400]; +- u8 res0[0x800]; +-} sir83xx_t; +- +-/* +-* ucc +-*/ +- +-typedef struct uslow { +- u32 gumr_l; /* UCCx general mode register (low) */ +- u32 gumr_h; /* UCCx general mode register (high) */ +- u16 upsmr; /* UCCx protocol-specific mode register */ +- u8 res0[0x2]; +- u16 utodr; /* UCCx transmit on demand register */ +- u16 udsr; /* UCCx data synchronization register */ +- u16 ucce; /* UCCx event register */ +- u8 res1[0x2]; +- u16 uccm; /* UCCx mask register */ +- u8 res2[0x1]; +- u8 uccs; /* UCCx status register */ +- u8 res3[0x1E8]; +-} uslow_t; +- +-typedef struct ufast { +- u32 gumr; /* UCCx general mode register */ +- u32 upsmr; /* UCCx protocol-specific mode register */ +- u16 utodr; /* UCCx transmit on demand register */ +- u8 res0[0x2]; +- u16 udsr; /* UCCx data synchronization register */ +- u8 res1[0x2]; +- u32 ucce; /* UCCx event register */ +- u32 uccm; /* UCCx mask register. */ +- u8 uccs; /* UCCx status register */ +- u8 res2[0x7]; +- u32 urfb; /* UCC receive FIFO base */ +- u16 urfs; /* UCC receive FIFO size */ +- u8 res3[0x2]; +- u16 urfet; /* UCC receive FIFO emergency threshold */ +- u16 urfset; /* UCC receive FIFO special emergency threshold */ +- u32 utfb; /* UCC transmit FIFO base */ +- u16 utfs; /* UCC transmit FIFO size */ +- u8 res4[0x2]; +- u16 utfet; /* UCC transmit FIFO emergency threshold */ +- u8 res5[0x2]; +- u16 utftt; /* UCC transmit FIFO transmit threshold */ +- u8 res6[0x2]; +- u16 utpt; /* UCC transmit polling timer */ +- u32 urtry; /* UCC retry counter register */ +- u8 res7[0x4C]; +- u8 guemr; /* UCC general extended mode register */ +- u8 res8[0x3]; +- u8 res9[0x6C]; +- u32 maccfg1; /* Mac configuration register #1 */ +- u32 maccfg2; /* Mac configuration register #2 */ +- u16 ipgifg; /* Interframe gap register */ +- u8 res10[0x2]; +- u32 hafdup; /* Half-duplex register */ +- u8 res11[0xC]; +- u32 emtr; /* Ethernet MAC test register */ +- u32 miimcfg; /* MII mgmt configuration register */ +- u32 miimcom; /* MII mgmt command register */ +- u32 miimadd; /* MII mgmt address register */ +- u32 miimcon; /* MII mgmt control register */ +- u32 miistat; /* MII mgmt status register */ +- u32 miimnd; /* MII mgmt indication register */ +- u32 ifctl; /* Interface control register */ +- u32 ifstat; /* Interface status register */ +- u32 macstnaddr1; /* Station address part 1 register */ +- u32 macstnaddr2; /* Station address part 2 register */ +- u8 res12[0x8]; +- u32 uempr; /* UCC Ethernet MAC parameter register */ +- u32 utbipa; /* UCC TBI address */ +- u16 uescr; /* UCC Ethernet statistics control register */ +- u8 res13[0x26]; +- u32 tx64; /* Transmit and receive 64-byte frame counter */ +- u32 tx127; /* Transmit and receive 65- to 127-byte frame counter */ +- u32 tx255; /* Transmit and receive 128- to 255-byte frame counter */ +- u32 rx64; /* Receive and receive 64-byte frame counter */ +- u32 rx127; /* Receive and receive 65- to 127-byte frame counter */ +- u32 rx255; /* Receive and receive 128- to 255-byte frame counter */ +- u32 txok; /* Transmit good bytes counter */ +- u32 txcf; /* Transmit control frame counter */ +- u32 tmca; /* Transmit multicast control frame counter */ +- u32 tbca; /* Transmit broadcast packet counter */ +- u32 rxfok; /* Receive frame OK counter */ +- u32 rbyt; /* Receive good and bad bytes counter */ +- u32 rxbok; /* Receive bytes OK counter */ +- u32 rmca; /* Receive multicast packet counter */ +- u32 rbca; /* Receive broadcast packet counter */ +- u32 scar; /* Statistics carry register */ +- u32 scam; /* Statistics carry mask register */ +- u8 res14[0x3C]; +-} ufast_t; +- +-typedef struct ucc83xx { +- union { +- uslow_t slow; +- ufast_t fast; +- }; +-} ucc83xx_t; +- +-/* +-* MultiPHY UTOPIA POS Controllers +-*/ +- +-typedef struct upc83xx { +- u32 upgcr; /* UTOPIA/POS general configuration register */ +-#define UPGCR_PROTOCOL 0x80000000 /* protocol ul2 or pl2 */ +-#define UPGCR_TMS 0x40000000 /* Transmit master/slave mode */ +-#define UPGCR_RMS 0x20000000 /* Receive master/slave mode */ +-#define UPGCR_ADDR 0x10000000 /* Master MPHY Addr multiplexing: */ +-#define UPGCR_DIAG 0x01000000 /* Diagnostic mode */ +- u32 uplpa; /* UTOPIA/POS last PHY address */ +- u32 uphec; /* ATM HEC register */ +- u32 upuc; /* UTOPIA/POS UCC configuration */ +- u32 updc1; /* UTOPIA/POS device 1 configuration */ +- u32 updc2; /* UTOPIA/POS device 2 configuration */ +- u32 updc3; /* UTOPIA/POS device 3 configuration */ +- u32 updc4; /* UTOPIA/POS device 4 configuration */ +- u32 upstpa; /* UTOPIA/POS STPA threshold */ +- u8 res0[0xC]; +- u32 updrs1_h; /* UTOPIA/POS device 1 rate select */ +- u32 updrs1_l; /* UTOPIA/POS device 1 rate select */ +- u32 updrs2_h; /* UTOPIA/POS device 2 rate select */ +- u32 updrs2_l; /* UTOPIA/POS device 2 rate select */ +- u32 updrs3_h; /* UTOPIA/POS device 3 rate select */ +- u32 updrs3_l; /* UTOPIA/POS device 3 rate select */ +- u32 updrs4_h; /* UTOPIA/POS device 4 rate select */ +- u32 updrs4_l; /* UTOPIA/POS device 4 rate select */ +- u32 updrp1; /* UTOPIA/POS device 1 receive priority low */ +- u32 updrp2; /* UTOPIA/POS device 2 receive priority low */ +- u32 updrp3; /* UTOPIA/POS device 3 receive priority low */ +- u32 updrp4; /* UTOPIA/POS device 4 receive priority low */ +- u32 upde1; /* UTOPIA/POS device 1 event */ +- u32 upde2; /* UTOPIA/POS device 2 event */ +- u32 upde3; /* UTOPIA/POS device 3 event */ +- u32 upde4; /* UTOPIA/POS device 4 event */ +- u16 uprp1; +- u16 uprp2; +- u16 uprp3; +- u16 uprp4; +- u8 res1[0x8]; +- u16 uptirr1_0; /* Device 1 transmit internal rate 0 */ +- u16 uptirr1_1; /* Device 1 transmit internal rate 1 */ +- u16 uptirr1_2; /* Device 1 transmit internal rate 2 */ +- u16 uptirr1_3; /* Device 1 transmit internal rate 3 */ +- u16 uptirr2_0; /* Device 2 transmit internal rate 0 */ +- u16 uptirr2_1; /* Device 2 transmit internal rate 1 */ +- u16 uptirr2_2; /* Device 2 transmit internal rate 2 */ +- u16 uptirr2_3; /* Device 2 transmit internal rate 3 */ +- u16 uptirr3_0; /* Device 3 transmit internal rate 0 */ +- u16 uptirr3_1; /* Device 3 transmit internal rate 1 */ +- u16 uptirr3_2; /* Device 3 transmit internal rate 2 */ +- u16 uptirr3_3; /* Device 3 transmit internal rate 3 */ +- u16 uptirr4_0; /* Device 4 transmit internal rate 0 */ +- u16 uptirr4_1; /* Device 4 transmit internal rate 1 */ +- u16 uptirr4_2; /* Device 4 transmit internal rate 2 */ +- u16 uptirr4_3; /* Device 4 transmit internal rate 3 */ +- u32 uper1; /* Device 1 port enable register */ +- u32 uper2; /* Device 2 port enable register */ +- u32 uper3; /* Device 3 port enable register */ +- u32 uper4; /* Device 4 port enable register */ +- u8 res2[0x150]; +-} upc83xx_t; +- +-/* +-* SDMA +-*/ +- +-typedef struct sdma83xx { +- u32 sdsr; /* Serial DMA status register */ +- u32 sdmr; /* Serial DMA mode register */ +- u32 sdtr1; /* SDMA system bus threshold register */ +- u32 sdtr2; /* SDMA secondary bus threshold register */ +- u32 sdhy1; /* SDMA system bus hysteresis register */ +- u32 sdhy2; /* SDMA secondary bus hysteresis register */ +- u32 sdta1; /* SDMA system bus address register */ +- u32 sdta2; /* SDMA secondary bus address register */ +- u32 sdtm1; /* SDMA system bus MSNUM register */ +- u32 sdtm2; /* SDMA secondary bus MSNUM register */ +- u8 res0[0x10]; +- u32 sdaqr; /* SDMA address bus qualify register */ +- u32 sdaqmr; /* SDMA address bus qualify mask register */ +- u8 res1[0x4]; +- u32 sdwbcr; /* SDMA CAM entries base register */ +- u8 res2[0x38]; +-} sdma83xx_t; +- +-/* +-* Debug Space +-*/ +- +-typedef struct dbg83xx { +- u32 bpdcr; /* Breakpoint debug command register */ +- u32 bpdsr; /* Breakpoint debug status register */ +- u32 bpdmr; /* Breakpoint debug mask register */ +- u32 bprmrr0; /* Breakpoint request mode risc register 0 */ +- u32 bprmrr1; /* Breakpoint request mode risc register 1 */ +- u8 res0[0x8]; +- u32 bprmtr0; /* Breakpoint request mode trb register 0 */ +- u32 bprmtr1; /* Breakpoint request mode trb register 1 */ +- u8 res1[0x8]; +- u32 bprmir; /* Breakpoint request mode immediate register */ +- u32 bprmsr; /* Breakpoint request mode serial register */ +- u32 bpemr; /* Breakpoint exit mode register */ +- u8 res2[0x48]; +-} dbg83xx_t; +- +-/* +-* RISC Special Registers (Trap and Breakpoint) +-*/ +- +-typedef struct rsp83xx { +- u8 fixme[0x100]; +-} rsp83xx_t; +-#endif ++#if defined(CONFIG_MPC8349) ++typedef struct immap { ++ sysconf83xx_t sysconf; /* System configuration */ ++ wdt83xx_t wdt; /* Watch Dog Timer (WDT) Registers */ ++ rtclk83xx_t rtc; /* Real Time Clock Module Registers */ ++ rtclk83xx_t pit; /* Periodic Interval Timer */ ++ gtm83xx_t gtm[2]; /* Global Timers Module */ ++ ipic83xx_t ipic; /* Integrated Programmable Interrupt Controller */ ++ arbiter83xx_t arbiter; /* System Arbiter Registers */ ++ reset83xx_t reset; /* Reset Module */ ++ clk83xx_t clk; /* System Clock Module */ ++ pmc83xx_t pmc; /* Power Management Control Module */ ++ gpio83xx_t gpio[2]; /* General purpose I/O module */ ++ u8 res0[0x200]; ++ u8 dll_ddr[0x100]; ++ u8 dll_lbc[0x100]; ++ u8 res1[0xE00]; ++ ddr83xx_t ddr; /* DDR Memory Controller Memory */ ++ fsl_i2c_t i2c[2]; /* I2C Controllers */ ++ u8 res2[0x1300]; ++ duart83xx_t duart[2]; /* DUART */ ++ u8 res3[0x900]; ++ lbus83xx_t lbus; /* Local Bus Controller Registers */ ++ u8 res4[0x1000]; ++ spi83xx_t spi; /* Serial Peripheral Interface */ ++ dma83xx_t dma; /* DMA */ ++ pciconf83xx_t pci_conf[2]; /* PCI Software Configuration Registers */ ++ ios83xx_t ios; /* Sequencer */ ++ pcictrl83xx_t pci_ctrl[2]; /* PCI Controller Control and Status Registers */ ++ u8 res5[0x19900]; ++ usb83xx_t usb; ++ tsec83xx_t tsec[2]; ++ u8 res6[0xA000]; ++ security83xx_t security; ++ u8 res7[0xC0000]; ++} immap_t; + ++#elif defined(CONFIG_MPC8360) + typedef struct immap { +- sysconf83xx_t sysconf; /* System configuration */ +- wdt83xx_t wdt; /* Watch Dog Timer (WDT) Registers */ +- rtclk83xx_t rtc; /* Real Time Clock Module Registers */ +- rtclk83xx_t pit; /* Periodic Interval Timer */ +- gtm83xx_t gtm[2]; /* Global Timers Module */ +- ipic83xx_t ipic; /* Integrated Programmable Interrupt Controller */ +- arbiter83xx_t arbiter; /* System Arbiter Registers */ +- reset83xx_t reset; /* Reset Module */ +- clk83xx_t clk; /* System Clock Module */ +- pmc83xx_t pmc; /* Power Management Control Module */ +-#if defined (CONFIG_MPC8349) +- gpio83xx_t pgio[2]; /* general purpose I/O module */ +-#elif defined (CONFIG_MPC8360) +- qepi83xx_t qepi; /* QE Ports Interrupts Registers */ +-#endif +- u8 res0[0x200]; +-#if defined (CONFIG_MPC8360) +- u8 DLL_LBDDR[0x100]; +-#endif +- u8 DDL_DDR[0x100]; +- u8 DDL_LBIU[0x100]; +-#if defined (CONFIG_MPC8349) +- u8 res1[0xE00]; +-#elif defined (CONFIG_MPC8360) +- u8 res1[0x200]; +- gpio83xx_t gpio; /* General purpose I/O module */ +- qesba83xx_t qesba; /* QE Secondary Bus Access Windows */ +-#endif +- ddr83xx_t ddr; /* DDR Memory Controller Memory */ +- fsl_i2c_t i2c[2]; /* I2C Controllers */ +- u8 res2[0x1300]; +- duart83xx_t duart[2]; /* DUART */ +-#if defined (CONFIG_MPC8349) +- u8 res3[0x900]; +- lbus83xx_t lbus; /* Local Bus Controller Registers */ +- u8 res4[0x1000]; +- spi83xx_t spi; /* Serial Peripheral Interface */ +- u8 res5[0xF00]; +-#elif defined (CONFIG_MPC8360) +- u8 res3[0x900]; +- lbus83xx_t lbus; /* Local Bus Controller */ +- u8 res4[0x2000]; +-#endif +- dma83xx_t dma; /* DMA */ +-#if defined (CONFIG_MPC8349) +- pciconf83xx_t pci_conf[2]; /* PCI Software Configuration Registers */ +- ios83xx_t ios; /* Sequencer */ +- pcictrl83xx_t pci_ctrl[2]; /* PCI Controller Control and Status Registers */ +- u8 res6[0x19900]; +- usb83xx_t usb; +- tsec83xx_t tsec[2]; +- u8 res7[0xA000]; +- security83xx_t security; +-#elif defined (CONFIG_MPC8360) +- pciconf83xx_t pci_conf[1]; /* PCI Software Configuration Registers */ +- u8 res_5[128]; +- ios83xx_t ios; /* Sequencer (IOS) */ +- pcictrl83xx_t pci_ctrl[1]; /* PCI Controller Control and Status Registers */ +- u8 res6[0x4A00]; +- ddr83xx_t ddr_secondary; /* Secondary DDR Memory Controller Memory Map */ +- u8 res7[0x22000]; +- security83xx_t security; +- u8 res8[0xC0000]; +- iram83xx_t iram; /* IRAM */ +- irq83xx_t irq; /* Interrupt Controller */ +- cp83xx_t cp; /* Communications Processor */ +- qmx83xx_t qmx; /* QE Multiplexer */ +- qet83xx_t qet; /* QE Timers */ +- spi83xx_t spi[0x2]; /* spi */ +- mcc83xx_t mcc; /* mcc */ +- brg83xx_t brg; /* brg */ +- usb83xx_t usb; /* USB */ +- si1_83xx_t si1; /* SI */ +- u8 res9[0x800]; +- sir83xx_t sir; /* SI Routing Tables */ +- ucc83xx_t ucc1; /* ucc1 */ +- ucc83xx_t ucc3; /* ucc3 */ +- ucc83xx_t ucc5; /* ucc5 */ +- ucc83xx_t ucc7; /* ucc7 */ +- u8 res10[0x600]; +- upc83xx_t upc1; /* MultiPHY UTOPIA POS Controller 1 */ +- ucc83xx_t ucc2; /* ucc2 */ +- ucc83xx_t ucc4; /* ucc4 */ +- ucc83xx_t ucc6; /* ucc6 */ +- ucc83xx_t ucc8; /* ucc8 */ +- u8 res11[0x600]; +- upc83xx_t upc2; /* MultiPHY UTOPIA POS Controller 2 */ +- sdma83xx_t sdma; /* SDMA */ +- dbg83xx_t dbg; /* Debug Space */ +- rsp83xx_t rsp[0x2]; /* RISC Special Registers (Trap and Breakpoint) */ +- u8 res12[0x300]; +- u8 res13[0x3A00]; +- u8 res14[0x8000]; /* 0x108000 - 0x110000 */ +- u8 res15[0xC000]; /* 0x110000 - 0x11C000 Multi-user RAM */ +- u8 res16[0x24000]; /* 0x11C000 - 0x140000 */ +- u8 res17[0xC0000]; /* 0x140000 - 0x200000 */ +-#endif ++ sysconf83xx_t sysconf; /* System configuration */ ++ wdt83xx_t wdt; /* Watch Dog Timer (WDT) Registers */ ++ rtclk83xx_t rtc; /* Real Time Clock Module Registers */ ++ rtclk83xx_t pit; /* Periodic Interval Timer */ ++ u8 res0[0x200]; ++ ipic83xx_t ipic; /* Integrated Programmable Interrupt Controller */ ++ arbiter83xx_t arbiter; /* System Arbiter Registers */ ++ reset83xx_t reset; /* Reset Module */ ++ clk83xx_t clk; /* System Clock Module */ ++ pmc83xx_t pmc; /* Power Management Control Module */ ++ qepi83xx_t qepi; /* QE Ports Interrupts Registers */ ++ u8 res1[0x300]; ++ u8 dll_ddr[0x100]; ++ u8 dll_lbc[0x100]; ++ u8 res2[0x200]; ++ qepio83xx_t qepio; /* QE Parallel I/O ports */ ++ qesba83xx_t qesba; /* QE Secondary Bus Access Windows */ ++ u8 res3[0x400]; ++ ddr83xx_t ddr; /* DDR Memory Controller Memory */ ++ fsl_i2c_t i2c[2]; /* I2C Controllers */ ++ u8 res4[0x1300]; ++ duart83xx_t duart[2]; /* DUART */ ++ u8 res5[0x900]; ++ lbus83xx_t lbus; /* Local Bus Controller Registers */ ++ u8 res6[0x2000]; ++ dma83xx_t dma; /* DMA */ ++ pciconf83xx_t pci_conf[1]; /* PCI Software Configuration Registers */ ++ u8 res7[128]; ++ ios83xx_t ios; /* Sequencer (IOS) */ ++ pcictrl83xx_t pci_ctrl[1]; /* PCI Controller Control and Status Registers */ ++ u8 res8[0x4A00]; ++ ddr83xx_t ddr_secondary; /* Secondary DDR Memory Controller Memory Map */ ++ u8 res9[0x22000]; ++ security83xx_t security; ++ u8 res10[0xC0000]; ++ u8 qe[0x100000]; /* QE block */ + } immap_t; ++#endif + + #endif /* __IMMAP_83xx__ */ +diff --git a/include/mpc83xx.h b/include/mpc83xx.h +index 03dd0ca..504b6a9 100644 +--- a/include/mpc83xx.h ++++ b/include/mpc83xx.h +@@ -10,12 +10,6 @@ + * the License, or (at your option) any later version. + */ + +-/* +- * mpc83xx.h +- * +- * MPC83xx specific definitions +- */ +- + #ifndef __MPC83XX_H__ + #define __MPC83XX_H__ + +@@ -24,406 +18,941 @@ + #include <asm/e300.h> + #endif + +-/* +- * MPC83xx cpu provide RCR register to do reset thing specially. easier +- * to implement ++/* MPC83xx cpu provide RCR register to do reset thing specially + */ +- + #define MPC83xx_RESET + +-/* +- * System reset offset (PowerPC standard) ++/* System reset offset (PowerPC standard) + */ +-#define EXC_OFF_SYS_RESET 0x0100 ++#define EXC_OFF_SYS_RESET 0x0100 + +-/* +- * Default Internal Memory Register Space (Freescale recomandation) ++/* IMMRBAR - Internal Memory Register Base Address + */ +-#define CONFIG_DEFAULT_IMMR 0xFF400000 ++#define CONFIG_DEFAULT_IMMR 0xFF400000 /* Default IMMR base address */ ++#define IMMRBAR 0x0000 /* Register offset to immr */ ++#define IMMRBAR_BASE_ADDR 0xFFF00000 /* Base address mask */ ++#define IMMRBAR_RES ~(IMMRBAR_BASE_ADDR) + +-/* +- * Watchdog ++/* LAWBAR - Local Access Window Base Address Register + */ +-#define SWCRR 0x0204 +-#define SWCRR_SWTC 0xFFFF0000 /* Software Watchdog Time Count. */ +-#define SWCRR_SWEN 0x00000004 /* Watchdog Enable bit. */ +-#define SWCRR_SWRI 0x00000002 /* Software Watchdog Reset/Interrupt Select bit. */ +-#define SWCRR_SWPR 0x00000001 /* Software Watchdog Counter Prescale bit. */ +-#define SWCRR_RES ~(SWCRR_SWTC | SWCRR_SWEN | SWCRR_SWRI | SWCRR_SWPR) ++#define LBLAWBAR0 0x0020 /* Register offset to immr */ ++#define LBLAWAR0 0x0024 ++#define LBLAWBAR1 0x0028 ++#define LBLAWAR1 0x002C ++#define LBLAWBAR2 0x0030 ++#define LBLAWAR2 0x0034 ++#define LBLAWBAR3 0x0038 ++#define LBLAWAR3 0x003C ++#define LAWBAR_BAR 0xFFFFF000 /* Base address mask */ ++ ++/* SPRIDR - System Part and Revision ID Register ++ */ ++#define SPRIDR_PARTID 0xFFFF0000 /* Part Identification */ ++#define SPRIDR_REVID 0x0000FFFF /* Revision Identification */ ++ ++#define SPR_8349E_REV10 0x80300100 ++#define SPR_8349_REV10 0x80310100 ++#define SPR_8347E_REV10_TBGA 0x80320100 ++#define SPR_8347_REV10_TBGA 0x80330100 ++#define SPR_8347E_REV10_PBGA 0x80340100 ++#define SPR_8347_REV10_PBGA 0x80350100 ++#define SPR_8343E_REV10 0x80360100 ++#define SPR_8343_REV10 0x80370100 ++ ++#define SPR_8349E_REV11 0x80300101 ++#define SPR_8349_REV11 0x80310101 ++#define SPR_8347E_REV11_TBGA 0x80320101 ++#define SPR_8347_REV11_TBGA 0x80330101 ++#define SPR_8347E_REV11_PBGA 0x80340101 ++#define SPR_8347_REV11_PBGA 0x80350101 ++#define SPR_8343E_REV11 0x80360101 ++#define SPR_8343_REV11 0x80370101 ++ ++#define SPR_8360E_REV10 0x80480010 ++#define SPR_8360_REV10 0x80490010 ++#define SPR_8360E_REV11 0x80480011 ++#define SPR_8360_REV11 0x80490011 ++#define SPR_8360E_REV12 0x80480012 ++#define SPR_8360_REV12 0x80490012 ++ ++/* SPCR - System Priority Configuration Register ++ */ ++#define SPCR_PCIHPE 0x10000000 /* PCI Highest Priority Enable */ ++#define SPCR_PCIHPE_SHIFT (31-3) ++#define SPCR_PCIPR 0x03000000 /* PCI bridge system bus request priority */ ++#define SPCR_PCIPR_SHIFT (31-7) ++#define SPCR_OPT 0x00800000 /* Optimize */ ++#define SPCR_TBEN 0x00400000 /* E300 PowerPC core time base unit enable */ ++#define SPCR_TBEN_SHIFT (31-9) ++#define SPCR_COREPR 0x00300000 /* E300 PowerPC Core system bus request priority */ ++#define SPCR_COREPR_SHIFT (31-11) ++ ++#if defined(CONFIG_MPC8349) ++/* SPCR bits - MPC8349 specific */ ++#define SPCR_TSEC1DP 0x00003000 /* TSEC1 data priority */ ++#define SPCR_TSEC1DP_SHIFT (31-19) ++#define SPCR_TSEC1BDP 0x00000C00 /* TSEC1 buffer descriptor priority */ ++#define SPCR_TSEC1BDP_SHIFT (31-21) ++#define SPCR_TSEC1EP 0x00000300 /* TSEC1 emergency priority */ ++#define SPCR_TSEC1EP_SHIFT (31-23) ++#define SPCR_TSEC2DP 0x00000030 /* TSEC2 data priority */ ++#define SPCR_TSEC2DP_SHIFT (31-27) ++#define SPCR_TSEC2BDP 0x0000000C /* TSEC2 buffer descriptor priority */ ++#define SPCR_TSEC2BDP_SHIFT (31-29) ++#define SPCR_TSEC2EP 0x00000003 /* TSEC2 emergency priority */ ++#define SPCR_TSEC2EP_SHIFT (31-31) ++#endif + +-#define SWCNR 0x0208 +-#define SWCNR_SWCN 0x0000FFFF Software Watchdog Count Field. +-#define SWCNR_RES ~(SWCNR_SWCN) ++/* SICRL/H - System I/O Configuration Register Low/High ++ */ ++#if defined(CONFIG_MPC8349) ++/* SICRL bits - MPC8349 specific */ ++#define SICRL_LDP_A 0x80000000 ++#define SICRL_USB1 0x40000000 ++#define SICRL_USB0 0x20000000 ++#define SICRL_UART 0x0C000000 ++#define SICRL_GPIO1_A 0x02000000 ++#define SICRL_GPIO1_B 0x01000000 ++#define SICRL_GPIO1_C 0x00800000 ++#define SICRL_GPIO1_D 0x00400000 ++#define SICRL_GPIO1_E 0x00200000 ++#define SICRL_GPIO1_F 0x00180000 ++#define SICRL_GPIO1_G 0x00040000 ++#define SICRL_GPIO1_H 0x00020000 ++#define SICRL_GPIO1_I 0x00010000 ++#define SICRL_GPIO1_J 0x00008000 ++#define SICRL_GPIO1_K 0x00004000 ++#define SICRL_GPIO1_L 0x00003000 ++ ++/* SICRH bits - MPC8349 specific */ ++#define SICRH_DDR 0x80000000 ++#define SICRH_TSEC1_A 0x10000000 ++#define SICRH_TSEC1_B 0x08000000 ++#define SICRH_TSEC1_C 0x04000000 ++#define SICRH_TSEC1_D 0x02000000 ++#define SICRH_TSEC1_E 0x01000000 ++#define SICRH_TSEC1_F 0x00800000 ++#define SICRH_TSEC2_A 0x00400000 ++#define SICRH_TSEC2_B 0x00200000 ++#define SICRH_TSEC2_C 0x00100000 ++#define SICRH_TSEC2_D 0x00080000 ++#define SICRH_TSEC2_E 0x00040000 ++#define SICRH_TSEC2_F 0x00020000 ++#define SICRH_TSEC2_G 0x00010000 ++#define SICRH_TSEC2_H 0x00008000 ++#define SICRH_GPIO2_A 0x00004000 ++#define SICRH_GPIO2_B 0x00002000 ++#define SICRH_GPIO2_C 0x00001000 ++#define SICRH_GPIO2_D 0x00000800 ++#define SICRH_GPIO2_E 0x00000400 ++#define SICRH_GPIO2_F 0x00000200 ++#define SICRH_GPIO2_G 0x00000180 ++#define SICRH_GPIO2_H 0x00000060 ++#define SICRH_TSOBI1 0x00000002 ++#define SICRH_TSOBI2 0x00000001 ++ ++#elif defined(CONFIG_MPC8360) ++/* SICRL bits - MPC8360 specific */ ++#define SICRL_LDP_A 0xC0000000 ++#define SICRL_LCLK_1 0x10000000 ++#define SICRL_LCLK_2 0x08000000 ++#define SICRL_SRCID_A 0x03000000 ++#define SICRL_IRQ_CKSTP_A 0x00C00000 ++ ++/* SICRH bits - MPC8360 specific */ ++#define SICRH_DDR 0x80000000 ++#define SICRH_SECONDARY_DDR 0x40000000 ++#define SICRH_SDDROE 0x20000000 ++#define SICRH_IRQ3 0x10000000 ++#define SICRH_UC1EOBI 0x00000004 ++#define SICRH_UC2E1OBI 0x00000002 ++#define SICRH_UC2E2OBI 0x00000001 ++#endif + +-#define SWSRR 0x020E ++/* SWCRR - System Watchdog Control Register ++ */ ++#define SWCRR 0x0204 /* Register offset to immr */ ++#define SWCRR_SWTC 0xFFFF0000 /* Software Watchdog Time Count */ ++#define SWCRR_SWEN 0x00000004 /* Watchdog Enable bit */ ++#define SWCRR_SWRI 0x00000002 /* Software Watchdog Reset/Interrupt Select bit */ ++#define SWCRR_SWPR 0x00000001 /* Software Watchdog Counter Prescale bit */ ++#define SWCRR_RES ~(SWCRR_SWTC | SWCRR_SWEN | SWCRR_SWRI | SWCRR_SWPR) ++ ++/* SWCNR - System Watchdog Counter Register ++ */ ++#define SWCNR 0x0208 /* Register offset to immr */ ++#define SWCNR_SWCN 0x0000FFFF /* Software Watchdog Count mask */ ++#define SWCNR_RES ~(SWCNR_SWCN) + +-/* +- * Default Internal Memory Register Space (Freescale recomandation) ++/* SWSRR - System Watchdog Service Register + */ +-#define IMMRBAR 0x0000 +-#define IMMRBAR_BASE_ADDR 0xFFF00000 /* Identifies the 12 most-significant address bits of the base of the 1 MByte internal memory window. */ +-#define IMMRBAR_RES ~(IMMRBAR_BASE_ADDR) ++#define SWSRR 0x020E /* Register offset to immr */ + +-/* +- * Default Internal Memory Register Space (Freescale recomandation) ++/* ACR - Arbiter Configuration Register + */ +-#define LBLAWBAR0 0x0020 +-#define LBLAWAR0 0x0024 +-#define LBLAWBAR1 0x0028 +-#define LBLAWAR1 0x002C +-#define LBLAWBAR2 0x0030 +-#define LBLAWAR2 0x0034 +-#define LBLAWBAR3 0x0038 +-#define LBLAWAR3 0x003C ++#define ACR_COREDIS 0x10000000 /* Core disable */ ++#define ACR_COREDIS_SHIFT (31-7) ++#define ACR_PIPE_DEP 0x00070000 /* Pipeline depth */ ++#define ACR_PIPE_DEP_SHIFT (31-15) ++#define ACR_PCI_RPTCNT 0x00007000 /* PCI repeat count */ ++#define ACR_PCI_RPTCNT_SHIFT (31-19) ++#define ACR_RPTCNT 0x00000700 /* Repeat count */ ++#define ACR_RPTCNT_SHIFT (31-23) ++#define ACR_APARK 0x00000030 /* Address parking */ ++#define ACR_APARK_SHIFT (31-27) ++#define ACR_PARKM 0x0000000F /* Parking master */ ++#define ACR_PARKM_SHIFT (31-31) ++ ++/* ATR - Arbiter Timers Register ++ */ ++#define ATR_DTO 0x00FF0000 /* Data time out */ ++#define ATR_ATO 0x000000FF /* Address time out */ + +-/* +- * The device ID and revision numbers +- */ +-#define SPR_8349E_REV10 0x80300100 +-#define SPR_8349_REV10 0x80310100 +-#define SPR_8347E_REV10_TBGA 0x80320100 +-#define SPR_8347_REV10_TBGA 0x80330100 +-#define SPR_8347E_REV10_PBGA 0x80340100 +-#define SPR_8347_REV10_PBGA 0x80350100 +-#define SPR_8343E_REV10 0x80360100 +-#define SPR_8343_REV10 0x80370100 +- +-#define SPR_8349E_REV11 0x80300101 +-#define SPR_8349_REV11 0x80310101 +-#define SPR_8347E_REV11_TBGA 0x80320101 +-#define SPR_8347_REV11_TBGA 0x80330101 +-#define SPR_8347E_REV11_PBGA 0x80340101 +-#define SPR_8347_REV11_PBGA 0x80350101 +-#define SPR_8343E_REV11 0x80360101 +-#define SPR_8343_REV11 0x80370101 +- +-#define SPR_8360E_REV10 0x80480010 +-#define SPR_8360_REV10 0x80490010 +-#define SPR_8360E_REV11 0x80480011 +-#define SPR_8360_REV11 0x80490011 +-#define SPR_8360E_REV12 0x80480012 +-#define SPR_8360_REV12 0x80490012 ++/* AER - Arbiter Event Register ++ */ ++#define AER_ETEA 0x00000020 /* Transfer error */ ++#define AER_RES 0x00000010 /* Reserved transfer type */ ++#define AER_ECW 0x00000008 /* External control word transfer type */ ++#define AER_AO 0x00000004 /* Address Only transfer type */ ++#define AER_DTO 0x00000002 /* Data time out */ ++#define AER_ATO 0x00000001 /* Address time out */ ++ ++/* AEATR - Arbiter Event Address Register ++ */ ++#define AEATR_EVENT 0x07000000 /* Event type */ ++#define AEATR_MSTR_ID 0x001F0000 /* Master Id */ ++#define AEATR_TBST 0x00000800 /* Transfer burst */ ++#define AEATR_TSIZE 0x00000700 /* Transfer Size */ ++#define AEATR_TTYPE 0x0000001F /* Transfer Type */ + +-/* +- * Base Registers & Option Registers +- */ +-#define BR0 0x5000 +-#define BR1 0x5008 +-#define BR2 0x5010 +-#define BR3 0x5018 +-#define BR4 0x5020 +-#define BR5 0x5028 +-#define BR6 0x5030 +-#define BR7 0x5038 +- +-#define BR_BA 0xFFFF8000 +-#define BR_BA_SHIFT 15 +-#define BR_PS 0x00001800 +-#define BR_PS_SHIFT 11 +-#define BR_PS_8 0x00000800 /* Port Size 8 bit */ +-#define BR_PS_16 0x00001000 /* Port Size 16 bit */ +-#define BR_PS_32 0x00001800 /* Port Size 32 bit */ +-#define BR_DECC 0x00000600 +-#define BR_DECC_SHIFT 9 +-#define BR_WP 0x00000100 +-#define BR_WP_SHIFT 8 +-#define BR_MSEL 0x000000E0 +-#define BR_MSEL_SHIFT 5 +-#define BR_MS_GPCM 0x00000000 /* GPCM */ +-#define BR_MS_SDRAM 0x00000060 /* SDRAM */ +-#define BR_MS_UPMA 0x00000080 /* UPMA */ +-#define BR_MS_UPMB 0x000000A0 /* UPMB */ +-#define BR_MS_UPMC 0x000000C0 /* UPMC */ +-#if defined (CONFIG_MPC8360) +-#define BR_ATOM 0x0000000C +-#define BR_ATOM_SHIFT 2 +-#endif +-#define BR_V 0x00000001 +-#define BR_V_SHIFT 0 +-#if defined (CONFIG_MPC8349) +-#define BR_RES ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_V) +-#elif defined (CONFIG_MPC8360) +-#define BR_RES ~(BR_BA|BR_PS|BR_DECC|BR_WP|BR_MSEL|BR_ATOM|BR_V) ++/* HRCWL - Hard Reset Configuration Word Low ++ */ ++#define HRCWL_LBIUCM 0x80000000 ++#define HRCWL_LBIUCM_SHIFT 31 ++#define HRCWL_LCL_BUS_TO_SCB_CLK_1X1 0x00000000 ++#define HRCWL_LCL_BUS_TO_SCB_CLK_2X1 0x80000000 ++ ++#define HRCWL_DDRCM 0x40000000 ++#define HRCWL_DDRCM_SHIFT 30 ++#define HRCWL_DDR_TO_SCB_CLK_1X1 0x00000000 ++#define HRCWL_DDR_TO_SCB_CLK_2X1 0x40000000 ++ ++#define HRCWL_SPMF 0x0f000000 ++#define HRCWL_SPMF_SHIFT 24 ++#define HRCWL_CSB_TO_CLKIN_16X1 0x00000000 ++#define HRCWL_CSB_TO_CLKIN_1X1 0x01000000 ++#define HRCWL_CSB_TO_CLKIN_2X1 0x02000000 ++#define HRCWL_CSB_TO_CLKIN_3X1 0x03000000 ++#define HRCWL_CSB_TO_CLKIN_4X1 0x04000000 ++#define HRCWL_CSB_TO_CLKIN_5X1 0x05000000 ++#define HRCWL_CSB_TO_CLKIN_6X1 0x06000000 ++#define HRCWL_CSB_TO_CLKIN_7X1 0x07000000 ++#define HRCWL_CSB_TO_CLKIN_8X1 0x08000000 ++#define HRCWL_CSB_TO_CLKIN_9X1 0x09000000 ++#define HRCWL_CSB_TO_CLKIN_10X1 0x0A000000 ++#define HRCWL_CSB_TO_CLKIN_11X1 0x0B000000 ++#define HRCWL_CSB_TO_CLKIN_12X1 0x0C000000 ++#define HRCWL_CSB_TO_CLKIN_13X1 0x0D000000 ++#define HRCWL_CSB_TO_CLKIN_14X1 0x0E000000 ++#define HRCWL_CSB_TO_CLKIN_15X1 0x0F000000 ++ ++#define HRCWL_VCO_BYPASS 0x00000000 ++#define HRCWL_VCO_1X2 0x00000000 ++#define HRCWL_VCO_1X4 0x00200000 ++#define HRCWL_VCO_1X8 0x00400000 ++ ++#define HRCWL_COREPLL 0x007F0000 ++#define HRCWL_COREPLL_SHIFT 16 ++#define HRCWL_CORE_TO_CSB_BYPASS 0x00000000 ++#define HRCWL_CORE_TO_CSB_1X1 0x00020000 ++#define HRCWL_CORE_TO_CSB_1_5X1 0x00030000 ++#define HRCWL_CORE_TO_CSB_2X1 0x00040000 ++#define HRCWL_CORE_TO_CSB_2_5X1 0x00050000 ++#define HRCWL_CORE_TO_CSB_3X1 0x00060000 ++ ++#if defined(CONFIG_MPC8360) ++#define HRCWL_CEVCOD 0x000000C0 ++#define HRCWL_CEVCOD_SHIFT 6 ++#define HRCWL_CE_PLL_VCO_DIV_4 0x00000000 ++#define HRCWL_CE_PLL_VCO_DIV_8 0x00000040 ++#define HRCWL_CE_PLL_VCO_DIV_2 0x00000080 ++ ++#define HRCWL_CEPDF 0x00000020 ++#define HRCWL_CEPDF_SHIFT 5 ++#define HRCWL_CE_PLL_DIV_1X1 0x00000000 ++#define HRCWL_CE_PLL_DIV_2X1 0x00000020 ++ ++#define HRCWL_CEPMF 0x0000001F ++#define HRCWL_CEPMF_SHIFT 0 ++#define HRCWL_CE_TO_PLL_1X16_ 0x00000000 ++#define HRCWL_CE_TO_PLL_1X2 0x00000002 ++#define HRCWL_CE_TO_PLL_1X3 0x00000003 ++#define HRCWL_CE_TO_PLL_1X4 0x00000004 ++#define HRCWL_CE_TO_PLL_1X5 0x00000005 ++#define HRCWL_CE_TO_PLL_1X6 0x00000006 ++#define HRCWL_CE_TO_PLL_1X7 0x00000007 ++#define HRCWL_CE_TO_PLL_1X8 0x00000008 ++#define HRCWL_CE_TO_PLL_1X9 0x00000009 ++#define HRCWL_CE_TO_PLL_1X10 0x0000000A ++#define HRCWL_CE_TO_PLL_1X11 0x0000000B ++#define HRCWL_CE_TO_PLL_1X12 0x0000000C ++#define HRCWL_CE_TO_PLL_1X13 0x0000000D ++#define HRCWL_CE_TO_PLL_1X14 0x0000000E ++#define HRCWL_CE_TO_PLL_1X15 0x0000000F ++#define HRCWL_CE_TO_PLL_1X16 0x00000010 ++#define HRCWL_CE_TO_PLL_1X17 0x00000011 ++#define HRCWL_CE_TO_PLL_1X18 0x00000012 ++#define HRCWL_CE_TO_PLL_1X19 0x00000013 ++#define HRCWL_CE_TO_PLL_1X20 0x00000014 ++#define HRCWL_CE_TO_PLL_1X21 0x00000015 ++#define HRCWL_CE_TO_PLL_1X22 0x00000016 ++#define HRCWL_CE_TO_PLL_1X23 0x00000017 ++#define HRCWL_CE_TO_PLL_1X24 0x00000018 ++#define HRCWL_CE_TO_PLL_1X25 0x00000019 ++#define HRCWL_CE_TO_PLL_1X26 0x0000001A ++#define HRCWL_CE_TO_PLL_1X27 0x0000001B ++#define HRCWL_CE_TO_PLL_1X28 0x0000001C ++#define HRCWL_CE_TO_PLL_1X29 0x0000001D ++#define HRCWL_CE_TO_PLL_1X30 0x0000001E ++#define HRCWL_CE_TO_PLL_1X31 0x0000001F + #endif + +-#define OR0 0x5004 +-#define OR1 0x500C +-#define OR2 0x5014 +-#define OR3 0x501C +-#define OR4 0x5024 +-#define OR5 0x502C +-#define OR6 0x5034 +-#define OR7 0x503C +- +-#define OR_GPCM_AM 0xFFFF8000 +-#define OR_GPCM_AM_SHIFT 15 +-#define OR_GPCM_BCTLD 0x00001000 +-#define OR_GPCM_BCTLD_SHIFT 12 +-#define OR_GPCM_CSNT 0x00000800 +-#define OR_GPCM_CSNT_SHIFT 11 +-#define OR_GPCM_ACS 0x00000600 +-#define OR_GPCM_ACS_SHIFT 9 +-#define OR_GPCM_ACS_0b10 0x00000400 +-#define OR_GPCM_ACS_0b11 0x00000600 +-#define OR_GPCM_XACS 0x00000100 +-#define OR_GPCM_XACS_SHIFT 8 +-#define OR_GPCM_SCY 0x000000F0 +-#define OR_GPCM_SCY_SHIFT 4 +-#define OR_GPCM_SCY_1 0x00000010 +-#define OR_GPCM_SCY_2 0x00000020 +-#define OR_GPCM_SCY_3 0x00000030 +-#define OR_GPCM_SCY_4 0x00000040 +-#define OR_GPCM_SCY_5 0x00000050 +-#define OR_GPCM_SCY_6 0x00000060 +-#define OR_GPCM_SCY_7 0x00000070 +-#define OR_GPCM_SCY_8 0x00000080 +-#define OR_GPCM_SCY_9 0x00000090 +-#define OR_GPCM_SCY_10 0x000000a0 +-#define OR_GPCM_SCY_11 0x000000b0 +-#define OR_GPCM_SCY_12 0x000000c0 +-#define OR_GPCM_SCY_13 0x000000d0 +-#define OR_GPCM_SCY_14 0x000000e0 +-#define OR_GPCM_SCY_15 0x000000f0 +-#define OR_GPCM_SETA 0x00000008 +-#define OR_GPCM_SETA_SHIFT 3 +-#define OR_GPCM_TRLX 0x00000004 +-#define OR_GPCM_TRLX_SHIFT 2 +-#define OR_GPCM_EHTR 0x00000002 +-#define OR_GPCM_EHTR_SHIFT 1 +-#define OR_GPCM_EAD 0x00000001 +-#define OR_GPCM_EAD_SHIFT 0 +- +-#define OR_UPM_AM 0xFFFF8000 +-#define OR_UPM_AM_SHIFT 15 +-#define OR_UPM_XAM 0x00006000 +-#define OR_UPM_XAM_SHIFT 13 +-#define OR_UPM_BCTLD 0x00001000 +-#define OR_UPM_BCTLD_SHIFT 12 +-#define OR_UPM_BI 0x00000100 +-#define OR_UPM_BI_SHIFT 8 +-#define OR_UPM_TRLX 0x00000004 +-#define OR_UPM_TRLX_SHIFT 2 +-#define OR_UPM_EHTR 0x00000002 +-#define OR_UPM_EHTR_SHIFT 1 +-#define OR_UPM_EAD 0x00000001 +-#define OR_UPM_EAD_SHIFT 0 +- +-#define OR_SDRAM_AM 0xFFFF8000 +-#define OR_SDRAM_AM_SHIFT 15 +-#define OR_SDRAM_XAM 0x00006000 +-#define OR_SDRAM_XAM_SHIFT 13 +-#define OR_SDRAM_COLS 0x00001C00 +-#define OR_SDRAM_COLS_SHIFT 10 +-#define OR_SDRAM_ROWS 0x000001C0 +-#define OR_SDRAM_ROWS_SHIFT 6 +-#define OR_SDRAM_PMSEL 0x00000020 +-#define OR_SDRAM_PMSEL_SHIFT 5 +-#define OR_SDRAM_EAD 0x00000001 +-#define OR_SDRAM_EAD_SHIFT 0 +- +-/* +- * Hard Reset Configration Word - High ++/* HRCWH - Hardware Reset Configuration Word High + */ +-#define HRCWH_PCI_AGENT 0x00000000 +-#define HRCWH_PCI_HOST 0x80000000 ++#define HRCWH_PCI_HOST 0x80000000 ++#define HRCWH_PCI_HOST_SHIFT 31 ++#define HRCWH_PCI_AGENT 0x00000000 + +-#if defined (CONFIG_MPC8349) +-#define HRCWH_32_BIT_PCI 0x00000000 +-#define HRCWH_64_BIT_PCI 0x40000000 ++#if defined(CONFIG_MPC8349) ++#define HRCWH_32_BIT_PCI 0x00000000 ++#define HRCWH_64_BIT_PCI 0x40000000 + #endif + +-#define HRCWH_PCI1_ARBITER_DISABLE 0x00000000 +-#define HRCWH_PCI1_ARBITER_ENABLE 0x20000000 ++#define HRCWH_PCI1_ARBITER_DISABLE 0x00000000 ++#define HRCWH_PCI1_ARBITER_ENABLE 0x20000000 ++ ++#define HRCWH_PCI_ARBITER_DISABLE 0x00000000 ++#define HRCWH_PCI_ARBITER_ENABLE 0x20000000 + +-#if defined (CONFIG_MPC8349) +-#define HRCWH_PCI2_ARBITER_DISABLE 0x00000000 +-#define HRCWH_PCI2_ARBITER_ENABLE 0x10000000 +-#elif defined (CONFIG_MPC8360) +-#define HRCWH_PCICKDRV_DISABLE 0x00000000 +-#define HRCWH_PCICKDRV_ENABLE 0x10000000 ++#if defined(CONFIG_MPC8349) ++#define HRCWH_PCI2_ARBITER_DISABLE 0x00000000 ++#define HRCWH_PCI2_ARBITER_ENABLE 0x10000000 ++ ++#elif defined(CONFIG_MPC8360) ++#define HRCWH_PCICKDRV_DISABLE 0x00000000 ++#define HRCWH_PCICKDRV_ENABLE 0x10000000 + #endif + +-#define HRCWH_CORE_DISABLE 0x08000000 +-#define HRCWH_CORE_ENABLE 0x00000000 ++#define HRCWH_CORE_DISABLE 0x08000000 ++#define HRCWH_CORE_ENABLE 0x00000000 + +-#define HRCWH_FROM_0X00000100 0x00000000 +-#define HRCWH_FROM_0XFFF00100 0x04000000 ++#define HRCWH_FROM_0X00000100 0x00000000 ++#define HRCWH_FROM_0XFFF00100 0x04000000 + +-#define HRCWH_BOOTSEQ_DISABLE 0x00000000 +-#define HRCWH_BOOTSEQ_NORMAL 0x01000000 +-#define HRCWH_BOOTSEQ_EXTENDED 0x02000000 ++#define HRCWH_BOOTSEQ_DISABLE 0x00000000 ++#define HRCWH_BOOTSEQ_NORMAL 0x01000000 ++#define HRCWH_BOOTSEQ_EXTENDED 0x02000000 + +-#define HRCWH_SW_WATCHDOG_DISABLE 0x00000000 +-#define HRCWH_SW_WATCHDOG_ENABLE 0x00800000 ++#define HRCWH_SW_WATCHDOG_DISABLE 0x00000000 ++#define HRCWH_SW_WATCHDOG_ENABLE 0x00800000 + +-#define HRCWH_ROM_LOC_DDR_SDRAM 0x00000000 +-#define HRCWH_ROM_LOC_PCI1 0x00100000 +-#if defined (CONFIG_MPC8349) +-#define HRCWH_ROM_LOC_PCI2 0x00200000 ++#define HRCWH_ROM_LOC_DDR_SDRAM 0x00000000 ++#define HRCWH_ROM_LOC_PCI1 0x00100000 ++#if defined(CONFIG_MPC8349) ++#define HRCWH_ROM_LOC_PCI2 0x00200000 + #endif +-#define HRCWH_ROM_LOC_LOCAL_8BIT 0x00500000 +-#define HRCWH_ROM_LOC_LOCAL_16BIT 0x00600000 +-#define HRCWH_ROM_LOC_LOCAL_32BIT 0x00700000 +- +-#if defined (CONFIG_MPC8349) +-#define HRCWH_TSEC1M_IN_RGMII 0x00000000 +-#define HRCWH_TSEC1M_IN_RTBI 0x00004000 +-#define HRCWH_TSEC1M_IN_GMII 0x00008000 +-#define HRCWH_TSEC1M_IN_TBI 0x0000C000 +- +-#define HRCWH_TSEC2M_IN_RGMII 0x00000000 +-#define HRCWH_TSEC2M_IN_RTBI 0x00001000 +-#define HRCWH_TSEC2M_IN_GMII 0x00002000 +-#define HRCWH_TSEC2M_IN_TBI 0x00003000 ++#define HRCWH_ROM_LOC_LOCAL_8BIT 0x00500000 ++#define HRCWH_ROM_LOC_LOCAL_16BIT 0x00600000 ++#define HRCWH_ROM_LOC_LOCAL_32BIT 0x00700000 ++ ++#if defined(CONFIG_MPC8349) ++#define HRCWH_TSEC1M_IN_RGMII 0x00000000 ++#define HRCWH_TSEC1M_IN_RTBI 0x00004000 ++#define HRCWH_TSEC1M_IN_GMII 0x00008000 ++#define HRCWH_TSEC1M_IN_TBI 0x0000C000 ++#define HRCWH_TSEC2M_IN_RGMII 0x00000000 ++#define HRCWH_TSEC2M_IN_RTBI 0x00001000 ++#define HRCWH_TSEC2M_IN_GMII 0x00002000 ++#define HRCWH_TSEC2M_IN_TBI 0x00003000 + #endif + +-#if defined (CONFIG_MPC8360) +-#define HRCWH_SECONDARY_DDR_DISABLE 0x00000000 +-#define HRCWH_SECONDARY_DDR_ENABLE 0x00000010 ++#if defined(CONFIG_MPC8360) ++#define HRCWH_SECONDARY_DDR_DISABLE 0x00000000 ++#define HRCWH_SECONDARY_DDR_ENABLE 0x00000010 + #endif + +-#define HRCWH_BIG_ENDIAN 0x00000000 +-#define HRCWH_LITTLE_ENDIAN 0x00000008 ++#define HRCWH_BIG_ENDIAN 0x00000000 ++#define HRCWH_LITTLE_ENDIAN 0x00000008 + +-#define HRCWH_LALE_NORMAL 0x00000000 +-#define HRCWH_LALE_EARLY 0x00000004 ++#define HRCWH_LALE_NORMAL 0x00000000 ++#define HRCWH_LALE_EARLY 0x00000004 + +-#define HRCWH_LDP_SET 0x00000000 +-#define HRCWH_LDP_CLEAR 0x00000002 ++#define HRCWH_LDP_SET 0x00000000 ++#define HRCWH_LDP_CLEAR 0x00000002 + +-/* +- * Hard Reset Configration Word - Low +- */ +-#define HRCWL_LCL_BUS_TO_SCB_CLK_1X1 0x00000000 +-#define HRCWL_LCL_BUS_TO_SCB_CLK_2X1 0x80000000 +- +-#define HRCWL_DDR_TO_SCB_CLK_1X1 0x00000000 +-#define HRCWL_DDR_TO_SCB_CLK_2X1 0x40000000 +- +-#define HRCWL_CSB_TO_CLKIN_16X1 0x00000000 +-#define HRCWL_CSB_TO_CLKIN_1X1 0x01000000 +-#define HRCWL_CSB_TO_CLKIN_2X1 0x02000000 +-#define HRCWL_CSB_TO_CLKIN_3X1 0x03000000 +-#define HRCWL_CSB_TO_CLKIN_4X1 0x04000000 +-#define HRCWL_CSB_TO_CLKIN_5X1 0x05000000 +-#define HRCWL_CSB_TO_CLKIN_6X1 0x06000000 +-#define HRCWL_CSB_TO_CLKIN_7X1 0x07000000 +-#define HRCWL_CSB_TO_CLKIN_8X1 0x08000000 +-#define HRCWL_CSB_TO_CLKIN_9X1 0x09000000 +-#define HRCWL_CSB_TO_CLKIN_10X1 0x0A000000 +-#define HRCWL_CSB_TO_CLKIN_11X1 0x0B000000 +-#define HRCWL_CSB_TO_CLKIN_12X1 0x0C000000 +-#define HRCWL_CSB_TO_CLKIN_13X1 0x0D000000 +-#define HRCWL_CSB_TO_CLKIN_14X1 0x0E000000 +-#define HRCWL_CSB_TO_CLKIN_15X1 0x0F000000 +- +-#define HRCWL_VCO_BYPASS 0x00000000 +-#define HRCWL_VCO_1X2 0x00000000 +-#define HRCWL_VCO_1X4 0x00200000 +-#define HRCWL_VCO_1X8 0x00400000 +- +-#define HRCWL_CORE_TO_CSB_BYPASS 0x00000000 +-#define HRCWL_CORE_TO_CSB_1X1 0x00020000 +-#define HRCWL_CORE_TO_CSB_1_5X1 0x00030000 +-#define HRCWL_CORE_TO_CSB_2X1 0x00040000 +-#define HRCWL_CORE_TO_CSB_2_5X1 0x00050000 +-#define HRCWL_CORE_TO_CSB_3X1 0x00060000 +- +-#if defined (CONFIG_MPC8360) +-#define HRCWL_CE_PLL_VCO_DIV_4 0x00000000 +-#define HRCWL_CE_PLL_VCO_DIV_8 0x00000040 +-#define HRCWL_CE_PLL_VCO_DIV_2 0x00000080 +- +-#define HRCWL_CE_PLL_DIV_1X1 0x00000000 +-#define HRCWL_CE_PLL_DIV_2X1 0x00000020 +- +-#define HRCWL_CE_TO_PLL_1X16_ 0x00000000 +-#define HRCWL_CE_TO_PLL_1X2 0x00000002 +-#define HRCWL_CE_TO_PLL_1X3 0x00000003 +-#define HRCWL_CE_TO_PLL_1X4 0x00000004 +-#define HRCWL_CE_TO_PLL_1X5 0x00000005 +-#define HRCWL_CE_TO_PLL_1X6 0x00000006 +-#define HRCWL_CE_TO_PLL_1X7 0x00000007 +-#define HRCWL_CE_TO_PLL_1X8 0x00000008 +-#define HRCWL_CE_TO_PLL_1X9 0x00000009 +-#define HRCWL_CE_TO_PLL_1X10 0x0000000A +-#define HRCWL_CE_TO_PLL_1X11 0x0000000B +-#define HRCWL_CE_TO_PLL_1X12 0x0000000C +-#define HRCWL_CE_TO_PLL_1X13 0x0000000D +-#define HRCWL_CE_TO_PLL_1X14 0x0000000E +-#define HRCWL_CE_TO_PLL_1X15 0x0000000F +-#define HRCWL_CE_TO_PLL_1X16 0x00000010 +-#define HRCWL_CE_TO_PLL_1X17 0x00000011 +-#define HRCWL_CE_TO_PLL_1X18 0x00000012 +-#define HRCWL_CE_TO_PLL_1X19 0x00000013 +-#define HRCWL_CE_TO_PLL_1X20 0x00000014 +-#define HRCWL_CE_TO_PLL_1X21 0x00000015 +-#define HRCWL_CE_TO_PLL_1X22 0x00000016 +-#define HRCWL_CE_TO_PLL_1X23 0x00000017 +-#define HRCWL_CE_TO_PLL_1X24 0x00000018 +-#define HRCWL_CE_TO_PLL_1X25 0x00000019 +-#define HRCWL_CE_TO_PLL_1X26 0x0000001A +-#define HRCWL_CE_TO_PLL_1X27 0x0000001B +-#define HRCWL_CE_TO_PLL_1X28 0x0000001C +-#define HRCWL_CE_TO_PLL_1X29 0x0000001D +-#define HRCWL_CE_TO_PLL_1X30 0x0000001E +-#define HRCWL_CE_TO_PLL_1X31 0x0000001F ++/* RSR - Reset Status Register ++ */ ++#define RSR_RSTSRC 0xE0000000 /* Reset source */ ++#define RSR_RSTSRC_SHIFT 29 ++#define RSR_BSF 0x00010000 /* Boot seq. fail */ ++#define RSR_BSF_SHIFT 16 ++#define RSR_SWSR 0x00002000 /* software soft reset */ ++#define RSR_SWSR_SHIFT 13 ++#define RSR_SWHR 0x00001000 /* software hard reset */ ++#define RSR_SWHR_SHIFT 12 ++#define RSR_JHRS 0x00000200 /* jtag hreset */ ++#define RSR_JHRS_SHIFT 9 ++#define RSR_JSRS 0x00000100 /* jtag sreset status */ ++#define RSR_JSRS_SHIFT 8 ++#define RSR_CSHR 0x00000010 /* checkstop reset status */ ++#define RSR_CSHR_SHIFT 4 ++#define RSR_SWRS 0x00000008 /* software watchdog reset status */ ++#define RSR_SWRS_SHIFT 3 ++#define RSR_BMRS 0x00000004 /* bus monitop reset status */ ++#define RSR_BMRS_SHIFT 2 ++#define RSR_SRS 0x00000002 /* soft reset status */ ++#define RSR_SRS_SHIFT 1 ++#define RSR_HRS 0x00000001 /* hard reset status */ ++#define RSR_HRS_SHIFT 0 ++#define RSR_RES ~(RSR_RSTSRC | RSR_BSF | RSR_SWSR | RSR_SWHR |\ ++ RSR_JHRS | RSR_JSRS | RSR_CSHR | RSR_SWRS |\ ++ RSR_BMRS | RSR_SRS | RSR_HRS) ++/* RMR - Reset Mode Register ++ */ ++#define RMR_CSRE 0x00000001 /* checkstop reset enable */ ++#define RMR_CSRE_SHIFT 0 ++#define RMR_RES ~(RMR_CSRE) ++ ++/* RCR - Reset Control Register ++ */ ++#define RCR_SWHR 0x00000002 /* software hard reset */ ++#define RCR_SWSR 0x00000001 /* software soft reset */ ++#define RCR_RES ~(RCR_SWHR | RCR_SWSR) ++ ++/* RCER - Reset Control Enable Register ++ */ ++#define RCER_CRE 0x00000001 /* software hard reset */ ++#define RCER_RES ~(RCER_CRE) ++ ++/* SPMR - System PLL Mode Register ++ */ ++#define SPMR_LBIUCM 0x80000000 ++#define SPMR_DDRCM 0x40000000 ++#define SPMR_SPMF 0x0F000000 ++#define SPMR_CKID 0x00800000 ++#define SPMR_CKID_SHIFT 23 ++#define SPMR_COREPLL 0x007F0000 ++#define SPMR_CEVCOD 0x000000C0 ++#define SPMR_CEPDF 0x00000020 ++#define SPMR_CEPMF 0x0000001F ++ ++/* OCCR - Output Clock Control Register ++ */ ++#define OCCR_PCICOE0 0x80000000 ++#define OCCR_PCICOE1 0x40000000 ++#define OCCR_PCICOE2 0x20000000 ++#define OCCR_PCICOE3 0x10000000 ++#define OCCR_PCICOE4 0x08000000 ++#define OCCR_PCICOE5 0x04000000 ++#define OCCR_PCICOE6 0x02000000 ++#define OCCR_PCICOE7 0x01000000 ++#define OCCR_PCICD0 0x00800000 ++#define OCCR_PCICD1 0x00400000 ++#define OCCR_PCICD2 0x00200000 ++#define OCCR_PCICD3 0x00100000 ++#define OCCR_PCICD4 0x00080000 ++#define OCCR_PCICD5 0x00040000 ++#define OCCR_PCICD6 0x00020000 ++#define OCCR_PCICD7 0x00010000 ++#define OCCR_PCI1CR 0x00000002 ++#define OCCR_PCI2CR 0x00000001 ++#define OCCR_PCICR OCCR_PCI1CR ++ ++/* SCCR - System Clock Control Register ++ */ ++#define SCCR_ENCCM 0x03000000 ++#define SCCR_ENCCM_SHIFT 24 ++#define SCCR_ENCCM_0 0x00000000 ++#define SCCR_ENCCM_1 0x01000000 ++#define SCCR_ENCCM_2 0x02000000 ++#define SCCR_ENCCM_3 0x03000000 ++ ++#define SCCR_PCICM 0x00010000 ++#define SCCR_PCICM_SHIFT 16 ++ ++/* SCCR bits - MPC8349 specific */ ++#define SCCR_TSEC1CM 0xc0000000 ++#define SCCR_TSEC1CM_SHIFT 30 ++#define SCCR_TSEC1CM_0 0x00000000 ++#define SCCR_TSEC1CM_1 0x40000000 ++#define SCCR_TSEC1CM_2 0x80000000 ++#define SCCR_TSEC1CM_3 0xC0000000 ++ ++#define SCCR_TSEC2CM 0x30000000 ++#define SCCR_TSEC2CM_SHIFT 28 ++#define SCCR_TSEC2CM_0 0x00000000 ++#define SCCR_TSEC2CM_1 0x10000000 ++#define SCCR_TSEC2CM_2 0x20000000 ++#define SCCR_TSEC2CM_3 0x30000000 ++ ++#define SCCR_USBMPHCM 0x00c00000 ++#define SCCR_USBMPHCM_SHIFT 22 ++#define SCCR_USBDRCM 0x00300000 ++#define SCCR_USBDRCM_SHIFT 20 ++ ++#define SCCR_USBCM_0 0x00000000 ++#define SCCR_USBCM_1 0x00500000 ++#define SCCR_USBCM_2 0x00A00000 ++#define SCCR_USBCM_3 0x00F00000 ++ ++#define SCCR_CLK_MASK ( SCCR_TSEC1CM_3 \ ++ | SCCR_TSEC2CM_3 \ ++ | SCCR_ENCCM_3 \ ++ | SCCR_USBCM_3 ) ++ ++#define SCCR_DEFAULT 0xFFFFFFFF ++ ++/* CSn_BDNS - Chip Select memory Bounds Register ++ */ ++#define CSBNDS_SA 0x00FF0000 ++#define CSBNDS_SA_SHIFT 8 ++#define CSBNDS_EA 0x000000FF ++#define CSBNDS_EA_SHIFT 24 ++ ++/* CSn_CONFIG - Chip Select Configuration Register ++ */ ++#define CSCONFIG_EN 0x80000000 ++#define CSCONFIG_AP 0x00800000 ++#define CSCONFIG_ROW_BIT 0x00000700 ++#define CSCONFIG_ROW_BIT_12 0x00000000 ++#define CSCONFIG_ROW_BIT_13 0x00000100 ++#define CSCONFIG_ROW_BIT_14 0x00000200 ++#define CSCONFIG_COL_BIT 0x00000007 ++#define CSCONFIG_COL_BIT_8 0x00000000 ++#define CSCONFIG_COL_BIT_9 0x00000001 ++#define CSCONFIG_COL_BIT_10 0x00000002 ++#define CSCONFIG_COL_BIT_11 0x00000003 ++ ++/* TIMING_CFG_1 - DDR SDRAM Timing Configuration 1 ++ */ ++#define TIMING_CFG1_PRETOACT 0x70000000 ++#define TIMING_CFG1_PRETOACT_SHIFT 28 ++#define TIMING_CFG1_ACTTOPRE 0x0F000000 ++#define TIMING_CFG1_ACTTOPRE_SHIFT 24 ++#define TIMING_CFG1_ACTTORW 0x00700000 ++#define TIMING_CFG1_ACTTORW_SHIFT 20 ++#define TIMING_CFG1_CASLAT 0x00070000 ++#define TIMING_CFG1_CASLAT_SHIFT 16 ++#define TIMING_CFG1_REFREC 0x0000F000 ++#define TIMING_CFG1_REFREC_SHIFT 12 ++#define TIMING_CFG1_WRREC 0x00000700 ++#define TIMING_CFG1_WRREC_SHIFT 8 ++#define TIMING_CFG1_ACTTOACT 0x00000070 ++#define TIMING_CFG1_ACTTOACT_SHIFT 4 ++#define TIMING_CFG1_WRTORD 0x00000007 ++#define TIMING_CFG1_WRTORD_SHIFT 0 ++#define TIMING_CFG1_CASLAT_20 0x00030000 /* CAS latency = 2.0 */ ++#define TIMING_CFG1_CASLAT_25 0x00040000 /* CAS latency = 2.5 */ ++ ++/* TIMING_CFG_2 - DDR SDRAM Timing Configuration 2 ++ */ ++#define TIMING_CFG2_CPO 0x0F000000 ++#define TIMING_CFG2_CPO_SHIFT 24 ++#define TIMING_CFG2_ACSM 0x00080000 ++#define TIMING_CFG2_WR_DATA_DELAY 0x00001C00 ++#define TIMING_CFG2_WR_DATA_DELAY_SHIFT 10 ++#define TIMING_CFG2_CPO_DEF 0x00000000 /* default (= CASLAT + 1) */ ++ ++/* DDR_SDRAM_CFG - DDR SDRAM Control Configuration ++ */ ++#define SDRAM_CFG_MEM_EN 0x80000000 ++#define SDRAM_CFG_SREN 0x40000000 ++#define SDRAM_CFG_ECC_EN 0x20000000 ++#define SDRAM_CFG_RD_EN 0x10000000 ++#define SDRAM_CFG_SDRAM_TYPE 0x03000000 ++#define SDRAM_CFG_SDRAM_TYPE_SHIFT 24 ++#define SDRAM_CFG_DYN_PWR 0x00200000 ++#define SDRAM_CFG_32_BE 0x00080000 ++#define SDRAM_CFG_8_BE 0x00040000 ++#define SDRAM_CFG_NCAP 0x00020000 ++#define SDRAM_CFG_2T_EN 0x00008000 ++#define SDRAM_CFG_SDRAM_TYPE_DDR 0x02000000 ++ ++/* DDR_SDRAM_MODE - DDR SDRAM Mode Register ++ */ ++#define SDRAM_MODE_ESD 0xFFFF0000 ++#define SDRAM_MODE_ESD_SHIFT 16 ++#define SDRAM_MODE_SD 0x0000FFFF ++#define SDRAM_MODE_SD_SHIFT 0 ++#define DDR_MODE_EXT_MODEREG 0x4000 /* select extended mode reg */ ++#define DDR_MODE_EXT_OPMODE 0x3FF8 /* operating mode, mask */ ++#define DDR_MODE_EXT_OP_NORMAL 0x0000 /* normal operation */ ++#define DDR_MODE_QFC 0x0004 /* QFC / compatibility, mask */ ++#define DDR_MODE_QFC_COMP 0x0000 /* compatible to older SDRAMs */ ++#define DDR_MODE_WEAK 0x0002 /* weak drivers */ ++#define DDR_MODE_DLL_DIS 0x0001 /* disable DLL */ ++#define DDR_MODE_CASLAT 0x0070 /* CAS latency, mask */ ++#define DDR_MODE_CASLAT_15 0x0010 /* CAS latency 1.5 */ ++#define DDR_MODE_CASLAT_20 0x0020 /* CAS latency 2 */ ++#define DDR_MODE_CASLAT_25 0x0060 /* CAS latency 2.5 */ ++#define DDR_MODE_CASLAT_30 0x0030 /* CAS latency 3 */ ++#define DDR_MODE_BTYPE_SEQ 0x0000 /* sequential burst */ ++#define DDR_MODE_BTYPE_ILVD 0x0008 /* interleaved burst */ ++#define DDR_MODE_BLEN_2 0x0001 /* burst length 2 */ ++#define DDR_MODE_BLEN_4 0x0002 /* burst length 4 */ ++#define DDR_REFINT_166MHZ_7US 1302 /* exact value for 7.8125us */ ++#define DDR_BSTOPRE 256 /* use 256 cycles as a starting point */ ++#define DDR_MODE_MODEREG 0x0000 /* select mode register */ ++ ++/* DDR_SDRAM_INTERVAL - DDR SDRAM Interval Register ++ */ ++#define SDRAM_INTERVAL_REFINT 0x3FFF0000 ++#define SDRAM_INTERVAL_REFINT_SHIFT 16 ++#define SDRAM_INTERVAL_BSTOPRE 0x00003FFF ++#define SDRAM_INTERVAL_BSTOPRE_SHIFT 0 ++ ++/* DDR_SDRAM_CLK_CNTL - DDR SDRAM Clock Control Register ++ */ ++#define DDR_SDRAM_CLK_CNTL_SS_EN 0x80000000 ++#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_025 0x01000000 ++#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05 0x02000000 ++#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_075 0x03000000 ++#define DDR_SDRAM_CLK_CNTL_CLK_ADJUST_1 0x04000000 ++ ++/* ECC_ERR_INJECT - Memory data path error injection mask ECC ++ */ ++#define ECC_ERR_INJECT_EMB (0x80000000>>22) /* ECC Mirror Byte */ ++#define ECC_ERR_INJECT_EIEN (0x80000000>>23) /* Error Injection Enable */ ++#define ECC_ERR_INJECT_EEIM (0xff000000>>24) /* ECC Erroe Injection Enable */ ++#define ECC_ERR_INJECT_EEIM_SHIFT 0 ++ ++/* CAPTURE_ECC - Memory data path read capture ECC ++ */ ++#define CAPTURE_ECC_ECE (0xff000000>>24) ++#define CAPTURE_ECC_ECE_SHIFT 0 ++ ++/* ERR_DETECT - Memory error detect ++ */ ++#define ECC_ERROR_DETECT_MME (0x80000000>>0) /* Multiple Memory Errors */ ++#define ECC_ERROR_DETECT_MBE (0x80000000>>28) /* Multiple-Bit Error */ ++#define ECC_ERROR_DETECT_SBE (0x80000000>>29) /* Single-Bit ECC Error Pickup */ ++#define ECC_ERROR_DETECT_MSE (0x80000000>>31) /* Memory Select Error */ ++ ++/* ERR_DISABLE - Memory error disable ++ */ ++#define ECC_ERROR_DISABLE_MBED (0x80000000>>28) /* Multiple-Bit ECC Error Disable */ ++#define ECC_ERROR_DISABLE_SBED (0x80000000>>29) /* Sinle-Bit ECC Error disable */ ++#define ECC_ERROR_DISABLE_MSED (0x80000000>>31) /* Memory Select Error Disable */ ++#define ECC_ERROR_ENABLE ~(ECC_ERROR_DISABLE_MSED | ECC_ERROR_DISABLE_SBED |\ ++ ECC_ERROR_DISABLE_MBED) ++/* ERR_INT_EN - Memory error interrupt enable ++ */ ++#define ECC_ERR_INT_EN_MBEE (0x80000000>>28) /* Multiple-Bit ECC Error Interrupt Enable */ ++#define ECC_ERR_INT_EN_SBEE (0x80000000>>29) /* Single-Bit ECC Error Interrupt Enable */ ++#define ECC_ERR_INT_EN_MSEE (0x80000000>>31) /* Memory Select Error Interrupt Enable */ ++#define ECC_ERR_INT_DISABLE ~(ECC_ERR_INT_EN_MBEE | ECC_ERR_INT_EN_SBEE |\ ++ ECC_ERR_INT_EN_MSEE) ++/* CAPTURE_ATTRIBUTES - Memory error attributes capture ++ */ ++#define ECC_CAPT_ATTR_BNUM (0xe0000000>>1) /* Data Beat Num */ ++#define ECC_CAPT_ATTR_BNUM_SHIFT 28 ++#define ECC_CAPT_ATTR_TSIZ (0xc0000000>>6) /* Transaction Size */ ++#define ECC_CAPT_ATTR_TSIZ_FOUR_DW 0 ++#define ECC_CAPT_ATTR_TSIZ_ONE_DW 1 ++#define ECC_CAPT_ATTR_TSIZ_TWO_DW 2 ++#define ECC_CAPT_ATTR_TSIZ_THREE_DW 3 ++#define ECC_CAPT_ATTR_TSIZ_SHIFT 24 ++#define ECC_CAPT_ATTR_TSRC (0xf8000000>>11) /* Transaction Source */ ++#define ECC_CAPT_ATTR_TSRC_E300_CORE_DT 0x0 ++#define ECC_CAPT_ATTR_TSRC_E300_CORE_IF 0x2 ++#define ECC_CAPT_ATTR_TSRC_TSEC1 0x4 ++#define ECC_CAPT_ATTR_TSRC_TSEC2 0x5 ++#define ECC_CAPT_ATTR_TSRC_USB (0x06|0x07) ++#define ECC_CAPT_ATTR_TSRC_ENCRYPT 0x8 ++#define ECC_CAPT_ATTR_TSRC_I2C 0x9 ++#define ECC_CAPT_ATTR_TSRC_JTAG 0xA ++#define ECC_CAPT_ATTR_TSRC_PCI1 0xD ++#define ECC_CAPT_ATTR_TSRC_PCI2 0xE ++#define ECC_CAPT_ATTR_TSRC_DMA 0xF ++#define ECC_CAPT_ATTR_TSRC_SHIFT 16 ++#define ECC_CAPT_ATTR_TTYP (0xe0000000>>18) /* Transaction Type */ ++#define ECC_CAPT_ATTR_TTYP_WRITE 0x1 ++#define ECC_CAPT_ATTR_TTYP_READ 0x2 ++#define ECC_CAPT_ATTR_TTYP_R_M_W 0x3 ++#define ECC_CAPT_ATTR_TTYP_SHIFT 12 ++#define ECC_CAPT_ATTR_VLD (0x80000000>>31) /* Valid */ ++ ++/* ERR_SBE - Single bit ECC memory error management ++ */ ++#define ECC_ERROR_MAN_SBET (0xff000000>>8) /* Single-Bit Error Threshold 0..255 */ ++#define ECC_ERROR_MAN_SBET_SHIFT 16 ++#define ECC_ERROR_MAN_SBEC (0xff000000>>24) /* Single Bit Error Counter 0..255 */ ++#define ECC_ERROR_MAN_SBEC_SHIFT 0 ++ ++/* BR - Base Registers ++ */ ++#define BR0 0x5000 /* Register offset to immr */ ++#define BR1 0x5008 ++#define BR2 0x5010 ++#define BR3 0x5018 ++#define BR4 0x5020 ++#define BR5 0x5028 ++#define BR6 0x5030 ++#define BR7 0x5038 ++ ++#define BR_BA 0xFFFF8000 ++#define BR_BA_SHIFT 15 ++#define BR_PS 0x00001800 ++#define BR_PS_SHIFT 11 ++#define BR_PS_8 0x00000800 /* Port Size 8 bit */ ++#define BR_PS_16 0x00001000 /* Port Size 16 bit */ ++#define BR_PS_32 0x00001800 /* Port Size 32 bit */ ++#define BR_DECC 0x00000600 ++#define BR_DECC_SHIFT 9 ++#define BR_WP 0x00000100 ++#define BR_WP_SHIFT 8 ++#define BR_MSEL 0x000000E0 ++#define BR_MSEL_SHIFT 5 ++#define BR_MS_GPCM 0x00000000 /* GPCM */ ++#define BR_MS_SDRAM 0x00000060 /* SDRAM */ ++#define BR_MS_UPMA 0x00000080 /* UPMA */ ++#define BR_MS_UPMB 0x000000A0 /* UPMB */ ++#define BR_MS_UPMC 0x000000C0 /* UPMC */ ++#if defined(CONFIG_MPC8360) ++#define BR_ATOM 0x0000000C ++#define BR_ATOM_SHIFT 2 + #endif ++#define BR_V 0x00000001 ++#define BR_V_SHIFT 0 + +-/* +- * LCRR - Clock Ratio Register (10.3.1.16) +- */ +-#define LCRR_DBYP 0x80000000 +-#define LCRR_DBYP_SHIFT 31 +-#define LCRR_BUFCMDC 0x30000000 +-#define LCRR_BUFCMDC_1 0x10000000 +-#define LCRR_BUFCMDC_2 0x20000000 +-#define LCRR_BUFCMDC_3 0x30000000 +-#define LCRR_BUFCMDC_4 0x00000000 +-#define LCRR_BUFCMDC_SHIFT 28 +-#define LCRR_ECL 0x03000000 +-#define LCRR_ECL_4 0x00000000 +-#define LCRR_ECL_5 0x01000000 +-#define LCRR_ECL_6 0x02000000 +-#define LCRR_ECL_7 0x03000000 +-#define LCRR_ECL_SHIFT 24 +-#define LCRR_EADC 0x00030000 +-#define LCRR_EADC_1 0x00010000 +-#define LCRR_EADC_2 0x00020000 +-#define LCRR_EADC_3 0x00030000 +-#define LCRR_EADC_4 0x00000000 +-#define LCRR_EADC_SHIFT 16 +-#define LCRR_CLKDIV 0x0000000F +-#define LCRR_CLKDIV_2 0x00000002 +-#define LCRR_CLKDIV_4 0x00000004 +-#define LCRR_CLKDIV_8 0x00000008 +-#define LCRR_CLKDIV_SHIFT 0 ++#if defined(CONFIG_MPC8349) ++#define BR_RES ~(BR_BA | BR_PS | BR_DECC | BR_WP | BR_MSEL | BR_V) ++#elif defined(CONFIG_MPC8360) ++#define BR_RES ~(BR_BA | BR_PS | BR_DECC | BR_WP | BR_MSEL | BR_ATOM | BR_V) ++#endif + +-/* +- * SCCR-System Clock Control Register +- */ +-#define SCCR_TSEC1CM_0 0x00000000 +-#define SCCR_TSEC1CM_1 0x40000000 +-#define SCCR_TSEC1CM_2 0x80000000 +-#define SCCR_TSEC1CM_3 0xC0000000 +-#define SCCR_TSEC2CM_0 0x00000000 +-#define SCCR_TSEC2CM_1 0x10000000 +-#define SCCR_TSEC2CM_2 0x20000000 +-#define SCCR_TSEC2CM_3 0x30000000 +-#define SCCR_ENCCM_0 0x00000000 +-#define SCCR_ENCCM_1 0x01000000 +-#define SCCR_ENCCM_2 0x02000000 +-#define SCCR_ENCCM_3 0x03000000 +-#define SCCR_USBCM_0 0x00000000 +-#define SCCR_USBCM_1 0x00500000 +-#define SCCR_USBCM_2 0x00A00000 +-#define SCCR_USBCM_3 0x00F00000 +- +-#define SCCR_CLK_MASK ( SCCR_TSEC1CM_3 \ +- | SCCR_TSEC2CM_3 \ +- | SCCR_ENCCM_3 \ +- | SCCR_USBCM_3 ) +- +-#define SCCR_DEFAULT 0xFFFFFFFF ++/* OR - Option Registers ++ */ ++#define OR0 0x5004 /* Register offset to immr */ ++#define OR1 0x500C ++#define OR2 0x5014 ++#define OR3 0x501C ++#define OR4 0x5024 ++#define OR5 0x502C ++#define OR6 0x5034 ++#define OR7 0x503C ++ ++#define OR_GPCM_AM 0xFFFF8000 ++#define OR_GPCM_AM_SHIFT 15 ++#define OR_GPCM_BCTLD 0x00001000 ++#define OR_GPCM_BCTLD_SHIFT 12 ++#define OR_GPCM_CSNT 0x00000800 ++#define OR_GPCM_CSNT_SHIFT 11 ++#define OR_GPCM_ACS 0x00000600 ++#define OR_GPCM_ACS_SHIFT 9 ++#define OR_GPCM_ACS_0b10 0x00000400 ++#define OR_GPCM_ACS_0b11 0x00000600 ++#define OR_GPCM_XACS 0x00000100 ++#define OR_GPCM_XACS_SHIFT 8 ++#define OR_GPCM_SCY 0x000000F0 ++#define OR_GPCM_SCY_SHIFT 4 ++#define OR_GPCM_SCY_1 0x00000010 ++#define OR_GPCM_SCY_2 0x00000020 ++#define OR_GPCM_SCY_3 0x00000030 ++#define OR_GPCM_SCY_4 0x00000040 ++#define OR_GPCM_SCY_5 0x00000050 ++#define OR_GPCM_SCY_6 0x00000060 ++#define OR_GPCM_SCY_7 0x00000070 ++#define OR_GPCM_SCY_8 0x00000080 ++#define OR_GPCM_SCY_9 0x00000090 ++#define OR_GPCM_SCY_10 0x000000a0 ++#define OR_GPCM_SCY_11 0x000000b0 ++#define OR_GPCM_SCY_12 0x000000c0 ++#define OR_GPCM_SCY_13 0x000000d0 ++#define OR_GPCM_SCY_14 0x000000e0 ++#define OR_GPCM_SCY_15 0x000000f0 ++#define OR_GPCM_SETA 0x00000008 ++#define OR_GPCM_SETA_SHIFT 3 ++#define OR_GPCM_TRLX 0x00000004 ++#define OR_GPCM_TRLX_SHIFT 2 ++#define OR_GPCM_EHTR 0x00000002 ++#define OR_GPCM_EHTR_SHIFT 1 ++#define OR_GPCM_EAD 0x00000001 ++#define OR_GPCM_EAD_SHIFT 0 ++ ++#define OR_UPM_AM 0xFFFF8000 ++#define OR_UPM_AM_SHIFT 15 ++#define OR_UPM_XAM 0x00006000 ++#define OR_UPM_XAM_SHIFT 13 ++#define OR_UPM_BCTLD 0x00001000 ++#define OR_UPM_BCTLD_SHIFT 12 ++#define OR_UPM_BI 0x00000100 ++#define OR_UPM_BI_SHIFT 8 ++#define OR_UPM_TRLX 0x00000004 ++#define OR_UPM_TRLX_SHIFT 2 ++#define OR_UPM_EHTR 0x00000002 ++#define OR_UPM_EHTR_SHIFT 1 ++#define OR_UPM_EAD 0x00000001 ++#define OR_UPM_EAD_SHIFT 0 ++ ++#define OR_SDRAM_AM 0xFFFF8000 ++#define OR_SDRAM_AM_SHIFT 15 ++#define OR_SDRAM_XAM 0x00006000 ++#define OR_SDRAM_XAM_SHIFT 13 ++#define OR_SDRAM_COLS 0x00001C00 ++#define OR_SDRAM_COLS_SHIFT 10 ++#define OR_SDRAM_ROWS 0x000001C0 ++#define OR_SDRAM_ROWS_SHIFT 6 ++#define OR_SDRAM_PMSEL 0x00000020 ++#define OR_SDRAM_PMSEL_SHIFT 5 ++#define OR_SDRAM_EAD 0x00000001 ++#define OR_SDRAM_EAD_SHIFT 0 ++ ++/* LBCR - Local Bus Configuration Register ++ */ ++#define LBCR_LDIS 0x80000000 ++#define LBCR_LDIS_SHIFT 31 ++#define LBCR_BCTLC 0x00C00000 ++#define LBCR_BCTLC_SHIFT 22 ++#define LBCR_LPBSE 0x00020000 ++#define LBCR_LPBSE_SHIFT 17 ++#define LBCR_EPAR 0x00010000 ++#define LBCR_EPAR_SHIFT 16 ++#define LBCR_BMT 0x0000FF00 ++#define LBCR_BMT_SHIFT 8 ++ ++/* LCRR - Clock Ratio Register ++ */ ++#define LCRR_DBYP 0x80000000 ++#define LCRR_DBYP_SHIFT 31 ++#define LCRR_BUFCMDC 0x30000000 ++#define LCRR_BUFCMDC_SHIFT 28 ++#define LCRR_BUFCMDC_1 0x10000000 ++#define LCRR_BUFCMDC_2 0x20000000 ++#define LCRR_BUFCMDC_3 0x30000000 ++#define LCRR_BUFCMDC_4 0x00000000 ++#define LCRR_ECL 0x03000000 ++#define LCRR_ECL_SHIFT 24 ++#define LCRR_ECL_4 0x00000000 ++#define LCRR_ECL_5 0x01000000 ++#define LCRR_ECL_6 0x02000000 ++#define LCRR_ECL_7 0x03000000 ++#define LCRR_EADC 0x00030000 ++#define LCRR_EADC_SHIFT 16 ++#define LCRR_EADC_1 0x00010000 ++#define LCRR_EADC_2 0x00020000 ++#define LCRR_EADC_3 0x00030000 ++#define LCRR_EADC_4 0x00000000 ++#define LCRR_CLKDIV 0x0000000F ++#define LCRR_CLKDIV_SHIFT 0 ++#define LCRR_CLKDIV_2 0x00000002 ++#define LCRR_CLKDIV_4 0x00000004 ++#define LCRR_CLKDIV_8 0x00000008 ++ ++/* DMAMR - DMA Mode Register ++ */ ++#define DMA_CHANNEL_START 0x00000001 /* Bit - DMAMRn CS */ ++#define DMA_CHANNEL_TRANSFER_MODE_DIRECT 0x00000004 /* Bit - DMAMRn CTM */ ++#define DMA_CHANNEL_SOURCE_ADRESSS_HOLD_EN 0x00001000 /* Bit - DMAMRn SAHE */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_1B 0x00000000 /* 2Bit- DMAMRn SAHTS 1byte */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_2B 0x00004000 /* 2Bit- DMAMRn SAHTS 2bytes */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_4B 0x00008000 /* 2Bit- DMAMRn SAHTS 4bytes */ ++#define DMA_CHANNEL_SOURCE_ADDRESS_HOLD_8B 0x0000c000 /* 2Bit- DMAMRn SAHTS 8bytes */ ++#define DMA_CHANNEL_SNOOP 0x00010000 /* Bit - DMAMRn DMSEN */ ++ ++/* DMASR - DMA Status Register ++ */ ++#define DMA_CHANNEL_BUSY 0x00000004 /* Bit - DMASRn CB */ ++#define DMA_CHANNEL_TRANSFER_ERROR 0x00000080 /* Bit - DMASRn TE */ ++ ++/* CONFIG_ADDRESS - PCI Config Address Register ++ */ ++#define PCI_CONFIG_ADDRESS_EN 0x80000000 ++#define PCI_CONFIG_ADDRESS_BN_SHIFT 16 ++#define PCI_CONFIG_ADDRESS_BN_MASK 0x00ff0000 ++#define PCI_CONFIG_ADDRESS_DN_SHIFT 11 ++#define PCI_CONFIG_ADDRESS_DN_MASK 0x0000f800 ++#define PCI_CONFIG_ADDRESS_FN_SHIFT 8 ++#define PCI_CONFIG_ADDRESS_FN_MASK 0x00000700 ++#define PCI_CONFIG_ADDRESS_RN_SHIFT 0 ++#define PCI_CONFIG_ADDRESS_RN_MASK 0x000000fc ++ ++/* POTAR - PCI Outbound Translation Address Register ++ */ ++#define POTAR_TA_MASK 0x000fffff ++ ++/* POBAR - PCI Outbound Base Address Register ++ */ ++#define POBAR_BA_MASK 0x000fffff ++ ++/* POCMR - PCI Outbound Comparision Mask Register ++ */ ++#define POCMR_EN 0x80000000 ++#define POCMR_IO 0x40000000 /* 0-memory space 1-I/O space */ ++#define POCMR_SE 0x20000000 /* streaming enable */ ++#define POCMR_DST 0x10000000 /* 0-PCI1 1-PCI2 */ ++#define POCMR_CM_MASK 0x000fffff ++#define POCMR_CM_4G 0x00000000 ++#define POCMR_CM_2G 0x00080000 ++#define POCMR_CM_1G 0x000C0000 ++#define POCMR_CM_512M 0x000E0000 ++#define POCMR_CM_256M 0x000F0000 ++#define POCMR_CM_128M 0x000F8000 ++#define POCMR_CM_64M 0x000FC000 ++#define POCMR_CM_32M 0x000FE000 ++#define POCMR_CM_16M 0x000FF000 ++#define POCMR_CM_8M 0x000FF800 ++#define POCMR_CM_4M 0x000FFC00 ++#define POCMR_CM_2M 0x000FFE00 ++#define POCMR_CM_1M 0x000FFF00 ++#define POCMR_CM_512K 0x000FFF80 ++#define POCMR_CM_256K 0x000FFFC0 ++#define POCMR_CM_128K 0x000FFFE0 ++#define POCMR_CM_64K 0x000FFFF0 ++#define POCMR_CM_32K 0x000FFFF8 ++#define POCMR_CM_16K 0x000FFFFC ++#define POCMR_CM_8K 0x000FFFFE ++#define POCMR_CM_4K 0x000FFFFF ++ ++/* PITAR - PCI Inbound Translation Address Register ++ */ ++#define PITAR_TA_MASK 0x000fffff ++ ++/* PIBAR - PCI Inbound Base/Extended Address Register ++ */ ++#define PIBAR_MASK 0xffffffff ++#define PIEBAR_EBA_MASK 0x000fffff ++ ++/* PIWAR - PCI Inbound Windows Attributes Register ++ */ ++#define PIWAR_EN 0x80000000 ++#define PIWAR_PF 0x20000000 ++#define PIWAR_RTT_MASK 0x000f0000 ++#define PIWAR_RTT_NO_SNOOP 0x00040000 ++#define PIWAR_RTT_SNOOP 0x00050000 ++#define PIWAR_WTT_MASK 0x0000f000 ++#define PIWAR_WTT_NO_SNOOP 0x00004000 ++#define PIWAR_WTT_SNOOP 0x00005000 ++#define PIWAR_IWS_MASK 0x0000003F ++#define PIWAR_IWS_4K 0x0000000B ++#define PIWAR_IWS_8K 0x0000000C ++#define PIWAR_IWS_16K 0x0000000D ++#define PIWAR_IWS_32K 0x0000000E ++#define PIWAR_IWS_64K 0x0000000F ++#define PIWAR_IWS_128K 0x00000010 ++#define PIWAR_IWS_256K 0x00000011 ++#define PIWAR_IWS_512K 0x00000012 ++#define PIWAR_IWS_1M 0x00000013 ++#define PIWAR_IWS_2M 0x00000014 ++#define PIWAR_IWS_4M 0x00000015 ++#define PIWAR_IWS_8M 0x00000016 ++#define PIWAR_IWS_16M 0x00000017 ++#define PIWAR_IWS_32M 0x00000018 ++#define PIWAR_IWS_64M 0x00000019 ++#define PIWAR_IWS_128M 0x0000001A ++#define PIWAR_IWS_256M 0x0000001B ++#define PIWAR_IWS_512M 0x0000001C ++#define PIWAR_IWS_1G 0x0000001D ++#define PIWAR_IWS_2G 0x0000001E + + #endif /* __MPC83XX_H__ */ diff --git a/packages/uboot/u-boot_1.1.6.bb b/packages/uboot/u-boot_1.1.6.bb index bec1a619e4..e003c69d7b 100644 --- a/packages/uboot/u-boot_1.1.6.bb +++ b/packages/uboot/u-boot_1.1.6.bb @@ -1,12 +1,25 @@ require u-boot.inc -PR = "r2" +PR = "r3" SRC_URI = "ftp://ftp.denx.de/pub/u-boot/u-boot-1.1.6.tar.bz2 \ - file://devkit-idp.patch;patch=1" + file://devkit-idp.patch;patch=1 \ +" SRC_URI_append_sarge-at91 = " file://sarge-uboot.patch;patch=1" +SRC_URI_append_mpc8323e-rdb = " file://u-boot-1.1.6-fsl-1-mpc83xx-20061206.patch;patch=1 \ + file://u-boot-1.1.6-fsl-1-Fix-the-UEC-driver-bug-of-QE.patch;patch=1 \ + file://u-boot-1.1.6-fsl-1-streamline-the-83xx-immr-head-file.patch;patch=1 \ + file://u-boot-1.1.6-fsl-1-Add-support-for-the-MPC832XEMDS-board.patch;patch=1 \ + file://u-boot-1.1.6-fsl-1-Add-the-MPC832XEMDS-board-readme.patch;patch=1 \ + file://u-boot-1.1.6-fsl-1-Added-MPC8323E-RDB-board-support-2.patch;patch=1 \ + file://u-boot-1.1.6-fsl-1-UEC-remove-udelay.patch;patch=1 \ + file://u-boot-1.1.6-83xx-optimizations.patch;patch=1 \ +" + + + PACKAGE_ARCH = "${MACHINE_ARCH}" UBOOT_MACHINE_sarge-at91 = "sarge_config" diff --git a/packages/uicmoc/uicmoc4-native.inc b/packages/uicmoc/uicmoc4-native.inc index 77ef361980..8f0c715a89 100644 --- a/packages/uicmoc/uicmoc4-native.inc +++ b/packages/uicmoc/uicmoc4-native.inc @@ -11,7 +11,7 @@ S = "${WORKDIR}/qtopia-core-opensource-src-${PV}" inherit native -EXTRA_OECONF = "-prefix ${STAGING_DIR}/${BUILD_SYS}/qt4 \ +EXTRA_OECONF = "-prefix ${STAGING_DIR_NATIVE}/qt4 \ -qt-libjpeg -qt-gif -system-zlib \ -no-nis -no-cups -no-exceptions \ -no-accessibility -no-libjpeg \ @@ -56,6 +56,6 @@ do_stage() { install -m 0755 bin/uic ${STAGING_BINDIR}/uic4 install -m 0755 bin/uic3 ${STAGING_BINDIR}/uic34 install -m 0755 bin/rcc ${STAGING_BINDIR}/rcc4 - install -d ${STAGING_DIR}/${BUILD_SYS}/qt4/ - install -m 0644 tools/porting/src/q3porting.xml ${STAGING_DIR}/${BUILD_SYS}/qt4/ + install -d ${STAGING_DIR_NATIVE}/qt4/ + install -m 0644 tools/porting/src/q3porting.xml ${STAGING_DIR_NATIVE}/qt4/ } diff --git a/packages/uicmoc/uicmoc4-native_4.3.0.bb b/packages/uicmoc/uicmoc4-native_4.3.0.bb index 93a2b6a4ce..bc5aba4102 100644 --- a/packages/uicmoc/uicmoc4-native_4.3.0.bb +++ b/packages/uicmoc/uicmoc4-native_4.3.0.bb @@ -11,7 +11,7 @@ S = "${WORKDIR}/qt-x11-opensource-src-${PV}" inherit native -EXTRA_OECONF = "-prefix ${STAGING_DIR}/${BUILD_SYS}/qt4 \ +EXTRA_OECONF = "-prefix ${STAGING_DIR_NATIVE}/qt4 \ -qt-libjpeg -qt-gif -system-zlib \ -no-nis -no-cups -no-exceptions \ -no-accessibility -no-libjpeg \ @@ -48,6 +48,6 @@ do_stage() { install -m 0755 bin/uic ${STAGING_BINDIR}/uic4 install -m 0755 bin/uic3 ${STAGING_BINDIR}/uic34 install -m 0755 bin/rcc ${STAGING_BINDIR}/rcc4 - install -d ${STAGING_DIR}/${BUILD_SYS}/qt4/ - install -m 0644 tools/porting/src/q3porting.xml ${STAGING_DIR}/${BUILD_SYS}/qt4/ + install -d ${STAGING_DIR_NATIVE}/qt4/ + install -m 0644 tools/porting/src/q3porting.xml ${STAGING_DIR_NATIVE}/qt4/ } diff --git a/packages/vala/.mtn2git_empty b/packages/vala/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/vala/.mtn2git_empty diff --git a/packages/vala/vala-native_0.1.4.bb b/packages/vala/vala-native_0.1.4.bb new file mode 100644 index 0000000000..8de1b9258c --- /dev/null +++ b/packages/vala/vala-native_0.1.4.bb @@ -0,0 +1,5 @@ +require vala_${PV}.bb + +inherit native +DEPENDS = "glib-native-2.0" + diff --git a/packages/vala/vala_0.1.4.bb b/packages/vala/vala_0.1.4.bb new file mode 100644 index 0000000000..0d357945b7 --- /dev/null +++ b/packages/vala/vala_0.1.4.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "Vala is a C#-like language dedicated to ease GObject programming. Vala compiles to C" +SECTION = "devel" +DEPENDS = "glib-2.0" +HOMEPAGE = "http://live.gnome.org/Vala" +LICENSE = "LGPL" + +SRC_URI = "http://download.gnome.org/sources/vala/0.1/vala-${PV}.tar.bz2" +S = "${WORKDIR}/vala-${PV}" + +inherit autotools lib_package + +do_stage() { + autotools_stage_all +} + diff --git a/packages/vte/vte_0.16.8.bb b/packages/vte/vte_0.16.8.bb index 213bd0afbe..57a3aca74d 100644 --- a/packages/vte/vte_0.16.8.bb +++ b/packages/vte/vte_0.16.8.bb @@ -1,5 +1,6 @@ DESCRIPTION = "vte is a virtual terminal emulator" LICENSE = "LGPL" +DEPENDS += " glib-2.0 gtk+" RDEPENDS = "termcap" PR = "r3" diff --git a/packages/xorg-app/mkfontdir-native_1.0.3.bb b/packages/xorg-app/mkfontdir-native_1.0.3.bb index 2753b185ba..1c62b85a1d 100644 --- a/packages/xorg-app/mkfontdir-native_1.0.3.bb +++ b/packages/xorg-app/mkfontdir-native_1.0.3.bb @@ -6,6 +6,6 @@ PR = "r1" PE = "1" S = "${WORKDIR}/mkfontdir-${PV}" -SRC_URI = "${XORG_MIRROR}/X11R7.1/src/app/mkfontdir-${PV}.tar.bz2" +SRC_URI = "${XORG_MIRROR}/individual/app/mkfontdir-${PV}.tar.bz2" inherit native autotools pkgconfig diff --git a/packages/xorg-app/xdm_1.1.4.bb b/packages/xorg-app/xdm_1.1.4.bb index 7b4195e3d8..5df9fdd7bf 100644 --- a/packages/xorg-app/xdm_1.1.4.bb +++ b/packages/xorg-app/xdm_1.1.4.bb @@ -3,6 +3,6 @@ PE = "1" DESCRIPTION = "X display manager" -DEPENDS += " libxmu libxinerama libxpm libxdmcp libxau virtual/libx11 libxext libxdmcp libxt" +DEPENDS += " libxmu libxinerama libxpm libxdmcp libxau virtual/libx11 libxext libxdmcp libxt libxaw" EXTRA_OECONF += " --with-random-device=/dev/urandom" diff --git a/packages/xorg-app/xdm_1.1.6.bb b/packages/xorg-app/xdm_1.1.6.bb index 1520a903ad..eb153b1da9 100644 --- a/packages/xorg-app/xdm_1.1.6.bb +++ b/packages/xorg-app/xdm_1.1.6.bb @@ -3,7 +3,7 @@ PE = "1" DESCRIPTION = "X display manager" -DEPENDS += " libxmu libxinerama libxpm libxdmcp libxau virtual/libx11 libxext libxdmcp libxt" +DEPENDS += " libxmu libxinerama libxpm libxdmcp libxau virtual/libx11 libxext libxdmcp libxt libxaw" EXTRA_OECONF += " --with-random-device=/dev/urandom" diff --git a/packages/xorg-app/xterm_207.bb b/packages/xorg-app/xterm_207.bb index 8c940bd2e8..547b42d0f1 100644 --- a/packages/xorg-app/xterm_207.bb +++ b/packages/xorg-app/xterm_207.bb @@ -11,7 +11,7 @@ inherit autotools pkgconfig FILES_${PN} += " /usr/lib/X11" #EXTRA_OERECONF = " -I${S}/xterm.m4" -EXTRA_OECONF = " --x-includes=${STAGING_INCDIR} --x-libraries=${STAGING_LIBDIR} FREETYPE_CONFIG=${STAGING_DIR}/${BUILD_SYS}/bin/freetype-config --disable-imake" +EXTRA_OECONF = " --x-includes=${STAGING_INCDIR} --x-libraries=${STAGING_LIBDIR} FREETYPE_CONFIG=${STAGING_BINDIR_CROSS}/freetype-config --disable-imake" #do_configure_prepend () { # mv ${S}/aclocal.m4 ${S}/xterm.m4 diff --git a/packages/xorg-lib/pixman_0.9.6.bb b/packages/xorg-lib/pixman_0.9.6.bb new file mode 100644 index 0000000000..dec40fac4d --- /dev/null +++ b/packages/xorg-lib/pixman_0.9.6.bb @@ -0,0 +1,6 @@ +require xorg-lib-common.inc + +DESCRIPTION = "Library for lowlevel pixel operations" +DEPENDS = "virtual/libx11" + +SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz" diff --git a/packages/xournal/xournal_0.4.0.1.bb b/packages/xournal/xournal_0.4.0.1.bb index 5a8a1b74b7..f62648863b 100644 --- a/packages/xournal/xournal_0.4.0.1.bb +++ b/packages/xournal/xournal_0.4.0.1.bb @@ -1,9 +1,11 @@ HOMEPAGE = "http://xournal.sf.net/" DESCRIPTION = "Xournal is an application for notetaking, sketching, keeping a journal using a stylus." DEPENDS = "gtk+ libgnomecanvas libgnomeprintui" +# For pdftopnm: +RDEPENDS = "poppler" SECTION = "x11" LICENSE = "GPL" -PR = "r0" +PR = "r1" SRC_URI = "http://xournal.sourceforge.net/xournal-${PV}.tar.gz \ file://xournal.desktop" diff --git a/packages/xournal/xournal_0.4.1.bb b/packages/xournal/xournal_0.4.1.bb new file mode 100644 index 0000000000..51958d545b --- /dev/null +++ b/packages/xournal/xournal_0.4.1.bb @@ -0,0 +1,15 @@ +HOMEPAGE = "http://xournal.sf.net/" +DESCRIPTION = "Xournal is an application for notetaking, sketching, keeping a journal using a stylus." +DEPENDS = "gtk+ libgnomecanvas libgnomeprintui" +# For pdftopnm: +RDEPENDS = "poppler" +SECTION = "x11" +LICENSE = "GPL" +PR = "r0" + +SRC_URI = "http://xournal.sourceforge.net/xournal-${PV}.tar.gz \ + " + +inherit autotools pkgconfig + + diff --git a/packages/zaurus-updater/zaurus-updater.bb b/packages/zaurus-updater/zaurus-updater.bb index 05c7a9ca3a..c4e0d87bc7 100644 --- a/packages/zaurus-updater/zaurus-updater.bb +++ b/packages/zaurus-updater/zaurus-updater.bb @@ -1,7 +1,7 @@ DESCRIPTION = "Encrypted shellscript for the Zaurus ROM update" DEPENDS = "encdec-updater-native" LICENSE = "zaurus-updater" -PR = "r6" +PR = "r7" PACKAGES = "" PACKAGE_ARCH = "${MACHINE_ARCH}" |